Browse Source

订单配送发单-顺丰同城

jlutt@163.com 2 years ago
parent
commit
95245a914f

+ 31 - 0
conf/apiFiles/expressOut.xml

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

+ 10 - 0
conf/esTemplate/businessorder.json

@@ -113,6 +113,16 @@
           }
         }
       },
+      "outGoingPlatformBillCode": {
+        "type": "text",
+        "index": "analyzed",
+        "analyzer": "codefull_analyzer",
+        "fields": {
+          "raw": {
+            "type": "keyword"
+          }
+        }
+      },
       "voidFlagIn": {
         "type": "integer"
       },

+ 12 - 0
conf/script/1000/business/BE_DocClearScriptCache.groovy

@@ -1,5 +1,6 @@
 import com.dderp.common.api.BusinessExecutor
 import com.dderp.common.api.DocInfoService
+import com.dderp.common.api.StoreService
 import com.dderp.common.api.SystemService
 import com.dderp.common.api.flycat.ExpressOutService
 import com.dderp.common.api.flycat.OrderSearchService
@@ -34,6 +35,9 @@ class BE_DocClearScriptCache implements BusinessExecutor<ProcessEntityItem<ERPMo
     ExpressOutService expressOutService
 
     @Resource
+    StoreService storeService
+
+    @Resource
     OrderService orderService
 
     @Resource
@@ -61,6 +65,7 @@ class BE_DocClearScriptCache implements BusinessExecutor<ProcessEntityItem<ERPMo
             systemService.reloadScriptCache(source.inputItem.code, ERPModule.SYSTEM, source.dataSourceId, source.supplierCode)
             docInfoService.reloadScriptCache(source.inputItem.code, ERPModule.SYSTEM, source.dataSourceId, source.supplierCode)
             expressOutService.reloadScriptCache(source.inputItem.code, ERPModule.SYSTEM, source.dataSourceId, source.supplierCode)
+            storeService.reloadScriptCache(source.inputItem.code, ERPModule.SYSTEM, source.dataSourceId, source.supplierCode)
             orderService.reloadScriptCache(source.inputItem.code, ERPModule.SYSTEM, source.dataSourceId, source.supplierCode)
             orderSearchService.reloadScriptCache(source.inputItem.code, ERPModule.SYSTEM, source.dataSourceId, source.supplierCode)
         }
@@ -110,6 +115,13 @@ class BE_DocClearScriptCache implements BusinessExecutor<ProcessEntityItem<ERPMo
                         orderSearchService.reloadScriptCache(source.getInputItem().getCode(), erpModule, source.getDataSourceId(), source.getSupplierCode())
                     }
                     break
+                case ERPModule.STORE_API:
+                    if (source.getOperation() == BusinessOperation.SAVE) {
+                        storeService.invalidateScriptCache(source.getSupplierCode() + "-" + source.getInputItem().getCode())
+                    } else {
+                        storeService.reloadScriptCache(source.getInputItem().getCode(), erpModule, source.getDataSourceId(), source.getSupplierCode())
+                    }
+                    break
                 case ERPModule.ADDRESSPARSER:
                     break
                 case ERPModule.APP:

+ 168 - 20
conf/script/1000/expressApi/BE_Express_CreateOrder_SFTC.groovy

@@ -1,22 +1,36 @@
 import com.alibaba.fastjson2.JSON
+import com.dderp.business.dao.OrderDao
 import com.dderp.common.api.BusinessExecutor
 import com.dderp.common.api.ERPLockDataService
 import com.dderp.common.api.StoreService
+import com.dderp.common.api.SupplierInitService
 import com.dderp.common.api.flycat.OrderSearchService
-import com.dderp.common.datas.ERPModule
-import com.dderp.common.datas.RedisKeys
+import com.dderp.common.api.flycat.OrderStepService
+import com.dderp.common.datas.*
+import com.dderp.common.datas.flycat.BusinessOrderStatus
 import com.dderp.common.entity.base.InvokeCallParams
 import com.dderp.common.entity.base.InvokeCallResult
 import com.dderp.common.entity.order.BusinessOrder
+import com.dderp.common.entity.order.OrderStep
 import com.dderp.common.entity.store.StoreInfo
-import com.dderp.common.entity.store.StorePlatformRequire
+import com.dderp.common.entity.store.StorePlatform
 import com.dderp.common.http.HttpTools
+import com.dderp.common.tool.ERPUtils
+import com.dySweetFishPlugin.elasticsearch.ESClient
 import com.dySweetFishPlugin.sql.dao.OperatorWait
+import com.dySweetFishPlugin.sql.dao.TunaService
 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
+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.UpdateRequest
+import org.elasticsearch.common.xcontent.XContentType
 
 import javax.annotation.Resource
 import java.nio.charset.StandardCharsets
@@ -27,6 +41,8 @@ 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_Express_CreateOrder_SFTC implements BusinessExecutor<InvokeCallParams, InvokeCallResult> {
 
@@ -44,6 +60,11 @@ class BE_Express_CreateOrder_SFTC implements BusinessExecutor<InvokeCallParams,
     @Resource
     JsonConvert jsonConvert
 
+    @Resource(name = "APP_HOME")
+    private String appHome
+
+    private String appid
+
     @Resource
     ERPLockDataService lockDataService
 
@@ -51,8 +72,22 @@ class BE_Express_CreateOrder_SFTC implements BusinessExecutor<InvokeCallParams,
     OrderSearchService orderSearchService
 
     @Resource
+    OrderStepService orderStepService
+
+    @Resource
     StoreService storeService
 
+    @Resource
+    TunaService tunaService
+
+    @Resource
+    ESClient esClient
+
+    @Resource
+    SupplierInitService supplierService
+
+    private OrderDao orderDao
+
     @Override
     String scriptName() {
         return "顺丰同城创建订单"
@@ -69,19 +104,45 @@ class BE_Express_CreateOrder_SFTC implements BusinessExecutor<InvokeCallParams,
     }
 
     @Override
+    boolean needToken(InvokeCallParams source) {
+        return true
+    }
+
+    @Override
+    void start(long supplierCode) {
+        orderDao = tunaService.generate(OrderDao.class)
+    }
+
+    @Override
     RetResult<InvokeCallParams> checkExecute(InvokeCallParams source) {
         //检查订单信息
         def jsonSlurper = new JsonSlurper()
         def invokeOrder = jsonSlurper.parseText(source.params)
 
-        String orderId = invokeOrder["orderId"] as String
-        //todo 获取订单信息
+        String orderId = invokeOrder["idOrder"] as String
+
+        if (source.currentUser == null) {
+            return RetResult.<InvokeCallParams> errorT().retinfo("请登录")
+        }
 
         RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(Long.parseLong(orderId), 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)
     }
 
@@ -91,7 +152,7 @@ class BE_Express_CreateOrder_SFTC implements BusinessExecutor<InvokeCallParams,
         def jsonSlurper = new JsonSlurper()
         def invokeOrder = jsonSlurper.parseText(source.params)
 
-        String orderId = invokeOrder["orderId"] as String
+        String orderId = invokeOrder["idOrder"] as String
 
         if (lockDataService.hLockAdd(orderId, RedisKeys.KEY_ERP_WORKING_ORDER, source.supplierCode) > 1) {
             return RetResult.<InvokeCallParams> errorT().retinfo(orderId + "提交工作中,请稍后刷新即可,无需重复操作")
@@ -101,13 +162,15 @@ class BE_Express_CreateOrder_SFTC implements BusinessExecutor<InvokeCallParams,
 
     @Override
     void afterExecute(boolean executeError, InvokeCallParams source, InvokeCallResult dest) {
-        //锁定下订单数据
+        //锁订单数据
         def jsonSlurper = new JsonSlurper()
         def invokeOrder = jsonSlurper.parseText(source.params)
 
-        String orderId = invokeOrder["orderId"] as String
+        String orderId = invokeOrder["idOrder"] as String
 
         lockDataService.hLockDel(orderId, RedisKeys.KEY_ERP_WORKING_ORDER, source.supplierCode)
+
+
     }
 
     RetResult<InvokeCallResult> execute(InvokeCallParams source) {
@@ -115,9 +178,12 @@ class BE_Express_CreateOrder_SFTC implements BusinessExecutor<InvokeCallParams,
         def jsonSlurper = new JsonSlurper()
         def invokeOrder = jsonSlurper.parseText(source.params)
 
-        String orderId = invokeOrder["orderId"] as String
+        String orderId = invokeOrder["idOrder"] as String
+
+        RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(Long.parseLong(orderId),
+                source.currentUser, source.dataSourceId, source.supplierCode,
+                ReadOrderOption.ORDER_FINANCES, ReadOrderOption.ORDER_DELIVERY, ReadOrderOption.ORDER_PRODUCT)
 
-        RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(Long.parseLong(orderId), source.currentUser, source.dataSourceId, source.supplierCode)
         if (!orderResult.isSuccess()) {
             return RetResult.<InvokeCallResult> errorT().retinfo("无效的订单信息")
         }
@@ -128,9 +194,9 @@ class BE_Express_CreateOrder_SFTC implements BusinessExecutor<InvokeCallParams,
         if (storeInfo == null) {
             return RetResult.<InvokeCallResult> errorT().retinfo("无效的门店信息")
         }
-        StorePlatformRequire storePlatformRequire = storeInfo.requireItem("SFTC", "shopId")
-        if (storePlatformRequire == null) {
-            return RetResult.<InvokeCallResult> errorT().retinfo("门店未设置顺丰店铺id")
+        StorePlatform storePlatform = storeInfo.platformList.find { StringUtils.equalsIgnoreCase("SFTC", it.platformCode) }
+        if (storePlatform == null) {
+            return RetResult.<InvokeCallResult> errorT().retinfo("商家未授权顺丰同城")
         }
 
         //秒级时间戳,groovy里面不让用system
@@ -139,21 +205,22 @@ class BE_Express_CreateOrder_SFTC implements BusinessExecutor<InvokeCallParams,
 
         def sfOrder = [
                 dev_id        : sfAppId,
-                shop_id       : storePlatformRequire.itemValue,
+                shop_id       : storePlatform.platformStoreId,
                 shop_type     : 1,
                 shop_order_id : businessOrder.orderCode,
                 order_source  : businessOrder.incomePlatformName,
                 order_sequence: String.valueOf(businessOrder.orderSequence),
                 order_time    : currentTime,
                 push_time     : currentTime,
+                return_flag   : 511,
                 version       : 19,
 
                 order_detail  : [
-                        total_price     : 30100L,
+                        total_price     : ERPUtils.money100(businessOrder.orderFinances.orderMoney),
                         product_type    : 1,
-                        weight_gram     : 3000L,
-                        product_num     : 15,
-                        product_type_num: 5,
+                        weight_gram     : 1L,
+                        product_num     : businessOrder.detailItemList.sum { it.itemCount },
+                        product_type_num: 1,
                         product_detail  : businessOrder.detailItemList.collect { detailItem ->
                             def productDetail = [
                                     product_name: detailItem.itemName,
@@ -184,12 +251,93 @@ class BE_Express_CreateOrder_SFTC implements BusinessExecutor<InvokeCallParams,
                 ["Content-Type": "application/json;charset=utf-8"])
         try {
             String sfCreateOrderJson = apiResult.get(6000, TimeUnit.SECONDS)
-
             def sfOrderData = jsonSlurper.parseText(sfCreateOrderJson)
 
+            //下单没有发送异步消息
             logger.info(sfOrderData)
 
-            return RetResult.<InvokeCallResult> successT()
+            if (sfOrderData["error_code"] == 0) {
+                businessOrder.outGoingPlatformId = storePlatform.idPlatformInfo
+                businessOrder.outGoingPlatformName = storePlatform.platformName
+                businessOrder.outGoingPlatformOrderCode = sfOrderData["result"]["sf_order_id"]
+                businessOrder.outGoingPlatformBillCode = sfOrderData["result"]["sf_bill_id"]
+
+                businessOrder.orderFinances.expressTotalPrice = ERPUtils.money(sfOrderData["result"]["total_price"] as long)
+                businessOrder.orderFinances.expressFreeSendServiceFee = ERPUtils.money(sfOrderData["result"]["free_send_service_fee"] as long)
+                businessOrder.orderFinances.expressTotalPayMoney = ERPUtils.money(sfOrderData["result"]["total_pay_money"] as long)
+                businessOrder.orderFinances.expressRealPayMoney = ERPUtils.money(sfOrderData["result"]["real_pay_money"] as long)
+                businessOrder.orderFinances.expressCouponsTotalFee = ERPUtils.money(sfOrderData["result"]["coupons_total_fee"] as long)
+
+                businessOrder.orderStatus = BusinessOrderStatus.delivery.value
+
+                OrderStep expressStep = orderStepService.parseOrderStep(businessOrder.id,
+                        "配送发单",
+                        "[" + storePlatform.platformName + "]配送单号: " + businessOrder.outGoingPlatformOrderCode,
+                        source.currentUser)
+
+                List<OrderStep> stepList = new ArrayList<>()
+                stepList << expressStep
+
+                int iData = orderDao.expressCreateOrder(businessOrder, businessOrder.orderFinances, stepList, source.dataSourceId, source.supplierCode + "_1")
+
+                if (iData >= 0) {
+                    BulkRequestBuilder bulkRequest = esClient.getClient().prepareBulk().setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)
+                    try {
+                        UpdateRequest orderRequest = new UpdateRequest(
+                                supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1),
+                                ESKeys.ES_DELIVER_BUSINESS_ORDER_TYPE, String.valueOf(businessOrder.id))
+                                .doc(jsonBuilder()
+                                        .startObject()
+                                        .field("outGoingPlatformId", businessOrder.outGoingPlatformId)
+                                        .field("outGoingPlatformName", businessOrder.outGoingPlatformName)
+                                        .field("outGoingPlatformOrderCode", businessOrder.outGoingPlatformOrderCode)
+                                        .field("outGoingPlatformBillCode", businessOrder.outGoingPlatformBillCode)
+                                        .field("orderStatus", businessOrder.orderStatus)
+                                        .endObject())
+                        bulkRequest.add(orderRequest)
+
+                        UpdateRequest orderFinanceRequest = new UpdateRequest(
+                                supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1),
+                                ESKeys.ES_DELIVER_ORDER_FINANCES_TYPE, String.valueOf(businessOrder.orderFinances.id))
+                                .parent(String.valueOf(businessOrder.id))
+                                .doc(jsonBuilder()
+                                        .startObject()
+                                        .field("expressTotalPrice", businessOrder.orderFinances.expressTotalPrice)
+                                        .field("expressFreeSendServiceFee", businessOrder.orderFinances.expressFreeSendServiceFee)
+                                        .field("expressTotalPayMoney", businessOrder.orderFinances.expressTotalPayMoney)
+                                        .field("expressRealPayMoney", businessOrder.orderFinances.expressRealPayMoney)
+                                        .field("expressCouponsTotalFee", businessOrder.orderFinances.expressCouponsTotalFee)
+                                        .endObject())
+                        bulkRequest.add(orderFinanceRequest)
+
+                        stepList.each { orderStep ->
+                            IndexRequestBuilder orderStepRequest = esClient.getClient()
+                                    .prepareIndex(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_ORDER_STEP_INDEX, 1),
+                                            ESKeys.ES_DELIVER_ORDER_STEP_TYPE)
+                                    .setSource(jsonConvert.convertTo(orderStep), XContentType.JSON)
+                            bulkRequest.add(orderStepRequest)
+                        }
+
+                        //写入到es索引中
+                        BulkResponse bulkResponse = bulkRequest.execute().actionGet()
+                        if (bulkResponse.hasFailures()) {
+                            logger.error("订单配送发单错误:" + bulkResponse.buildFailureMessage())
+                        }
+                    } catch (Exception e) {
+                        logger.error("订单修改基础信息出错:" + e.getMessage(), e)
+                    }
+                }
+
+                return RetResult.<InvokeCallResult> successT().result(
+                        InvokeCallResult.success().data(JSON.toJSONString(sfOrderData))
+                )
+            } else {
+                return RetResult.<InvokeCallResult> successT().result(
+                        InvokeCallResult.error(HttpCode.BAD_REQUEST.value(), sfOrderData["error_msg"] as String)
+                )
+            }
+
+
         } catch (InterruptedException | ExecutionException | TimeoutException e) {
             logger.error(e.getMessage(), e)
 

+ 203 - 0
conf/script/1000/expressApi/BE_Express_PreCreateOrder_DDPT.groovy

@@ -0,0 +1,203 @@
+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.dderp.common.tool.ERPUtils
+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
+
+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
+
+@SuppressWarnings("unused")
+class BE_Express_PreCreateOrder_DDPT 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
+    JsonConvert jsonConvert
+
+    @Resource
+    ERPLockDataService lockDataService
+
+    @Resource
+    OrderSearchService orderSearchService
+
+    @Resource
+    StoreService storeService
+
+    @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 invokeOrder = jsonSlurper.parseText(source.params)
+
+        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("无效的订单信息")
+            }
+        }
+
+        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("DDPT", it.platformCode) }
+        if (storePlatform == null) {
+            //统一返回,避免前端获取值不同
+            def preDeliveryInfo = [
+                    errCode      : 1001,
+                    errMsg       : "商家未授权达达跑腿",
+                    //配送金额
+                    totalPrice   : 0,
+                    //配送距离
+                    distanceMeter: 0
+            ]
+            return RetResult.<InvokeCallResult> successT().result(
+                    InvokeCallResult.success().data(JSON.toJSONString(preDeliveryInfo))
+            )
+        }
+
+
+        //秒级时间戳,groovy里面不让用system
+        long currentTime = LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8))
+
+        def sfOrder = [
+                dev_id           : sfAppId,
+                shop_id          : storePlatform.platformStoreId,
+                product_type     : 1,
+                shop_type        : 1,
+                user_address     : ERPUtils.convertNullToBlank(businessOrder.orderDeliveryInfo.deliverAddress),
+                push_time        : currentTime,
+                return_flag      : 511,
+                multi_pickup_info: [
+                        [
+                                pickup_shop_address: storePlatform.platformShopAddress
+                        ]
+                ]
+        ]
+
+
+        String postData = JSON.toJSONString(sfOrder)
+        logger.info("请求数据: " + postData)
+        String sign = ExpressApiSign.sfGenerateOpenSign(postData, sfAppId, sfAppKey)
+
+        String url = sfApiUrl + "precreateorder?sign=" + sign
+
+        CompletableFuture<String> apiResult = HttpTools.postHttpContentAsync(url,
+                5000,
+                StandardCharsets.UTF_8,
+                postData,
+                ["Content-Type": "application/json;charset=utf-8"])
+        try {
+            String sfOrderResult = apiResult.get(6000, TimeUnit.SECONDS)
+
+            def sfOrderJson = jsonSlurper.parseText(sfOrderResult)
+
+            if (sfOrderJson["error_code"] == 0) {
+                //统一返回,避免前端获取值不同
+                def preDeliveryInfo = [
+                        errCode      : 0,
+                        errMsg       : "",
+                        //配送金额
+                        totalPrice   : sfOrderJson["result"]["total_price"],
+                        //配送距离
+                        distanceMeter: sfOrderJson["result"]["delivery_distance_meter"]
+                ]
+                return RetResult.<InvokeCallResult> successT().result(
+                        InvokeCallResult.success().data(JSON.toJSONString(preDeliveryInfo))
+                )
+            } else {
+                def preDeliveryInfo = [
+                        errCode      : 1000,
+                        errMsg       : sfOrderJson["error_msg"] as String,
+                        //配送金额
+                        totalPrice   : 0,
+                        //配送距离
+                        distanceMeter: 0
+                ]
+                return RetResult.<InvokeCallResult> successT().result(
+                        InvokeCallResult.success().data(JSON.toJSONString(preDeliveryInfo))
+                )
+            }
+
+        } catch (InterruptedException | ExecutionException | TimeoutException e) {
+            logger.error(e.getMessage(), e)
+
+            return RetResult.<InvokeCallResult> errorT().retinfo(e.getMessage())
+        }
+    }
+}
+

+ 42 - 20
conf/script/1000/expressApi/BE_Express_PreCreateOrder_SFTC.groovy

@@ -12,6 +12,7 @@ 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.dderp.common.tool.ERPUtils
 import com.dySweetFishPlugin.sql.dao.OperatorWait
 import com.sweetfish.convert.json.JsonConvert
 import com.sweetfish.service.RetResult
@@ -94,12 +95,6 @@ class BE_Express_PreCreateOrder_SFTC implements BusinessExecutor<InvokeCallParam
             }
         }
 
-        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)
     }
 
@@ -121,7 +116,18 @@ class BE_Express_PreCreateOrder_SFTC implements BusinessExecutor<InvokeCallParam
         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("商家未授权顺丰同城")
+            //统一返回,避免前端获取值不同
+            def preDeliveryInfo = [
+                    errCode      : 1001,
+                    errMsg       : "商家未授权顺丰同城",
+                    //配送金额
+                    totalPrice   : 0,
+                    //配送距离
+                    distanceMeter: 0
+            ]
+            return RetResult.<InvokeCallResult> successT().result(
+                    InvokeCallResult.success().data(JSON.toJSONString(preDeliveryInfo))
+            )
         }
 
 
@@ -131,18 +137,18 @@ class BE_Express_PreCreateOrder_SFTC implements BusinessExecutor<InvokeCallParam
         def sfOrder = [
                 dev_id           : sfAppId,
                 shop_id          : storePlatform.platformStoreId,
+                product_type     : 1,
                 shop_type        : 1,
-                user_address     : businessOrder.orderDeliveryInfo.deliverAddress,
+                user_address     : ERPUtils.convertNullToBlank(businessOrder.orderDeliveryInfo.deliverAddress),
                 push_time        : currentTime,
                 return_flag      : 511,
                 multi_pickup_info: [
                         [
-                                pickup_shop_address: storeInfo.storeProvince + storeInfo.storeCity + storeInfo.storeDistrict + storeInfo.storeAddress
+                                pickup_shop_address: storePlatform.platformShopAddress
                         ]
                 ]
         ]
 
-
         String postData = JSON.toJSONString(sfOrder)
         logger.info("请求数据: " + postData)
         String sign = ExpressApiSign.sfGenerateOpenSign(postData, sfAppId, sfAppKey)
@@ -159,17 +165,33 @@ class BE_Express_PreCreateOrder_SFTC implements BusinessExecutor<InvokeCallParam
 
             def sfOrderJson = jsonSlurper.parseText(sfOrderResult)
 
-            //统一返回,避免前端获取值不同
-            def preDeliveryInfo = [
-                    //配送金额
-                    totalPrice: sfOrderJson["result"]["total_price"],
-                    //配送距离
-                    distanceMeter: sfOrderJson["result"]["delivery_distance_meter"]
-            ]
+            if (sfOrderJson["error_code"] == 0) {
+                //统一返回,避免前端获取值不同
+                def preDeliveryInfo = [
+                        errCode      : 0,
+                        errMsg       : "",
+                        //配送金额
+                        totalPrice   : sfOrderJson["result"]["total_price"],
+                        //配送距离
+                        distanceMeter: sfOrderJson["result"]["delivery_distance_meter"]
+                ]
+                return RetResult.<InvokeCallResult> successT().result(
+                        InvokeCallResult.success().data(JSON.toJSONString(preDeliveryInfo))
+                )
+            } else {
+                def preDeliveryInfo = [
+                        errCode      : 1000,
+                        errMsg       : sfOrderJson["error_msg"] as String,
+                        //配送金额
+                        totalPrice   : 0,
+                        //配送距离
+                        distanceMeter: 0
+                ]
+                return RetResult.<InvokeCallResult> successT().result(
+                        InvokeCallResult.success().data(JSON.toJSONString(preDeliveryInfo))
+                )
+            }
 
-            return RetResult.<InvokeCallResult> successT().result(
-                    InvokeCallResult.success().data(JSON.toJSONString(preDeliveryInfo))
-            )
         } catch (InterruptedException | ExecutionException | TimeoutException e) {
             logger.error(e.getMessage(), e)
 

+ 26 - 1
conf/sqlroot/com/dderp/business/dao/OrderDao.dql

@@ -138,4 +138,29 @@ storeRealCollection = #{storerealcollection},omeServiceFee = #{omeservicefee},up
  update $table$ set deliverProvince = #{deliverprovince},deliverCity = #{delivercity},deliverDistract = #{deliverdistract},
  deliverAddress = #{deliveraddress},geoLocationSerial = #{geolocationserial},receiveMan = #{receiveman},contractPhone = #{contractphone},
  deliverTimeliness = #{delivertimeliness},bookingDeliverTime = #{bookingdelivertime},bookingDeliverTimeLong = #{bookingdelivertimelong},customerInvoiceInfo = #{customerinvoiceinfo},
- updateBy = #{updateby},updateTime = #{updatetime},updateTimeLong = #{updatetimelong} where id = #{id};
+ updateBy = #{updateby},updateTime = #{updatetime},updateTimeLong = #{updatetimelong} where id = #{id};
+
+
+  -- [expressCreateOrder]
+  update $table$ set
+  outGoingPlatformId = #{outgoingplatformid},
+  outGoingPlatformName = #{outgoingplatformname},
+  outGoingPlatformOrderCode = #{outgoingplatformordercode},
+  outGoingPlatformBillCode = #{outgoingplatformbillcode},
+  orderStatus = #{orderStatus},
+  updateBy = #{updateby},
+  updateTime = #{updatetime},
+  updateTimeLong = #{updatetimelong}
+  where id = #{id};
+
+    -- [expressCreateOrderFinance]
+    update $table$ set
+    expressTotalPrice = #{expresstotalprice},
+    expressFreeSendServiceFee = #{expressfreesendservicefee},
+    expressTotalPayMoney = #{expresstotalpaymoney},
+    expressRealPayMoney = #{expressrealpaymoney},
+    expressCouponsTotalFee = #{expresscouponstotalfee},
+    updateBy = #{updateby},
+    updateTime = #{updatetime},
+    updateTimeLong = #{updatetimelong}
+    where id = #{id};

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

@@ -94,9 +94,9 @@ public interface OrderDao extends DaoRepository {
     @SqlId(clazz = OrderDao.class, sql = "addOrderAfterSaleBill", table = "deOrderAfterSaleBill", tableParam = 5, params = {2}, sort = 2)
     @SqlId(clazz = OrderDao.class, sql = "addOrderStep", table = "deOrderStep", tableParam = 5, params = {3}, sort = 3)
     int partRefundOrder(OrderFinances orderFinances,
-                           OrderAfterSaleBill afterSaleBill,
-                           List<OrderStep> stepList,
-                           @DatabaseShardingBy String dataSourceId, String tableKey);
+                        OrderAfterSaleBill afterSaleBill,
+                        List<OrderStep> stepList,
+                        @DatabaseShardingBy String dataSourceId, String tableKey);
 
 
     @Sharding(databaseShardingStrategy = SupplierDataBaseShardingStrategy.class, tableShardingStrategy = OrderTableShardingStrategy.class)
@@ -104,8 +104,8 @@ public interface OrderDao extends DaoRepository {
     @SqlId(clazz = OrderDao.class, sql = "updateOrderFinances", table = "deOrderFinances", tableParam = 4, params = {1}, sort = 1)
     @SqlId(clazz = OrderDao.class, sql = "addOrderStep", table = "deOrderStep", tableParam = 4, params = {2}, sort = 2)
     int orderConfirmBill(OrderFinances orderFinances,
-                        List<OrderStep> stepList,
-                        @DatabaseShardingBy String dataSourceId, String tableKey);
+                         List<OrderStep> stepList,
+                         @DatabaseShardingBy String dataSourceId, String tableKey);
 
 
     @Sharding(databaseShardingStrategy = SupplierDataBaseShardingStrategy.class, tableShardingStrategy = OrderTableShardingStrategy.class)
@@ -118,5 +118,17 @@ public interface OrderDao extends DaoRepository {
                             List<OrderStep> stepList,
                             @DatabaseShardingBy String dataSourceId, String tableKey);
 
+    //region 配送平台业务
+
+    @Sharding(databaseShardingStrategy = SupplierDataBaseShardingStrategy.class, tableShardingStrategy = OrderTableShardingStrategy.class)
+    @DAOMethod(operator = OperatorType.UPDATE, owait = OperatorWait.AWAIT)
+    @SqlId(clazz = OrderDao.class, sql = "expressCreateOrder", table = "deBusinessOrder", tableParam = 5, params = {1}, sort = 1)
+    @SqlId(clazz = OrderDao.class, sql = "expressCreateOrderFinance", table = "deOrderFinances", tableParam = 5, params = {2}, sort = 2)
+    @SqlId(clazz = OrderDao.class, sql = "addOrderStep", table = "deOrderStep", tableParam = 5, params = {3}, sort = 3)
+    int expressCreateOrder(BusinessOrder businessOrder,
+                           OrderFinances orderFinances,
+                           List<OrderStep> stepList,
+                           @DatabaseShardingBy String dataSourceId, String tableKey);
+    //endregion
 
 }

+ 9 - 2
ddBusiness/src/main/java/com/dderp/business/service/PlatformServiceImpl.java

@@ -27,6 +27,7 @@ import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 @AutoLoad(value = false)
 @Local
@@ -69,8 +70,14 @@ public class PlatformServiceImpl extends BaseService implements PlatformService
 
     }
 
-    public List<PlatformInfo> getRedisPlatformList(long supplierCode) {
-        return getRedisDocInfos(keysService.getRedisKey(RedisKeys.KEY_DELIVER_PLATFORM_INFO, supplierCode), PlatformInfo.class);
+    public List<PlatformInfo> getRedisPlatformList(int platformType, long supplierCode) {
+        List<PlatformInfo> redisList = getRedisDocInfos(keysService.getRedisKey(RedisKeys.KEY_DELIVER_PLATFORM_INFO, supplierCode), PlatformInfo.class);
+
+        if (platformType < 0) {
+            return redisList;
+        } else {
+            return redisList.stream().filter((x) -> x.getPlatformType() == platformType).sorted(Comparator.comparingLong(PlatformInfo::getId)).collect(Collectors.toList());
+        }
     }
 
     @Override

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

@@ -689,7 +689,7 @@ public class StoreServiceImpl extends BaseService implements StoreService {
         );
 
         List<Map<String, String>> viewStoreInfoList = new ArrayList<>();
-        List<PlatformInfo> platformInfoList = platformService.getRedisPlatformList(supplierCode);
+        List<PlatformInfo> platformInfoList = platformService.getRedisPlatformList(-1, supplierCode);
 
         if (!idStores.isEmpty()) {
             long[] idStoreArray = ERPUtils.longListToArray(idStores);

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

@@ -17,7 +17,7 @@ public interface PlatformService extends ScriptService {
     @SuppressWarnings("rawtypes")
     RetResult<List<PlatformInfo>> queryPlatformList(RMap params, PageFlipper pageFlipper, String dataSourceId, long supplierCode);
 
-    List<PlatformInfo> getRedisPlatformList(long supplierCode);
+    List<PlatformInfo> getRedisPlatformList(int platformType, long supplierCode);
 
     PlatformInfo getPlatformInfo(long idPlatformInfo, boolean withDetail, long supplierCode);
 

+ 0 - 1
ddCommon/src/main/java/com/dderp/common/api/flycat/OrderStepService.java

@@ -22,7 +22,6 @@ public interface OrderStepService extends ScriptService {
      * 订单结构转订单脚印结构
      *
      * @param idOrder     订单
-     * @param orderYear   订单年份
      * @param workMemo    备注
      * @param workExplain 描述
      * @param currentUser 当前用户

+ 1 - 1
ddCommon/src/main/java/com/dderp/common/base/BaseService.java

@@ -670,7 +670,7 @@ public abstract class BaseService extends AbstractService {
                                     logger.error(e.getMessage(), e);
                                 }
                             });
-                            return RetResult.successT();
+                            return RetResult.<InvokeCallResult>successT().result(InvokeCallResult.success());
                         }
                     }
                 } catch (Exception e2) {

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

@@ -101,6 +101,10 @@ public class BusinessOrder extends BaseEntity {
     @Comment("配送平台订单编号")
     private String outGoingPlatformOrderCode;
 
+    @RColumn("outgoingplatformbillcode")
+    @Comment("配送平台运单号")
+    private String outGoingPlatformBillCode;
+
     @RColumn("voidflagin")
     @Comment("来源平台的退款标记")
     private int voidFlagIn;
@@ -330,4 +334,12 @@ public class BusinessOrder extends BaseEntity {
     public void setRiderItemList(List<OrderRiderItem> riderItemList) {
         this.riderItemList = riderItemList;
     }
+
+    public String getOutGoingPlatformBillCode() {
+        return outGoingPlatformBillCode;
+    }
+
+    public void setOutGoingPlatformBillCode(String outGoingPlatformBillCode) {
+        this.outGoingPlatformBillCode = outGoingPlatformBillCode;
+    }
 }

+ 5 - 0
ddWebCore/src/main/java/com/dderp/webcore/rest/AdminRest.java

@@ -1,6 +1,7 @@
 package com.dderp.webcore.rest;
 
 import com.dderp.common.api.DocInfoService;
+import com.dderp.common.api.StoreService;
 import com.dderp.common.api.SystemService;
 import com.dderp.common.api.flycat.ExpressOutService;
 import com.dderp.common.api.flycat.OrderSearchService;
@@ -61,6 +62,9 @@ public class AdminRest extends BaseService {
     OrderSearchService orderSearchService;
 
     @Resource
+    StoreService storeService;
+
+    @Resource
     JsonConvert jsonConvert;
 
 
@@ -180,6 +184,7 @@ public class AdminRest extends BaseService {
                             systemService.getLoadedScriptCache(dataSourceId, Long.parseLong(supplierCode)),
                             docInfoService.getLoadedScriptCache(dataSourceId, Long.parseLong(supplierCode)),
                             expressOutService.getLoadedScriptCache(dataSourceId, Long.parseLong(supplierCode)),
+                            storeService.getLoadedScriptCache(dataSourceId, Long.parseLong(supplierCode)),
                             orderService.getLoadedScriptCache(dataSourceId, Long.parseLong(supplierCode)),
                             orderSearchService.getLoadedScriptCache(dataSourceId, Long.parseLong(supplierCode))
                     ).forEach(scriptList::addAll);

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

@@ -110,6 +110,21 @@ public class PlatformRest extends BaseService {
                 }, getExecutor()
         );
     }
+
+    @RestMapping(name = "getPlatformList", auth = true, sort = 6, comment = "按类别获取平台列表,不分页", methods = {"GET", "POST"})
+    @WebApiBean(result = true, type = PlatformInfo.class)
+    public CompletableFuture<RMap> getPlatformList(
+            @RestParam(name = "platformType", comment = "类别 0订单 1配送") int platformType,
+            @RestHeader(name = ERPHeader.HTTPHEADER_DATASOURCE) String dataSourceId,
+            @RestHeader(name = ERPHeader.HTTPHEADER_SUPPLIER) String supplierCode) {
+        return CompletableFuture.supplyAsync(
+                () -> {
+                    List<PlatformInfo> result = platformService.getRedisPlatformList(platformType, Long.parseLong(supplierCode));
+                    return RMapUtils.successV2(result, null, null);
+                }, getExecutor()
+        );
+    }
+
     //endregion
 
 

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

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