Kaynağa Gözat

顺丰同城回调业务编码

jlutt@163.com 2 yıl önce
ebeveyn
işleme
09b865d5f7

+ 0 - 1
conf/application-ddWebOne.xml

@@ -114,7 +114,6 @@
             <service value="com.dderp.webcore.rest.flycat.ExpressOutRest"/>
             <service value="com.dderp.webcore.rest.flycat.OrderRest"/>
 
-
             <websocket value="com.dderp.webcore.websocket.ERPWebSocket" name="dws" groups="DELIVER_SERVICE_REMOTE"/>
         </rest>
 

+ 229 - 13
conf/script/1000/expressApi/BE_Express_CallBack_Invoke_SFTC.groovy

@@ -1,21 +1,38 @@
-import com.dderp.common.api.BusinessExecutor
-import com.dderp.common.api.ERPLockDataService
-import com.dderp.common.api.NoSqlKeysService
-import com.dderp.common.api.StoreService
+import com.dderp.business.dao.OrderDao
+import com.dderp.common.api.*
+import com.dderp.common.api.flycat.OrderSearchService
+import com.dderp.common.api.flycat.OrderStepService
 import com.dderp.common.datas.ERPModule
+import com.dderp.common.datas.ESKeys
 import com.dderp.common.datas.RedisKeys
+import com.dderp.common.datas.flycat.BusinessOrderStatus
+import com.dderp.common.datas.flycat.OrderRiderStatus
 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.OrderRiderItem
+import com.dderp.common.entity.order.OrderStep
+import com.dySweetFishPlugin.elasticsearch.ESClient
+import com.dySweetFishPlugin.sql.TableIdService
 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 static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder
+
 class BE_Express_CallBack_Invoke_SFTC implements BusinessExecutor<InvokeCallParams, InvokeCallResult> {
 
     private final Logger logger = LogManager.getLogger(this.getClass().getSimpleName())
@@ -32,6 +49,26 @@ class BE_Express_CallBack_Invoke_SFTC implements BusinessExecutor<InvokeCallPara
     @Resource
     StoreService storeService
 
+    @Resource
+    OrderSearchService orderSearchService
+
+    @Resource
+    OrderStepService orderStepService
+
+    @Resource
+    TableIdService tableIdService
+
+    @Resource
+    TunaService tunaService
+
+    @Resource
+    ESClient esClient
+
+    @Resource
+    SupplierInitService supplierService
+
+    private OrderDao orderDao
+
     @Override
     String scriptName() {
         return "顺丰同城数据回调"
@@ -48,6 +85,11 @@ class BE_Express_CallBack_Invoke_SFTC implements BusinessExecutor<InvokeCallPara
     }
 
     @Override
+    void start(long supplierCode) {
+        orderDao = tunaService.generate(OrderDao.class)
+    }
+
+    @Override
     RetResult<InvokeCallParams> beforeExecute(InvokeCallParams source) {
         //此回调post的数据看着没有子表,直接用groovy自带的json即可,如果有子表,还是应该建立一个类进行转换
 
@@ -71,8 +113,8 @@ class BE_Express_CallBack_Invoke_SFTC implements BusinessExecutor<InvokeCallPara
                 return RetResult.<InvokeCallParams> errorT().retinfo(shopId + "提交工作中,请稍后刷新即可,无需重复操作")
             }
         } else {
-            String invokeOrderId = invokeOrder["sf_order_id"] as String
-            if (lockDataService.hLockAdd(invokeOrderId, RedisKeys.KEY_ERP_WORKING_SF_ORDER, source.supplierCode) > 1) {
+            String invokeOrderId = invokeOrder["shop_order_id"] as String
+            if (lockDataService.hLockAdd(invokeOrderId, RedisKeys.KEY_ERP_WORKING_ORDER, source.supplierCode) > 1) {
                 return RetResult.<InvokeCallParams> errorT().retinfo(invokeOrderId + "提交工作中,请稍后刷新即可,无需重复操作")
             }
         }
@@ -95,8 +137,8 @@ class BE_Express_CallBack_Invoke_SFTC implements BusinessExecutor<InvokeCallPara
             String shopId = invokeOrder["shop_id"] as String
             lockDataService.hLockDel(shopId, RedisKeys.KEY_ERP_WORKING_SF_STORE, source.supplierCode)
         } else {
-            String invokeOrderId = invokeOrder["sf_order_id"] as String
-            lockDataService.hLockDel(invokeOrderId,RedisKeys.KEY_ERP_WORKING_SF_ORDER, source.supplierCode)
+            String invokeOrderId = invokeOrder["shop_order_id"] as String
+            lockDataService.hLockDel(invokeOrderId, RedisKeys.KEY_ERP_WORKING_ORDER, source.supplierCode)
         }
     }
 
@@ -106,12 +148,186 @@ class BE_Express_CallBack_Invoke_SFTC implements BusinessExecutor<InvokeCallPara
 
         logger.info(source.params)
 
-        logger.info(invokeOrder["url_index"])
-        logger.info(invokeOrder["sf_order_id"])
-        logger.info(invokeOrder["operator_name"])
+        String urlIndex = invokeOrder["url_index"]
+        if (StringUtils.equalsIgnoreCase("rider_status", urlIndex)) {
+            //region 配送状态更改回调
 
-        String urlIndex = invokeOrder["url_index"] as String
-        if (StringUtils.equalsIgnoreCase("bindnotify", urlIndex)) {
+            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"]
+            )
+
+            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"]
+            )
+            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("bindnotify", urlIndex)) {
             storeService.bindStorePlatform(source.params, "SFTC", source.dataSourceId, source.supplierCode, source.currentUser)
         }
 

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

@@ -207,7 +207,7 @@ class BE_Express_CreateOrder_SFTC implements BusinessExecutor<InvokeCallParams,
                 dev_id        : sfAppId,
                 shop_id       : storePlatform.platformStoreId,
                 shop_type     : 1,
-                shop_order_id : businessOrder.orderCode,
+                shop_order_id : String.valueOf(businessOrder.id),
                 order_source  : businessOrder.incomePlatformName,
                 order_sequence: String.valueOf(businessOrder.orderSequence),
                 order_time    : currentTime,

+ 23 - 2
conf/script/1000/orderSearch/BE_ERP_BusinessOrder_Search.groovy

@@ -3,8 +3,10 @@ import com.dderp.common.api.SupplierInitService
 import com.dderp.common.datas.ERPModule
 import com.dderp.common.datas.ESKeys
 import com.dderp.common.datas.ReadOrderOption
+import com.dderp.common.datas.TokenUserFrom
 import com.dderp.common.entity.base.ProcessSearchOptionsItem
 import com.dderp.common.entity.order.*
+import com.dderp.common.entity.site.ERPTokenUser
 import com.dderp.common.tool.ERPUtils
 import com.dySweetFishPlugin.elasticsearch.ESClient
 import com.dySweetFishPlugin.tool.lang.DateUtil
@@ -188,12 +190,14 @@ class BE_ERP_BusinessOrder_Search implements BusinessExecutor<ProcessSearchOptio
         }
     }
 
-    def readOrderTotal(RMap searchData, long supplierCode, ReadOrderOption... options) {
+    def readOrderTotal(RMap searchData, ERPTokenUser currentUser, long supplierCode, ReadOrderOption... options) {
 
         if (!(ReadOrderOption.ORDER_TOTAL in options)) {
             return null
         }
 
+
+
         //这里的查询需要和主表一致
         BoolQueryBuilder bqb = searchByFinance(searchData)
                 .byOrderParentQuery(
@@ -266,6 +270,14 @@ class BE_ERP_BusinessOrder_Search implements BusinessExecutor<ProcessSearchOptio
             orderBySort = source.orderBy.split(",")[1].trim().toLowerCase()
         }
 
+        if ((source.currentUser.userFrom == TokenUserFrom.APP_STORE_ADMIN.value) || (source.currentUser.userFrom == TokenUserFrom.PC_STORE_ADMIN.value)) {
+            if (source.searchData == null) {
+                source.searchData = new RMap()
+            }
+
+            source.searchData.put("idStore", source.currentUser.idBindOrg)
+        }
+
         List<BusinessOrder> orderList = ESList.<BusinessOrder> getESList()
                 .esClient(esClient)
                 .jsonConvert(jsonConvert)
@@ -299,7 +311,7 @@ class BE_ERP_BusinessOrder_Search implements BusinessExecutor<ProcessSearchOptio
 
         readOrderOptions(orderList, source.supplierCode, source.options)
 
-        RMap<String, Number> collectionData = readOrderTotal(source.searchData, source.supplierCode, source.options)
+        RMap<String, Number> collectionData = readOrderTotal(source.searchData, source.currentUser, source.supplierCode, source.options)
         return RetResult.<List<BusinessOrder>> successT().result(orderList).page(source.pageFlipper).attachRMap(collectionData)
 
 
@@ -353,6 +365,10 @@ class BE_ERP_BusinessOrder_Search implements BusinessExecutor<ProcessSearchOptio
                     //获取完成的数据情况
                     ESConditionBuilder qb = search(null).byIdOrder(idOrder)
                     //这里还需要判断数据权限
+                    if ((source.currentUser.userFrom == TokenUserFrom.APP_STORE_ADMIN.value) || (source.currentUser.userFrom == TokenUserFrom.PC_STORE_ADMIN.value)) {
+                        //如果是客户自行导入的
+                        qb = qb.byIdStore(source.currentUser.idBindOrg)
+                    }
                     return qb.build()
                 })
                 .index(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1))
@@ -655,6 +671,11 @@ class BE_ERP_BusinessOrder_Search implements BusinessExecutor<ProcessSearchOptio
             return this
         }
 
+        ESConditionBuilder byIdStore(long idStore) {
+            qb = qb.must(QueryBuilders.termQuery("idStore", idStore))
+            return this
+        }
+
         ESConditionBuilder byOrderParentQuery(QueryBuilder qbParent) {
             qb = qb.must(JoinQueryBuilders.hasParentQuery(ESKeys.ES_DELIVER_BUSINESS_ORDER_TYPE, qbParent, false))
             return this

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

@@ -150,26 +150,50 @@ storeRealCollection = #{storerealcollection},omeServiceFee = #{omeservicefee},up
  #{updateby}, #{updatetime}, #{updatetimelong} );
 
 
-  -- [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};
+-- [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};
+
+-- [expressRiderOrder]
+update $table$ set
+orderStatus = #{orderStatus},
+updateBy = #{updateby},
+updateTime = #{updatetime},
+updateTimeLong = #{updatetimelong}
+where id = #{id};
+
+-- [addOrderRiderItem]
+insert into $table$ (
+id, idOrder, riderStatus, statusDesc,
+idPlatform, platformCode, platformName,
+platformOrderId, operatorName, operatorPhone,
+riderLng, riderLat, createBy,
+createTime, createTimeLong, updateBy,
+updateTime, updateTimeLong )
+values (
+#{id}, #{idorder}, #{riderstatus}, #{statusdesc},
+#{idplatform}, #{platformcode}, #{platformname},
+#{platformorderid}, #{operatorname}, #{operatorphone},
+#{riderlng}, #{riderlat}, #{createby},
+#{createtime}, #{createtimelong}, #{updateby},
+#{updatetime}, #{updatetimelong} );

+ 10 - 0
ddBusiness/src/main/java/com/dderp/business/dao/OrderDao.java

@@ -131,6 +131,16 @@ public interface OrderDao extends DaoRepository {
                            OrderFinances orderFinances,
                            List<OrderStep> stepList,
                            @DatabaseShardingBy String dataSourceId, String tableKey);
+
+    @Sharding(databaseShardingStrategy = SupplierDataBaseShardingStrategy.class, tableShardingStrategy = OrderTableShardingStrategy.class)
+    @DAOMethod(operator = OperatorType.UPDATE, owait = OperatorWait.AWAIT)
+    @SqlId(clazz = OrderDao.class, sql = "expressRiderOrder", table = "deBusinessOrder", tableParam = 5, params = {1}, sort = 1)
+    @SqlId(clazz = OrderDao.class, sql = "addOrderRiderItem", table = "deOrderRiderItems", tableParam = 5, params = {2}, sort = 2)
+    @SqlId(clazz = OrderDao.class, sql = "addOrderStep", table = "deOrderStep", tableParam = 5, params = {3}, sort = 3)
+    int expressRiderOrder(BusinessOrder businessOrder,
+                          OrderRiderItem orderRiderItem,
+                          List<OrderStep> stepList,
+                          @DatabaseShardingBy String dataSourceId, String tableKey);
     //endregion
 
 }

+ 43 - 0
ddCommon/src/main/java/com/dderp/common/datas/flycat/OrderRiderStatus.java

@@ -0,0 +1,43 @@
+package com.dderp.common.datas.flycat;
+
+public enum OrderRiderStatus {
+
+    accept("配送员接单", 1),
+
+    store("配送员到店", 2),
+
+    working("配送员配送中", 3),
+
+    complete("配送员点击完成", 4);
+
+    private String name;
+    private int value;
+
+    OrderRiderStatus(String name, int value) {
+        this.name = name;
+        this.value = value;
+    }
+
+    public static String getName(int value) {
+        for (OrderRiderStatus p : OrderRiderStatus.values()) {
+            if (p.getValue() == value) return p.getName();
+        }
+        return null;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public int getValue() {
+        return value;
+    }
+
+    public void setValue(int value) {
+        this.value = value;
+    }
+    }

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

@@ -57,6 +57,29 @@ public class OrderRiderItem extends BaseEntity {
     @RColumn("riderlat")
     private String riderLat;
 
+    public OrderRiderItem() {
+    }
+
+    private OrderRiderItem(Builder builder) {
+        setId(builder.id);
+        setIdOrder(builder.idOrder);
+        setRiderStatus(builder.riderStatus);
+        setStatusDesc(builder.statusDesc);
+        setIdPlatform(builder.idPlatform);
+        setPlatformCode(builder.platformCode);
+        setPlatformName(builder.platformName);
+        setPlatformOrderId(builder.platformOrderId);
+        setOperatorName(builder.operatorName);
+        setOperatorPhone(builder.operatorPhone);
+        setRiderLng(builder.riderLng);
+        setRiderLat(builder.riderLat);
+    }
+
+    public static Builder newBuilder() {
+        return new Builder();
+    }
+
+
     public long getId() {
         return id;
     }
@@ -152,4 +175,86 @@ public class OrderRiderItem extends BaseEntity {
     public void setRiderLat(String riderLat) {
         this.riderLat = riderLat;
     }
+
+    public static final class Builder {
+        private long id;
+        private long idOrder;
+        private int riderStatus;
+        private String statusDesc;
+        private long idPlatform;
+        private String platformCode;
+        private String platformName;
+        private String platformOrderId;
+        private String operatorName;
+        private String operatorPhone;
+        private String riderLng;
+        private String riderLat;
+
+        private Builder() {
+        }
+
+        public Builder id(long val) {
+            id = val;
+            return this;
+        }
+
+        public Builder idOrder(long val) {
+            idOrder = val;
+            return this;
+        }
+
+        public Builder riderStatus(int val) {
+            riderStatus = val;
+            return this;
+        }
+
+        public Builder statusDesc(String val) {
+            statusDesc = val;
+            return this;
+        }
+
+        public Builder idPlatform(long val) {
+            idPlatform = val;
+            return this;
+        }
+
+        public Builder platformCode(String val) {
+            platformCode = val;
+            return this;
+        }
+
+        public Builder platformName(String val) {
+            platformName = val;
+            return this;
+        }
+
+        public Builder platformOrderId(String val) {
+            platformOrderId = val;
+            return this;
+        }
+
+        public Builder operatorName(String val) {
+            operatorName = val;
+            return this;
+        }
+
+        public Builder operatorPhone(String val) {
+            operatorPhone = val;
+            return this;
+        }
+
+        public Builder riderLng(String val) {
+            riderLng = val;
+            return this;
+        }
+
+        public Builder riderLat(String val) {
+            riderLat = val;
+            return this;
+        }
+
+        public OrderRiderItem build() {
+            return new OrderRiderItem(this);
+        }
+    }
 }

+ 80 - 0
ddWebCore/src/main/java/com/dderp/webcore/rest/flycat/StoreAppRest.java

@@ -3,10 +3,13 @@ package com.dderp.webcore.rest.flycat;
 import com.dderp.common.api.LoginService;
 import com.dderp.common.api.StoreService;
 import com.dderp.common.api.SystemService;
+import com.dderp.common.api.flycat.OrderSearchService;
 import com.dderp.common.base.BaseService;
 import com.dderp.common.datas.ERPHeader;
 import com.dderp.common.datas.HttpCode;
+import com.dderp.common.datas.ReadOrderOption;
 import com.dderp.common.datas.TokenUserFrom;
+import com.dderp.common.entity.order.*;
 import com.dderp.common.entity.site.ERPTokenUser;
 import com.dderp.common.entity.site.LoginRequest;
 import com.dderp.common.entity.site.LoginResult;
@@ -15,10 +18,14 @@ import com.dySweetFishPlugin.sql.RMapUtils;
 import com.sweetfish.net.http.*;
 import com.sweetfish.service.Local;
 import com.sweetfish.service.RetResult;
+import com.sweetfish.source.PageFlipper;
+import com.sweetfish.util.AnyValue;
 import com.sweetfish.util.AutoLoad;
+import org.apache.commons.lang3.StringUtils;
 import org.rex.RMap;
 
 import javax.annotation.Resource;
+import java.util.*;
 import java.util.concurrent.CompletableFuture;
 
 @AutoLoad(false)
@@ -36,6 +43,22 @@ public class StoreAppRest extends BaseService {
     @Resource
     StoreService storeService;
 
+    @Resource
+    OrderSearchService orderSearchService;
+
+    private final Map<String, ReadOrderOption> readOrderOptionMap = new HashMap<>();
+
+    @Override
+    public void init(AnyValue config) {
+        super.init(config);
+
+        readOrderOptionMap.put("total", ReadOrderOption.ORDER_TOTAL);
+        readOrderOptionMap.put("finances", ReadOrderOption.ORDER_FINANCES);
+        readOrderOptionMap.put("delivery", ReadOrderOption.ORDER_DELIVERY);
+        readOrderOptionMap.put("product", ReadOrderOption.ORDER_PRODUCT);
+        readOrderOptionMap.put("rider", ReadOrderOption.ORDER_RIDER);
+    }
+
     @RestMapping(name = "login", logging = 1, sort = 1, comment = "登录", methods = {"POST"})
     public CompletableFuture<RMap> login(
             @RestSessionid(create = true) String sessionId,
@@ -76,4 +99,61 @@ public class StoreAppRest extends BaseService {
                 }, getExecutor()
         );
     }
+
+    @RestMapping(name = "queryOrderList", auth = true, sort = 100, comment = "获取订单列表", methods = {"GET", "POST"})
+    @WebApiBean(result = true, type = BusinessOrder.class)
+    public CompletableFuture<RMap> queryOrderList(
+            @RestParam(name = "params", comment = "搜索内容", required = false) RMap searchData,
+            @RestParam(name = "page", comment = "分页信息", required = false) PageFlipper pageFlipper,
+            @RestParam(name = "&", comment = "登录用户,无需传入") ERPTokenUser currentUser,
+            @RestHeader(name = ERPHeader.HTTPHEADER_DATASOURCE) String dataSourceId,
+            @RestHeader(name = ERPHeader.HTTPHEADER_SUPPLIER) String supplierCode) {
+        return CompletableFuture.supplyAsync(
+                () -> {
+                    RetResult<List<BusinessOrder>> retResult = orderSearchService.searchBusinessOrderList(searchData, currentUser, null,
+                            pageFlipper, dataSourceId, Long.parseLong(supplierCode), ReadOrderOption.ORDER_DELIVERY, ReadOrderOption.ORDER_FINANCES, ReadOrderOption.ORDER_TOTAL);
+                    if (retResult.isSuccess()) {
+                        return RMapUtils.successV2(retResult.getResult(), retResult.getAttachRMap(), retResult.getPageFlipper());
+                    }
+                    return RMapUtils.error(HttpCode.NOT_FOUND.value(), retResult.getRetinfo());
+                }, getExecutor()
+        );
+    }
+
+    @RestMapping(name = "getBusinessOrder", auth = true, sort = 101, comment = "获取订单详情", methods = {"GET", "POST"})
+    @WebApiBean(type = BusinessOrder.class, result = true)
+    @WebApiBean(type = OrderFinances.class, result = true)
+    @WebApiBean(type = OrderDetailItem.class, result = true)
+    @WebApiBean(type = OrderDeliveryInfo.class, result = true)
+    @WebApiBean(type = OrderRiderItem.class, result = true)
+    public CompletableFuture<RMap> getBusinessOrder(
+            @RestParam(name = "idOrder", comment = "订单id") long idOrder,
+            @RestParam(name = "options", comment = "读取内容,不传为全部", required = false) String options,
+            @RestParam(name = "&", comment = "登录用户,无需传入") ERPTokenUser currentUser,
+            @RestHeader(name = ERPHeader.HTTPHEADER_DATASOURCE) String dataSourceId,
+            @RestHeader(name = ERPHeader.HTTPHEADER_SUPPLIER) String supplierCode) {
+        return CompletableFuture.supplyAsync(
+                () -> {
+                    ReadOrderOption[] optionArr;
+                    if (StringUtils.isBlank(options)) {
+                        optionArr = new ReadOrderOption[]{ReadOrderOption.ORDER_FINANCES, ReadOrderOption.ORDER_DELIVERY, ReadOrderOption.ORDER_PRODUCT};
+                    } else {
+                        List<ReadOrderOption> optionList = new ArrayList<>();
+                        Arrays.stream(options.split(","))
+                                .forEach(s -> {
+                                    if (readOrderOptionMap.containsKey(s)) {
+                                        optionList.add(readOrderOptionMap.get(s));
+                                    }
+                                });
+                        optionArr = optionList.toArray(new ReadOrderOption[0]);
+                    }
+
+                    RetResult<BusinessOrder> result = orderSearchService.getBusinessOrder(idOrder, currentUser, dataSourceId, Long.parseLong(supplierCode), optionArr);
+                    if (!result.isSuccess()) {
+                        return RMapUtils.error(HttpCode.BAD_REQUEST.value(), result.getRetinfo());
+                    }
+                    return RMapUtils.successV2(result.getResult(), null, null);
+                }, getExecutor()
+        );
+    }
 }