浏览代码

顺丰同城绑定门店

jlutt@163.com 2 年之前
父节点
当前提交
3cc90ce9a8

+ 9 - 45
conf/apiFiles/expressOut.xml

@@ -2,68 +2,32 @@
 <apis>
     <api>
         <!-- 接口名称 -->
-        <methodName>测试api</methodName>
+        <methodName>顺丰同城预下单报价</methodName>
         <!-- 排序 -->
-        <sort>10</sort>
-        <!-- 使用的脚本业务名称 不要BE_ -->
-        <businessMethod>Express_aaaa</businessMethod>
+        <sort>2</sort>
+        <businessMethod>Express_PreCreateOrder_SFTC</businessMethod>
         <!-- 是否需要token,留着空表示不需要,需要token的写上获取token的方法,不能不要该节点 -->
-        <tokenFrom></tokenFrom>
+        <tokenFrom/>
         <!-- 是否需要分页,留着空表示不需要,随便写的啥表示需要分页参数,不能不要该节点 -->
-        <pageFrom>1</pageFrom>
+        <pageFrom/>
 
         <!--
             参数信息,paramOnly和params是互斥的,有的时候我们需要的参数是单个类的json就完事,但是又懒得一个一个写param,可以只用paramOnly标识,里面输入带包类名,
             然后在类里面用@ApiPlce("脚本业务名称")标记上需要的字段即可,不能不要该节点,使用params时,paramOnly写空即可。
         -->
-        <paramOnly></paramOnly>
+        <paramOnly/>
         <!--
             参数信息,
         -->
         <params>
             <param>
                 <!-- 参数说明 -->
-                <paramComment>参数1</paramComment>
+                <paramComment>订单id</paramComment>
                 <!-- 参数名称 -->
-                <paramKey>keyWord1</paramKey>
+                <paramKey>idOrder</paramKey>
                 <!-- 参数类型 "Integer", "Long", "Double", "Float", "Boolean", "String" 为基础类型 -->
-                <paramKind>Integer</paramKind>
-            </param>
-
-            <param>
-                <paramComment>参数2</paramComment>
-                <paramKey>keyWord2</paramKey>
-                <paramKind>String</paramKind>
-            </param>
-
-            <param>
-                <paramComment>参数3</paramComment>
-                <paramKey>keyWord3</paramKey>
-                <!-- 参数类型 为类时,文档会读取注解@ApiPlce("脚本业务名称")的字段生成参数表 -->
-                <paramKind>com.dderp.common.entity.order.BusinessOrder</paramKind>
-            </param>
-
-            <param>
-                <paramComment>参数4</paramComment>
-                <paramKey>keyWord4</paramKey>
-                <paramKind>com.dderp.common.entity.order.OrderAfterSaleBill</paramKind>
+                <paramKind>Long</paramKind>
             </param>
         </params>
-
-        <!-- 类说明,文档会生成类的说明表格 -->
-        <webApiBean>com.dderp.common.entity.order.OrderAfterSaleBill</webApiBean>
-        <webApiBean>com.dderp.common.entity.order.OrderDeliveryInfo</webApiBean>
-    </api>
-
-    <api>
-        <methodName>创建配送单</methodName>
-        <sort>11</sort>
-        <businessMethod>Express_bbbbb</businessMethod>
-        <tokenFrom>/order/orderFormToken</tokenFrom>
-        <pageFrom></pageFrom>
-
-        <paramOnly>com.dderp.common.entity.order.BusinessOrder</paramOnly>
-
-        <webApiBean></webApiBean>
     </api>
 </apis>

+ 11 - 0
conf/script/1000/expressApi/BE_Express_CallBack_Invoke_SFTC.groovy

@@ -1,6 +1,7 @@
 import com.dderp.common.api.BusinessExecutor
 import com.dderp.common.api.ERPLockDataService
 import com.dderp.common.api.NoSqlKeysService
+import com.dderp.common.api.StoreService
 import com.dderp.common.datas.ERPModule
 import com.dderp.common.datas.RedisKeys
 import com.dderp.common.entity.base.InvokeCallParams
@@ -28,6 +29,9 @@ class BE_Express_CallBack_Invoke_SFTC implements BusinessExecutor<InvokeCallPara
     @Resource
     NoSqlKeysService keysService
 
+    @Resource
+    StoreService storeService
+
     @Override
     String scriptName() {
         return "顺丰同城数据回调"
@@ -100,10 +104,17 @@ class BE_Express_CallBack_Invoke_SFTC implements BusinessExecutor<InvokeCallPara
         def jsonSlurper = new JsonSlurper()
         def invokeOrder = jsonSlurper.parseText(source.params)
 
+        logger.info(source.params)
+
         logger.info(invokeOrder["url_index"])
         logger.info(invokeOrder["sf_order_id"])
         logger.info(invokeOrder["operator_name"])
 
+        String urlIndex = invokeOrder["url_index"] as String
+        if (StringUtils.equalsIgnoreCase("bindnotify", urlIndex)) {
+            storeService.bindStorePlatform(source.params, "SFTC", source.dataSourceId, source.supplierCode, source.currentUser)
+        }
+
         return RetResult.<InvokeCallResult> successT().result(
                 InvokeCallResult.success()
         )

+ 81 - 11
conf/script/1000/expressApi/BE_Express_PreCreateOrder_SFTC.groovy

@@ -1,14 +1,22 @@
 import com.alibaba.fastjson2.JSON
 import com.dderp.common.api.BusinessExecutor
 import com.dderp.common.api.ERPLockDataService
+import com.dderp.common.api.StoreService
+import com.dderp.common.api.flycat.OrderSearchService
 import com.dderp.common.datas.ERPModule
+import com.dderp.common.datas.ReadOrderOption
+import com.dderp.common.datas.TokenUserFrom
 import com.dderp.common.entity.base.InvokeCallParams
 import com.dderp.common.entity.base.InvokeCallResult
+import com.dderp.common.entity.order.BusinessOrder
+import com.dderp.common.entity.store.StoreInfo
+import com.dderp.common.entity.store.StorePlatform
 import com.dderp.common.http.HttpTools
 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
 
@@ -41,6 +49,12 @@ class BE_Express_PreCreateOrder_SFTC implements BusinessExecutor<InvokeCallParam
     @Resource
     ERPLockDataService lockDataService
 
+    @Resource
+    OrderSearchService orderSearchService
+
+    @Resource
+    StoreService storeService
+
     @Override
     String scriptName() {
         return "顺丰同城预创建订单--价格计算"
@@ -62,24 +76,73 @@ class BE_Express_PreCreateOrder_SFTC implements BusinessExecutor<InvokeCallParam
         def jsonSlurper = new JsonSlurper()
         def invokeOrder = jsonSlurper.parseText(source.params)
 
-        String orderId = invokeOrder["orderId"] as String
-        //todo 获取订单信息
+        String idOrder = invokeOrder["idOrder"] as String
+
+        if (source.currentUser == null) {
+            return RetResult.<InvokeCallParams> errorT().retinfo("请登录")
+        }
+
+        RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(Long.parseLong(idOrder), source.currentUser, source.dataSourceId, source.supplierCode)
+        if (!orderResult.isSuccess()) {
+            return RetResult.<InvokeCallParams> errorT().retinfo("无效的订单信息")
+        }
+
+        BusinessOrder businessOrder = orderResult.result
+        if (source.currentUser.userFrom == TokenUserFrom.PC_STORE_ADMIN.value) {
+            if (businessOrder.idStore != source.currentUser.idBindOrg) {
+                return RetResult.<InvokeCallParams> errorT().retinfo("无效的订单信息")
+            }
+        }
+
+        StoreInfo storeInfo = storeService.getStoreInfo(businessOrder.idStore, source.supplierCode, false, false, true)
+        StorePlatform storePlatform = storeInfo.platformList.find { StringUtils.equalsIgnoreCase("SFTC", it.platformCode) }
+        if (storePlatform == null) {
+            return RetResult.<InvokeCallParams> errorT().retinfo("商家未授权顺丰同城")
+        }
 
         return RetResult.<InvokeCallParams> successT().result(source)
     }
 
     RetResult<InvokeCallResult> execute(InvokeCallParams source) {
         //预创建订单,并非真正发单;用来验证是否可以发单并在成功时返回时效、计价等信息,也可用来验证地址以及时间是否在顺丰的配送范围内
+
+        def jsonSlurper = new JsonSlurper()
+        def invokeOrder = jsonSlurper.parseText(source.params)
+
+        String idOrder = invokeOrder["idOrder"] as String
+
+        RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(Long.parseLong(idOrder), source.currentUser, source.dataSourceId, source.supplierCode, ReadOrderOption.ORDER_FINANCES, ReadOrderOption.ORDER_DELIVERY)
+        if (!orderResult.isSuccess()) {
+            return RetResult.<InvokeCallResult> errorT().retinfo("无效的订单信息")
+        }
+
+        BusinessOrder businessOrder = orderResult.result
+
+        StoreInfo storeInfo = storeService.getStoreInfo(businessOrder.idStore, source.supplierCode, false, false, true)
+        StorePlatform storePlatform = storeInfo.platformList.find { StringUtils.equalsIgnoreCase("SFTC", it.platformCode) }
+        if (storePlatform == null) {
+            return RetResult.<InvokeCallResult> errorT().retinfo("商家未授权顺丰同城")
+        }
+
+
         //秒级时间戳,groovy里面不让用system
         long currentTime = LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8))
 
         def sfOrder = [
-                dev_id      : sfAppId,
-                shop_type   : 1,
-                user_address: "北京市海淀区国泰大厦",
-                push_time   : currentTime
+                dev_id           : sfAppId,
+                shop_id          : storePlatform.platformStoreId,
+                shop_type        : 1,
+                user_address     : businessOrder.orderDeliveryInfo.deliverAddress,
+                push_time        : currentTime,
+                return_flag      : 511,
+                multi_pickup_info: [
+                        [
+                                pickup_shop_address: storeInfo.storeProvince + storeInfo.storeCity + storeInfo.storeDistrict + storeInfo.storeAddress
+                        ]
+                ]
         ]
 
+
         String postData = JSON.toJSONString(sfOrder)
         logger.info("请求数据: " + postData)
         String sign = ExpressApiSign.sfGenerateOpenSign(postData, sfAppId, sfAppKey)
@@ -92,14 +155,21 @@ class BE_Express_PreCreateOrder_SFTC implements BusinessExecutor<InvokeCallParam
                 postData,
                 ["Content-Type": "application/json;charset=utf-8"])
         try {
-            String orderResult = apiResult.get(6000, TimeUnit.SECONDS)
+            String sfOrderResult = apiResult.get(6000, TimeUnit.SECONDS)
 
-            def jsonSlurper = new JsonSlurper()
-            def sfOrderJson = jsonSlurper.parseText(orderResult)
+            def sfOrderJson = jsonSlurper.parseText(sfOrderResult)
 
-            logger.info(sfOrderJson)
+            //统一返回,避免前端获取值不同
+            def preDeliveryInfo = [
+                    //配送金额
+                    totalPrice: sfOrderJson["result"]["total_price"],
+                    //配送距离
+                    distanceMeter: sfOrderJson["result"]["delivery_distance_meter"]
+            ]
 
-            return RetResult.<InvokeCallResult> successT()
+            return RetResult.<InvokeCallResult> successT().result(
+                    InvokeCallResult.success().data(JSON.toJSONString(preDeliveryInfo))
+            )
         } catch (InterruptedException | ExecutionException | TimeoutException e) {
             logger.error(e.getMessage(), e)
 

+ 0 - 74
conf/script/1000/expressApi/BE_Express_StoreBind_SFTC.groovy

@@ -1,74 +0,0 @@
-import com.dderp.common.api.BusinessExecutor
-import com.dderp.common.datas.ERPModule
-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.service.RetResult
-import groovy.json.JsonSlurper
-import org.apache.logging.log4j.LogManager
-import org.apache.logging.log4j.Logger
-
-import javax.annotation.Resource
-
-class BE_Express_StoreBind_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.storeBindUrl")
-    String sfStoreBindUrl
-
-    @Override
-    String scriptName() {
-        return "顺丰同城店铺绑定地址"
-    }
-
-    @Override
-    ERPModule module() {
-        return ERPModule.EXPRESS_API
-    }
-
-    @Override
-    OperatorWait getAWait(InvokeCallParams source) {
-        return OperatorWait.SYNC
-    }
-
-    @Override
-    RetResult<InvokeCallParams> checkExecute(InvokeCallParams source) {
-        //检查门店信息
-        def jsonSlurper = new JsonSlurper()
-        def invokeData = jsonSlurper.parseText(source.params)
-
-        long idStore = invokeData["id"] as long
-        //todo 调用store服务获取门店信息,检查
-
-        return RetResult.<InvokeCallParams> successT().result(source)
-    }
-
-    RetResult<InvokeCallResult> execute(InvokeCallParams source) {
-        def jsonSlurper = new JsonSlurper()
-        def invokeData = jsonSlurper.parseText(source.params)
-
-        long idStore = invokeData["id"] as long
-
-        //todo 调用store服务获取门店信息,检查
-        StoreInfo storeInfo = new StoreInfo()
-
-        //查找顺丰店铺id
-        StorePlatformRequire storePlatformRequire = storeInfo.requireItem("SFTC", "shopId")
-        if (storePlatformRequire == null) {
-            return RetResult.<InvokeCallResult> errorT().retinfo("门店未设置顺丰店铺id")
-        }
-
-        return RetResult.<InvokeCallResult> successT().result(
-                InvokeCallResult.success().data(sfStoreBindUrl + "?" + "dev_id" + sfAppId + "&out_shop_id=" + storePlatformRequire.itemValue)
-        )
-    }
-}

+ 213 - 0
conf/script/1000/storeApi/BE_Store_BindStorePlatform_SFTC.groovy

@@ -0,0 +1,213 @@
+import com.alibaba.fastjson2.JSON
+import com.dderp.business.dao.StoreDao
+import com.dderp.common.api.BusinessExecutor
+import com.dderp.common.api.NoSqlKeysService
+import com.dderp.common.api.PlatformService
+import com.dderp.common.api.StoreService
+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.InvokeCallResult
+import com.dderp.common.entity.base.ProcessStringItem
+import com.dderp.common.entity.inquire.InquireMainInfo
+import com.dderp.common.entity.platform.PlatformInfo
+import com.dderp.common.entity.site.ERPTokenUser
+import com.dderp.common.entity.store.StoreInfo
+import com.dderp.common.entity.store.StorePlatform
+import com.dderp.common.entity.store.StorePlatformRequire
+import com.dderp.common.entity.store.ViewStoreInfo
+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.support.WriteRequest
+import org.elasticsearch.action.update.UpdateRequestBuilder
+import org.elasticsearch.common.xcontent.XContentType
+
+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
+
+import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder
+
+@SuppressWarnings("unused")
+class BE_Store_BindStorePlatform_SFTC implements BusinessExecutor<ProcessStringItem, StorePlatform> {
+
+    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
+    private JsonConvert jsonConvert
+
+    @Resource
+    private TableIdService tableIdService
+
+    @Resource
+    private StoreService storeService
+
+    @Resource
+    private PlatformService platformService
+
+    @Resource
+    private ESClient esClient
+
+    @Resource
+    private NoSqlKeysService keysService
+
+    @Resource
+    private TunaService tunaService
+
+    private StoreDao storeDao
+
+    @Override
+    String scriptName() {
+        return "顺丰同城授权并绑定门店"
+    }
+
+    @Override
+    ERPModule module() {
+        return ERPModule.STORE_API
+    }
+
+    @Override
+    void start(long supplierCode) {
+        storeDao = tunaService.generate(StoreDao.class)
+    }
+
+    RetResult<StorePlatform> execute(ProcessStringItem source) {
+        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 invokeContent = jsonSlurper.parseText(source.itemValue)
+
+        long idStore = invokeContent["out_shop_id"] as Long
+        StoreInfo storeInfo = storeService.getStoreInfo(idStore, supplierCode, false, false, false)
+        if (storeInfo == null) return RetResult.<StorePlatform> errorT().retinfo("门店信息不存在")
+
+        PlatformInfo platformInfo = platformService.getPlatformInfoByCode("SFTC", true, supplierCode)
+        if (platformInfo == null) return RetResult.<StorePlatform> errorT().retinfo("系统档案内未找到[顺丰同城]平台")
+
+        //推送过来的数据不足,需要通过 获取门店信息 接口获取
+        def sfStoreRequest = [
+                dev_id           : sfAppId,
+                shop_id          : invokeContent["shop_id"] as String,
+                push_time        : currentTime,
+
+        ]
+        String postData = JSON.toJSONString(sfStoreRequest)
+        String sign = ExpressApiSign.sfGenerateOpenSign(postData, sfAppId, sfAppKey)
+        String url = sfApiUrl + "getshopinfo?sign=" + sign
+
+        CompletableFuture<String> apiResult = HttpTools.postHttpContentAsync(url,
+                5000,
+                StandardCharsets.UTF_8,
+                postData,
+                ["Content-Type": "application/json;charset=utf-8"])
+        try {
+            String sfStoreResult = apiResult.get(6000, TimeUnit.SECONDS)
+            logger.info(sfStoreResult)
+            def sfStoreJson = jsonSlurper.parseText(sfStoreResult)
+
+            if (sfStoreJson["error_code"] as int == 0) {
+                //查询之前绑定过这个门店没有
+                StorePlatform esStorePlatform = storeService.getStorePlatformByInvokeInfo(invokeContent["shop_id"] as String,
+                        "SFTC", PlatformType.delivery.value, supplierCode)
+
+                if (esStorePlatform != null) {
+                    //之前已绑定过,重新启用即可
+                    logger.info("[" + platformInfo.platformName + "]门店已绑定过[" + invokeContent["shop_id"] as String + "],重新启用")
+
+                    esStorePlatform.enableStatue = 1
+                    StorePlatform.update(esStorePlatform, currentUser.id)
+                    try {
+                        esClient.getClient().prepareUpdate(keysService.getESKey(ESKeys.ES_DELIVER_STORE_INFO_INDEX, supplierCode), ESKeys.ES_DELIVER_STORE_PLATFORM_TYPE,
+                                String.valueOf(esStorePlatform.getId()))
+                                .setDoc(jsonBuilder()
+                                        .startObject()
+                                        .field("enableStatue", esStorePlatform.enableStatue)
+                                        .field("updateBy", esStorePlatform.getUpdateBy())
+                                        .field("updateTimeLong", esStorePlatform.getUpdateTimeLong())
+                                        .endObject())
+                                .get()
+
+
+                        storeDao.enableStorePlatform(esStorePlatform, dataSourceId, supplierCode)
+                        return RetResult.<StorePlatform>successT().result(esStorePlatform)
+                    } catch (IOException e) {
+                        logger.error("绑定门店重新启用出错:" + e.getMessage(), e)
+                        return RetResult.<StorePlatform> errorT().retcode(-1).retinfo("绑定门店重新启用出错:" + e.getMessage())
+                    }
+                } else {
+                    //之前未绑定过,需要新开
+                    StorePlatform storePlatform = new StorePlatform(
+                            id: tableIdService.getTableIdMulti("tbStorePlatform.id", 1, dataSourceId, String.valueOf(supplierCode)),
+                            idStore: idStore,
+                            platformStoreId: invokeContent["shop_id"] as String,
+                            platformShopName: sfStoreJson["result"]["shop_info"]["shop_name"],
+                            platformShopAddress: sfStoreJson["result"]["shop_info"]["path_name"] + sfStoreJson["result"]["shop_info"]["shop_address"],
+                            platformShopPhone: sfStoreJson["result"]["shop_info"]["shop_contact_phone"],
+                            platformShopGeoLat: sfStoreJson["result"]["shop_info"]["latitude"],
+                            platformShopGeoLng: sfStoreJson["result"]["shop_info"]["longitude"],
+                            idPlatformInfo: platformInfo.id,
+                            platformName: platformInfo.platformName,
+                            platformCode: platformInfo.platformCode,
+                            platformType: platformInfo.platformType,
+                            enableStatue: 1
+                    )
+                    StorePlatform.create(storePlatform, currentUser.id)
+
+                    BulkRequestBuilder bulkRequest = esClient.getClient().prepareBulk().setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)
+
+                    bulkRequest.add(esClient.getClient().prepareIndex(
+                            keysService.getESKey(ESKeys.ES_DELIVER_STORE_INFO_INDEX, supplierCode), ESKeys.ES_DELIVER_STORE_PLATFORM_TYPE)
+                            .setId(String.valueOf(storePlatform.getId()))
+                            .setParent(String.valueOf(storePlatform.idStore))
+                            .setSource(source.getConvert("storePlatformWriteConvert").convertTo(storePlatform), XContentType.JSON))
+
+                    BulkResponse bulkResponse = bulkRequest.get()
+
+                    if (bulkResponse.hasFailures()) {
+                        logger.error("门店开通平台出错:" + bulkResponse.buildFailureMessage())
+                        return RetResult.<StorePlatform> errorT().retinfo("门店开通平台出错:" + storePlatform.getPlatformName())
+                    } else {
+                        logger.info("门店开通平台成功")
+                        //写数据库
+                        storeDao.addStorePlatform(storePlatform, storePlatform.getRequireList(), dataSourceId, supplierCode)
+                        return RetResult.<StorePlatform>successT().result(storePlatform)
+                    }
+                }
+            } else {
+                return RetResult.<StorePlatform> errorT().retinfo("无法获取顺丰同城店铺信息")
+            }
+        } catch (InterruptedException | ExecutionException | TimeoutException e) {
+            logger.error(e.getMessage(), e)
+
+            return RetResult.<StorePlatform> errorT().retinfo(e.getMessage())
+        }
+
+    }
+}

+ 51 - 0
conf/script/1000/storeApi/BE_Store_GenerateStoreAuthUrl_SFTC.groovy

@@ -0,0 +1,51 @@
+import com.dderp.common.api.BusinessExecutor
+import com.dderp.common.api.StoreService
+import com.dderp.common.datas.ERPModule
+import com.dderp.common.entity.base.ProcessIdItem
+import com.dderp.common.entity.base.ScriptStringResult
+import com.dderp.common.entity.store.StoreInfo
+import com.sweetfish.service.RetResult
+import org.apache.logging.log4j.LogManager
+import org.apache.logging.log4j.Logger
+
+import javax.annotation.Resource
+
+class BE_Store_GenerateStoreAuthUrl_SFTC implements BusinessExecutor<ProcessIdItem, ScriptStringResult> {
+
+    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.storeBindUrl")
+    String sfStoreBindUrl
+
+    @Resource
+    StoreService storeService
+
+    @Override
+    String scriptName() {
+        return "顺丰同城店铺绑定地址"
+    }
+
+    @Override
+    ERPModule module() {
+        return ERPModule.STORE_API
+    }
+
+    RetResult<ScriptStringResult> execute(ProcessIdItem source) {
+        long idStore = source.id
+
+        StoreInfo storeInfo = storeService.getStoreInfo(idStore, source.supplierCode, false, false, false)
+        if (storeInfo == null) {
+            return RetResult.<ScriptStringResult> errorT().retinfo("无效的门店信息")
+        }
+
+        return RetResult.<ScriptStringResult> successT().result(
+                new ScriptStringResult(sfStoreBindUrl + "?" + "dev_id" + sfAppId + "&out_shop_id=" + idStore)
+        )
+    }
+}

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

@@ -517,6 +517,7 @@ public class StoreServiceImpl extends BaseService implements StoreService {
             return RetResult.<StoreInfo>errorT().retinfo("未找到此门店");
         }
 
+
         esInfo.setStoreName(storeInfo.getStoreName());
         esInfo.setIdBrand(storeInfo.getIdBrand());
         esInfo.setBrandName(storeInfo.getBrandName());

+ 6 - 7
ddWebCore/src/main/java/com/dderp/webcore/rest/StoreRest.java

@@ -226,7 +226,7 @@ public class StoreRest extends BaseService {
         );
     }
 
-    @RestMapping(name = "getStorePlatformList", auth = true, sort = 21, comment = "获取门店某平台授权信息", methods = {"GET", "POST"})
+    @RestMapping(name = "getStorePlatformList", auth = true, sort = 51, comment = "获取门店某平台授权信息", methods = {"GET", "POST"})
     @WebApiBean(result = true, type = StoreInfo.class)
     public CompletableFuture<RMap> getStorePlatformList(
             @RestParam(name = "idStore", comment = "门店id") long idStore,
@@ -236,7 +236,7 @@ public class StoreRest extends BaseService {
         return CompletableFuture.supplyAsync(
                 () -> {
                     RetResult<List<StorePlatform>> esResult = storeService.getStorePlatformList(idStore, platformCode, Long.parseLong(supplierCode));
-                    if (esResult.isSuccess()) {
+                    if (!esResult.isSuccess()) {
                         return RMapUtils.error(HttpCode.BAD_REQUEST.value(), "门店档案不存在");
                     }
                     return RMapUtils.successV2(esResult.getResult(), null, null);
@@ -244,7 +244,7 @@ public class StoreRest extends BaseService {
         );
     }
 
-    @RestMapping(name = "getStorePlatformInfo", auth = true, sort = 21, comment = "获取门店授权平台信息", methods = {"GET", "POST"})
+    @RestMapping(name = "getStorePlatformInfo", auth = true, sort = 52, comment = "获取门店授权平台信息", methods = {"GET", "POST"})
     @WebApiBean(result = true, type = StorePlatform.class)
     public CompletableFuture<RMap> getStorePlatformInfo(
             @RestParam(name = "idStorePlatform", comment = "门店平台授权id") long idStorePlatform,
@@ -262,8 +262,7 @@ public class StoreRest extends BaseService {
     }
 
 
-    @RestMapping(name = "generateStorePlatformAuthUrl", auth = true, sort = 14, comment = "生成门店平台授权地址", methods = {"POST"})
-    @WebApiBean(result = true, type = StoreInfo.class)
+    @RestMapping(name = "generateStorePlatformAuthUrl", auth = true, sort = 53, comment = "生成门店平台授权地址", methods = {"POST"})
     public CompletableFuture<RMap> generateStorePlatformAuthUrl(
             @RestParam(name = "idStore", comment = "门店id") long idStore,
             @RestParam(name = "platformCode", comment = "平台编号") String platformCode,
@@ -284,7 +283,7 @@ public class StoreRest extends BaseService {
 
     //region 门店发票
 
-    @RestMapping(name = "configStoreInvoiceInfo", auth = true, sort = 14, comment = "开启与关闭门店开票", methods = {"POST"})
+    @RestMapping(name = "configStoreInvoiceInfo", auth = true, sort = 70, comment = "开启与关闭门店开票", methods = {"POST"})
     @WebApiBean(result = true, type = StoreInvoiceInfo.class)
     public CompletableFuture<RMap> configStoreInvoiceInfo(
             @RestParam(name = "storeInvoiceInfo", comment = "门店开票信息") StoreInvoiceInfo storeInvoiceInfo,
@@ -304,7 +303,7 @@ public class StoreRest extends BaseService {
     //endregion
 
     //region 门店登录
-    @RestMapping(name = "login", logging = 1, sort = 1, comment = "登录", methods = {"POST"})
+    @RestMapping(name = "login", logging = 1, sort = 100, comment = "登录", methods = {"POST"})
     public CompletableFuture<RMap> login(
             @RestParam(name = "user", comment = "登录人员信息,只需要账号和密码") LoginRequest bean,
             @RestParam(name = "supplierId", comment = "工厂id") long supplierId,

+ 9 - 6
ddWebCore/src/main/java/com/dderp/webcore/rest/flycat/ExpressOutRest.java

@@ -1,12 +1,12 @@
 package com.dderp.webcore.rest.flycat;
 
+import com.dderp.common.api.SystemService;
 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.*;
@@ -27,20 +27,23 @@ public class ExpressOutRest extends BaseService {
     @Resource
     ExpressOutService expressOutService;
 
-    @RestMapping(name = "testExpress", sort = 1, comment = "测试", methods = {"GET", "POST"})
-    public CompletableFuture<RMap> testExpress(
+    @Resource
+    SystemService systemService;
+
+    @RestMapping(name = "expressFormToken", auth = true, sort = 1, comment = "请求token", methods = {"POST"})
+    public CompletableFuture<RMap> orderFormToken(
             @RestParam(name = "&", comment = "登录用户,无需传入") ERPTokenUser currentUser,
             @RestHeader(name = ERPHeader.HTTPHEADER_DATASOURCE) String dataSourceId,
             @RestHeader(name = ERPHeader.HTTPHEADER_SUPPLIER) String supplierCode) {
         return CompletableFuture.supplyAsync(
                 () -> {
-                    RetResult<ProcessStringItem> infoResult = expressOutService.test(dataSourceId, Long.parseLong(supplierCode));
-                    return RMapUtils.successV2(infoResult, null, null);
+                    String token = systemService.requestFormToken("expressOutForm", Long.parseLong(supplierCode));
+                    return RMapUtils.successV2(token, null, null);
                 }, getExecutor()
         );
     }
 
-    @RestMapping(name = "callExpress", auth = true, sort = 1, logging = 4, comment = "配送快递接口", methods = {"POST"})
+    @RestMapping(name = "callExpress", auth = true, sort = 2, logging = 4, comment = "配送快递接口", methods = {"POST"})
     @WebApiFile(fileName = "expressOut.xml")
     public CompletableFuture<InvokeCallResult> callExpress(
             @RestBody(comment = "提交数据") InvokeCallParams callParams,

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

@@ -109,7 +109,7 @@ public class OrderRest extends BaseService {
     @WebApiBean(type = OrderDetailItem.class, result = true)
     @WebApiBean(type = OrderDeliveryInfo.class, result = true)
     @WebApiBean(type = OrderRiderItem.class, result = true)
-    public CompletableFuture<RMap> getSendOrder(
+    public CompletableFuture<RMap> getBusinessOrder(
             @RestParam(name = "idOrder", comment = "订单id") long idOrder,
             @RestParam(name = "options", comment = "读取内容,不传为全部", required = false) String options,
             @RestParam(name = "&", comment = "登录用户,无需传入") ERPTokenUser currentUser,