Jelajahi Sumber

完善顺丰同城所有回调业务

jlutt@163.com 2 tahun lalu
induk
melakukan
0e82dc0396

+ 9 - 0
conf/KeyId.xml

@@ -415,4 +415,13 @@
             <TableWhere/>
         </Table>
     </Item>
+
+    <Item>
+        <IDName>deOrderRiderItems.id</IDName>
+        <Table>
+            <TableName>v_deOrderRiderItems1000</TableName>
+            <IDFieldName>id</IDFieldName>
+            <TableWhere/>
+        </Table>
+    </Item>
 </Items>

+ 4 - 0
conf/esTemplate/orderrideritem.json

@@ -92,6 +92,10 @@
         "type": "text",
         "index": "not_analyzed"
       },
+      "itemContent": {
+        "type": "text",
+        "index": "not_analyzed"
+      },
       "createBy": {
         "type": "long"
       },

+ 658 - 267
conf/script/1000/expressApi/BE_Express_CallBack_Invoke_SFTC.groovy

@@ -69,6 +69,658 @@ class BE_Express_CallBack_Invoke_SFTC implements BusinessExecutor<InvokeCallPara
 
     private OrderDao orderDao
 
+    //执行逻辑,为代码看清楚点,不要担心这里的代码重复,主要是把逻辑写清楚,免得后期维护麻烦,反正每次通知只有一种情况
+    def invokeCallFunc = [
+            "rider_status@10"   : { invokeOrder, InvokeCallParams source ->
+                //region 配送员接单/改派
+
+                long orderId = invokeOrder["shop_order_id"] as long
+                RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(orderId,
+                        source.currentUser, source.dataSourceId, source.supplierCode)
+
+                if (!orderResult.isSuccess()) {
+                    return RetResult.<InvokeCallResult> errorT().retinfo("无效的订单信息")
+                }
+
+                BusinessOrder businessOrder = orderResult.result
+
+                OrderRiderItem orderRiderItem = new OrderRiderItem(
+                        id: tableIdService.getTableIdMulti("deOrderRiderItems.id", 1, source.dataSourceId, String.valueOf(source.supplierCode)),
+                        idOrder: businessOrder.id,
+                        idPlatform: businessOrder.outGoingPlatformId,
+                        platformCode: 'SFTC',
+                        platformName: businessOrder.outGoingPlatformName,
+                        platformOrderId: invokeOrder["sf_order_id"],
+                        operatorName: invokeOrder["operator_name"],
+                        operatorPhone: invokeOrder["operator_phone"],
+                        riderLng: invokeOrder["rider_lng"],
+                        riderLat: invokeOrder["rider_lat"],
+                        itemContent: ""
+                )
+                OrderRiderItem.create(orderRiderItem, source.currentUser.id)
+
+                List<OrderStep> stepList = new ArrayList<>()
+
+                //配送员接单/改派
+                businessOrder.orderStatus = BusinessOrderStatus.riderReceiving.value
+                orderRiderItem.riderStatus = OrderRiderStatus.accept.value
+                orderRiderItem.statusDesc = OrderRiderStatus.accept.name
+
+                stepList.add(orderStepService.parseOrderStep(businessOrder.id,
+                        "配送接单",
+                        "[" + businessOrder.outGoingPlatformName + "]" + orderRiderItem.operatorName + "(" + orderRiderItem.operatorPhone + ")接单",
+                        source.currentUser))
+
+
+                int iData = orderDao.expressRiderOrder(businessOrder, orderRiderItem, 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("orderStatus", businessOrder.orderStatus)
+                                        .endObject())
+                        bulkRequest.add(orderRequest)
+
+                        IndexRequestBuilder itemRequest = esClient.getClient()
+                                .prepareIndex(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1),
+                                        ESKeys.ES_DELIVER_ORDER_RIDER_ITEM_TYPE)
+                                .setId(String.valueOf(orderRiderItem.id))
+                                .setParent(String.valueOf(orderRiderItem.idOrder))
+                                .setSource(jsonConvert.convertTo(orderRiderItem), XContentType.JSON)
+                        bulkRequest.add(itemRequest)
+
+                        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)
+                    }
+                }
+
+                //endregion
+
+                return RetResult.<InvokeCallResult> successT().result(
+                        InvokeCallResult.success()
+                )
+            },
+
+            "rider_status@12"   : { invokeOrder, InvokeCallParams source ->
+                //region 配送员到店
+
+                long orderId = invokeOrder["shop_order_id"] as long
+                RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(orderId,
+                        source.currentUser, source.dataSourceId, source.supplierCode)
+
+                if (!orderResult.isSuccess()) {
+                    return RetResult.<InvokeCallResult> errorT().retinfo("无效的订单信息")
+                }
+
+                BusinessOrder businessOrder = orderResult.result
+
+                OrderRiderItem orderRiderItem = new OrderRiderItem(
+                        id: tableIdService.getTableIdMulti("deOrderRiderItems.id", 1, source.dataSourceId, String.valueOf(source.supplierCode)),
+                        idOrder: businessOrder.id,
+                        idPlatform: businessOrder.outGoingPlatformId,
+                        platformCode: 'SFTC',
+                        platformName: businessOrder.outGoingPlatformName,
+                        platformOrderId: invokeOrder["sf_order_id"],
+                        operatorName: invokeOrder["operator_name"],
+                        operatorPhone: invokeOrder["operator_phone"],
+                        riderLng: invokeOrder["rider_lng"],
+                        riderLat: invokeOrder["rider_lat"],
+                        itemContent: ""
+                )
+                OrderRiderItem.create(orderRiderItem, source.currentUser.id)
+
+                List<OrderStep> stepList = new ArrayList<>()
+
+                //配送员到店
+                businessOrder.orderStatus = BusinessOrderStatus.riderComing.value
+                orderRiderItem.riderStatus = OrderRiderStatus.store.value
+                orderRiderItem.statusDesc = OrderRiderStatus.store.name
+
+                stepList.add(orderStepService.parseOrderStep(businessOrder.id,
+                        "配送到店",
+                        "[" + businessOrder.outGoingPlatformName + "]" + orderRiderItem.operatorName + "(" + orderRiderItem.operatorPhone + ")到店",
+                        source.currentUser))
+
+                int iData = orderDao.expressRiderOrder(businessOrder, orderRiderItem, 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("orderStatus", businessOrder.orderStatus)
+                                        .endObject())
+                        bulkRequest.add(orderRequest)
+
+                        IndexRequestBuilder itemRequest = esClient.getClient()
+                                .prepareIndex(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1),
+                                        ESKeys.ES_DELIVER_ORDER_RIDER_ITEM_TYPE)
+                                .setId(String.valueOf(orderRiderItem.id))
+                                .setParent(String.valueOf(orderRiderItem.idOrder))
+                                .setSource(jsonConvert.convertTo(orderRiderItem), XContentType.JSON)
+                        bulkRequest.add(itemRequest)
+
+                        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)
+                    }
+                }
+
+                //endregion
+
+                return RetResult.<InvokeCallResult> successT().result(
+                        InvokeCallResult.success()
+                )
+            },
+
+            "rider_status@15"   : { invokeOrder, InvokeCallParams source ->
+                //region 配送员配送中
+
+                long orderId = invokeOrder["shop_order_id"] as long
+                RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(orderId,
+                        source.currentUser, source.dataSourceId, source.supplierCode)
+
+                if (!orderResult.isSuccess()) {
+                    return RetResult.<InvokeCallResult> errorT().retinfo("无效的订单信息")
+                }
+
+                BusinessOrder businessOrder = orderResult.result
+
+                OrderRiderItem orderRiderItem = new OrderRiderItem(
+                        id: tableIdService.getTableIdMulti("deOrderRiderItems.id", 1, source.dataSourceId, String.valueOf(source.supplierCode)),
+                        idOrder: businessOrder.id,
+                        idPlatform: businessOrder.outGoingPlatformId,
+                        platformCode: 'SFTC',
+                        platformName: businessOrder.outGoingPlatformName,
+                        platformOrderId: invokeOrder["sf_order_id"],
+                        operatorName: invokeOrder["operator_name"],
+                        operatorPhone: invokeOrder["operator_phone"],
+                        riderLng: invokeOrder["rider_lng"],
+                        riderLat: invokeOrder["rider_lat"],
+                        itemContent: ""
+                )
+                OrderRiderItem.create(orderRiderItem, source.currentUser.id)
+
+                List<OrderStep> stepList = new ArrayList<>()
+
+                //配送员配送中
+                businessOrder.orderStatus = BusinessOrderStatus.riderTaking.value
+                orderRiderItem.riderStatus = OrderRiderStatus.working.value
+                orderRiderItem.statusDesc = OrderRiderStatus.working.name
+
+                stepList.add(orderStepService.parseOrderStep(businessOrder.id,
+                        "开始配送",
+                        "[" + businessOrder.outGoingPlatformName + "]" + orderRiderItem.operatorName + "(" + orderRiderItem.operatorPhone + ")配送",
+                        source.currentUser))
+
+                int iData = orderDao.expressRiderOrder(businessOrder, orderRiderItem, 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("orderStatus", businessOrder.orderStatus)
+                                        .endObject())
+                        bulkRequest.add(orderRequest)
+
+                        IndexRequestBuilder itemRequest = esClient.getClient()
+                                .prepareIndex(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1),
+                                        ESKeys.ES_DELIVER_ORDER_RIDER_ITEM_TYPE)
+                                .setId(String.valueOf(orderRiderItem.id))
+                                .setParent(String.valueOf(orderRiderItem.idOrder))
+                                .setSource(jsonConvert.convertTo(orderRiderItem), XContentType.JSON)
+                        bulkRequest.add(itemRequest)
+
+                        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)
+                    }
+                }
+
+                //endregion
+
+                return RetResult.<InvokeCallResult> successT().result(
+                        InvokeCallResult.success()
+                )
+            },
+
+            "order_complete@17" : { invokeOrder, InvokeCallParams source ->
+                //region 订单完成
+                long orderId = invokeOrder["shop_order_id"] as long
+                RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(orderId,
+                        source.currentUser, source.dataSourceId, source.supplierCode)
+
+                if (!orderResult.isSuccess()) {
+                    return RetResult.<InvokeCallResult> errorT().retinfo("无效的订单信息")
+                }
+
+                BusinessOrder businessOrder = orderResult.result
+
+                List<OrderStep> stepList = new ArrayList<>()
+
+                OrderRiderItem orderRiderItem = new OrderRiderItem(
+                        id: tableIdService.getTableIdMulti("deOrderRiderItems.id", 1, source.dataSourceId, String.valueOf(source.supplierCode)),
+                        idOrder: businessOrder.id,
+                        idPlatform: businessOrder.outGoingPlatformId,
+                        platformCode: 'SFTC',
+                        platformName: businessOrder.outGoingPlatformName,
+                        platformOrderId: invokeOrder["sf_order_id"],
+                        operatorName: invokeOrder["operator_name"],
+                        operatorPhone: invokeOrder["operator_phone"],
+                        riderLng: invokeOrder["rider_lng"],
+                        riderLat: invokeOrder["rider_lat"],
+                        itemContent: ""
+                )
+                OrderRiderItem.create(orderRiderItem, source.currentUser.id)
+                businessOrder.orderStatus = BusinessOrderStatus.riderComplete.value
+                orderRiderItem.riderStatus = OrderRiderStatus.complete.value
+                orderRiderItem.statusDesc = OrderRiderStatus.complete.name
+
+                stepList.add(orderStepService.parseOrderStep(businessOrder.id,
+                        "配送完成",
+                        "[" + businessOrder.outGoingPlatformName + "]" + orderRiderItem.operatorName + "(" + orderRiderItem.operatorPhone + ")配送完成",
+                        source.currentUser))
+
+                int iData = orderDao.expressRiderOrder(businessOrder, orderRiderItem, 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("orderStatus", businessOrder.orderStatus)
+                                        .endObject())
+                        bulkRequest.add(orderRequest)
+
+                        IndexRequestBuilder itemRequest = esClient.getClient()
+                                .prepareIndex(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1),
+                                        ESKeys.ES_DELIVER_ORDER_RIDER_ITEM_TYPE)
+                                .setId(String.valueOf(orderRiderItem.id))
+                                .setParent(String.valueOf(orderRiderItem.idOrder))
+                                .setSource(jsonConvert.convertTo(orderRiderItem), XContentType.JSON)
+                        bulkRequest.add(itemRequest)
+
+                        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)
+                    }
+                }
+
+                //endregion
+
+                return RetResult.<InvokeCallResult> successT().result(
+                        InvokeCallResult.success()
+                )
+            },
+
+            "rider_recall@22"   : { invokeOrder, InvokeCallParams source ->
+                //region 配送员撤单
+
+                //当订单被骑士撤单的时候,顺丰同城会将订单撤撤单状态进行回调通知。
+                //注:顺丰同城撤单是指订单由A骑士接单后,因A骑士自身原因无法继续配送,故会将订单撤回抢单池,允许其他骑士继续抢单直至订单完结
+
+                //此消息并不会完全配送撤单,需要修正一下订单状态、轨迹和脚印
+                long orderId = invokeOrder["shop_order_id"] as long
+                RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(orderId,
+                        source.currentUser, source.dataSourceId, source.supplierCode)
+
+                if (!orderResult.isSuccess()) {
+                    return RetResult.<InvokeCallResult> errorT().retinfo("无效的订单信息")
+                }
+
+                BusinessOrder businessOrder = orderResult.result
+
+                List<OrderStep> stepList = new ArrayList<>()
+
+                OrderRiderItem orderRiderItem = new OrderRiderItem(
+                        id: tableIdService.getTableIdMulti("deOrderRiderItems.id", 1, source.dataSourceId, String.valueOf(source.supplierCode)),
+                        idOrder: businessOrder.id,
+                        idPlatform: businessOrder.outGoingPlatformId,
+                        platformCode: 'SFTC',
+                        platformName: businessOrder.outGoingPlatformName,
+                        platformOrderId: invokeOrder["sf_order_id"],
+                        operatorName: "",
+                        operatorPhone: "",
+                        riderLng: "",
+                        riderLat: "",
+                        itemContent: invokeOrder["status_desc"]
+                )
+                OrderRiderItem.create(orderRiderItem, source.currentUser.id)
+
+                businessOrder.orderStatus = BusinessOrderStatus.delivery.value
+                orderRiderItem.riderStatus = OrderRiderStatus.riderReCall.value
+                orderRiderItem.statusDesc = OrderRiderStatus.riderReCall.name
+
+                stepList.add(orderStepService.parseOrderStep(businessOrder.id,
+                        "配送撤单",
+                        "[" + businessOrder.outGoingPlatformName + "]" + "配送员撤单",
+                        source.currentUser))
+
+                int iData = orderDao.expressRiderOrder(businessOrder, orderRiderItem, 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("orderStatus", businessOrder.orderStatus)
+                                        .endObject())
+                        bulkRequest.add(orderRequest)
+
+                        IndexRequestBuilder itemRequest = esClient.getClient()
+                                .prepareIndex(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1),
+                                        ESKeys.ES_DELIVER_ORDER_RIDER_ITEM_TYPE)
+                                .setId(String.valueOf(orderRiderItem.id))
+                                .setParent(String.valueOf(orderRiderItem.idOrder))
+                                .setSource(jsonConvert.convertTo(orderRiderItem), XContentType.JSON)
+                        bulkRequest.add(itemRequest)
+
+                        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)
+                    }
+                }
+
+                //endregion
+
+                return RetResult.<InvokeCallResult> successT().result(
+                        InvokeCallResult.success()
+                )
+            },
+
+            "rider_exception@91": { invokeOrder, InvokeCallParams source ->
+                //region 订单异常回调
+
+                //当订单发生异常操作的时候,顺丰同城会将订单相关的异常进行回调通知。(订单异常不是订单终态,只有取消和完成才是订单终态,骑手会和商家或用户线下沟通选择将配送物品送回商家或订单取消)
+
+                //异常回调不改变订单状态
+
+                long orderId = invokeOrder["shop_order_id"] as long
+                RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(orderId,
+                        source.currentUser, source.dataSourceId, source.supplierCode)
+
+                if (!orderResult.isSuccess()) {
+                    return RetResult.<InvokeCallResult> errorT().retinfo("无效的订单信息")
+                }
+
+                BusinessOrder businessOrder = orderResult.result
+
+                List<OrderStep> stepList = new ArrayList<>()
+
+                OrderRiderItem orderRiderItem = new OrderRiderItem(
+                        id: tableIdService.getTableIdMulti("deOrderRiderItems.id", 1, source.dataSourceId, String.valueOf(source.supplierCode)),
+                        idOrder: businessOrder.id,
+                        idPlatform: businessOrder.outGoingPlatformId,
+                        platformCode: 'SFTC',
+                        platformName: businessOrder.outGoingPlatformName,
+                        platformOrderId: invokeOrder["sf_order_id"],
+                        operatorName: invokeOrder["operator_name"],
+                        operatorPhone: invokeOrder["operator_phone"],
+                        riderLng: "",
+                        riderLat: "",
+                        itemContent: invokeOrder["ex_content"]
+                )
+                OrderRiderItem.create(orderRiderItem, source.currentUser.id)
+
+                orderRiderItem.riderStatus = OrderRiderStatus.exception.value
+                switch (invokeOrder["ex_id"] as int) {
+                    case 4003:
+                        orderRiderItem.statusDesc = "骑士上报异常:" + "托寄物丢失或损坏"
+                        break
+                    case 1001:
+                        orderRiderItem.statusDesc = "骑士上报异常:" + "商家出货慢"
+                        break
+                    case 2010:
+                        orderRiderItem.statusDesc = "骑士上报异常:" + "顾客拒绝实名认证"
+                        break
+                    case 3004:
+                        orderRiderItem.statusDesc = "骑士上报异常:" + "实名认证校验失败"
+                        break
+                    case 1007:
+                        orderRiderItem.statusDesc = "骑士上报异常:" + "更改取货地址"
+                        break
+                    case 2001:
+                        orderRiderItem.statusDesc = "骑士上报异常:" + "顾客电话无法接通"
+                        break
+                    case 2004:
+                        orderRiderItem.statusDesc = "骑士上报异常:" + "更改期望送达时间"
+                        break
+                    case 2005:
+                        orderRiderItem.statusDesc = "骑士上报异常:" + "顾客拒收"
+                        break
+                    case 2008:
+                        orderRiderItem.statusDesc = "骑士上报异常:" + "顾客不在家"
+                        break
+                    case 2009:
+                        orderRiderItem.statusDesc = "骑士上报异常:" + "更改送货地址"
+                        break
+                    case 4001:
+                        orderRiderItem.statusDesc = "骑士上报异常:" + "配送地址错误"
+                        break
+                    default:
+                        orderRiderItem.statusDesc = "骑士上报异常:" + "其他"
+                        break
+                }
+
+                stepList.add(orderStepService.parseOrderStep(businessOrder.id,
+                        "配送异常",
+                        "[" + businessOrder.outGoingPlatformName + "]" + orderRiderItem.operatorName + " " + orderRiderItem.statusDesc,
+                        source.currentUser))
+
+                int iData = orderDao.expressRiderOrder(businessOrder, orderRiderItem, stepList, source.dataSourceId, source.supplierCode + "_1")
+
+                if (iData >= 0) {
+                    BulkRequestBuilder bulkRequest = esClient.getClient().prepareBulk().setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)
+                    try {
+                        IndexRequestBuilder itemRequest = esClient.getClient()
+                                .prepareIndex(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1),
+                                        ESKeys.ES_DELIVER_ORDER_RIDER_ITEM_TYPE)
+                                .setId(String.valueOf(orderRiderItem.id))
+                                .setParent(String.valueOf(orderRiderItem.idOrder))
+                                .setSource(jsonConvert.convertTo(orderRiderItem), XContentType.JSON)
+                        bulkRequest.add(itemRequest)
+
+                        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)
+                    }
+                }
+
+                //endregion
+
+                return RetResult.<InvokeCallResult> successT().result(
+                        InvokeCallResult.success()
+                )
+            },
+
+            "sf_cancel@2"       : { invokeOrder, InvokeCallParams source ->
+                //region 顺丰原因订单取消回调
+
+                //当订单在顺丰侧被取消时,会由顺丰同城回调对接方回调地址告知订单被取消。
+                //一般情况下订单被顺丰侧取消原因为:用户拒收,订单超时严重未完成等等操作原因会在返回error_msg中返回。若仍有疑问,可与调度或骑士联系获取更多信息。
+
+                long orderId = invokeOrder["shop_order_id"] as long
+                RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(orderId,
+                        source.currentUser, source.dataSourceId, source.supplierCode)
+
+                if (!orderResult.isSuccess()) {
+                    return RetResult.<InvokeCallResult> errorT().retinfo("无效的订单信息")
+                }
+
+                BusinessOrder businessOrder = orderResult.result
+
+                List<OrderStep> stepList = new ArrayList<>()
+
+                OrderRiderItem orderRiderItem = new OrderRiderItem(
+                        id: tableIdService.getTableIdMulti("deOrderRiderItems.id", 1, source.dataSourceId, String.valueOf(source.supplierCode)),
+                        idOrder: businessOrder.id,
+                        idPlatform: businessOrder.outGoingPlatformId,
+                        platformCode: 'SFTC',
+                        platformName: businessOrder.outGoingPlatformName,
+                        platformOrderId: invokeOrder["sf_order_id"],
+                        operatorName: invokeOrder["operator_name"],
+                        operatorPhone: invokeOrder["operator_phone"],
+                        riderLng: invokeOrder["rider_lng"],
+                        riderLat: invokeOrder["rider_lat"],
+                        itemContent: invokeOrder["cancel_reason"]
+                )
+                OrderRiderItem.create(orderRiderItem, source.currentUser.id)
+
+                businessOrder.orderStatus = BusinessOrderStatus.accept.value
+                orderRiderItem.riderStatus = OrderRiderStatus.cancel.value
+                orderRiderItem.statusDesc = OrderRiderStatus.cancel.name
+
+                stepList.add(orderStepService.parseOrderStep(businessOrder.id,
+                        "配送取消",
+                        "[" + businessOrder.outGoingPlatformName + "]" + "配送取消:" + invokeOrder["cancel_reason"],
+                        source.currentUser))
+
+                int iData = orderDao.expressRiderOrder(businessOrder, orderRiderItem, 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("orderStatus", businessOrder.orderStatus)
+                                        .endObject())
+                        bulkRequest.add(orderRequest)
+
+                        IndexRequestBuilder itemRequest = esClient.getClient()
+                                .prepareIndex(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1),
+                                        ESKeys.ES_DELIVER_ORDER_RIDER_ITEM_TYPE)
+                                .setId(String.valueOf(orderRiderItem.id))
+                                .setParent(String.valueOf(orderRiderItem.idOrder))
+                                .setSource(jsonConvert.convertTo(orderRiderItem), XContentType.JSON)
+                        bulkRequest.add(itemRequest)
+
+                        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)
+                    }
+                }
+
+                //endregion
+
+                return RetResult.<InvokeCallResult> successT().result(
+                        InvokeCallResult.success()
+                )
+            },
+
+            "bindnotify@0"      : { invokeOrder, InvokeCallParams source ->
+                storeService.bindStorePlatform(source.params, "SFTC", source.dataSourceId, source.supplierCode, source.currentUser)
+                return RetResult.<InvokeCallResult> successT().result(
+                        InvokeCallResult.success()
+                )
+            }
+    ]
+
     @Override
     String scriptName() {
         return "顺丰同城数据回调"
@@ -150,275 +802,14 @@ class BE_Express_CallBack_Invoke_SFTC implements BusinessExecutor<InvokeCallPara
 
         //https://openic.sf-express.com/open/api/docs/index#/apidoc
         //顺丰订单的逻辑,只有取消和完成才是订单终态
-        String urlIndex = invokeOrder["url_index"]
-        if (StringUtils.equalsIgnoreCase("rider_status", urlIndex)) {
-            //region 配送状态更改回调
-
-            long orderId = invokeOrder["shop_order_id"] as long
-            RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(orderId,
-                    source.currentUser, source.dataSourceId, source.supplierCode)
-
-            if (!orderResult.isSuccess()) {
-                return RetResult.<InvokeCallResult> errorT().retinfo("无效的订单信息")
-            }
-
-            BusinessOrder businessOrder = orderResult.result
-
-            OrderRiderItem orderRiderItem = new OrderRiderItem(
-                    id: tableIdService.getTableIdMulti("deOrderRiderItems.id", 1, source.dataSourceId, String.valueOf(source.supplierCode)),
-                    idOrder: businessOrder.id,
-                    idPlatform: businessOrder.outGoingPlatformId,
-                    platformCode: 'SFTC',
-                    platformName: businessOrder.outGoingPlatformName,
-                    platformOrderId: invokeOrder["sf_order_id"],
-                    operatorName: invokeOrder["operator_name"],
-                    operatorPhone: invokeOrder["operator_phone"],
-                    riderLng: invokeOrder["rider_lng"],
-                    riderLat: invokeOrder["rider_lat"]
-            )
-            OrderRiderItem.create(orderRiderItem, source.currentUser.id)
-
-            List<OrderStep> stepList = new ArrayList<>()
-
-            int sfOrderStatus = invokeOrder["order_status"] as int
-            if (sfOrderStatus == 10) {
-                //配送员接单/改派
-                businessOrder.orderStatus = BusinessOrderStatus.riderReceiving.value
-                orderRiderItem.riderStatus = OrderRiderStatus.accept.value
-                orderRiderItem.statusDesc = OrderRiderStatus.accept.name
-
-                stepList.add(orderStepService.parseOrderStep(businessOrder.id,
-                        "配送接单",
-                        "[" + businessOrder.outGoingPlatformName + "]" + orderRiderItem.operatorName + "(" + orderRiderItem.operatorPhone + ")接单",
-                        source.currentUser))
-            } else if (sfOrderStatus == 12) {
-                //配送员到店
-                businessOrder.orderStatus = BusinessOrderStatus.riderComing.value
-                orderRiderItem.riderStatus = OrderRiderStatus.store.value
-                orderRiderItem.statusDesc = OrderRiderStatus.store.name
-
-                stepList.add(orderStepService.parseOrderStep(businessOrder.id,
-                        "配送到店",
-                        "[" + businessOrder.outGoingPlatformName + "]" + orderRiderItem.operatorName + "(" + orderRiderItem.operatorPhone + ")到店",
-                        source.currentUser))
-            } else if (sfOrderStatus == 15) {
-                //配送员配送中
-                businessOrder.orderStatus = BusinessOrderStatus.riderTaking.value
-                orderRiderItem.riderStatus = OrderRiderStatus.working.value
-                orderRiderItem.statusDesc = OrderRiderStatus.working.name
-
-                stepList.add(orderStepService.parseOrderStep(businessOrder.id,
-                        "开始配送",
-                        "[" + businessOrder.outGoingPlatformName + "]" + orderRiderItem.operatorName + "(" + orderRiderItem.operatorPhone + ")配送",
-                        source.currentUser))
-            }
-
-            int iData = orderDao.expressRiderOrder(businessOrder, orderRiderItem, 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("orderStatus", businessOrder.orderStatus)
-                                    .endObject())
-                    bulkRequest.add(orderRequest)
-
-                    IndexRequestBuilder itemRequest = esClient.getClient()
-                            .prepareIndex(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1),
-                                    ESKeys.ES_DELIVER_ORDER_RIDER_ITEM_TYPE)
-                            .setId(String.valueOf(orderRiderItem.id))
-                            .setParent(String.valueOf(orderRiderItem.idOrder))
-                            .setSource(jsonConvert.convertTo(orderRiderItem), XContentType.JSON)
-                    bulkRequest.add(itemRequest)
-
-                    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)
-                }
-            }
 
-            //endregion
-        } else if (StringUtils.equalsIgnoreCase("order_complete", urlIndex)) {
-            //region 订单完成
-            long orderId = invokeOrder["shop_order_id"] as long
-            RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(orderId,
-                    source.currentUser, source.dataSourceId, source.supplierCode)
-
-            if (!orderResult.isSuccess()) {
-                return RetResult.<InvokeCallResult> errorT().retinfo("无效的订单信息")
-            }
-
-            BusinessOrder businessOrder = orderResult.result
-
-            List<OrderStep> stepList = new ArrayList<>()
-
-            OrderRiderItem orderRiderItem = new OrderRiderItem(
-                    id: tableIdService.getTableIdMulti("deOrderRiderItems.id", 1, source.dataSourceId, String.valueOf(source.supplierCode)),
-                    idOrder: businessOrder.id,
-                    idPlatform: businessOrder.outGoingPlatformId,
-                    platformCode: 'SFTC',
-                    platformName: businessOrder.outGoingPlatformName,
-                    platformOrderId: invokeOrder["sf_order_id"],
-                    operatorName: invokeOrder["operator_name"],
-                    operatorPhone: invokeOrder["operator_phone"],
-                    riderLng: invokeOrder["rider_lng"],
-                    riderLat: invokeOrder["rider_lat"]
-            )
-            OrderRiderItem.create(orderRiderItem, source.currentUser.id)
-            businessOrder.orderStatus = BusinessOrderStatus.riderComplete.value
-            orderRiderItem.riderStatus = OrderRiderStatus.complete.value
-            orderRiderItem.statusDesc = OrderRiderStatus.complete.name
-
-            stepList.add(orderStepService.parseOrderStep(businessOrder.id,
-                    "配送完成",
-                    "[" + businessOrder.outGoingPlatformName + "]" + orderRiderItem.operatorName + "(" + orderRiderItem.operatorPhone + ")配送完成",
-                    source.currentUser))
-
-            int iData = orderDao.expressRiderOrder(businessOrder, orderRiderItem, 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("orderStatus", businessOrder.orderStatus)
-                                    .endObject())
-                    bulkRequest.add(orderRequest)
-
-                    IndexRequestBuilder itemRequest = esClient.getClient()
-                            .prepareIndex(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1),
-                                    ESKeys.ES_DELIVER_ORDER_RIDER_ITEM_TYPE)
-                            .setId(String.valueOf(orderRiderItem.id))
-                            .setParent(String.valueOf(orderRiderItem.idOrder))
-                            .setSource(jsonConvert.convertTo(orderRiderItem), XContentType.JSON)
-                    bulkRequest.add(itemRequest)
-
-                    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)
-                }
-            }
-
-            //endregion
-        } else if (StringUtils.equalsIgnoreCase("rider_recall", urlIndex)) {
-            //region 配送员撤单
-
-            //当订单被骑士撤单的时候,顺丰同城会将订单撤撤单状态进行回调通知。
-            //注:顺丰同城撤单是指订单由A骑士接单后,因A骑士自身原因无法继续配送,故会将订单撤回抢单池,允许其他骑士继续抢单直至订单完结
-
-            //此消息并不会完全配送撤单,需要修正一下订单状态、轨迹和脚印
-            long orderId = invokeOrder["shop_order_id"] as long
-            RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(orderId,
-                    source.currentUser, source.dataSourceId, source.supplierCode)
-
-            if (!orderResult.isSuccess()) {
-                return RetResult.<InvokeCallResult> errorT().retinfo("无效的订单信息")
-            }
-
-            BusinessOrder businessOrder = orderResult.result
-
-            List<OrderStep> stepList = new ArrayList<>()
-
-            OrderRiderItem orderRiderItem = new OrderRiderItem(
-                    id: tableIdService.getTableIdMulti("deOrderRiderItems.id", 1, source.dataSourceId, String.valueOf(source.supplierCode)),
-                    idOrder: businessOrder.id,
-                    idPlatform: businessOrder.outGoingPlatformId,
-                    platformCode: 'SFTC',
-                    platformName: businessOrder.outGoingPlatformName,
-                    platformOrderId: invokeOrder["sf_order_id"],
-                    operatorName: "",
-                    operatorPhone: "",
-                    riderLng: "",
-                    riderLat: ""
-            )
-            OrderRiderItem.create(orderRiderItem, source.currentUser.id)
-            businessOrder.orderStatus = BusinessOrderStatus.riderComplete.value
-            orderRiderItem.riderStatus = OrderRiderStatus.complete.value
-            orderRiderItem.statusDesc = OrderRiderStatus.complete.name
-
-            stepList.add(orderStepService.parseOrderStep(businessOrder.id,
-                    "配送撤单",
-                    "[" + businessOrder.outGoingPlatformName + "]" + "配送员撤单",
-                    source.currentUser))
-
-            int iData = orderDao.expressRiderOrder(businessOrder, orderRiderItem, 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("orderStatus", businessOrder.orderStatus)
-                                    .endObject())
-                    bulkRequest.add(orderRequest)
-
-                    IndexRequestBuilder itemRequest = esClient.getClient()
-                            .prepareIndex(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1),
-                                    ESKeys.ES_DELIVER_ORDER_RIDER_ITEM_TYPE)
-                            .setId(String.valueOf(orderRiderItem.id))
-                            .setParent(String.valueOf(orderRiderItem.idOrder))
-                            .setSource(jsonConvert.convertTo(orderRiderItem), XContentType.JSON)
-                    bulkRequest.add(itemRequest)
-
-                    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)
-                }
-            }
-
-            //endregion
-        } else if (StringUtils.equalsIgnoreCase("bindnotify", urlIndex)) {
-            storeService.bindStorePlatform(source.params, "SFTC", source.dataSourceId, source.supplierCode, source.currentUser)
+        String urlIndex = invokeOrder["url_index"]
+        int orderStatus = 0
+        if (!StringUtils.equalsIgnoreCase("bindnotify", urlIndex)) {
+            orderStatus = invokeOrder["order_status"] as int
         }
 
-        return RetResult.<InvokeCallResult> successT().result(
-                InvokeCallResult.success()
-        )
+        return invokeCallFunc.get(urlIndex + "@" + orderStatus).call(invokeOrder, source)
+
     }
 }

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

@@ -187,13 +187,13 @@ insert into $table$ (
 id, idOrder, riderStatus, statusDesc,
 idPlatform, platformCode, platformName,
 platformOrderId, operatorName, operatorPhone,
-riderLng, riderLat, createBy,
-createTime, createTimeLong, updateBy,
+riderLng, riderLat, itemContent,
+createBy, createTime, createTimeLong, updateBy,
 updateTime, updateTimeLong )
 values (
 #{id}, #{idorder}, #{riderstatus}, #{statusdesc},
 #{idplatform}, #{platformcode}, #{platformname},
 #{platformorderid}, #{operatorname}, #{operatorphone},
-#{riderlng}, #{riderlat}, #{createby},
-#{createtime}, #{createtimelong}, #{updateby},
+#{riderlng}, #{riderlat}, #{itemcontent},
+#{createby}, #{createtime}, #{createtimelong}, #{updateby},
 #{updatetime}, #{updatetimelong} );

+ 7 - 1
ddCommon/src/main/java/com/dderp/common/datas/flycat/OrderRiderStatus.java

@@ -8,7 +8,13 @@ public enum OrderRiderStatus {
 
     working("配送员配送中", 3),
 
-    complete("配送员点击完成", 4);
+    complete("配送员点击完成", 4),
+
+    riderReCall("配送员撤单", 30),
+
+    exception("订单异常", 40),
+
+    cancel("订单取消", 50);
 
     private String name;
     private int value;

+ 20 - 0
ddCommon/src/main/java/com/dderp/common/entity/order/OrderRiderItem.java

@@ -57,9 +57,14 @@ public class OrderRiderItem extends BaseEntity {
     @RColumn("riderlat")
     private String riderLat;
 
+    @Comment("详情")
+    @RColumn("itemcontent")
+    private String itemContent;
+
     public OrderRiderItem() {
     }
 
+
     private OrderRiderItem(Builder builder) {
         setId(builder.id);
         setIdOrder(builder.idOrder);
@@ -73,6 +78,7 @@ public class OrderRiderItem extends BaseEntity {
         setOperatorPhone(builder.operatorPhone);
         setRiderLng(builder.riderLng);
         setRiderLat(builder.riderLat);
+        setItemContent(builder.itemContent);
     }
 
     public static Builder newBuilder() {
@@ -176,6 +182,14 @@ public class OrderRiderItem extends BaseEntity {
         this.riderLat = riderLat;
     }
 
+    public String getItemContent() {
+        return itemContent;
+    }
+
+    public void setItemContent(String itemContent) {
+        this.itemContent = itemContent;
+    }
+
     public static final class Builder {
         private long id;
         private long idOrder;
@@ -189,6 +203,7 @@ public class OrderRiderItem extends BaseEntity {
         private String operatorPhone;
         private String riderLng;
         private String riderLat;
+        private String itemContent;
 
         private Builder() {
         }
@@ -253,6 +268,11 @@ public class OrderRiderItem extends BaseEntity {
             return this;
         }
 
+        public Builder itemContent(String val) {
+            itemContent = val;
+            return this;
+        }
+
         public OrderRiderItem build() {
             return new OrderRiderItem(this);
         }

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

@@ -28,25 +28,11 @@ import java.util.concurrent.ForkJoinPool;
 @HttpUserType(ERPTokenUser.class)
 public class ExpressCallServlet extends HttpServlet {
 
-    @Resource(name = "property.sftc.appId")
-    private long sfAppId;
-
-    @Resource(name = "property.sftc.appKey")
-    private String sfAppKey;
-
     @Resource
     ExpressOutService expressOutService;
 
     private final Logger logger = LogManager.getLogger(this.getClass().getSimpleName());
 
-    private ExecutorService getExecutor() {
-        Thread thread = Thread.currentThread();
-        if (thread instanceof WorkThread) {
-            return ((WorkThread) thread).getExecutor();
-        }
-        return ForkJoinPool.commonPool();
-    }
-
     @Override
     public void init(HttpContext context, AnyValue config) {
         super.init(context, config);
@@ -57,29 +43,7 @@ public class ExpressCallServlet extends HttpServlet {
         super.destroy(context, config);
     }
 
-    private String sfGenerateOpenSign(String postData, Long appId, String appKey) {
-        try {
-            String sb = postData +
-                    "&" + appId + "&" + appKey;
-            MessageDigest md = MessageDigest.getInstance("MD5");
-            byte[] md5 = md.digest(sb.getBytes(StandardCharsets.UTF_8));
-            int i;
-            StringBuilder buf = new StringBuilder();
-            for (int offset = 0; offset < md5.length; offset++) {
-                i = md5[offset];
-                if (i < 0) {
-                    i += 256;
-                }
-                if (i < 16) {
-                    buf.append("0");
-                }
-                buf.append(Integer.toHexString(i));
-            }
-            return Base64.encodeBase64String(buf.toString().getBytes(StandardCharsets.UTF_8));
-        } catch (Exception e) {
-            return "";
-        }
-    }
+    //当前查看顺丰的回调,没有字段体现出顺丰的接口,大概每个快递平台需要不同的地址提供回调,顺丰的回调可以通过url_index来判断回调的业务
 
     @HttpMapping(url = "/express/call", methods = {"POST"}, comment = "回调入口")
     public void expressCall(HttpRequest request, HttpResponse response) {
@@ -132,42 +96,4 @@ public class ExpressCallServlet extends HttpServlet {
             response.finish(200, callSignResult.getResult().getData());
         }
     }
-
-    //当前查看顺丰的回调,没有字段体现出顺丰的接口,大概每个快递平台需要不同的地址提供回调,顺丰的回调可以通过url_index来判断回调的业务
-
-    @HttpMapping(url = "/express/sfCall", methods = {"POST", "GET"}, comment = "回调入口")
-    public void sfCall(HttpRequest request, HttpResponse response) {
-        logger.info(request);
-
-        //验证签名,防止乱post
-        String body = request.getBodyUTF8();
-        String currentSign = sfGenerateOpenSign(body, sfAppId, sfAppKey);
-        String orginSign = request.getParameter("sign", "");
-        if (!StringUtils.equals(currentSign, orginSign)) {
-            logger.error("签名错误");
-            response.finish(ExpressCallResult.success());
-            return;
-        }
-
-        String dataSourceId = request.getHeader(ERPHeader.HTTPHEADER_DATASOURCE, "");
-        long supplierCode = request.getLongHeader(ERPHeader.HTTPHEADER_SUPPLIER, 0L);
-
-        if ((StringUtils.isBlank(dataSourceId)) || (supplierCode <= 0L)) {
-            response.finish(ExpressCallResult.success());
-            return;
-        }
-
-        //其它平台看了两个,好像都只有一个回调,就顺丰有一堆回调,这里统一,让脚本里面分开处理,脚本大点就大点吧
-
-        InvokeCallParams callParams = InvokeCallParams.newBuilder()
-                .businessMethod("Express_CallBack_Invoke_SFTC")
-                .params(body)
-                .currentUser(ERPUtils.getSysTokenUser())
-                .dataSourceId(dataSourceId)
-                .supplierCode(supplierCode)
-                .build();
-        expressOutService.callExpress(callParams, ERPUtils.getSysTokenUser(), dataSourceId, supplierCode);
-
-        response.finish(ExpressCallResult.success());
-    }
 }