From 142e151cc0dfa17420192b9ef476891031f2062d Mon Sep 17 00:00:00 2001
From: MrShi <1878285526@qq.com>
Date: 星期一, 20 四月 2026 17:20:27 +0800
Subject: [PATCH] Merge branch 'master' of http://139.186.142.91:10010/r/productDev/gtzxinglijicun

---
 server/services/src/main/java/com/doumee/dao/dto/DriverGrabOrderDTO.java                        |   27 
 server/services/src/main/java/com/doumee/dao/vo/DriverOrderDetailVO.java                        |   89 ++
 server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java       |  649 +++++++++++++++++
 server/web/src/main/java/com/doumee/api/web/ApiController.java                                  |   14 
 server/web/src/main/java/com/doumee/api/web/RevenueApi.java                                     |   72 ++
 server/services/src/main/java/com/doumee/service/business/impl/SmsrecordServiceImpl.java        |   17 
 server/services/src/main/java/com/doumee/dao/dto/CalculateLocalPriceDTO.java                    |   14 
 server/services/src/main/java/com/doumee/service/business/ShopInfoService.java                  |    2 
 server/web/src/main/java/com/doumee/api/web/ConfigApi.java                                      |   31 
 server/services/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java                           |    5 
 server/services/src/main/java/com/doumee/core/utils/aliyun/AliSmsService.java                   |    2 
 server/services/src/main/java/com/doumee/dao/vo/AccountResponse.java                            |    9 
 server/services/src/main/java/com/doumee/service/business/impl/AreasServiceImpl.java            |   15 
 server/services/src/main/java/com/doumee/dao/business/model/DriverInfo.java                     |    9 
 server/services/src/main/java/com/doumee/dao/vo/ShopNearbyVO.java                               |    6 
 server/services/src/main/java/com/doumee/dao/business/model/Category.java                       |    2 
 server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java |   25 
 server/services/src/main/java/com/doumee/dao/vo/RevenueSummaryVO.java                           |   17 
 server/services/src/main/java/com/doumee/dao/vo/DriverCenterVO.java                             |   46 +
 server/web/src/main/java/com/doumee/api/web/ShopInfoApi.java                                    |    4 
 server/services/src/main/java/com/doumee/dao/business/model/PricingRule.java                    |    2 
 server/services/src/main/java/com/doumee/dao/dto/ShopNearbyDTO.java                             |    3 
 server/web/src/main/java/com/doumee/api/web/OrdersApi.java                                      |   11 
 server/services/src/main/java/com/doumee/service/business/RevenueService.java                   |   38 +
 server/services/src/main/resources/application-pro.yml                                          |   44 
 server/services/src/main/java/com/doumee/dao/vo/EstimatedDeliveryResultVO.java                  |   26 
 server/services/src/main/java/com/doumee/dao/vo/ShopWebDetailVO.java                            |   12 
 server/services/src/main/java/com/doumee/dao/vo/UserCenterVO.java                               |   17 
 server/services/src/main/java/com/doumee/dao/business/model/Orders.java                         |   15 
 server/services/src/main/java/com/doumee/service/business/DriverInfoService.java                |   63 +
 server/services/src/main/java/com/doumee/core/utils/Tencent/MapUtil.java                        |   58 +
 server/services/src/main/java/com/doumee/dao/dto/RevenueQueryDTO.java                           |   28 
 server/web/src/main/java/com/doumee/api/web/WalletApi.java                                      |   13 
 server/services/src/main/java/com/doumee/config/jwt/WebMvcConfig.java                           |   55 +
 server/services/src/main/java/com/doumee/dao/dto/DriverActiveOrderDTO.java                      |   22 
 server/services/src/main/java/com/doumee/config/wx/WxPayProperties.java                         |   39 +
 server/services/src/main/java/com/doumee/core/annotation/LoginDriverRequired.java               |   10 
 server/services/src/main/java/com/doumee/service/business/OrdersService.java                    |   25 
 server/services/src/main/java/com/doumee/dao/dto/SameCityCheckDTO.java                          |   34 
 server/services/src/main/java/com/doumee/dao/dto/CalculateRemotePriceDTO.java                   |    3 
 server/services/src/main/java/com/doumee/service/business/AreasService.java                     |    8 
 server/services/src/main/java/com/doumee/dao/vo/DriverGrabOrderVO.java                          |   71 +
 server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java         |   31 
 server/services/src/main/resources/application-dev.yml                                          |   31 
 server/services/src/main/java/com/doumee/service/business/impl/BannerServiceImpl.java           |    2 
 server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java         |    8 
 server/web/src/main/java/com/doumee/api/web/DriverInfoApi.java                                  |  107 ++
 server/services/src/main/java/com/doumee/dao/vo/PriceCalculateVO.java                           |    6 
 server/services/src/main/java/com/doumee/service/business/impl/RevenueServiceImpl.java          |  116 +++
 server/services/db/db_change.sql                                                                |   20 
 server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java           |   29 
 server/services/src/main/java/com/doumee/dao/dto/ShopApplyDTO.java                              |    3 
 server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java           |  142 +++
 server/web/src/main/resources/application.yml                                                   |    2 
 server/services/src/main/java/com/doumee/config/alipay/AlipayFundTransUniTransfer.java          |   11 
 55 files changed, 1,998 insertions(+), 162 deletions(-)

diff --git a/server/services/db/db_change.sql b/server/services/db/db_change.sql
index eab5b91..2afd4ab 100644
--- a/server/services/db/db_change.sql
+++ b/server/services/db/db_change.sql
@@ -5,6 +5,25 @@
 
 
 -- ============================================================
+-- 2026/04/20 璁㈠崟琛ㄥ鍔犵墿鍝佺骇鍒瓧娈�
+-- ============================================================
+ALTER TABLE `orders` ADD COLUMN `GOOD_LEVEL` INT DEFAULT NULL COMMENT '鐗╁搧绾у埆锛坈ategory涓婚敭锛宼ype=3锛�' AFTER `GOOD_TYPE`;
+
+
+-- ============================================================
+-- 2026/04/17 璁㈠崟棰勮閫佽揪鏃堕棿瀛楁
+-- ============================================================
+ALTER TABLE `orders` ADD COLUMN `ESTIMATED_DELIVERY_TIME` DATETIME DEFAULT NULL COMMENT '棰勮閫佽揪鏃堕棿' AFTER `CODE`;
+
+
+-- ============================================================
+-- 2026/04/17 鍙告満瀹炴椂瀹氫綅瀛楁
+-- ============================================================
+ALTER TABLE `driver_info` ADD COLUMN `LONGITUDE` DOUBLE DEFAULT NULL COMMENT '瀹氫綅缁忓害' AFTER `ACCEPTING_STATUS`;
+ALTER TABLE `driver_info` ADD COLUMN `LATITUDE` DOUBLE DEFAULT NULL COMMENT '瀹氫綅绾害' AFTER `LONGITUDE`;
+
+
+-- ============================================================
 -- 2026/04/16 璁㈠崟缁撶畻鍔熻兘锛氱粨绠楁椂闂村瓧娈� + 闂ㄥ簵/鍙告満浣欓瀛楁
 -- ============================================================
 ALTER TABLE `orders` ADD COLUMN `SETTLEMENT_TIME` DATETIME DEFAULT NULL COMMENT '缁撶畻鏃堕棿' AFTER `SETTLEMENT_STATUS`;
@@ -14,6 +33,7 @@
 
 ALTER TABLE `driver_info` ADD COLUMN `BALANCE` BIGINT DEFAULT 0 COMMENT '褰撳墠浣欓(鍒�)' AFTER `SCORE`;
 ALTER TABLE `driver_info` ADD COLUMN `TOTAL_BALANCE` BIGINT DEFAULT 0 COMMENT '鍘嗗彶鎬婚噾棰�(鍒�)' AFTER `BALANCE`;
+ALTER TABLE `driver_info` ADD COLUMN `ACCEPTING_STATUS` INT DEFAULT 0 COMMENT '鏄惁鎺ュ崟涓細0=鏈帴鍗曪紱1=鎺ュ崟涓�' AFTER `TOTAL_BALANCE`;
 
 
 -- ============================================================
diff --git a/server/services/src/main/java/com/doumee/config/alipay/AlipayFundTransUniTransfer.java b/server/services/src/main/java/com/doumee/config/alipay/AlipayFundTransUniTransfer.java
index def1a64..e495576 100644
--- a/server/services/src/main/java/com/doumee/config/alipay/AlipayFundTransUniTransfer.java
+++ b/server/services/src/main/java/com/doumee/config/alipay/AlipayFundTransUniTransfer.java
@@ -17,39 +17,29 @@
         ApiClient defaultClient = Configuration.getDefaultApiClient();
         // 鍒濆鍖朼lipay鍙傛暟锛堝叏灞�璁剧疆涓�娆★級
         defaultClient.setAlipayConfig(getAlipayConfig());
-
         // 鏋勯�犺姹傚弬鏁颁互璋冪敤鎺ュ彛
         AlipayFundTransUniApi api = new AlipayFundTransUniApi();
         AlipayFundTransUniTransferModel data = new AlipayFundTransUniTransferModel();
-
         // 璁剧疆鍟嗗渚у敮涓�璁㈠崟鍙�
         data.setOutBizNo("202606300001");
-
         // 璁剧疆璁㈠崟鎬婚噾棰�
         data.setTransAmount("1");
-
         // 璁剧疆鎻忚堪鐗瑰畾鐨勪笟鍔″満鏅�
         data.setBizScene("DIRECT_TRANSFER");
-
         // 璁剧疆涓氬姟浜у搧鐮�
         data.setProductCode("TRANS_ACCOUNT_NO_PWD");
-
         // 璁剧疆杞处涓氬姟鐨勬爣棰�
         data.setOrderTitle("201905浠e彂");
-
         // 璁剧疆鍘熸敮浠樺疂涓氬姟鍗曞彿
         data.setOriginalOrderId("20190620110075000006640000063056");
-
         // 璁剧疆鏀舵鏂逛俊鎭�
         Participant payeeInfo = new Participant();
         payeeInfo.setIdentity("15345690849");
         payeeInfo.setName("姹熻悕");
         payeeInfo.setIdentityType("ALIPAY_LOGON_ID");
         data.setPayeeInfo(payeeInfo);
-
         // 璁剧疆涓氬姟澶囨敞
         data.setRemark("201905浠e彂");
-
         // 璁剧疆杞处鍦烘櫙鍚嶇О
         data.setTransferSceneName("浣i噾鎶ラ叕");
 
@@ -74,7 +64,6 @@
         signData.setOriCharSet("UTF-8");
         data.setSignData(signData);
 */
-
         try {
             AlipayFundTransUniTransferResponseModel response = api.transfer(data);
         } catch (ApiException e) {
diff --git a/server/services/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java b/server/services/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java
index aab481a..1adf556 100644
--- a/server/services/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java
+++ b/server/services/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java
@@ -29,11 +29,10 @@
 
     public static final String MEMBER_ID = "MEMBER_ID";
 
-    public static final String MEMBER_INFO = "MEMBER_INFO";
-
     public static final String SHOP_ID = "SHOP_ID";
 
-    public static final String SHOP_INFO = "SHOP_INFO";
+    public static final String DRIVER_ID = "DRIVER_ID";
+
 
     @Resource
     private RedisTemplate<String,Object> redisTemplate;
diff --git a/server/services/src/main/java/com/doumee/config/jwt/WebMvcConfig.java b/server/services/src/main/java/com/doumee/config/jwt/WebMvcConfig.java
index 6a3bcd9..3c85107 100644
--- a/server/services/src/main/java/com/doumee/config/jwt/WebMvcConfig.java
+++ b/server/services/src/main/java/com/doumee/config/jwt/WebMvcConfig.java
@@ -1,6 +1,7 @@
 package com.doumee.config.jwt;
 
 import com.alibaba.fastjson.JSONObject;
+import com.doumee.core.annotation.LoginDriverRequired;
 import com.doumee.core.annotation.LoginRequired;
 import com.doumee.core.annotation.LoginShopRequired;
 import com.doumee.core.constants.Constants;
@@ -87,6 +88,22 @@
                     } else {
                         throw new BusinessException(ResponseStatus.BE_OVERDUE.getCode(),"鏈櫥褰�");
                     }
+                }else if (beanType.isAnnotationPresent(LoginDriverRequired.class)) {
+                    //鑾峰彇token
+                    String token = request.getHeader(JwtTokenUtil.HEADER_KEY);  // 浠� http 璇锋眰澶翠腑鍙栧嚭 token
+                    if (StringUtils.isNotBlank(token)) {
+                        checkDriverLogin(request,response);
+                    } else {
+                        throw new BusinessException(ResponseStatus.BE_OVERDUE.getCode(),"鏈櫥褰�");
+                    }
+                }else if (handlerMethod.hasMethodAnnotation(LoginDriverRequired.class)){
+                    //鑾峰彇token
+                    String token = request.getHeader(JwtTokenUtil.HEADER_KEY);  // 浠� http 璇锋眰澶翠腑鍙栧嚭 token
+                    if (StringUtils.isNotBlank(token)) {
+                        checkDriverLogin(request,response);
+                    } else {
+                        throw new BusinessException(ResponseStatus.BE_OVERDUE.getCode(),"鏈櫥褰�");
+                    }
                 }
                 return true;
             }
@@ -99,11 +116,10 @@
     public Boolean checkMemberLogin(HttpServletRequest request, HttpServletResponse response){
         String token = request.getHeader(JwtTokenUtil.HEADER_KEY);
         try {
-
             if(!token.startsWith(Constants.ZERO+"")){
                 throw new BusinessException(ResponseStatus.TOKEN_EXCEED_TIME);
             }
-            String tokenRedis = (String) redisTemplate.opsForValue().get(token);
+            String tokenRedis = (String) redisTemplate.opsForValue().get(Constants.REDIS_TOKEN_KEY+token);
             if(StringUtils.isBlank(tokenRedis)){
                 throw new BusinessException(ResponseStatus.BE_OVERDUE);
             }
@@ -117,7 +133,6 @@
             }
             Integer count = dao.queryForObject("select count(1) from member where id  = ?", Integer.class, member.getId());
             if (count != null && count > 0) {
-                request.setAttribute(JwtTokenUtil.MEMBER_INFO, JSONObject.toJSONString(member));
                 request.setAttribute(JwtTokenUtil.MEMBER_ID, member.getId());
                 return true;
             }else{
@@ -135,7 +150,7 @@
             if(!token.startsWith(Constants.TWO+"")){
                 throw new BusinessException(ResponseStatus.TOKEN_EXCEED_TIME);
             }
-            String tokenRedis = (String) redisTemplate.opsForValue().get(token);
+            String tokenRedis = (String) redisTemplate.opsForValue().get(Constants.REDIS_TOKEN_KEY+token);
             if(StringUtils.isBlank(tokenRedis)){
                 throw new BusinessException(ResponseStatus.BE_OVERDUE);
             }
@@ -159,7 +174,6 @@
             }
             Integer count = dao.queryForObject("select count(1) from shop where id  = ?", Integer.class, shopId);
             if (count != null && count > 0) {
-                request.setAttribute(JwtTokenUtil.SHOP_INFO, JSONObject.toJSONString(shop));
                 request.setAttribute(JwtTokenUtil.SHOP_ID, shop.getId());
                 return true;
             }else{
@@ -170,6 +184,37 @@
         }
     }
 
+    public Boolean checkDriverLogin(HttpServletRequest request, HttpServletResponse response){
+        String token = request.getHeader(JwtTokenUtil.HEADER_KEY);
+        try {
+            if(!token.startsWith(Constants.ONE+"")){
+                throw new BusinessException(ResponseStatus.TOKEN_EXCEED_TIME);
+            }
+            String tokenRedis = (String) redisTemplate.opsForValue().get(Constants.REDIS_TOKEN_KEY+token);
+            if(StringUtils.isBlank(tokenRedis)){
+                throw new BusinessException(ResponseStatus.BE_OVERDUE);
+            }
+            Integer memberId = getTokenId(token);
+            Integer isDeleted = dao.queryForObject(" select COALESCE(DELETED,1)  from member where user_type = 1 and   id  = ?", Integer.class, memberId);
+            if(isDeleted== Constants.ONE){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍙告満淇℃伅宸插垹闄�,璇疯仈绯荤鐞嗗憳");
+            }
+            Integer isForbidden = dao.queryForObject(" select COALESCE(STATUS,0)  from member where user_type = 1 and  id  = ?", Integer.class, memberId);
+            if(isForbidden == Constants.ONE){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍙告満淇℃伅宸茬鐢�,璇疯仈绯荤鐞嗗憳");
+            }
+            Integer count = dao.queryForObject("select count(1) from member where  user_type = 1  and id  = ?", Integer.class, memberId);
+            if (count != null && count > 0) {
+                request.setAttribute(JwtTokenUtil.DRIVER_ID, memberId);
+                return true;
+            }else{
+                throw new BusinessException(ResponseStatus.BE_OVERDUE.getCode(),"鍙告満淇℃伅鍑洪敊");
+            }
+        } catch (IllegalArgumentException | JwtException e) {
+            throw new BusinessException(ResponseStatus.BE_OVERDUE);
+        }
+    }
+
 
     public Integer getTokenId(String token){
         try {
diff --git a/server/services/src/main/java/com/doumee/config/wx/WxPayProperties.java b/server/services/src/main/java/com/doumee/config/wx/WxPayProperties.java
index 5c86de7..e4c45ba 100644
--- a/server/services/src/main/java/com/doumee/config/wx/WxPayProperties.java
+++ b/server/services/src/main/java/com/doumee/config/wx/WxPayProperties.java
@@ -46,4 +46,43 @@
      */
     private String keyPath;
 
+
+
+    /**
+     * apiV3Key
+     */
+    private String apiV3Key;
+
+
+
+    /**
+     * 鍟嗘埛璇佷功搴忓垪鍙�
+     */
+    private String serialNumer;
+
+    /**
+     * 閫�娆惧洖璋�
+     */
+    private String refundNotifyUrl;
+
+    /**
+     * 鍟嗘埛鏀粯鍏挜
+     */
+    private String pubKeyPath;
+
+
+    /**
+     * 鏀粯绉橀挜
+     */
+    private String privateCertPath;
+
+
+
+    /**
+     * 鏀粯key
+     */
+    private String privateKeyPath;
+
+
+
 }
diff --git a/server/services/src/main/java/com/doumee/core/annotation/LoginDriverRequired.java b/server/services/src/main/java/com/doumee/core/annotation/LoginDriverRequired.java
new file mode 100644
index 0000000..f8e4dda
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/core/annotation/LoginDriverRequired.java
@@ -0,0 +1,10 @@
+package com.doumee.core.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target({ElementType.METHOD,ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface LoginDriverRequired {}
diff --git a/server/services/src/main/java/com/doumee/core/utils/Tencent/MapUtil.java b/server/services/src/main/java/com/doumee/core/utils/Tencent/MapUtil.java
index cf377b8..9604686 100644
--- a/server/services/src/main/java/com/doumee/core/utils/Tencent/MapUtil.java
+++ b/server/services/src/main/java/com/doumee/core/utils/Tencent/MapUtil.java
@@ -28,6 +28,9 @@
     /** 璺濈鐭╅樀API */
     public static final String MATRIX_URL = "https://apis.map.qq.com/ws/distance/v1/matrix";
 
+    /** 閫嗗湴鐞嗚В鏋� */
+    public static final String GEO_URL = "https://apis.map.qq.com/ws/geocoder/v1/";
+
     /** 鏀寔鐨勬ā寮� */
     private static final List<String> SUPPORTED_MODES = Arrays.asList("driving", "bicycling");
 
@@ -121,4 +124,59 @@
                 .map(row -> ((JSONObject) row).getJSONArray("elements").getJSONObject(0))
                 .collect(Collectors.toList());
     }
+
+    /**
+     * 閫嗗湴鐞嗚В鏋� - 鏍规嵁缁忕含搴﹁幏鍙栧湴鍧�淇℃伅
+     *
+     * @param lat 绾害
+     * @param lng 缁忓害
+     * @return result.ad_info 涓殑 adcode(鍖哄垝鐮�)銆乧ity(鍩庡競)銆乨istrict(鍖�) 绛変俊鎭�
+     */
+    public static JSONObject reverseGeocode(double lat, double lng) {
+        try {
+            String url = GEO_URL
+                    + "?key=" + tencentKey
+                    + "&location=" + lat + "," + lng;
+
+            log.info("鑵捐鍦板浘閫嗗湴鐞嗚В鏋愯姹�: location={},{}", lat, lng);
+
+            JSONObject json = new Http().build(url)
+                    .setConnectTimeout(5000)
+                    .setReadTimeout(10000)
+                    .get()
+                    .toJSONObject();
+
+            log.info("鑵捐鍦板浘閫嗗湴鐞嗚В鏋愬搷搴�: {}", json);
+
+            if (json.getIntValue("status") != 0) {
+                throw new RuntimeException("鑵捐鍦板浘閫嗗湴鐞嗚В鏋愬け璐�: " + json.getString("message"));
+            }
+
+            return json.getJSONObject("result");
+        } catch (IOException e) {
+            log.error("鑵捐鍦板浘閫嗗湴鐞嗚В鏋愬紓甯�", e);
+            throw new RuntimeException("鑵捐鍦板浘閫嗗湴鐞嗚В鏋愬紓甯�", e);
+        }
+    }
+
+    /**
+     * 鍒ゆ柇涓や釜缁忕含搴︽槸鍚﹀湪鍚屼竴涓煄甯�
+     *
+     * @param lat1 绗竴涓偣绾害
+     * @param lng1 绗竴涓偣缁忓害
+     * @param lat2 绗簩涓偣绾害
+     * @param lng2 绗簩涓偣缁忓害
+     * @return true=鍚屽煄锛宖alse=涓嶅悓鍩�
+     */
+    public static boolean isSameCity(double lat1, double lng1, double lat2, double lng2) {
+        JSONObject result1 = reverseGeocode(lat1, lng1);
+        JSONObject result2 = reverseGeocode(lat2, lng2);
+
+        String city1 = result1.getJSONObject("ad_info").getString("city");
+        String city2 = result2.getJSONObject("ad_info").getString("city");
+
+        log.info("鍒ゆ柇鍚屽煄: ({},{}) => city={}, ({},{}) => city={}", lat1, lng1, city1, lat2, lng2, city2);
+
+        return city1 != null && city1.equals(city2);
+    }
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/AliSmsService.java b/server/services/src/main/java/com/doumee/core/utils/aliyun/AliSmsService.java
similarity index 98%
rename from server/services/src/main/java/com/doumee/service/business/AliSmsService.java
rename to server/services/src/main/java/com/doumee/core/utils/aliyun/AliSmsService.java
index 43f915d..66796b6 100644
--- a/server/services/src/main/java/com/doumee/service/business/AliSmsService.java
+++ b/server/services/src/main/java/com/doumee/core/utils/aliyun/AliSmsService.java
@@ -1,4 +1,4 @@
-package com.doumee.service.business;
+package com.doumee.core.utils.aliyun;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/Category.java b/server/services/src/main/java/com/doumee/dao/business/model/Category.java
index 62bdcfd..7905e9e 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/Category.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/Category.java
@@ -79,7 +79,7 @@
     @ExcelColumn(name="鎺掑簭鐮侊紙鍗囧簭锛�")
     private Integer sortnum;
 
-    @ApiModelProperty(value = "闄勫睘瀛楁1 (type=1:鏄惁闇�瑕佷笂浼犻┚椹惰瘉锛�0=涓嶉渶瑕侊紱1=闇�瑕侊紱) ")
+    @ApiModelProperty(value = "闄勫睘瀛楁1 (type=1:鏄惁闇�瑕佷笂浼犻┚椹惰瘉锛�0=涓嶉渶瑕侊紱1=闇�瑕侊紱type=3:鏄惁璐甸噸鐗╁搧锛�0=鍚︼紱1=鏄紱type=4:灏哄鎻忚堪锛�) ")
     @ExcelColumn(name="鍐呭")
     private String otherField;
 
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/DriverInfo.java b/server/services/src/main/java/com/doumee/dao/business/model/DriverInfo.java
index c38dd92..0ccc1e6 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/DriverInfo.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/DriverInfo.java
@@ -141,6 +141,15 @@
     @ApiModelProperty(value = "鍘嗗彶鎬婚噾棰�(鍒�)")
     private Long totalBalance;
 
+    @ApiModelProperty(value = "鏄惁鎺ュ崟涓細0=宸蹭笅绾匡紱1=鎺ュ崟涓�", example = "0")
+    private Integer acceptingStatus;
+
+    @ApiModelProperty(value = "瀹氫綅缁忓害", example = "116.404")
+    private Double longitude;
+
+    @ApiModelProperty(value = "瀹氫綅绾害", example = "39.915")
+    private Double latitude;
+
     @ApiModelProperty(value = "杞﹁締鐓х墖鍒楄〃")
     @TableField(exist = false)
     private List<Multifile> carImgList = new ArrayList<>();
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/Orders.java b/server/services/src/main/java/com/doumee/dao/business/model/Orders.java
index d8b5f77..ab1ac3d 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/Orders.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/Orders.java
@@ -191,6 +191,9 @@
     @ExcelColumn(name = "鍟嗗搧绫诲瀷")
     private Integer goodType;
 
+    @ApiModelProperty(value = "鐗╁搧绾у埆锛坈ategory涓婚敭锛宼ype=3锛�")
+    private Integer goodLevel;
+
     @ApiModelProperty(value = "琛ュ厖淇℃伅")
     @ExcelColumn(name = "琛ュ厖淇℃伅")
     private String supplement;
@@ -283,6 +286,10 @@
     @ApiModelProperty(value = "璁㈠崟缂栧彿")
     @ExcelColumn(name = "璁㈠崟缂栧彿")
     private String code;
+
+    @ApiModelProperty(value = "棰勮閫佽揪鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date estimatedDeliveryTime;
 
     @ApiModelProperty(value = "鍙告満钖叕锛堝垎锛�")
     @ExcelColumn(name = "鍙告満钖叕")
@@ -397,4 +404,12 @@
     @ApiModelProperty(value = "鍙栦欢闂ㄥ簵鍦板潃锛堝叧鑱旀煡璇級")
     private String takeShopAddress;
 
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鍙栦欢闂ㄥ簵鑱旂郴鐢佃瘽锛堝叧鑱旀煡璇級")
+    private String takeShopLinkPhone;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鐗╁搧绛夌骇璐甸噸鏍囪瘑锛堝叧鑱旀煡璇細0=鍚︼紱1=鏄級")
+    private String c2OtherField;
+
 }
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/PricingRule.java b/server/services/src/main/java/com/doumee/dao/business/model/PricingRule.java
index 18fb878..dd30250 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/PricingRule.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/PricingRule.java
@@ -48,7 +48,7 @@
     @ApiModelProperty(value = "鍩庡競涓婚敭锛坅rea_id锛�", example = "1")
     private Integer cityId;
 
-    @ApiModelProperty(value = "绫诲瀷锛�0=灏卞湴瀛樺彇瑙勫垯锛�1=寮傚湴瀛樺彇瑙勫垯锛�2=棰勮澶辨晥锛�3=闂ㄥ簵娉ㄥ唽鎶奸噾锛�4=鍒嗘垚姣斾緥", example = "0")
+    @ApiModelProperty(value = "绫诲瀷锛�0=灏卞湴瀛樺彇瑙勫垯锛�1=寮傚湴瀛樺彇瑙勫垯锛�2=棰勮鏃舵晥锛�3=闂ㄥ簵娉ㄥ唽鎶奸噾锛�4=鍒嗘垚姣斾緥", example = "0")
     @ExcelColumn(name = "绫诲瀷", index = 2, width = 10, valueMapping = "0=灏卞湴瀛樺彇瑙勫垯;1=寮傚湴瀛樺彇瑙勫垯;2=棰勮澶辨晥;3=闂ㄥ簵娉ㄥ唽鎶奸噾;4=鍒嗘垚姣斾緥;")
     private Integer type;
 
diff --git a/server/services/src/main/java/com/doumee/dao/dto/CalculateLocalPriceDTO.java b/server/services/src/main/java/com/doumee/dao/dto/CalculateLocalPriceDTO.java
index c411602..9d95813 100644
--- a/server/services/src/main/java/com/doumee/dao/dto/CalculateLocalPriceDTO.java
+++ b/server/services/src/main/java/com/doumee/dao/dto/CalculateLocalPriceDTO.java
@@ -8,6 +8,7 @@
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -24,17 +25,18 @@
     @NotNull(message = "鍩庡競涓嶈兘涓虹┖")
     private Integer cityId;
 
-    @ApiModelProperty(value = "棰勮瀛樻斁澶╂暟", required = true)
-    @NotNull(message = "棰勮瀛樻斁澶╂暟涓嶈兘涓虹┖")
-    private Integer estimatedDepositDays;
+    @ApiModelProperty(value = "棰勮瀛樻斁寮�濮嬫椂闂�", required = true)
+    @NotNull(message = "棰勮瀛樻斁寮�濮嬫椂闂翠笉鑳戒负绌�")
+    private Date depositStartTime;
+
+    @ApiModelProperty(value = "棰勮瀛樻斁缁撴潫鏃堕棿", required = true)
+    @NotNull(message = "棰勮瀛樻斁缁撴潫鏃堕棿涓嶈兘涓虹┖")
+    private Date depositEndTime;
 
     @ApiModelProperty(value = "鐗╁搧鍒楄〃", required = true)
     @NotEmpty(message = "鐗╁搧鍒楄〃涓嶈兘涓虹┖")
     @Valid
     private List<OrderItemDTO> items;
-
-    @ApiModelProperty(value = "鏄惁淇濅环")
-    private Boolean insured;
 
     @ApiModelProperty(value = "淇濅环閲戦(鍏�)")
     private BigDecimal declaredAmount;
diff --git a/server/services/src/main/java/com/doumee/dao/dto/CalculateRemotePriceDTO.java b/server/services/src/main/java/com/doumee/dao/dto/CalculateRemotePriceDTO.java
index b512f85..e4e2bc2 100644
--- a/server/services/src/main/java/com/doumee/dao/dto/CalculateRemotePriceDTO.java
+++ b/server/services/src/main/java/com/doumee/dao/dto/CalculateRemotePriceDTO.java
@@ -45,9 +45,6 @@
     @Valid
     private List<OrderItemDTO> items;
 
-    @ApiModelProperty(value = "鏄惁淇濅环")
-    private Boolean insured;
-
     @ApiModelProperty(value = "淇濅环閲戦(鍏�)")
     private BigDecimal declaredAmount;
 
diff --git a/server/services/src/main/java/com/doumee/dao/dto/DriverActiveOrderDTO.java b/server/services/src/main/java/com/doumee/dao/dto/DriverActiveOrderDTO.java
new file mode 100644
index 0000000..4b6bbe9
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/DriverActiveOrderDTO.java
@@ -0,0 +1,22 @@
+package com.doumee.dao.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 鍙告満杩涜涓鍗曟煡璇㈣姹�
+ * @author rk
+ * @date 2026/04/17
+ */
+@Data
+@ApiModel("鍙告満杩涜涓鍗曟煡璇㈣姹�")
+public class DriverActiveOrderDTO {
+
+    @NotNull(message = "璁㈠崟鐘舵�佷笉鑳戒负绌�")
+    @ApiModelProperty(value = "璁㈠崟鐘舵�侊細3=宸叉姠鍗曪紱4=娲鹃�佷腑", example = "3", required = true)
+    private Integer status;
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/DriverGrabOrderDTO.java b/server/services/src/main/java/com/doumee/dao/dto/DriverGrabOrderDTO.java
new file mode 100644
index 0000000..36081b7
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/DriverGrabOrderDTO.java
@@ -0,0 +1,27 @@
+package com.doumee.dao.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 鍙告満鎶㈠崟澶у巺鏌ヨ璇锋眰
+ * @author rk
+ * @date 2026/04/17
+ */
+@Data
+@ApiModel("鍙告満鎶㈠崟澶у巺鏌ヨ璇锋眰")
+public class DriverGrabOrderDTO implements Serializable {
+
+    @ApiModelProperty(value = "鎺掑簭绫诲瀷锛�1=缁煎悎鎺掑簭锛堝垱寤烘椂闂村�掑簭锛夛紱2=璺濈鏈�杩戯紙璺濆瓨浠堕棬搴楄窛绂诲崌搴忥級", example = "1")
+    private Integer sortType;
+
+    @ApiModelProperty(value = "鐗╁搧绛夌骇ID锛坈ategory type=3锛夛紝绛涢�夎绛夌骇涓嬬殑鎵�鏈夌墿鍝佸垎绫�", example = "5")
+    private Integer gradeId;
+
+    @ApiModelProperty(value = "璺濈绛涢�夛紙鍗曚綅锛氱背锛夛紝鍙告満鍒板瓨浠堕棬搴楃殑鏈�澶ц窛绂�", example = "5000")
+    private Integer distance;
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/RevenueQueryDTO.java b/server/services/src/main/java/com/doumee/dao/dto/RevenueQueryDTO.java
new file mode 100644
index 0000000..4c888bd
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/RevenueQueryDTO.java
@@ -0,0 +1,28 @@
+package com.doumee.dao.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@ApiModel("娴佹按鏌ヨ鏉′欢")
+public class RevenueQueryDTO {
+
+    @ApiModelProperty(value = "鏀舵敮绫诲瀷锛�1=鏀跺叆锛�-1=鏀嚭")
+    private Integer optType;
+
+    @ApiModelProperty(value = "鍙樺姩绫诲瀷锛�0=瀹屾垚璁㈠崟锛�1=鎻愮幇鏀嚭锛�2=鎻愮幇閫�鍥烇紱3=骞冲彴濂栧姳")
+    private Integer type;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "寮�濮嬫椂闂�")
+    private Date startTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "缁撴潫鏃堕棿")
+    private Date endTime;
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/SameCityCheckDTO.java b/server/services/src/main/java/com/doumee/dao/dto/SameCityCheckDTO.java
new file mode 100644
index 0000000..9b83d85
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/SameCityCheckDTO.java
@@ -0,0 +1,34 @@
+package com.doumee.dao.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 鏍¢獙涓や釜缁忕含搴︽槸鍚﹀悓鍩庤姹�
+ * @author rk
+ * @date 2026/04/17
+ */
+@Data
+@ApiModel("鏍¢獙鍚屽煄璇锋眰")
+public class SameCityCheckDTO {
+
+    @NotNull(message = "绗竴涓偣绾害涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "绗竴涓偣绾害", example = "39.915", required = true)
+    private Double lat1;
+
+    @NotNull(message = "绗竴涓偣缁忓害涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "绗竴涓偣缁忓害", example = "116.404", required = true)
+    private Double lng1;
+
+    @NotNull(message = "绗簩涓偣绾害涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "绗簩涓偣绾害", example = "31.230", required = true)
+    private Double lat2;
+
+    @NotNull(message = "绗簩涓偣缁忓害涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "绗簩涓偣缁忓害", example = "121.473", required = true)
+    private Double lng2;
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/ShopApplyDTO.java b/server/services/src/main/java/com/doumee/dao/dto/ShopApplyDTO.java
index 634ff08..9dad07d 100644
--- a/server/services/src/main/java/com/doumee/dao/dto/ShopApplyDTO.java
+++ b/server/services/src/main/java/com/doumee/dao/dto/ShopApplyDTO.java
@@ -19,6 +19,9 @@
 @ApiModel("闂ㄥ簵鍏ラ┗鐢宠璇锋眰")
 public class ShopApplyDTO implements Serializable {
 
+    @ApiModelProperty(value = "鐧诲綍鐢ㄦ埛涓婚敭", hidden = true, example = "0")
+    private Integer memberId;
+
     @ApiModelProperty(value = "浼佷笟绫诲瀷锛�0=涓汉锛�1=浼佷笟", required = true, example = "0")
     @NotNull(message = "浼佷笟绫诲瀷涓嶈兘涓虹┖")
     private Integer companyType;
diff --git a/server/services/src/main/java/com/doumee/dao/dto/ShopNearbyDTO.java b/server/services/src/main/java/com/doumee/dao/dto/ShopNearbyDTO.java
index b322330..5d91f4a 100644
--- a/server/services/src/main/java/com/doumee/dao/dto/ShopNearbyDTO.java
+++ b/server/services/src/main/java/com/doumee/dao/dto/ShopNearbyDTO.java
@@ -36,4 +36,7 @@
     @ApiModelProperty(value = "闂ㄥ簵鍚嶇О锛堟ā绯婃煡璇級", example = "XX闂ㄥ簵")
     private String name;
 
+    @ApiModelProperty(value = "鍩庡競涓婚敭", example = "1")
+    private Integer cityId;
+
 }
diff --git a/server/services/src/main/java/com/doumee/dao/vo/AccountResponse.java b/server/services/src/main/java/com/doumee/dao/vo/AccountResponse.java
index 5bd0298..e229cd6 100644
--- a/server/services/src/main/java/com/doumee/dao/vo/AccountResponse.java
+++ b/server/services/src/main/java/com/doumee/dao/vo/AccountResponse.java
@@ -27,15 +27,6 @@
     @ApiModelProperty(value = "鐢ㄦ埛淇℃伅")
     private Member member;
 
-    @ApiModelProperty(value = "鎴戞敞鍐岀殑闂ㄥ簵涓婚敭锛堥棬搴楃敤鎴锋椂杩斿洖锛�")
-    private Integer shopId;
-
-    @ApiModelProperty(value = "鎴戞敞鍐岀殑闂ㄥ簵瀹℃牳鐘舵�侊紙闂ㄥ簵鐢ㄦ埛鏃惰繑鍥烇級: 0=寰呭鏍� 1=宸查�氳繃 2=宸查┏鍥� 3=宸茬即绾充繚璇侀噾")
-    private Integer shopAuditStatus;
-
-    @ApiModelProperty(value = "闂ㄥ簵token")
-    private String loginShopToken;
-
 
 
 
diff --git a/server/services/src/main/java/com/doumee/dao/vo/DriverCenterVO.java b/server/services/src/main/java/com/doumee/dao/vo/DriverCenterVO.java
new file mode 100644
index 0000000..b637fc2
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/vo/DriverCenterVO.java
@@ -0,0 +1,46 @@
+package com.doumee.dao.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 鍙告満绔椤典俊鎭�
+ * @author rk
+ * @date 2026/04/17
+ */
+@Data
+@ApiModel("鍙告満绔椤典俊鎭�")
+public class DriverCenterVO {
+
+    @ApiModelProperty(value = "鍙告満濮撳悕")
+    private String name;
+
+    @ApiModelProperty(value = "鍙告満澶村儚")
+    private String imgUrl;
+
+    @ApiModelProperty(value = "鍙告満澶村儚鍏ㄨ矾寰�")
+    private String fullImgUrl;
+
+    @ApiModelProperty(value = "杞︾墝鍙�")
+    private String carCode;
+
+    @ApiModelProperty(value = "鏈嶅姟璇勫垎")
+    private String score;
+
+    @ApiModelProperty(value = "浠婃棩棰勮浣i噾(鍒�)")
+    private Long todayCommission;
+
+    @ApiModelProperty(value = "浠婃棩鎺ュ崟鏁�")
+    private Integer todayOrderCount;
+
+    @ApiModelProperty(value = "鎴戠殑浣欓(鍒�)")
+    private Long balance;
+
+    @ApiModelProperty(value = "寰呭彇璐ц鍗曟暟閲�")
+    private Integer waitPickCount;
+
+    @ApiModelProperty(value = "寰呴厤閫佽鍗曟暟閲�")
+    private Integer waitDeliverCount;
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/vo/DriverGrabOrderVO.java b/server/services/src/main/java/com/doumee/dao/vo/DriverGrabOrderVO.java
new file mode 100644
index 0000000..926cb22
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/vo/DriverGrabOrderVO.java
@@ -0,0 +1,71 @@
+package com.doumee.dao.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 鍙告満鎶㈠崟澶у巺鍒楄〃椤�
+ * @author rk
+ * @date 2026/04/17
+ */
+@Data
+@ApiModel("鍙告満鎶㈠崟澶у巺鍒楄〃椤�")
+public class DriverGrabOrderVO implements Serializable {
+
+    @ApiModelProperty(value = "璁㈠崟涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "璁㈠崟缂栧彿")
+    private String code;
+
+    @ApiModelProperty(value = "鍓╀綑鍒嗛挓鏁帮紙褰撳墠鏃堕棿鍒伴璁¢�佽揪鏃堕棿锛�")
+    private Long remainMinutes;
+
+    @ApiModelProperty(value = "鏄惁鍔犳�ワ細0=鍚︼紱1=鏄�")
+    private Integer isUrgent;
+
+    @ApiModelProperty(value = "瀛樹欢闂ㄥ簵鍚嶇О")
+    private String depositShopName;
+
+    @ApiModelProperty(value = "瀛樹欢闂ㄥ簵鍦板潃")
+    private String depositShopAddress;
+
+    @ApiModelProperty(value = "璺濆瓨浠堕棬搴楄窛绂伙紙濡� 500m銆�1.2km锛�")
+    private String depositDistance;
+
+    @ApiModelProperty(value = "鍙栦欢鍚嶇О锛堥棬搴楀悕绉版垨鑷畾涔夊湴鐐癸級")
+    private String takeName;
+
+    @ApiModelProperty(value = "鍙栦欢璺濈锛堝 500m銆�1.2km锛�")
+    private String takeDistance;
+
+    @ApiModelProperty(value = "鑱旂郴鐢佃瘽锛坰tatus=2鍙栦欢闂ㄥ簵鐢佃瘽锛泂tatus=3/4鏈夊彇浠堕棬搴楄繑鍥為棬搴楃數璇濓紝鏃犲垯杩斿洖鍙栦欢浜虹數璇濓級")
+    private String contactPhone;
+
+    @ApiModelProperty(value = "鍙告満钖叕锛堝垎锛�")
+    private Long driverFee;
+
+    @ApiModelProperty(value = "鍔犳�ヨ垂鐢紙鍒嗭級")
+    private Long urgentAmount;
+
+    @ApiModelProperty(value = "鐗╁搧鏄庣粏鍒楄〃")
+    private List<OrderItem> items;
+
+    @ApiModelProperty(value = "鏄惁璐甸噸鐗╁搧")
+    private Boolean isValuable;
+
+    @Data
+    @ApiModel("鎶㈠崟澶у巺鐗╁搧椤�")
+    public static class OrderItem implements Serializable {
+        @ApiModelProperty(value = "鐗╁搧鍚嶇О")
+        private String name;
+
+        @ApiModelProperty(value = "鏁伴噺")
+        private Integer quantity;
+    }
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/vo/DriverOrderDetailVO.java b/server/services/src/main/java/com/doumee/dao/vo/DriverOrderDetailVO.java
new file mode 100644
index 0000000..9506d34
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/vo/DriverOrderDetailVO.java
@@ -0,0 +1,89 @@
+package com.doumee.dao.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 鍙告満绔鍗曡鎯�
+ * @author rk
+ * @date 2026/04/17
+ */
+@Data
+@ApiModel("鍙告満绔鍗曡鎯�")
+public class DriverOrderDetailVO implements Serializable {
+
+    @ApiModelProperty(value = "璁㈠崟涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "璁㈠崟缂栧彿")
+    private String code;
+
+    @ApiModelProperty(value = "璁㈠崟鐘舵��")
+    private Integer status;
+
+    @ApiModelProperty(value = "璁㈠崟鐘舵�佹弿杩�")
+    private String statusDesc;
+
+    @ApiModelProperty(value = "鍓╀綑鍒嗛挓鏁帮紙褰撳墠鏃堕棿鍒伴璁¢�佽揪鏃堕棿锛�")
+    private Long remainMinutes;
+
+    @ApiModelProperty(value = "鏄惁鍔犳�ワ細0=鍚︼紱1=鏄�")
+    private Integer isUrgent;
+
+    @ApiModelProperty(value = "瀛樹欢闂ㄥ簵鍚嶇О")
+    private String depositShopName;
+
+    @ApiModelProperty(value = "瀛樹欢闂ㄥ簵鍦板潃")
+    private String depositShopAddress;
+
+    @ApiModelProperty(value = "璺濆瓨浠堕棬搴楄窛绂伙紙濡� 500m銆�1.2km锛�")
+    private String depositDistance;
+
+    @ApiModelProperty(value = "鍙栦欢鍚嶇О锛堥棬搴楀悕绉版垨鑷畾涔夊湴鐐癸級")
+    private String takeName;
+
+    @ApiModelProperty(value = "鍙栦欢璺濈锛堝 500m銆�1.2km锛�")
+    private String takeDistance;
+
+    @ApiModelProperty(value = "鑱旂郴鐢佃瘽")
+    private String contactPhone;
+
+    @ApiModelProperty(value = "鍙告満钖叕锛堝垎锛�")
+    private Long driverFee;
+
+    @ApiModelProperty(value = "鍔犳�ヨ垂鐢紙鍒嗭級")
+    private Long urgentAmount;
+
+    @ApiModelProperty(value = "鐗╁搧鏄庣粏鍒楄〃")
+    private List<OrderItem> items;
+
+    @ApiModelProperty(value = "鏄惁璐甸噸鐗╁搧")
+    private Boolean isValuable;
+
+    @ApiModelProperty(value = "瀵艰埅绾害锛坰tatus=2瀛樹欢闂ㄥ簵绾害锛宻tatus=3/4鍙栦欢绾害锛�")
+    private Double navigateLat;
+
+    @ApiModelProperty(value = "瀵艰埅缁忓害锛坰tatus=2瀛樹欢闂ㄥ簵缁忓害锛宻tatus=3/4鍙栦欢缁忓害锛�")
+    private Double navigateLng;
+
+    @ApiModelProperty(value = "瀹㈡埛淇℃伅锛屽锛氬垬鍏堢敓锛堟墜鏈哄熬鍙�1234锛�")
+    private String customerInfo;
+
+    @ApiModelProperty(value = "涓嬪崟闄勪欢鍥剧墖鍏ㄨ矾寰勫垪琛�")
+    private List<String> orderImages;
+
+    @Data
+    @ApiModel("鐗╁搧椤�")
+    public static class OrderItem implements Serializable {
+        @ApiModelProperty(value = "鐗╁搧鍚嶇О")
+        private String name;
+
+        @ApiModelProperty(value = "鏁伴噺")
+        private Integer quantity;
+    }
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/vo/EstimatedDeliveryResultVO.java b/server/services/src/main/java/com/doumee/dao/vo/EstimatedDeliveryResultVO.java
new file mode 100644
index 0000000..4749c3d
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/vo/EstimatedDeliveryResultVO.java
@@ -0,0 +1,26 @@
+package com.doumee.dao.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 棰勮閫佽揪鏃舵晥缁撴灉
+ * @author rk
+ * @date 2026/04/17
+ */
+@Data
+@ApiModel("棰勮閫佽揪鏃舵晥缁撴灉")
+public class EstimatedDeliveryResultVO {
+
+    @ApiModelProperty(value = "瀹為檯璺濈锛堝叕閲岋級")
+    private BigDecimal distanceKm;
+
+    @ApiModelProperty(value = "鏍囬�熻揪鏃舵晥锛堝皬鏃讹級")
+    private BigDecimal standardHours;
+
+    @ApiModelProperty(value = "鏋侀�熻揪鏃舵晥锛堝皬鏃讹級")
+    private BigDecimal expressHours;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/vo/PriceCalculateVO.java b/server/services/src/main/java/com/doumee/dao/vo/PriceCalculateVO.java
index a42b9f2..dee37e7 100644
--- a/server/services/src/main/java/com/doumee/dao/vo/PriceCalculateVO.java
+++ b/server/services/src/main/java/com/doumee/dao/vo/PriceCalculateVO.java
@@ -35,6 +35,12 @@
     @ApiModelProperty("璺濈(km)")
     private BigDecimal distance;
 
+    @ApiModelProperty("鏍囬�熻揪棰勮鏃堕暱(灏忔椂锛屼笂鍙栨暣)")
+    private Integer standardHours;
+
+    @ApiModelProperty("鏋侀�熻揪棰勮鏃堕暱(灏忔椂锛屼笂鍙栨暣)")
+    private Integer urgentHours;
+
     @ApiModelProperty("澶╂暟")
     private Integer days;
 }
diff --git a/server/services/src/main/java/com/doumee/dao/vo/RevenueSummaryVO.java b/server/services/src/main/java/com/doumee/dao/vo/RevenueSummaryVO.java
new file mode 100644
index 0000000..6ca15e1
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/vo/RevenueSummaryVO.java
@@ -0,0 +1,17 @@
+package com.doumee.dao.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("娴佹按鏀舵敮缁熻")
+public class RevenueSummaryVO {
+
+    @ApiModelProperty(value = "鏀跺叆鎬婚锛堝垎锛�")
+    private Long totalIncome;
+
+    @ApiModelProperty(value = "鏀嚭鎬婚锛堝垎锛�")
+    private Long totalExpense;
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/vo/ShopNearbyVO.java b/server/services/src/main/java/com/doumee/dao/vo/ShopNearbyVO.java
index 753a3c3..e955c96 100644
--- a/server/services/src/main/java/com/doumee/dao/vo/ShopNearbyVO.java
+++ b/server/services/src/main/java/com/doumee/dao/vo/ShopNearbyVO.java
@@ -36,4 +36,10 @@
 
     @ApiModelProperty(value = "闂ㄥ簵璇勫垎")
     private BigDecimal score;
+
+    @ApiModelProperty(value = "闂ㄥ簵绾害")
+    private Double latitude;
+
+    @ApiModelProperty(value = "闂ㄥ簵缁忓害")
+    private Double longitude;
 }
diff --git a/server/services/src/main/java/com/doumee/dao/vo/ShopWebDetailVO.java b/server/services/src/main/java/com/doumee/dao/vo/ShopWebDetailVO.java
index 6da15a3..efeebf1 100644
--- a/server/services/src/main/java/com/doumee/dao/vo/ShopWebDetailVO.java
+++ b/server/services/src/main/java/com/doumee/dao/vo/ShopWebDetailVO.java
@@ -33,4 +33,16 @@
 
     @ApiModelProperty(value = "璺濈锛堝 500m銆�1.2km锛夛紝鏃犵粡绾害鍏ュ弬鏃朵负绌�")
     private String distanceText;
+
+    @ApiModelProperty(value = "瀵勫瓨绫诲瀷锛堥�楀彿鍒嗛殧鐨刢ategory涓婚敭锛�")
+    private String depositTypes;
+
+    @ApiModelProperty(value = "鏀惰垂鏍囧噯")
+    private String feeStandard;
+
+    @ApiModelProperty(value = "闂ㄥ簵绾害")
+    private Double latitude;
+
+    @ApiModelProperty(value = "闂ㄥ簵缁忓害")
+    private Double longitude;
 }
diff --git a/server/services/src/main/java/com/doumee/dao/vo/UserCenterVO.java b/server/services/src/main/java/com/doumee/dao/vo/UserCenterVO.java
index 8927049..63ff222 100644
--- a/server/services/src/main/java/com/doumee/dao/vo/UserCenterVO.java
+++ b/server/services/src/main/java/com/doumee/dao/vo/UserCenterVO.java
@@ -12,6 +12,9 @@
 @Data
 public class UserCenterVO {
 
+    @ApiModelProperty(value = "openid")
+    private String openid;
+
     @ApiModelProperty(value = "浼氬憳澶村儚鍏ㄨ矾寰�")
     private String fullCoverImage;
 
@@ -36,4 +39,18 @@
     @ApiModelProperty(value = "寰呮敹璐ц鍗曟暟閲�")
     private Integer waitReceiveCount;
 
+    @ApiModelProperty(value = "閫�娆句腑璁㈠崟鏁伴噺")
+    private Integer refundingCount;
+
+    @ApiModelProperty(value = "鎴戞敞鍐岀殑闂ㄥ簵涓婚敭锛堥棬搴楃敤鎴锋椂杩斿洖锛�")
+    private Integer shopId;
+
+    @ApiModelProperty(value = "鎴戞敞鍐岀殑闂ㄥ簵瀹℃牳鐘舵�侊紙闂ㄥ簵鐢ㄦ埛鏃惰繑鍥烇級: 0=寰呭鏍� 1=宸查�氳繃 2=宸查┏鍥� 3=宸茬即绾充繚璇侀噾")
+    private Integer shopAuditStatus;
+
+    @ApiModelProperty(value = "鎴戝綋鍓嶇粦瀹氱殑闂ㄥ簵")
+    private String bindShopId;
+
+
+
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/AreasService.java b/server/services/src/main/java/com/doumee/service/business/AreasService.java
index 6bd137a..a012865 100644
--- a/server/services/src/main/java/com/doumee/service/business/AreasService.java
+++ b/server/services/src/main/java/com/doumee/service/business/AreasService.java
@@ -140,4 +140,12 @@
      */
     List<Areas> getOpenCityList();
 
+    /**
+     * 鏍规嵁鍩庡競鍚嶇О鏌ヨ宸插紑閫氱殑鍩庡競淇℃伅
+     *
+     * @param cityName 鍩庡競鍚嶇О
+     * @return 鍩庡競淇℃伅锛屾湭寮�閫氬垯杩斿洖null
+     */
+    Areas getOpenedCityByName(String cityName);
+
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/DriverInfoService.java b/server/services/src/main/java/com/doumee/service/business/DriverInfoService.java
index d931cad..3c7f772 100644
--- a/server/services/src/main/java/com/doumee/service/business/DriverInfoService.java
+++ b/server/services/src/main/java/com/doumee/service/business/DriverInfoService.java
@@ -2,6 +2,8 @@
 
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
+import com.doumee.dao.dto.DriverActiveOrderDTO;
+import com.doumee.dao.dto.DriverGrabOrderDTO;
 import com.doumee.dao.business.model.DriverInfo;
 import com.doumee.dao.dto.DriverLoginRequest;
 import com.doumee.dao.dto.DriverRegisterRequest;
@@ -161,4 +163,65 @@
      */
     void changeStatus(com.doumee.dao.dto.ChangeStatusDTO dto);
 
+    /**
+     * 鍒囨崲鍙告満鎺ュ崟鐘舵��
+     *
+     * @param memberId 浼氬憳涓婚敭
+     * @param status   鎺ュ崟鐘舵�侊細0=鏈帴鍗曪紱1=鎺ュ崟涓�
+     */
+    void updateAcceptingStatus(Integer memberId, Integer status);
+
+    /**
+     * 鏇存柊鍙告満瀹炴椂瀹氫綅
+     *
+     * @param memberId  浼氬憳涓婚敭
+     * @param longitude 缁忓害
+     * @param latitude  绾害
+     */
+    void updateLocation(Integer memberId, Double longitude, Double latitude);
+
+    /**
+     * 鑾峰彇鍙告満绔椤典俊鎭�
+     *
+     * @param memberId 浼氬憳涓婚敭
+     * @return DriverCenterVO
+     */
+    com.doumee.dao.vo.DriverCenterVO getDriverCenterInfo(Integer memberId);
+
+    /**
+     * 鍙告満鎶㈠崟澶у巺 - 鍒嗛〉鏌ヨ鍙姠璁㈠崟
+     *
+     * @param memberId  褰撳墠鐧诲綍浼氬憳涓婚敭
+     * @param pageWrap  鍒嗛〉璇锋眰
+     * @return PageData<DriverGrabOrderVO>
+     */
+    com.doumee.core.model.PageData<com.doumee.dao.vo.DriverGrabOrderVO> grabOrderHall(Integer memberId, PageWrap<DriverGrabOrderDTO> pageWrap);
+
+    /**
+     * 鍙告満杩涜涓鍗曞垪琛�
+     *
+     * @param memberId 浼氬憳涓婚敭
+     * @param dto      鏌ヨ鏉′欢锛坰tatus: 3=宸叉姠鍗�, 4=娲鹃�佷腑锛�
+     * @return 璁㈠崟鍒楄〃
+     */
+    java.util.List<com.doumee.dao.vo.DriverGrabOrderVO> activeOrders(Integer memberId, DriverActiveOrderDTO dto);
+
+    /**
+     * 鍙告満绔鍗曡鎯�
+     *
+     * @param driverId 鍙告満涓婚敭
+     * @param orderId  璁㈠崟涓婚敭
+     * @return DriverOrderDetailVO
+     */
+    com.doumee.dao.vo.DriverOrderDetailVO driverOrderDetail(Integer driverId, Integer orderId);
+
+    /**
+     * 鍙告満鍙栨秷璁㈠崟锛堝凡鎺ュ崟status=2鏃跺彇娑堬紝閲婃斁鍥炴姠鍗曞ぇ鍘咃級
+     *
+     * @param driverId 鍙告満涓婚敭
+     * @param orderId  璁㈠崟涓婚敭
+     * @param reason   鍙栨秷鍘熷洜
+     */
+    void cancelOrder(Integer driverId, Integer orderId, String reason);
+
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/OrdersService.java b/server/services/src/main/java/com/doumee/service/business/OrdersService.java
index 58debcd..91ecdf9 100644
--- a/server/services/src/main/java/com/doumee/service/business/OrdersService.java
+++ b/server/services/src/main/java/com/doumee/service/business/OrdersService.java
@@ -17,6 +17,7 @@
 import com.doumee.dao.vo.OverdueFeeVO;
 import com.doumee.dao.vo.PayResponse;
 import com.doumee.dao.vo.PriceCalculateVO;
+import com.doumee.dao.vo.EstimatedDeliveryResultVO;
 
 import java.math.BigDecimal;
 import java.util.List;
@@ -298,6 +299,15 @@
     void confirmStoreOut(Integer orderId, Integer shopId, List<String> images, String remark);
 
     /**
+     * 浼氬憳纭鏀惰揣
+     * 寮傚湴瀵勫瓨涓旀棤鍙栦欢闂ㄥ簵鐨勮鍗曪紝閫佽揪鍚�(status=5)锛屼細鍛樼‘璁ゆ敹璐ф爣璁拌鍗曞畬鎴�
+     *
+     * @param orderId  璁㈠崟涓婚敭
+     * @param memberId 褰撳墠鐧诲綍浼氬憳ID
+     */
+    void memberConfirmReceipt(Integer orderId, Integer memberId);
+
+    /**
      * 璁$畻骞舵洿鏂拌鍗曚笁鏂规敹鐩婏紙瀛樹欢闂ㄥ簵/鍙栦欢闂ㄥ簵/鍙告満锛�
      * 灏卞湴瀵勫瓨锛氫粎瀛樹欢闂ㄥ簵鏀剁泭
      * 寮傚湴瀵勫瓨锛氬瓨浠堕棬搴� + 鍙告満鏀剁泭锛涙湁鍙栦欢闂ㄥ簵鏃跺姞涓婂彇浠堕棬搴楁敹鐩�
@@ -355,4 +365,19 @@
      */
     PageData<MyOrderVO> findShopOrderPage(PageWrap<MyOrderDTO> pageWrap, Integer shopId);
 
+    /**
+     * 璁$畻涓ゅ湴涔嬮棿鐨勯璁¢�佽揪鏃舵晥锛堟爣閫熻揪 + 鏋侀�熻揪锛�
+     * 閫氳繃鑵捐鍦板浘API璁$畻瀹為檯璺濈锛屽啀鏍规嵁pricing_rule type=2璁$畻鏃舵晥
+     *
+     * @param cityId    鍩庡競涓婚敭
+     * @param fromLat   璧风偣绾害
+     * @param fromLng   璧风偣缁忓害
+     * @param toLat     缁堢偣绾害
+     * @param toLng     缁堢偣缁忓害
+     * @return 棰勮閫佽揪鏃舵晥缁撴灉
+     */
+    EstimatedDeliveryResultVO calculateEstimatedDelivery(Integer cityId,
+                                                         Double fromLat, Double fromLng,
+                                                         Double toLat, Double toLng);
+
 }
\ No newline at end of file
diff --git a/server/services/src/main/java/com/doumee/service/business/RevenueService.java b/server/services/src/main/java/com/doumee/service/business/RevenueService.java
index de5f4ce..3e82d3c 100644
--- a/server/services/src/main/java/com/doumee/service/business/RevenueService.java
+++ b/server/services/src/main/java/com/doumee/service/business/RevenueService.java
@@ -3,7 +3,9 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.Revenue;
+import com.doumee.dao.dto.RevenueQueryDTO;
 import com.doumee.dao.vo.RevenueStatisticsVO;
+import com.doumee.dao.vo.RevenueSummaryVO;
 
 import java.util.List;
 
@@ -113,4 +115,40 @@
      */
     RevenueStatisticsVO getDriverRevenueStatistics(Integer memberId);
 
+    /**
+     * 鍙告満娴佹按鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉鍙傛暟
+     * @param memberId 浼氬憳涓婚敭
+     * @return 鍒嗛〉缁撴灉
+     */
+    PageData<Revenue> findDriverRevenuePage(PageWrap<RevenueQueryDTO> pageWrap, Integer memberId);
+
+    /**
+     * 闂ㄥ簵娴佹按鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉鍙傛暟
+     * @param shopId   闂ㄥ簵涓婚敭
+     * @return 鍒嗛〉缁撴灉
+     */
+    PageData<Revenue> findShopRevenuePage(PageWrap<RevenueQueryDTO> pageWrap, Integer shopId);
+
+    /**
+     * 鍙告満娴佹按鏀舵敮缁熻
+     *
+     * @param queryDTO 鏌ヨ鏉′欢
+     * @param memberId 浼氬憳涓婚敭
+     * @return 鏀舵敮姹囨��
+     */
+    RevenueSummaryVO getDriverRevenueSummary(RevenueQueryDTO queryDTO, Integer memberId);
+
+    /**
+     * 闂ㄥ簵娴佹按鏀舵敮缁熻
+     *
+     * @param queryDTO 鏌ヨ鏉′欢
+     * @param shopId   闂ㄥ簵涓婚敭
+     * @return 鏀舵敮姹囨��
+     */
+    RevenueSummaryVO getShopRevenueSummary(RevenueQueryDTO queryDTO, Integer shopId);
+
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/ShopInfoService.java b/server/services/src/main/java/com/doumee/service/business/ShopInfoService.java
index 2908a9e..590941b 100644
--- a/server/services/src/main/java/com/doumee/service/business/ShopInfoService.java
+++ b/server/services/src/main/java/com/doumee/service/business/ShopInfoService.java
@@ -109,7 +109,7 @@
      * @param request 鐢宠璇锋眰
      * @param member 褰撳墠鐧诲綍浼氬憳
      */
-    void applyShop(ShopApplyDTO request, Member member);
+    void applyShop(ShopApplyDTO request);
 
     /**
      * 鏌ヨ闂ㄥ簵璇︽儏锛堝惈闄勪欢锛�
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/AreasServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/AreasServiceImpl.java
index c147960..0ac6b5e 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/AreasServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/AreasServiceImpl.java
@@ -537,4 +537,19 @@
         return list;
     }
 
+    @Override
+    public Areas getOpenedCityByName(String cityName) {
+        if (StringUtils.isBlank(cityName)) {
+            return null;
+        }
+        QueryWrapper<Areas> qw = new QueryWrapper<>();
+        qw.lambda()
+                .eq(Areas::getType, Constants.ONE)
+                .eq(Areas::getStatus, Constants.ONE)
+                .eq(Areas::getIsdeleted, Constants.ZERO)
+                .eq(Areas::getName, cityName)
+                .last("limit 1");
+        return areasMapper.selectOne(qw);
+    }
+
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/BannerServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/BannerServiceImpl.java
index 0cb5720..e989ed7 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/BannerServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/BannerServiceImpl.java
@@ -229,6 +229,6 @@
 
     private String getBannerPath() {
         return systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
-                + systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.BANNER_FILES).getCode();
+                + systemDictDataBiz.queryByCode(Constants.OSS, Constants.BANNER_FILES).getCode();
     }
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
index 46ee50f..63d34d1 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
@@ -140,7 +140,7 @@
         }
         if(StringUtils.isNotBlank(category.getIcon())){
             String path  = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()
-                    +systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.CATEGORY_FILES).getCode();
+                    +systemDictDataBiz.queryByCode(Constants.OSS,Constants.CATEGORY_FILES).getCode();
             category.setIconFull(path + category.getIcon());
         }
         return category;
@@ -209,7 +209,7 @@
         PageData<Category> result =PageData.from(categoryMapper.selectJoinPage(page, Category.class,queryWrapper));
         if(result!=null && result.getRecords()!=null){
             String path  = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()
-                    +systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.CATEGORY_FILES).getCode();
+                    +systemDictDataBiz.queryByCode(Constants.OSS,Constants.CATEGORY_FILES).getCode();
             for(Category cate : result.getRecords()){
                 try {
                     if(StringUtils.isNotBlank(cate.getIcon())){
@@ -237,7 +237,7 @@
         );
         if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(categoryList)){
             String path  = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()
-                    +systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.CATEGORY_FILES).getCode();
+                    +systemDictDataBiz.queryByCode(Constants.OSS,Constants.CATEGORY_FILES).getCode();
             for (Category category:categoryList) {
                 if(StringUtils.isNotBlank(category.getIcon())){
                     category.setIconFull(path + category.getIcon());
@@ -276,7 +276,7 @@
         // 3. 鎷兼帴鍥炬爣鍏ㄨ矾寰�
         if (!CollectionUtils.isEmpty(sizeList)) {
             String path = systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.RESOURCE_PATH).getCode()
-                    + systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.CATEGORY_FILES).getCode();
+                    + systemDictDataBiz.queryByCode(Constants.OSS, Constants.CATEGORY_FILES).getCode();
             for (Category cate : sizeList) {
                 if (StringUtils.isNotBlank(cate.getIcon())) {
                     cate.setIconFull(path + cate.getIcon());
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java
index 11ec88f..8110145 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java
@@ -17,19 +17,33 @@
 import com.doumee.dao.business.MultifileMapper;
 import com.doumee.dao.business.SmsrecordMapper;
 import com.doumee.dao.business.CategoryMapper;
+import com.doumee.dao.business.OrdersMapper;
+import com.doumee.dao.business.OrdersDetailMapper;
+import com.doumee.dao.business.RevenueMapper;
 import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.biz.system.OperationConfigBiz;
+import com.doumee.dao.business.OrderLogMapper;
 import com.doumee.dao.business.model.Category;
 import com.doumee.dao.business.model.DriverInfo;
+import com.doumee.dao.business.model.OrderLog;
 import com.doumee.dao.business.model.Member;
 import com.doumee.dao.business.model.Multifile;
 import com.doumee.dao.business.model.Smsrecord;
+import com.doumee.dao.business.model.Orders;
+import com.doumee.dao.business.model.OrdersDetail;
+import com.doumee.dao.business.model.Revenue;
 import com.doumee.dao.vo.AccountResponse;
+import com.doumee.dao.vo.DriverCenterVO;
+import com.doumee.dao.vo.DriverGrabOrderVO;
+import com.doumee.dao.vo.DriverOrderDetailVO;
 import com.doumee.dao.dto.AuditDTO;
 import com.doumee.dao.dto.ChangeStatusDTO;
 import com.doumee.dao.dto.DriverLoginRequest;
 import com.doumee.dao.dto.DriverRegisterRequest;
 import com.doumee.dao.dto.DriverVerifyRequest;
-import com.doumee.service.business.AliSmsService;
+import com.doumee.dao.dto.DriverActiveOrderDTO;
+import com.doumee.dao.dto.DriverGrabOrderDTO;
+import com.doumee.core.utils.aliyun.AliSmsService;
 import com.doumee.service.business.DriverInfoService;
 import com.alibaba.fastjson.JSONObject;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
@@ -41,10 +55,8 @@
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 鍙告満娉ㄥ唽淇℃伅Service瀹炵幇
@@ -79,7 +91,22 @@
     private CategoryMapper categoryMapper;
 
     @Autowired
+    private OrdersMapper ordersMapper;
+
+    @Autowired
+    private RevenueMapper revenueMapper;
+
+    @Autowired
+    private OrdersDetailMapper ordersDetailMapper;
+
+    @Autowired
     private SystemDictDataBiz systemDictDataBiz;
+
+    @Autowired
+    private OrderLogMapper orderLogMapper;
+
+    @Autowired
+    private OperationConfigBiz operationConfigBiz;
 
     @Override
     public Integer create(DriverInfo driverInfo) {
@@ -289,7 +316,7 @@
             member.setCreateTime(now);
             member.setUpdateTime(now);
             member.setTelephone(telephone);
-            member.setNickName(telephone);
+            member.setNickName(telephone.substring(0, 3) + "****" + telephone.substring(7));
             member.setName(telephone);
             member.setUserType(Constants.ONE);
             member.setBusinessStatus(Constants.ZERO);
@@ -556,7 +583,7 @@
         String imgPrefix = "";
         try {
             imgPrefix = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
-                    + systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.DRIVER_FILES).getCode();
+                    + systemDictDataBiz.queryByCode(Constants.OSS, Constants.DRIVER_FILES).getCode();
         } catch (Exception e) {
             // 鏈厤缃椂蹇界暐
         }
@@ -630,4 +657,612 @@
         }
     }
 
+    @Override
+    public void updateAcceptingStatus(Integer memberId, Integer status) {
+        if (!Constants.ZERO.equals(status) && !Constants.ONE.equals(status)) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        DriverInfo driver = driverInfoMapper.selectOne(new QueryWrapper<DriverInfo>().lambda()
+                .eq(DriverInfo::getMemberId, memberId)
+                .eq(DriverInfo::getDeleted, Constants.ZERO)
+                .last("limit 1"));
+        if (driver == null) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "鍙告満淇℃伅涓嶅瓨鍦�");
+        }
+        if (!Constants.THREE.equals(driver.getAuditStatus())) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "璇峰厛瀹屾垚鎶奸噾鏀粯");
+        }
+        driverInfoMapper.update(new UpdateWrapper<DriverInfo>().lambda()
+                .set(DriverInfo::getAcceptingStatus, status)
+                .eq(DriverInfo::getId, driver.getId()));
+    }
+
+    @Override
+    public void updateLocation(Integer memberId, Double longitude, Double latitude) {
+        if (longitude == null || latitude == null) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "缁忕含搴︿笉鑳戒负绌�");
+        }
+        DriverInfo driver = driverInfoMapper.selectOne(new QueryWrapper<DriverInfo>().lambda()
+                .eq(DriverInfo::getMemberId, memberId)
+                .eq(DriverInfo::getDeleted, Constants.ZERO)
+                .last("limit 1"));
+        if (driver == null) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "鍙告満淇℃伅涓嶅瓨鍦�");
+        }
+        driverInfoMapper.update(new UpdateWrapper<DriverInfo>().lambda()
+                .set(DriverInfo::getLongitude, longitude)
+                .set(DriverInfo::getLatitude, latitude)
+                .eq(DriverInfo::getId, driver.getId()));
+    }
+
+    @Override
+    public DriverCenterVO getDriverCenterInfo(Integer memberId) {
+        DriverInfo driver = driverInfoMapper.selectOne(new QueryWrapper<DriverInfo>().lambda()
+                .eq(DriverInfo::getMemberId, memberId)
+                .eq(DriverInfo::getDeleted, Constants.ZERO)
+                .last("limit 1"));
+        if (driver == null) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "鍙告満淇℃伅涓嶅瓨鍦�");
+        }
+        DriverCenterVO vo = new DriverCenterVO();
+        vo.setName(driver.getName());
+        vo.setImgUrl(driver.getImgurl());
+        vo.setCarCode(driver.getCarCode());
+        vo.setScore(driver.getScore() != null ? driver.getScore().toPlainString() : "0");
+        vo.setBalance(driver.getBalance() != null ? driver.getBalance() : 0L);
+
+        // 澶村儚鍏ㄨ矾寰�
+        if (StringUtils.isNotBlank(driver.getImgurl())) {
+            String imgPrefix = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
+                    + systemDictDataBiz.queryByCode(Constants.OSS, Constants.MEMBER_FILES).getCode();
+            vo.setFullImgUrl(imgPrefix + driver.getImgurl());
+        }
+
+        // 浠婃棩棰勮浣i噾锛歳evenue琛ㄤ腑浠婂ぉ鐨勬敹鍏ヨ褰曢噾棰濅箣鍜�
+        Date now = new Date();
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(now);
+        cal.set(Calendar.HOUR_OF_DAY, 0);
+        cal.set(Calendar.MINUTE, 0);
+        cal.set(Calendar.SECOND, 0);
+        cal.set(Calendar.MILLISECOND, 0);
+        Date todayStart = cal.getTime();
+
+        QueryWrapper<Revenue> revenueWrapper = new QueryWrapper<>();
+        revenueWrapper.lambda()
+                .eq(Revenue::getMemberId, memberId)
+                .eq(Revenue::getMemberType, Constants.ONE)
+                .eq(Revenue::getOptType, Constants.ONE)
+                .eq(Revenue::getDeleted, Constants.ZERO)
+                .ge(Revenue::getCreateTime, todayStart);
+        revenueWrapper.select("IFNULL(SUM(AMOUNT),0) as amount");
+        Revenue sumResult = revenueMapper.selectOne(revenueWrapper);
+        vo.setTodayCommission(sumResult != null && sumResult.getAmount() != null ? sumResult.getAmount() : 0L);
+
+        // 浠婃棩鎺ュ崟鏁帮細浠婂ぉ瀹屾垚鐨勮鍗曟暟锛坅cceptDriver=鍙告満涓婚敭锛岀姸鎬�=宸插畬鎴愶級
+        Long todayOrderCount = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda()
+                .eq(Orders::getAcceptDriver, driver.getId())
+                .eq(Orders::getDeleted, Constants.ZERO)
+                .ge(Orders::getFinishTime, todayStart));
+        vo.setTodayOrderCount(todayOrderCount.intValue());
+
+        // 寰呭彇璐э紙宸叉帴鍗�=3锛�
+        Long waitPickCount = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda()
+                .eq(Orders::getAcceptDriver, driver.getId())
+                .eq(Orders::getDeleted, Constants.ZERO)
+                .eq(Orders::getStatus, Constants.OrderStatus.accepted.getStatus()));
+        vo.setWaitPickCount(waitPickCount.intValue());
+
+        // 寰呴厤閫侊紙娲鹃�佷腑=4锛�
+        Long waitDeliverCount = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda()
+                .eq(Orders::getAcceptDriver, driver.getId())
+                .eq(Orders::getDeleted, Constants.ZERO)
+                .eq(Orders::getStatus, Constants.OrderStatus.delivering.getStatus()));
+        vo.setWaitDeliverCount(waitDeliverCount.intValue());
+
+        return vo;
+    }
+
+    @Override
+    public PageData<DriverGrabOrderVO> grabOrderHall(Integer memberId, PageWrap<DriverGrabOrderDTO> pageWrap) {
+        DriverGrabOrderDTO dto = pageWrap.getModel();
+
+        // 1. 鑾峰彇鍙告満瀹氫綅
+        DriverInfo driver = driverInfoMapper.selectOne(new QueryWrapper<DriverInfo>().lambda()
+                .eq(DriverInfo::getMemberId, memberId)
+                .eq(DriverInfo::getDeleted, Constants.ZERO)
+                .last("limit 1"));
+        if (driver == null || driver.getLatitude() == null || driver.getLongitude() == null) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "鍙告満浣嶇疆淇℃伅缂哄け锛岃鍏堝紑鍚畾浣�");
+        }
+        // 鏍¢獙鍙告満宸叉敮浠樻娂閲�
+        if (!Constants.THREE.equals(driver.getAuditStatus())) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "璇峰厛瀹屾垚鎶奸噾鏀粯");
+        }
+        double driverLat = driver.getLatitude();
+        double driverLng = driver.getLongitude();
+
+        // 2. 棰勬煡鐗╁搧绛夌骇瀵瑰簲鐨勭墿鍝佸垎绫籌D
+        List<Integer> goodTypeIds = null;
+        if (dto != null && dto.getGradeId() != null) {
+            List<Category> cats = categoryMapper.selectList(new QueryWrapper<Category>().lambda()
+                    .eq(Category::getDeleted, Constants.ZERO)
+                    .eq(Category::getType, Constants.TWO)
+                    .eq(Category::getRelationId, dto.getGradeId()));
+            if (cats.isEmpty()) {
+                return emptyPage(pageWrap);
+            }
+            goodTypeIds = cats.stream().map(Category::getId).collect(Collectors.toList());
+        }
+
+        // 3. Haversine SQL鍏紡锛氬徃鏈哄埌瀛樹欢闂ㄥ簵璺濈(km)锛屼娇鐢∣rders鑷甫鍧愭爣
+        String depositDist = "(6371 * acos(cos(radians(" + driverLat + ")) * cos(radians(t.DEPOSIT_LGT)) "
+                + "* cos(radians(t.DEPOSIT_LAT) - radians(" + driverLng + ")) "
+                + "+ sin(radians(" + driverLat + ")) * sin(radians(t.DEPOSIT_LGT))))";
+
+        // 4. 鏋勯�燤PJ鏌ヨ
+        IPage<Orders> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        MPJLambdaWrapper<Orders> wrapper = new MPJLambdaWrapper<>();
+        wrapper.selectAll(Orders.class)
+                // 瀛樹欢闂ㄥ簵
+                .select("s1.name", Orders::getDepositShopName)
+                .select("s1.address", Orders::getDepositShopAddress)
+                // 鍙栦欢闂ㄥ簵
+                .select("s2.name", Orders::getTakeShopName)
+                .select("s2.address", Orders::getTakeShopAddress)
+                .select("s2.link_phone as takeShopLinkPhone")
+                // 鐗╁搧绛夌骇璐甸噸鏍囪瘑
+                .select("c2.other_field as c2OtherField")
+                // JOIN
+                .leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID and s1.DELETED = 0")
+                .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID and s2.DELETED = 0")
+                .leftJoin("category c1 on c1.id = t.GOOD_TYPE and c1.DELETED = 0")
+                .leftJoin("category c2 on c2.id = c1.RELATION_ID and c2.DELETED = 0 and c2.TYPE = 3");
+
+        // 鏍稿績鏉′欢
+        wrapper.eq(Orders::getType, Constants.ONE)
+                .eq(Orders::getStatus, Constants.TWO)
+                .eq(Orders::getDeleted, Constants.ZERO);
+
+        // 鍙告満绾у埆 >= 璁㈠崟鐗╁搧绾у埆
+        if (driver.getDriverLevel() != null) {
+            wrapper.apply("t.GOOD_LEVEL <= {0}", driver.getDriverLevel());
+        }
+
+        // 鍔犳�� OR 鍦ㄩ厤閫佽寖鍥村唴
+        wrapper.and(w -> w
+                .eq(Orders::getIsUrgent, Constants.ONE)
+                .or()
+                .apply(depositDist + " <= s1.delivery_area"));
+
+        // 鐢ㄦ埛璺濈杩囨护
+        if (dto != null && dto.getDistance() != null && dto.getDistance() > 0) {
+            double maxKm = dto.getDistance() / 1000.0;
+            wrapper.apply(depositDist + " <= {0}", maxKm);
+        }
+
+        // 鐗╁搧绛夌骇杩囨护
+        if (goodTypeIds != null && !goodTypeIds.isEmpty()) {
+            wrapper.in(Orders::getGoodType, goodTypeIds);
+        }
+
+        // 鎺掑簭
+        Integer sortType = (dto != null) ? dto.getSortType() : null;
+        if (sortType != null && sortType == Constants.TWO) {
+            wrapper.last("ORDER BY " + depositDist + " ASC");
+        } else {
+            wrapper.orderByDesc(Orders::getCreateTime);
+        }
+
+        IPage<Orders> result = ordersMapper.selectJoinPage(page, Orders.class, wrapper);
+
+        // 5. 鎵归噺鏌ヨ鐗╁搧鏄庣粏
+        List<Integer> orderIds = result.getRecords().stream()
+                .map(Orders::getId).collect(Collectors.toList());
+        Map<Integer, List<OrdersDetail>> detailMap = new HashMap<>();
+        if (!orderIds.isEmpty()) {
+            List<OrdersDetail> allDetails = ordersDetailMapper.selectList(
+                    new QueryWrapper<OrdersDetail>().lambda()
+                            .in(OrdersDetail::getOrderId, orderIds));
+            for (OrdersDetail d : allDetails) {
+                detailMap.computeIfAbsent(d.getOrderId(), k -> new ArrayList<>()).add(d);
+            }
+        }
+
+        // 6. 鏋勫缓VO锛堜娇鐢ㄥ叡鐢ㄦ柟娉曪級
+        Date now = new Date();
+        List<DriverGrabOrderVO> voList = new ArrayList<>();
+        for (Orders order : result.getRecords()) {
+            voList.add(buildDriverOrderVO(order, driverLat, driverLng, true, now, detailMap));
+        }
+
+        // 7. 鎵嬪姩鍒嗛〉
+        PageData<DriverGrabOrderVO> pageData = new PageData<>(result.getCurrent(), result.getSize());
+        pageData.setTotal(result.getTotal());
+        pageData.setRecords(voList);
+        return pageData;
+    }
+
+    @Override
+    public List<DriverGrabOrderVO> activeOrders(Integer memberId, DriverActiveOrderDTO dto) {
+        if (dto == null || dto.getStatus() == null ||
+                (!Constants.equalsInteger(dto.getStatus(), Constants.THREE) && !Constants.equalsInteger(dto.getStatus(), Constants.FOUR))) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璁㈠崟鐘舵�佸彧鑳戒负3(宸叉姠鍗�)鎴�4(娲鹃�佷腑)");
+        }
+
+        // 鑾峰彇鍙告満淇℃伅
+        DriverInfo driver = driverInfoMapper.selectOne(new QueryWrapper<DriverInfo>().lambda()
+                .eq(DriverInfo::getMemberId, memberId)
+                .eq(DriverInfo::getDeleted, Constants.ZERO)
+                .last("limit 1"));
+        if (driver == null) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "鍙告満淇℃伅涓嶅瓨鍦�");
+        }
+
+        boolean needDepositDist = Constants.equalsInteger(dto.getStatus(), Constants.THREE);
+        Double driverLat = driver.getLatitude();
+        Double driverLng = driver.getLongitude();
+
+        // MPJ鏌ヨ
+        MPJLambdaWrapper<Orders> wrapper = new MPJLambdaWrapper<>();
+        wrapper.selectAll(Orders.class)
+                .select("s1.name", Orders::getDepositShopName)
+                .select("s1.address", Orders::getDepositShopAddress)
+                .select("s2.name", Orders::getTakeShopName)
+                .select("s2.address", Orders::getTakeShopAddress)
+                .select("s2.link_phone as takeShopLinkPhone")
+                .select("c2.other_field as c2OtherField")
+                .leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID and s1.DELETED = 0")
+                .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID and s2.DELETED = 0")
+                .leftJoin("category c1 on c1.id = t.GOOD_TYPE and c1.DELETED = 0")
+                .leftJoin("category c2 on c2.id = c1.RELATION_ID and c2.DELETED = 0 and c2.TYPE = 3")
+                .eq(Orders::getAcceptDriver, driver.getId())
+                .eq(Orders::getType, Constants.ONE)
+                .eq(Orders::getStatus, dto.getStatus())
+                .eq(Orders::getDeleted, Constants.ZERO)
+                .orderByAsc(Orders::getAcceptTime);
+
+        List<Orders> ordersList = ordersMapper.selectJoinList(Orders.class, wrapper);
+
+        // 鎵归噺鏌ョ墿鍝佹槑缁�
+        List<Integer> orderIds = ordersList.stream().map(Orders::getId).collect(Collectors.toList());
+        Map<Integer, List<OrdersDetail>> detailMap = new HashMap<>();
+        if (!orderIds.isEmpty()) {
+            List<OrdersDetail> allDetails = ordersDetailMapper.selectList(
+                    new QueryWrapper<OrdersDetail>().lambda()
+                            .in(OrdersDetail::getOrderId, orderIds));
+            for (OrdersDetail d : allDetails) {
+                detailMap.computeIfAbsent(d.getOrderId(), k -> new ArrayList<>()).add(d);
+            }
+        }
+
+        // 鏋勫缓VO锛堜娇鐢ㄥ叡鐢ㄦ柟娉曪級
+        Date now = new Date();
+        List<DriverGrabOrderVO> voList = new ArrayList<>();
+        for (Orders order : ordersList) {
+            voList.add(buildDriverOrderVO(order, driverLat, driverLng, needDepositDist, now, detailMap));
+        }
+
+        return voList;
+    }
+
+    @Override
+    public DriverOrderDetailVO driverOrderDetail(Integer driverId, Integer orderId) {
+        // 鏌ヨ璁㈠崟锛圡PJ JOIN 闂ㄥ簵鍚嶇О+鍒嗙被锛岃窛绂昏绠椾娇鐢∣rders鑷甫鍧愭爣锛�
+        MPJLambdaWrapper<Orders> wrapper = new MPJLambdaWrapper<>();
+        wrapper.selectAll(Orders.class)
+                .select("s1.name", Orders::getDepositShopName)
+                .select("s1.address", Orders::getDepositShopAddress)
+                .select("s2.name", Orders::getTakeShopName)
+                .select("s2.address", Orders::getTakeShopAddress)
+                .select("s2.link_phone as takeShopLinkPhone")
+                .select("c2.other_field as c2OtherField")
+                .leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID and s1.DELETED = 0")
+                .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID and s2.DELETED = 0")
+                .leftJoin("category c1 on c1.id = t.GOOD_TYPE and c1.DELETED = 0")
+                .leftJoin("category c2 on c2.id = c1.RELATION_ID and c2.DELETED = 0 and c2.TYPE = 3")
+                .eq(Orders::getId, orderId)
+                .eq(Orders::getDeleted, Constants.ZERO);
+        Orders order = ordersMapper.selectJoinOne(Orders.class, wrapper);
+        if (order == null) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "璁㈠崟涓嶅瓨鍦�");
+        }
+
+        // 鏉冮檺鏍¢獙锛氭姠鍗曞ぇ鍘呭彲瑙�(status=2, type=1) 鎴� 宸叉姠鍗�/娲鹃�佷腑(acceptDriver=driverId)
+        boolean canView = false;
+        if (Constants.equalsInteger(order.getStatus(), Constants.TWO) && Constants.equalsInteger(order.getType(), Constants.ONE)) {
+            canView = true;
+        }
+        if (driverId != null && driverId.equals(order.getAcceptDriver())) {
+            canView = true;
+        }
+        if (!canView) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "鏃犳潈鏌ョ湅璇ヨ鍗�");
+        }
+
+        // 鑾峰彇鍙告満浣嶇疆锛堢敤浜庤窛绂昏绠楋級
+        Double driverLat = null;
+        Double driverLng = null;
+        if (driverId != null) {
+            DriverInfo driver = driverInfoMapper.selectById(driverId);
+            if (driver != null) {
+                driverLat = driver.getLatitude();
+                driverLng = driver.getLongitude();
+            }
+        }
+
+        // 鐗╁搧鏄庣粏
+        List<OrdersDetail> details = ordersDetailMapper.selectList(
+                new QueryWrapper<OrdersDetail>().lambda()
+                        .eq(OrdersDetail::getOrderId, orderId));
+        Map<Integer, List<OrdersDetail>> detailMap = new HashMap<>();
+        for (OrdersDetail d : details) {
+            detailMap.computeIfAbsent(d.getOrderId(), k -> new ArrayList<>()).add(d);
+        }
+
+        // 浣跨敤鍏辩敤鏂规硶鏋勫缓鍩虹VO瀛楁
+        Date now = new Date();
+        DriverGrabOrderVO base = buildDriverOrderVO(order, driverLat, driverLng, true, now, detailMap);
+
+        // 鏋勫缓璇︽儏VO
+        DriverOrderDetailVO vo = new DriverOrderDetailVO();
+        vo.setId(base.getId());
+        vo.setCode(base.getCode());
+        vo.setRemainMinutes(base.getRemainMinutes());
+        vo.setIsUrgent(base.getIsUrgent());
+        vo.setDepositShopName(base.getDepositShopName());
+        vo.setDepositShopAddress(base.getDepositShopAddress());
+        vo.setDepositDistance(base.getDepositDistance());
+        vo.setTakeName(base.getTakeName());
+        vo.setTakeDistance(base.getTakeDistance());
+        vo.setContactPhone(base.getContactPhone());
+        vo.setDriverFee(base.getDriverFee());
+        vo.setUrgentAmount(base.getUrgentAmount());
+        vo.setIsValuable(base.getIsValuable());
+
+        // 鐗╁搧鏄庣粏锛堣浆鎹㈢被鍨嬶級
+        List<DriverOrderDetailVO.OrderItem> detailItems = new ArrayList<>();
+        if (base.getItems() != null) {
+            for (DriverGrabOrderVO.OrderItem src : base.getItems()) {
+                DriverOrderDetailVO.OrderItem item = new DriverOrderDetailVO.OrderItem();
+                item.setName(src.getName());
+                item.setQuantity(src.getQuantity());
+                detailItems.add(item);
+            }
+        }
+        vo.setItems(detailItems);
+
+        // 璇︽儏鐗规湁瀛楁
+        vo.setStatus(order.getStatus());
+        vo.setStatusDesc(getStatusDesc(order.getStatus()));
+
+        // 瀹㈡埛淇℃伅
+        String customerInfo = "";
+        if (StringUtils.isNotBlank(order.getTakeUser())) {
+            customerInfo = order.getTakeUser();
+        }
+        if (StringUtils.isNotBlank(order.getTakePhone()) && order.getTakePhone().length() >= 4) {
+            customerInfo += "锛堟墜鏈哄熬鍙�" + order.getTakePhone().substring(order.getTakePhone().length() - 4) + "锛�";
+        }
+        vo.setCustomerInfo(customerInfo);
+
+        // 瀵艰埅缁忕含搴︼紙浣跨敤Orders鑷甫鍧愭爣锛�
+        if (Constants.equalsInteger(order.getStatus(), Constants.TWO)) {
+            if (order.getDepositLgt() != null && order.getDepositLat() != null) {
+                vo.setNavigateLat(order.getDepositLgt().doubleValue());
+                vo.setNavigateLng(order.getDepositLat().doubleValue());
+            }
+        } else {
+            if (order.getTakeLgt() != null && order.getTakeLat() != null) {
+                vo.setNavigateLat(order.getTakeLgt().doubleValue());
+                vo.setNavigateLng(order.getTakeLat().doubleValue());
+            }
+        }
+
+        // 涓嬪崟闄勪欢鍥剧墖
+        String imgPrefix = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
+                + systemDictDataBiz.queryByCode(Constants.OSS, Constants.MEMBER_FILES).getCode();
+        vo.setOrderImages(getFileUrls(orderId, Constants.FileType.ORDER_FILE.getKey(), imgPrefix));
+
+        return vo;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void cancelOrder(Integer driverId, Integer orderId, String reason) {
+        // 1. 鏌ヨ鍙告満淇℃伅
+        DriverInfo driver = driverInfoMapper.selectById(driverId);
+        if (driver == null) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "鍙告満淇℃伅涓嶅瓨鍦�");
+        }
+
+        // 2. 鏍¢獙璁㈠崟
+        Orders order = ordersMapper.selectById(orderId);
+        if (order == null || Constants.ONE.equals(order.getDeleted())) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "璁㈠崟涓嶅瓨鍦�");
+        }
+        if (!Constants.ONE.equals(order.getType())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "浠呭紓鍦板瘎瀛樿鍗曞彲鍙栨秷");
+        }
+        if (!Constants.TWO.equals(order.getStatus())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "褰撳墠璁㈠崟鐘舵�佷笉鍏佽鍙栨秷");
+        }
+        if (!driverId.equals(order.getAcceptDriver())) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "鏃犳潈鎿嶄綔璇ヨ鍗�");
+        }
+
+        // 3. 姣忔棩鍙栨秷娆℃暟闄愬埗
+        String limitStr = operationConfigBiz.getConfig().getDriverDailyCancelLimit();
+        int limit = 3;
+        if (StringUtils.isNotBlank(limitStr)) {
+            try { limit = Integer.parseInt(limitStr); } catch (NumberFormatException ignored) {}
+        }
+        Calendar cal = Calendar.getInstance();
+        cal.set(Calendar.HOUR_OF_DAY, 0);
+        cal.set(Calendar.MINUTE, 0);
+        cal.set(Calendar.SECOND, 0);
+        cal.set(Calendar.MILLISECOND, 0);
+        Date todayStart = cal.getTime();
+        Long todayCancelCount = orderLogMapper.selectCount(new QueryWrapper<OrderLog>().lambda()
+                .eq(OrderLog::getOptUserId, driver.getMemberId())
+                .eq(OrderLog::getObjType, Constants.ORDER_LOG_CANCEL)
+                .eq(OrderLog::getOptUserType, Constants.ONE)
+                .ge(OrderLog::getCreateTime, todayStart));
+        if (todayCancelCount != null && todayCancelCount >= limit) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "浠婃棩鍙栨秷娆℃暟宸茶揪涓婇檺");
+        }
+
+        // 4. 閲嶇疆璁㈠崟鍙告満瀛楁锛堜繚鎸乻tatus=2锛岄噴鏀惧洖鎶㈠崟澶у巺锛�
+        ordersMapper.update(new UpdateWrapper<Orders>().lambda()
+                .set(Orders::getAcceptDriver, null)
+                .set(Orders::getAcceptTime, null)
+                .set(Orders::getAcceptType, null)
+                .eq(Orders::getId, orderId));
+
+        // 5. 鍐欏叆鍙栨秷鏃ュ織
+        OrderLog log = new OrderLog();
+        log.setOrderId(orderId);
+        log.setTitle("鍙告満鍙栨秷璁㈠崟");
+        log.setLogInfo(StringUtils.isNotBlank(reason) ? reason : "鍙告満鍙栨秷鎺ュ崟");
+        log.setObjType(Constants.ORDER_LOG_CANCEL);
+        log.setOptUserId(driver.getMemberId());
+        log.setOptUserType(Constants.ONE);
+        log.setOrderStatus(order.getStatus());
+        log.setCreateTime(new Date());
+        log.setDeleted(Constants.ZERO);
+        orderLogMapper.insert(log);
+    }
+
+    private List<String> getFileUrls(Integer orderId, int objType, String prefix) {
+        List<Multifile> files = multifileMapper.selectList(
+                new QueryWrapper<Multifile>().lambda()
+                        .eq(Multifile::getObjId, orderId)
+                        .eq(Multifile::getObjType, objType)
+                        .eq(Multifile::getIsdeleted, Constants.ZERO)
+                        .orderByAsc(Multifile::getSortnum));
+        List<String> urls = new ArrayList<>();
+        if (files != null) {
+            for (Multifile f : files) {
+                if (StringUtils.isNotBlank(f.getFileurl())) {
+                    urls.add(prefix + f.getFileurl());
+                }
+            }
+        }
+        return urls;
+    }
+
+    private String getStatusDesc(Integer status) {
+        if (status == null) return "";
+        switch (status) {
+            case 0: return "寰呮敮浠�";
+            case 1: return "寰呭瘎瀛�";
+            case 2: return "宸插瘎瀛�";
+            case 3: return "宸叉帴鍗�";
+            case 4: return "娲鹃�佷腑";
+            case 5: return "寰呭彇浠�";
+            case 7: return "宸插畬鎴�";
+            case 96: return "璁㈠崟鍏抽棴";
+            case 98: return "鍙栨秷涓�";
+            case 99: return "宸插彇娑�";
+            default: return "";
+        }
+    }
+
+    private String formatDistance(double km) {
+        if (km < 1) {
+            return Math.round(km * 1000) + "m";
+        }
+        return String.format("%.1fkm", km);
+    }
+
+    private double haversine(double lat1, double lng1, double lat2, double lng2) {
+        double R = 6371;
+        double dLat = Math.toRadians(lat2 - lat1);
+        double dLng = Math.toRadians(lng2 - lng1);
+        double a = Math.sin(dLat / 2) * Math.sin(dLat / 2)
+                + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2))
+                * Math.sin(dLng / 2) * Math.sin(dLng / 2);
+        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
+        return R * c;
+    }
+
+    private <T> PageData<T> emptyPage(PageWrap<?> pageWrap) {
+        PageData<T> pd = new PageData<>(pageWrap.getPage(), pageWrap.getCapacity());
+        pd.setTotal(0);
+        pd.setRecords(new ArrayList<>());
+        return pd;
+    }
+
+    /**
+     * 鏋勫缓鍙告満绔鍗曞垪琛ㄥ叡鐢╒O锛堜娇鐢∣rders鑷甫鍧愭爣璁$畻璺濈锛�
+     *
+     * @param order          璁㈠崟瀹炰綋锛圡PJ宸插~鍏卍epositShopName绛夊叧鑱斿瓧娈碉級
+     * @param driverLat      鍙告満绾害
+     * @param driverLng      鍙告満缁忓害
+     * @param needDepositDist 鏄惁闇�瑕佽绠楄窛瀛樹欢闂ㄥ簵璺濈
+     * @param now            褰撳墠鏃堕棿
+     * @param detailMap      璁㈠崟鐗╁搧鏄庣粏Map锛坥rderId 鈫� detailList锛�
+     * @return DriverGrabOrderVO
+     */
+    private DriverGrabOrderVO buildDriverOrderVO(Orders order, Double driverLat, Double driverLng,
+            boolean needDepositDist, Date now, Map<Integer, List<OrdersDetail>> detailMap) {
+        DriverGrabOrderVO vo = new DriverGrabOrderVO();
+        vo.setId(order.getId());
+        vo.setCode(order.getCode());
+
+        // 鍓╀綑鏃堕暱
+        if (order.getEstimatedDeliveryTime() != null) {
+            long diffMs = order.getEstimatedDeliveryTime().getTime() - now.getTime();
+            vo.setRemainMinutes(diffMs > 0 ? diffMs / (60 * 1000) : 0L);
+        } else {
+            vo.setRemainMinutes(0L);
+        }
+
+        vo.setIsUrgent(order.getIsUrgent());
+        vo.setDriverFee(order.getDriverFee());
+        vo.setUrgentAmount(order.getUrgentAmount());
+
+        // 瀛樹欢闂ㄥ簵锛堜娇鐢∣rders鑷甫鍧愭爣锛�
+        vo.setDepositShopName(order.getDepositShopName());
+        vo.setDepositShopAddress(order.getDepositShopAddress());
+        if (needDepositDist && driverLat != null && driverLng != null
+                && order.getDepositLgt() != null && order.getDepositLat() != null) {
+            double distKm = haversine(driverLat, driverLng,
+                    order.getDepositLgt().doubleValue(), order.getDepositLat().doubleValue());
+            vo.setDepositDistance(formatDistance(distKm));
+        }
+
+        // 鍙栦欢淇℃伅 + 鑱旂郴鐢佃瘽锛堜娇鐢∣rders鑷甫鍧愭爣锛�
+        boolean hasTakeShop = order.getTakeShopId() != null && StringUtils.isNotBlank(order.getTakeShopName());
+        if (hasTakeShop) {
+            vo.setTakeName(order.getTakeShopName());
+            vo.setContactPhone(order.getTakeShopLinkPhone());
+        } else {
+            vo.setTakeName(order.getTakeLocation());
+            vo.setContactPhone(order.getTakePhone());
+        }
+        if (driverLat != null && driverLng != null
+                && order.getTakeLgt() != null && order.getTakeLat() != null) {
+            double takeDist = haversine(driverLat, driverLng,
+                    order.getTakeLgt().doubleValue(), order.getTakeLat().doubleValue());
+            vo.setTakeDistance(formatDistance(takeDist));
+        }
+
+        // 璐甸噸鐗╁搧
+        vo.setIsValuable("1".equals(order.getC2OtherField()));
+
+        // 鐗╁搧鏄庣粏
+        List<OrdersDetail> details = detailMap.getOrDefault(order.getId(), Collections.emptyList());
+        List<DriverGrabOrderVO.OrderItem> items = new ArrayList<>();
+        for (OrdersDetail detail : details) {
+            DriverGrabOrderVO.OrderItem item = new DriverGrabOrderVO.OrderItem();
+            item.setName(detail.getLuggageName());
+            item.setQuantity(detail.getNum());
+            items.add(item);
+        }
+        vo.setItems(items);
+
+        return vo;
+    }
+
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
index 5c4f12d..a4554eb 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -286,8 +286,6 @@
             String token = JwtTokenUtil.generateTokenForRedis(member.getId(), Constants.ZERO, JSONObject.toJSONString(member), redisTemplate);
             accountResponse.setToken(token);
             accountResponse.setMember(member);
-            // 闂ㄥ簵鐢ㄦ埛韬唤鏃讹紝杩斿洖鐢宠鐨勯棬搴楃姸鎬�
-            fillShopInfo(accountResponse, member);
             return accountResponse;
         } catch (WxErrorException e) {
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "寰俊鐧诲綍寮傚父锛佽鑱旂郴绠$悊鍛�");
@@ -341,8 +339,6 @@
             AccountResponse accountResponse = new AccountResponse();
             accountResponse.setToken(token);
             accountResponse.setMember(member);
-            // 闂ㄥ簵鐢ㄦ埛韬唤鏃讹紝杩斿洖鐢宠鐨勯棬搴楃姸鎬�
-            fillShopInfo(accountResponse, member);
             return accountResponse;
         } catch (Exception e) {
             e.printStackTrace();
@@ -353,15 +349,25 @@
     /**
      * 闂ㄥ簵鐢ㄦ埛韬唤鏃讹紝濉厖闂ㄥ簵瀹℃牳鐘舵��
      */
-    private void fillShopInfo(AccountResponse response, Member member) {
+    private void fillShopInfo(UserCenterVO userCenterVO, Member member) {
         if (Constants.TWO.equals(member.getUserType())) {
             ShopInfo shopInfo = shopInfoMapper.selectOne(new QueryWrapper<ShopInfo>().lambda()
                     .eq(ShopInfo::getRegionMemberId, member.getId())
                     .eq(ShopInfo::getDeleted, Constants.ZERO)
                     .last("limit 1"));
             if (shopInfo != null) {
-                response.setShopId(shopInfo.getId());
-                response.setShopAuditStatus(shopInfo.getAuditStatus());
+                userCenterVO.setShopId(shopInfo.getId());
+                userCenterVO.setShopAuditStatus(shopInfo.getAuditStatus());
+            }
+        }
+        // 鏍规嵁openid鏌ヨ褰撳墠缁戝畾鐨勯棬搴�
+        if (StringUtils.isNotBlank(member.getOpenid())) {
+            ShopInfo bindShop = shopInfoMapper.selectOne(new QueryWrapper<ShopInfo>().lambda()
+                    .eq(ShopInfo::getOpenid, member.getOpenid())
+                    .eq(ShopInfo::getDeleted, Constants.ZERO)
+                    .last("limit 1"));
+            if (bindShop != null) {
+                userCenterVO.setBindShopId(String.valueOf(bindShop.getId()));
             }
         }
     }
@@ -398,6 +404,7 @@
         userCenterVO.setName(member.getName());
         userCenterVO.setTelephone(member.getTelephone());
         userCenterVO.setCoverImage(member.getCoverImage());
+        userCenterVO.setOpenid(member.getOpenid());
         if(StringUtils.isNotBlank(member.getCoverImage())){
             String path  = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()
                     +systemDictDataBiz.queryByCode(Constants.OSS,Constants.MEMBER_FILES).getCode();
@@ -417,6 +424,14 @@
                 .eq(Orders::getDeleted, Constants.ZERO)
                 .in(Orders::getStatus, Arrays.stream(waitReceiveStatuses).boxed().collect(Collectors.toList())));
         userCenterVO.setWaitReceiveCount(waitReceiveCount.intValue());
+        // 閫�娆句腑璁㈠崟鏁伴噺
+        Long refundingCount = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda()
+                .eq(Orders::getMemberId, memberId)
+                .eq(Orders::getDeleted, Constants.ZERO)
+                .eq(Orders::getStatus, 98));
+        userCenterVO.setRefundingCount(refundingCount.intValue());
+        // 闂ㄥ簵鐢ㄦ埛韬唤鏃讹紝杩斿洖鐢宠鐨勯棬搴楃姸鎬�
+        fillShopInfo(userCenterVO, member);
         return userCenterVO;
     }
 
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
index 5224b0f..8fa0b27 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
@@ -33,6 +33,7 @@
 import com.doumee.service.business.OrderLogService;
 import com.doumee.service.business.OrdersService;
 import com.doumee.service.business.AreasService;
+import com.doumee.service.business.PricingRuleService;
 import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
 import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
 import com.github.binarywang.wxpay.exception.WxPayException;
@@ -111,6 +112,10 @@
 
     @Autowired
     private PricingRuleMapper pricingRuleMapper;
+
+    @Autowired
+    private PricingRuleService pricingRuleService;
+
     @Autowired
     private RedisTemplate<String, Object> redisTemplate;
 
@@ -303,9 +308,9 @@
      */
     @Override
     public PriceCalculateVO calculateLocalPrice(CalculateLocalPriceDTO dto) {
-        // 澶╂暟鏍¢獙锛屾渶灏�1澶�
-        int days = dto.getEstimatedDepositDays() != null && dto.getEstimatedDepositDays() > 0
-                ? dto.getEstimatedDepositDays() : 1;
+        // 鏍规嵁寮�濮嬪拰缁撴潫鏃堕棿璁$畻澶╂暟锛屾渶灏�1澶�
+        long diffMs = dto.getDepositEndTime().getTime() - dto.getDepositStartTime().getTime();
+        int days = (int) Math.max(1, (diffMs / (1000 * 60 * 60 * 24)) + 1);
 
         // 鏀堕泦鎵�鏈夌墿鍝佺被鍨婭D
         List<Integer> categoryIds = new ArrayList<>();
@@ -364,9 +369,9 @@
             itemPriceTotal += subtotal;
         }
 
-        // 淇濅环璐圭敤锛氭姤浠烽噾棰� 脳 淇濅环璐圭巼(瀛楀吀 INSURANCE_RATE)锛屽厓鈫掑垎
+        // 淇濅环璐圭敤锛氭姤浠烽噾棰� 脳 淇濅环璐圭巼(瀛楀吀 INSURANCE_RATE)锛屽厓鈫掑垎锛堜繚浠烽噾棰�>0鏃惰璐癸級
         long insuranceFeeFen = 0L;
-        if (Boolean.TRUE.equals(dto.getInsured()) && dto.getDeclaredAmount() != null) {
+        if (dto.getDeclaredAmount() != null && dto.getDeclaredAmount().compareTo(BigDecimal.ZERO) > 0) {
             BigDecimal insuranceFeeYuan = calculateInsuranceFee(dto.getDeclaredAmount());
             insuranceFeeFen = insuranceFeeYuan.multiply(new BigDecimal(100)).longValue();
         }
@@ -504,9 +509,9 @@
             itemPriceTotal += subtotal;
         }
 
-        // 4. 淇濅环璐圭敤锛氭姤浠烽噾棰� 脳 淇濅环璐圭巼(瀛楀吀 INSURANCE_RATE)锛屽厓鈫掑垎
+        // 4. 淇濅环璐圭敤锛氭姤浠烽噾棰� 脳 淇濅环璐圭巼(瀛楀吀 INSURANCE_RATE)锛屽厓鈫掑垎锛堜繚浠烽噾棰�>0鏃惰璐癸級
         long insuranceFeeFen = 0L;
-        if (Boolean.TRUE.equals(dto.getInsured()) && dto.getDeclaredAmount() != null) {
+        if (dto.getDeclaredAmount() != null && dto.getDeclaredAmount().compareTo(BigDecimal.ZERO) > 0) {
             BigDecimal insuranceFeeYuan = calculateInsuranceFee(dto.getDeclaredAmount());
             insuranceFeeFen = insuranceFeeYuan.multiply(new BigDecimal(100)).longValue();
         }
@@ -531,6 +536,33 @@
         result.setUrgentFee(urgentFeeFen);
         result.setTotalPrice(totalPrice);
         result.setDistance(distanceKm);
+
+        // 7. 棰勮閫佽揪鏃堕暱锛歱ricing_rule type=2锛坒ieldA=1鏍囬�熻揪锛宖ieldA=2鏋侀�熻揪锛�
+        List<PricingRule> timeRules = pricingRuleMapper.selectList(new QueryWrapper<PricingRule>().lambda()
+                .eq(PricingRule::getDeleted, Constants.ZERO)
+                .eq(PricingRule::getType, Constants.TWO)
+                .eq(PricingRule::getCityId, dto.getCityId())
+                .in(PricingRule::getFieldA, Arrays.asList("1", "2")));
+        for (PricingRule tr : timeRules) {
+            BigDecimal baseKm = new BigDecimal(tr.getFieldB());
+            int baseHours = Integer.parseInt(tr.getFieldC());
+            BigDecimal extraKm = new BigDecimal(tr.getFieldD());
+            int extraHours = Integer.parseInt(tr.getFieldE());
+            int hours;
+            if (distanceKm.compareTo(baseKm) <= 0) {
+                hours = baseHours;
+            } else {
+                BigDecimal overDistance = distanceKm.subtract(baseKm);
+                int extraCount = overDistance.divide(extraKm, 0, RoundingMode.CEILING).intValue();
+                hours = baseHours + extraCount * extraHours;
+            }
+            if ("1".equals(tr.getFieldA())) {
+                result.setStandardHours(hours);
+            } else if ("2".equals(tr.getFieldA())) {
+                result.setUrgentHours(hours);
+            }
+        }
+
         return result;
     }
 
@@ -633,6 +665,11 @@
                 takeLgt = BigDecimal.valueOf(takeShop.getLongitude());
                 takeLocationValue = takeShop.getAddress();
             } else if (dto.getTakeLat() != null && dto.getTakeLgt() != null && StringUtils.isNotBlank(dto.getTakeLocation())) {
+                // 鏃犲彇浠堕棬搴楋紝鏍¢獙瀛樹欢鐐逛笌鑷�夊彇浠剁偣鏄惁鍦ㄥ悓涓�鍩庡競
+                if (MapUtil.isSameCity(depositShop.getLatitude(), depositShop.getLongitude(),
+                        dto.getTakeLat().doubleValue(), dto.getTakeLgt().doubleValue())) {
+                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "寮傚湴瀵勫瓨璁㈠崟瀛樺彇鐐逛笉鑳藉湪鍚屼竴鍩庡競锛屽闇�鍚屽煄瀵勫瓨璇烽�夋嫨灏辫繎闂ㄥ簵");
+                }
                 takeLat = dto.getTakeLat();
                 takeLgt = dto.getTakeLgt();
                 takeLocationValue = dto.getTakeLocation();
@@ -647,15 +684,12 @@
         // ========== 3. 璁$畻璐圭敤 ==========
         PriceCalculateVO priceResult;
         if (Constants.ZERO.equals(dto.getType())) {
-            // 灏卞湴瀵勫瓨锛氳绠楀ぉ鏁�
-            long diffMs = takeTime.getTime() - depositTime.getTime();
-            int days = (int) Math.max(1, (diffMs / (1000 * 60 * 60 * 24)) + 1);
-
+            // 灏卞湴瀵勫瓨
             CalculateLocalPriceDTO priceDTO = new CalculateLocalPriceDTO();
             priceDTO.setCityId(dto.getCityId());
-            priceDTO.setEstimatedDepositDays(days);
+            priceDTO.setDepositStartTime(depositTime);
+            priceDTO.setDepositEndTime(takeTime);
             priceDTO.setItems(dto.getItems());
-            priceDTO.setInsured(dto.getDeclaredAmount() != null && dto.getDeclaredAmount().compareTo(BigDecimal.ZERO) > 0);
             priceDTO.setDeclaredAmount(dto.getDeclaredAmount());
             priceResult = calculateLocalPrice(priceDTO);
         } else {
@@ -667,7 +701,6 @@
             priceDTO.setToLat(takeLat);
             priceDTO.setToLgt(takeLgt);
             priceDTO.setItems(dto.getItems());
-            priceDTO.setInsured(dto.getDeclaredAmount() != null && dto.getDeclaredAmount().compareTo(BigDecimal.ZERO) > 0);
             priceDTO.setDeclaredAmount(dto.getDeclaredAmount());
             priceDTO.setUrgent(Constants.ONE.equals(dto.getIsUrgent()));
             priceResult = calculateRemotePrice(priceDTO);
@@ -736,6 +769,7 @@
 
         // 鐗╁搧淇℃伅
         orders.setGoodType(dto.getGoodType());
+        orders.setGoodLevel(goodTypeCategory.getRelationId());
         // 鎷兼帴鐗╁搧淇℃伅锛氱墿鍝佺被鍨嬪悕绉般�佸昂瀵稿悕绉�*鏁伴噺锛堟暟缁勫瓧绗︿覆锛�
         List<String> goodsParts = new ArrayList<>();
         for (ItemPriceVO itemVO : priceResult.getItemList()) {
@@ -1714,6 +1748,24 @@
         order.setUpdateTime(now);
         // 鐢熸垚浼氬憳鏍搁攢鐮�
         order.setMemberVerifyCode(generateVerifyCode());
+        // 寮傚湴瀵勫瓨锛氳绠楅璁¢�佽揪鏃堕棿
+        if (Constants.ONE.equals(order.getType())
+                && order.getDepositLat() != null && order.getDepositLgt() != null
+                && order.getTakeLat() != null && order.getTakeLgt() != null) {
+            EstimatedDeliveryResultVO deliveryResult = calculateEstimatedDelivery(
+                    Integer.valueOf(order.getCityId()),
+                    order.getDepositLat().doubleValue(), order.getDepositLgt().doubleValue(),
+                    order.getTakeLat().doubleValue(), order.getTakeLgt().doubleValue());
+            // isUrgent: 0=鏍囬�熻揪; 1=鏋侀�熻揪
+            BigDecimal hours = Constants.ONE.equals(order.getIsUrgent())
+                    ? deliveryResult.getExpressHours()
+                    : deliveryResult.getStandardHours();
+            if (hours != null) {
+                long millis = hours.multiply(new BigDecimal("3600000"))
+                        .setScale(0, RoundingMode.HALF_UP).longValue();
+                order.setEstimatedDeliveryTime(new Date(now.getTime() + millis));
+            }
+        }
         ordersMapper.updateById(order);
     }
 
@@ -2315,6 +2367,43 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void memberConfirmReceipt(Integer orderId, Integer memberId) {
+        // 1. 鏌ヨ璁㈠崟
+        Orders order = ordersMapper.selectById(orderId);
+        if (order == null || Constants.equalsInteger(order.getDeleted(), Constants.ONE)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "璁㈠崟涓嶅瓨鍦�");
+        }
+        // 2. 鏍¢獙褰掑睘
+        if (!memberId.equals(order.getMemberId())) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "鏃犳潈鎿嶄綔璇ヨ鍗�");
+        }
+        // 3. 鏍¢獙璁㈠崟绫诲瀷锛氬紓鍦板瘎瀛�
+        if (!Constants.ONE.equals(order.getType())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "浠呭紓鍦板瘎瀛樿鍗曞彲鎿嶄綔");
+        }
+        // 4. 鏍¢獙鏃犲彇浠堕棬搴�
+        if (order.getTakeShopId() != null) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曟湁鍙栦欢闂ㄥ簵锛岄渶闂ㄥ簵纭鍑哄簱");
+        }
+        // 5. 鏍¢獙鐘舵�侊細宸查�佽揪(5)
+        if (!Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.arrived.getStatus())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "褰撳墠璁㈠崟鐘舵�佷笉鍏佽纭鏀惰揣");
+        }
+
+        // 6. 鏇存柊璁㈠崟鐘舵�佷负宸插畬鎴�
+        Date now = new Date();
+        order.setStatus(Constants.OrderStatus.finished.getStatus());
+        order.setFinishTime(now);
+        order.setUpdateTime(now);
+        ordersMapper.updateById(order);
+
+        // 7. 鐢熸垚鏀剁泭璁板綍
+        calculateAndSaveOrderFees(orderId);
+        generateRevenueRecords(orderId);
+    }
+
+    @Override
     public void calculateAndSaveOrderFees(Integer orderId) {
         Orders order = ordersMapper.selectById(orderId);
         if (order == null || Constants.equalsInteger(order.getDeleted(), Constants.ONE)) {
@@ -2857,4 +2946,29 @@
         return Math.max(days, 0);
     }
 
+    @Override
+    public EstimatedDeliveryResultVO calculateEstimatedDelivery(Integer cityId,
+                                                                Double fromLat, Double fromLng,
+                                                                Double toLat, Double toLng) {
+        // 鑵捐鍦板浘璺濈鐭╅樀API璁$畻瀹為檯璺濈
+        String from = fromLat + "," + fromLng;
+        String to = toLat + "," + toLng;
+        JSONObject distanceResult = MapUtil.distanceSingle("driving", from, to);
+
+        // 鑾峰彇璺濈锛堢背锛夛紝杞叕閲�
+        int distanceMeters = distanceResult.getIntValue("distance");
+        BigDecimal distanceKm = new BigDecimal(distanceMeters)
+                .divide(new BigDecimal("1000"), 2, RoundingMode.HALF_UP);
+
+        // 鏍规嵁pricing_rule type=2 璁$畻 鏍囬�熻揪(1) 鍜� 鏋侀�熻揪(2) 鏃舵晥
+        BigDecimal standardTime = pricingRuleService.calculateEstimatedTime(cityId, 1, distanceKm);
+        BigDecimal expressTime = pricingRuleService.calculateEstimatedTime(cityId, 2, distanceKm);
+
+        EstimatedDeliveryResultVO vo = new EstimatedDeliveryResultVO();
+        vo.setDistanceKm(distanceKm);
+        vo.setStandardHours(standardTime);
+        vo.setExpressHours(expressTime);
+        return vo;
+    }
+
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/RevenueServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/RevenueServiceImpl.java
index 16e0ab0..bf73fc6 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/RevenueServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/RevenueServiceImpl.java
@@ -18,7 +18,9 @@
 import com.doumee.dao.business.model.ShopInfo;
 import com.doumee.dao.business.model.Member;
 import com.doumee.dao.business.model.WithdrawalOrders;
+import com.doumee.dao.dto.RevenueQueryDTO;
 import com.doumee.dao.vo.RevenueStatisticsVO;
+import com.doumee.dao.vo.RevenueSummaryVO;
 import com.doumee.service.business.RevenueService;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -235,4 +237,118 @@
         return vo;
     }
 
+    @Override
+    public PageData<Revenue> findDriverRevenuePage(PageWrap<RevenueQueryDTO> pageWrap, Integer memberId) {
+        IPage<Revenue> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<Revenue> qw = buildRevenueQueryWrapper(pageWrap.getModel(), memberId);
+        PageData<Revenue> result = PageData.from(revenueMapper.selectPage(page, qw));
+        if (result != null && result.getRecords() != null) {
+            for (Revenue model : result.getRecords()) {
+                model.setAmountInfo(Constants.getFormatMoney(model.getAmount()));
+            }
+        }
+        return result;
+    }
+
+    @Override
+    public PageData<Revenue> findShopRevenuePage(PageWrap<RevenueQueryDTO> pageWrap, Integer shopId) {
+        ShopInfo shop = shopInfoMapper.selectById(shopId);
+        if (shop == null || Constants.equalsInteger(shop.getDeleted(), Constants.ONE)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        IPage<Revenue> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<Revenue> qw = buildRevenueQueryWrapper(pageWrap.getModel(), shop.getRegionMemberId());
+        PageData<Revenue> result = PageData.from(revenueMapper.selectPage(page, qw));
+        if (result != null && result.getRecords() != null) {
+            for (Revenue model : result.getRecords()) {
+                model.setAmountInfo(Constants.getFormatMoney(model.getAmount()));
+            }
+        }
+        return result;
+    }
+
+    @Override
+    public RevenueSummaryVO getDriverRevenueSummary(RevenueQueryDTO queryDTO, Integer memberId) {
+        return buildRevenueSummary(queryDTO, memberId);
+    }
+
+    @Override
+    public RevenueSummaryVO getShopRevenueSummary(RevenueQueryDTO queryDTO, Integer shopId) {
+        ShopInfo shop = shopInfoMapper.selectById(shopId);
+        if (shop == null || Constants.equalsInteger(shop.getDeleted(), Constants.ONE)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        return buildRevenueSummary(queryDTO, shop.getRegionMemberId());
+    }
+
+    private QueryWrapper<Revenue> buildRevenueQueryWrapper(RevenueQueryDTO query, Integer memberId) {
+        QueryWrapper<Revenue> qw = new QueryWrapper<>();
+        qw.lambda().eq(Revenue::getDeleted, Constants.ZERO);
+        qw.lambda().eq(Revenue::getMemberId, memberId);
+        if (query != null) {
+            if (query.getOptType() != null) {
+                qw.lambda().eq(Revenue::getOptType, query.getOptType());
+            }
+            if (query.getType() != null) {
+                qw.lambda().eq(Revenue::getType, query.getType());
+            }
+            if (query.getStartTime() != null) {
+                qw.lambda().ge(Revenue::getCreateTime, query.getStartTime());
+            }
+            if (query.getEndTime() != null) {
+                qw.lambda().le(Revenue::getCreateTime, Utils.Date.getEnd(query.getEndTime()));
+            }
+        }
+        qw.lambda().orderByDesc(Revenue::getCreateTime);
+        return qw;
+    }
+
+    private RevenueSummaryVO buildRevenueSummary(RevenueQueryDTO queryDTO, Integer memberId) {
+        // 鏀跺叆
+        QueryWrapper<Revenue> incomeQw = new QueryWrapper<>();
+        incomeQw.eq("DELETED", Constants.ZERO);
+        incomeQw.eq("MEMBER_ID", memberId);
+        incomeQw.eq("OPT_TYPE", Constants.ONE);
+        if (queryDTO != null) {
+            if (queryDTO.getType() != null) {
+                incomeQw.eq("TYPE", queryDTO.getType());
+            }
+            if (queryDTO.getStartTime() != null) {
+                incomeQw.ge("CREATE_TIME", queryDTO.getStartTime());
+            }
+            if (queryDTO.getEndTime() != null) {
+                incomeQw.le("CREATE_TIME", Utils.Date.getEnd(queryDTO.getEndTime()));
+            }
+        }
+        incomeQw.select("IFNULL(SUM(AMOUNT), 0) as amount");
+        Map<String, Object> incomeResult = revenueMapper.selectMaps(incomeQw).stream().findFirst().orElse(null);
+        long totalIncome = incomeResult != null && incomeResult.get("amount") != null
+                ? Long.parseLong(incomeResult.get("amount").toString()) : 0L;
+        // 鏀嚭
+        QueryWrapper<Revenue> expenseQw = new QueryWrapper<>();
+        expenseQw.eq("DELETED", Constants.ZERO);
+        expenseQw.eq("MEMBER_ID", memberId);
+        expenseQw.eq("OPT_TYPE", -Constants.ONE);
+        if (queryDTO != null) {
+            if (queryDTO.getType() != null) {
+                expenseQw.eq("TYPE", queryDTO.getType());
+            }
+            if (queryDTO.getStartTime() != null) {
+                expenseQw.ge("CREATE_TIME", queryDTO.getStartTime());
+            }
+            if (queryDTO.getEndTime() != null) {
+                expenseQw.le("CREATE_TIME", Utils.Date.getEnd(queryDTO.getEndTime()));
+            }
+        }
+        expenseQw.select("IFNULL(SUM(AMOUNT), 0) as amount");
+        Map<String, Object> expenseResult = revenueMapper.selectMaps(expenseQw).stream().findFirst().orElse(null);
+        long totalExpense = expenseResult != null && expenseResult.get("amount") != null
+                ? Long.parseLong(expenseResult.get("amount").toString()) : 0L;
+
+        RevenueSummaryVO vo = new RevenueSummaryVO();
+        vo.setTotalIncome(totalIncome);
+        vo.setTotalExpense(totalExpense);
+        return vo;
+    }
+
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java
index bf5a84a..f08ea2e 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java
@@ -236,8 +236,8 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void applyShop(ShopApplyDTO request, Member member) {
-        Integer memberId = member.getId();
+    public void applyShop(ShopApplyDTO request) {
+        Member member = memberMapper.selectById(request.getMemberId());
 
         // 1. 鏍¢獙闂ㄥ簵鎵嬫満鍙峰敮涓�鎬э紙shop_info.telephone锛�
         checkTelephoneUnique(request.getTelephone(), null);
@@ -275,7 +275,7 @@
         // 3. 鏌ヨ璇ヤ細鍛樻槸鍚﹀凡鏈夐棬搴楄褰�
         QueryWrapper<ShopInfo> existQw = new QueryWrapper<>();
         existQw.lambda()
-                .eq(ShopInfo::getRegionMemberId, memberId)
+                .eq(ShopInfo::getRegionMemberId, member.getId())
                 .eq(ShopInfo::getDeleted, Constants.ZERO)
                 .last("limit 1");
         ShopInfo existing = shopInfoMapper.selectOne(existQw);
@@ -317,7 +317,6 @@
             existing.setAliAccount(request.getAliAccount());
             existing.setAuditStatus(Constants.ZERO);
             existing.setUpdateTime(now);
-            existing.setUpdateUser(memberId);
             existing.setAuditRemark(null);
             existing.setAuditTime(null);
             existing.setAuditUserId(null);
@@ -351,8 +350,7 @@
             shopInfo.setDeleted(Constants.ZERO);
             shopInfo.setCreateTime(now);
             shopInfo.setUpdateTime(now);
-            shopInfo.setCreateUser(memberId);
-            shopInfo.setRegionMemberId(memberId);
+            shopInfo.setRegionMemberId(member.getId());
             shopInfoMapper.insert(shopInfo);
             shopId = shopInfo.getId();
         }
@@ -662,7 +660,7 @@
         String imgPrefix = "";
         try {
             imgPrefix = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
-                    + systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.SHOP_FILES).getCode();
+                    + systemDictDataBiz.queryByCode(Constants.OSS, Constants.SHOP_FILES).getCode();
         } catch (Exception e) {
             // 鏈厤缃椂蹇界暐
         }
@@ -720,7 +718,7 @@
                 String memberPrefix = "";
                 try {
                     memberPrefix = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
-                            + systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.MEMBER_FILES).getCode();
+                            + systemDictDataBiz.queryByCode(Constants.OSS, Constants.MEMBER_FILES).getCode();
                 } catch (Exception e) {
                     // 鏈厤缃椂蹇界暐
                 }
@@ -761,6 +759,12 @@
             qw.lambda().like(ShopInfo::getName, dto.getName());
         }
 
+        // 鍩庡競绛涢�夛紙areaId鏄尯鍘匡紝闇�鍖归厤鍏秔arentId绛変簬鍩庡競ID锛�
+        if (dto.getCityId() != null) {
+            qw.inSql("AREA_ID",
+                    "SELECT id FROM areas WHERE parent_id = " + dto.getCityId() + " AND isdeleted = 0");
+        }
+
         // 璺濈绛涢�夛紙鍗曚綅锛氱背 鈫� 杞崲涓簁m姣旇緝锛�
         if (distanceMeter != null && distanceMeter > 0) {
             double maxKm = distanceMeter / 1000.0;
@@ -793,6 +797,8 @@
             vo.setShopHours(shop.getShopHours());
             vo.setAddress(shop.getAddress());
             vo.setScore(shop.getScore());
+            vo.setLatitude(shop.getLatitude());
+            vo.setLongitude(shop.getLongitude());
             // 闂ㄥご鐓х涓�寮�
             vo.setCoverImg(getFirstImage(shop.getId(), Constants.FileType.STORE_FRONT.getKey(), imgPrefix));
             // 璺濈
@@ -823,6 +829,10 @@
         vo.setName(shop.getName());
         vo.setAddress(shop.getAddress());
         vo.setContent(shop.getContent());
+        vo.setDepositTypes(shop.getDepositTypes());
+        vo.setFeeStandard(shop.getFeeStandard());
+        vo.setLatitude(shop.getLatitude());
+        vo.setLongitude(shop.getLongitude());
 
         // 闂ㄥご鐓� + 鍐呴儴鐓� 鍏ㄨ矾寰勯泦鍚�
         String imgPrefix = getShopPrefix();
@@ -911,7 +921,7 @@
     private String getShopPrefix() {
         try {
             return systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
-                    + systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.SHOP_FILES).getCode();
+                    + systemDictDataBiz.queryByCode(Constants.OSS, Constants.SHOP_FILES).getCode();
         } catch (Exception e) {
             return "";
         }
@@ -965,7 +975,7 @@
         vo.setCoverImg(shop.getCoverImg());
         if (StringUtils.isNotBlank(shop.getCoverImg())) {
             String path = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
-                    + systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.SHOP_FILES).getCode();
+                    + systemDictDataBiz.queryByCode(Constants.OSS, Constants.SHOP_FILES).getCode();
             vo.setFullCoverImg(path + shop.getCoverImg());
         }
         vo.setHasMessage(false);
@@ -1055,7 +1065,6 @@
         if (shop == null) {
             return null;
         }
-
         // 鍒涘缓token锛坓enerateTokenForRedis 宸茶嚜鍔ㄦ竻闄よ鐢ㄦ埛鏃oken锛屼繚璇佸敮涓�鏈夋晥锛�
         String token = JwtTokenUtil.generateTokenForRedis(shop.getId(), Constants.TWO, JSONObject.toJSONString(shop), redisTemplate);
 
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/SmsrecordServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/SmsrecordServiceImpl.java
index b551c26..182169c 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/SmsrecordServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/SmsrecordServiceImpl.java
@@ -1,7 +1,5 @@
 package com.doumee.service.business.impl;
 
-import com.alibaba.fastjson.JSONObject;
-import com.aliyuncs.CommonResponse;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -14,7 +12,7 @@
 import com.doumee.core.utils.DateUtil;
 import com.doumee.core.utils.Strings;
 import com.doumee.core.utils.Utils;
-import com.doumee.core.utils.aliyun.ALiYunSmSUtil;
+import com.doumee.core.utils.aliyun.AliSmsService;
 import com.doumee.dao.business.SmsrecordMapper;
 import com.doumee.dao.business.model.Smsrecord;
 import com.doumee.service.business.SmsrecordService;
@@ -179,15 +177,10 @@
         );
         String digits = Strings.randomNumeric(4);
         //鍙戦�侀獙璇佺爜
-        Map<String,Object> map = new HashMap<String,Object>();
-        map.put("code",digits);
-        CommonResponse response = ALiYunSmSUtil.sendMessage(phone,map);
-        if(response.getHttpResponse().isSuccess()){
-            JSONObject data = JSONObject.parseObject(response.getData());
-            String returnCode = data.getString("Code");
-            if(!returnCode.equals("OK")){
-                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鐭俊鍙戦�佸け璐ワ細" + data.getString("Message"));
-            }
+        String templateParam = "{\"code\":\"" + digits + "\"}";
+        Boolean result = AliSmsService.sendSms(phone, "SMS_491325122", templateParam);
+        if (!result) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "鐭俊鍙戦�佸け璐ワ紝璇风◢鍚庨噸璇�");
         }
         //瀛樺偍鐭俊楠岃瘉鐮�
         Smsrecord smsrecord = new Smsrecord();
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java
index 83e7959..3484958 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java
@@ -258,6 +258,22 @@
         update.setUpdateTime(now);
         withdrawalOrdersMapper.updateById(update);
 
+        // 鏇存柊鍏宠仈鐨勬彁鐜� Revenue 璁板綍鐘舵��
+        // 閫氳繃 objId + objType=1(鎻愮幇涓氬姟) + type=1(鎻愮幇鏀嚭) 鎵惧埌鍘熷鎻愮幇鏀嚭璁板綍
+        Revenue withdrawalRevenue = revenueMapper.selectOne(new QueryWrapper<Revenue>().lambda()
+                .eq(Revenue::getObjId, order.getId())
+                .eq(Revenue::getObjType, Constants.ONE)
+                .eq(Revenue::getType, Constants.ONE)
+                .eq(Revenue::getDeleted, Constants.ZERO)
+                .last("limit 1"));
+        if (withdrawalRevenue != null) {
+            Integer revenueStatus = Constants.ONE.equals(dto.getStatus()) ? Constants.ZERO : Constants.ONE; // 閫氳繃=0鎴愬姛, 椹冲洖=1澶辫触
+            revenueMapper.update(new UpdateWrapper<Revenue>().lambda()
+                    .set(Revenue::getStatus, revenueStatus)
+                    .set(Revenue::getUpdateTime, now)
+                    .eq(Revenue::getId, withdrawalRevenue.getId()));
+        }
+
         // 椹冲洖鏃堕��鍥炰綑棰�
         if (Constants.TWO.equals(dto.getStatus())) {
             Long amountFen = order.getAmount() != null ? order.getAmount() : 0L;
@@ -295,7 +311,8 @@
                 revenue.setVaildStatus(Constants.ONE); // 宸插叆璐�
                 revenue.setObjId(order.getId());
                 revenue.setObjType(Constants.ONE); // 1=鎻愮幇涓氬姟
-                revenue.setStatus(Constants.ZERO);
+                revenue.setOrderNo(order.getOutBillNo());
+                revenue.setStatus(Constants.ZERO); // 0=鎴愬姛
                 revenue.setDeleted(Constants.ZERO);
                 revenue.setCreateTime(now);
                 revenueMapper.insert(revenue);
@@ -390,7 +407,8 @@
         revenue.setVaildStatus(Constants.ONE);
         revenue.setObjId(order.getId());
         revenue.setObjType(Constants.ONE);
-        revenue.setStatus(Constants.ZERO);
+        revenue.setOrderNo(billNo);
+        revenue.setStatus(Constants.TWO); // 2=澶勭悊涓�
         revenue.setDeleted(Constants.ZERO);
         revenue.setCreateTime(now);
         revenueMapper.insert(revenue);
@@ -440,7 +458,8 @@
         revenue.setVaildStatus(Constants.ONE); // 宸插叆璐�
         revenue.setObjId(order.getId());
         revenue.setObjType(Constants.ONE); // 1=鎻愮幇涓氬姟
-        revenue.setStatus(Constants.ZERO);
+        revenue.setOrderNo(billNo);
+        revenue.setStatus(Constants.TWO); // 2=澶勭悊涓�
         revenue.setDeleted(Constants.ZERO);
         revenue.setCreateTime(now);
         revenueMapper.insert(revenue);
diff --git a/server/services/src/main/resources/application-dev.yml b/server/services/src/main/resources/application-dev.yml
index 65f07cc..fa3d1ce 100644
--- a/server/services/src/main/resources/application-dev.yml
+++ b/server/services/src/main/resources/application-dev.yml
@@ -83,12 +83,31 @@
 ########################寰俊鏀粯鐩稿叧閰嶇疆########################
 wx:
   pay:
-    appId: wxcd2b89fd2ff065f8
-    appSecret: 3462fa186da7cb06c544df8d8664b63a
-    mchId: 1229817002
-    mchKey: u4TSNtv0wFP7WRfnxBgijYOtRhS9FvlM
-    notifyUrl: https://test.doumee.cn/dmmall_web_api/web/api/wxPayNotify
-    keyPath: D:\DouMee\dmkjWxcert\apiclient_cert.p12
+#    appId: wxcd2b89fd2ff065f8
+#    appSecret: 3462fa186da7cb06c544df8d8664b63a
+#    mchId: 1229817002
+#    mchKey: u4TSNtv0wFP7WRfnxBgijYOtRhS9FvlM
+#    notifyUrl: http://xiaopiqiu2.natapp1.cc/web/api/wxPayNotify
+#    keyPath: D:\DouMee\dmkjWxcert\apiclient_cert.p12
+    appId: wxb1b59320e803dc6c
+    appSecret: eb93785c7bca3f0ff0364b0e26bfeb59
+    mchId: 1229817002    #鍟嗘埛鍙�
+    mchKey: u4TSNtv0wFP7WRfnxBgijYOtRhS9FvlM #鍟嗘埛绉橀挜
+    apiV3Key: 7tG4Vk9Zp2L8dXw5Jq0N3hR6yE1sF3cB #apiV3Key
+    serialNumer: 3FE90C2F3D40A56E1C51926F31B8A8D22426CCE0 #鍟嗘埛璇佷功搴忓垪鍙�
+    notifyUrl: http://xiaopiqiu2.natapp1.cc/web/wxPayNotify
+    refundNotifyUrl: http://xiaopiqiu2.natapp1.cc/web/wxRefundNotify
+    keyPath: D:\DouMee\1229817002_20220310_cert\apiclient_cert.p12
+    privateCertPath: D:\DouMee\1229817002_20220310_cert\apiclient_cert.pem
+    privateKeyPath: D:\DouMee\1229817002_20220310_cert\apiclient_key.pem
+    pubKeyPath: D:\DouMee\1229817002_20220310_cert\pub_key.pem #鍟嗘埛鏀粯鍏挜
+
+#    appId: wx6264b4f3a697cbe8
+#    appSecret: 23734577e8978138c946b727f0394027
+#    mchId: 1629568742
+#    mchKey: NJTLJSTZYXZRGScaiwubuzichanbu666
+#    notifyUrl: https://test.doumee.cn/dmmall_web_api/web/api/wxPayNotify
+#    keyPath: D:\DouMee\gtxljcWxcert\apiclient_cert.p12
 
 alipay:
   pay:
diff --git a/server/services/src/main/resources/application-pro.yml b/server/services/src/main/resources/application-pro.yml
index bb5fcb0..d47e4ed 100644
--- a/server/services/src/main/resources/application-pro.yml
+++ b/server/services/src/main/resources/application-pro.yml
@@ -52,39 +52,19 @@
 ########################寰俊鏀粯鐩稿叧閰嶇疆########################
 wx:
   pay:
-    #鏈嶅姟鍟�---------start------- 鍙傛暟璇﹁В鍦板潃 https://pay.weixin.qq.com/doc/v3/partner/4013080340
-    mchId: 1700071922    #鏈嶅姟鍟嗗湪寰俊鏀粯渚х殑鍞竴韬唤鏍囪瘑
-    appId: wx6cc1087ca79db7f6    #鏈嶅姟鍟嗗湪寰俊寮�鏀惧钩鍙帮紙绉诲姩搴旂敤锛夋垨鍏紬骞冲彴锛堝叕浼楀彿/灏忕▼搴忥級涓婄敵璇风殑涓�涓敮涓�鏍囪瘑
-    apiV3Key: 0a056faa107c2b2944b9d6a9aa6d4142 #7tG4Vk9Zp2L8dXw5Jq0N3hR6yE1sF3cB
-    serialNumer: 6696086F6EFB8D6A4F821BD47DDBAF75C3BC1209 #38495CE0137D90E4DC4F64F7ECDE035A35470BE3 #鏈嶅姟鍟嗚瘉涔﹀簭鍒楀彿
-    payPublicKeyId: PUB_KEY_ID_0117000719222024112700219100000508 #鍟嗘埛/骞冲彴鏀粯鍏挜id
-    #mchKey: W97N53Q71326D6JZ2E9HY5M4VT4BAC8S
-    notifyUrl: https://jinkuai.832smartfarm.com/jinkuai_admin/web/wxPayNotify
-    refundNotifyUrl: https://jinkuai.832smartfarm.com/jinkuai_admin/web/wxRefundNotify
-    keyPath: /usr/local/jars/payFile/apiclient_cert.p12
-    privateCertPath: /usr/local/jars/payFile/apiclient_cert.pem
-    privateKeyPath: /usr/local/jars/payFile/apiclient_key.pem
-    pubKeyPath: /usr/local/jars/payFile/pub_key.pem #鍟嗘埛鏀粯鍏挜
+    appId: wxb1b59320e803dc6c
+    appSecret: eb93785c7bca3f0ff0364b0e26bfeb59
+    mchId: 1229817002    #鍟嗘埛鍙�
+    mchKey: u4TSNtv0wFP7WRfnxBgijYOtRhS9FvlM #鍟嗘埛绉橀挜
+    apiV3Key: 7tG4Vk9Zp2L8dXw5Jq0N3hR6yE1sF3cB #apiV3Key
+    serialNumer: 3FE90C2F3D40A56E1C51926F31B8A8D22426CCE0 #鍟嗘埛璇佷功搴忓垪鍙�
+    notifyUrl: http://xiaopiqiu2.natapp1.cc/web/wxPayNotify
+    refundNotifyUrl: http://xiaopiqiu2.natapp1.cc/web/wxRefundNotify
+    keyPath: D:\DouMee\1229817002_20220310_cert\apiclient_cert.p12
+    privateCertPath: D:\DouMee\1229817002_20220310_cert\apiclient_cert.pem
+    privateKeyPath: D:\DouMee\1229817002_20220310_cert\apiclient_key.pem
+    pubKeyPath: D:\DouMee\1229817002_20220310_cert\pub_key.pem #鍟嗘埛鏀粯鍏挜
 
-    #鏈嶅姟鍟�-------------end---
-
-    #鍟嗘埛淇℃伅
-    wechatSerialNumer: 12C0F0DD0F3D2B565B45586D3FEA225EBF723BEC
-    wechatPayPublicKeyId: PUB_KEY_ID_0117233260692025072500181939000603 #鍟嗘埛/骞冲彴鏀粯鍏挜id
-    wechatPubKeyPath: /usr/local/jars/payFile/shanghu/pub_key.pem #鍟嗘埛鏀粯鍏挜
-    wechatPrivateKeyPath: /usr/local/jars/payFile/shanghu/apiclient_key.pem #鍟嗘埛绉侀挜
-    wechatNotifyUrl: https://jinkuai.832smartfarm.com/jinkuai_admin/web/wechat/transferNotify #鍟嗘埛杞处鍥炶皟鍦板潃
-    wechatApiV3Key: 7tG4Vk9Zp2L8dXw5Jq0N3hR6yE1sF3cB
-
-
-    existsSub: 1
-    appSecret:
-    #瀛愬晢鎴�------------start----
-    subMchId: 1723326069    #瀛愬晢鎴峰彿
-    subAppId: wx332441ae5b12be7d #灏忕▼搴廼d
-    subAppSecret: add86d6406f5c14501ac5bbb1a60e004 #灏忕▼搴忕閽�
-    #瀛愬晢鎴�------------end----
-    #      mchKey: u4TSNtv0wFP7WRfnxBgijYOtRhS9FvlM
     typeId: jinkuai
 
 alipay:
diff --git a/server/web/src/main/java/com/doumee/api/web/ApiController.java b/server/web/src/main/java/com/doumee/api/web/ApiController.java
index 897ce33..1383dcd 100644
--- a/server/web/src/main/java/com/doumee/api/web/ApiController.java
+++ b/server/web/src/main/java/com/doumee/api/web/ApiController.java
@@ -42,16 +42,8 @@
         return obj != null ? (Integer) obj : null;
     }
 
-    /**
-     * 鑾峰彇鐧诲綍鐢ㄦ埛瀵硅薄淇℃伅
-     * @return
-     */
-    protected Member getMemberResponse(){
-        Object obj = this.getRequest().getAttribute(JwtTokenUtil.MEMBER_INFO);
-        if(obj != null){
-            return JSONObject.parseObject(obj.toString(),Member.class);
-        }
-        return null;
+    protected Integer getDriverId() {
+        Object obj = this.getRequest().getAttribute(JwtTokenUtil.DRIVER_ID);
+        return obj != null ? (Integer) obj : null;
     }
-
 }
diff --git a/server/web/src/main/java/com/doumee/api/web/ConfigApi.java b/server/web/src/main/java/com/doumee/api/web/ConfigApi.java
index 0391012..bc17bac 100644
--- a/server/web/src/main/java/com/doumee/api/web/ConfigApi.java
+++ b/server/web/src/main/java/com/doumee/api/web/ConfigApi.java
@@ -3,12 +3,14 @@
 import com.doumee.core.annotation.LoginRequired;
 import com.doumee.core.annotation.trace.Trace;
 import com.doumee.core.model.ApiResponse;
+import com.doumee.core.utils.Tencent.MapUtil;
 import com.doumee.dao.business.model.Areas;
 import com.doumee.dao.business.model.Banner;
 import com.doumee.dao.business.model.Category;
+import com.doumee.dao.dto.AreasDto;
 import com.doumee.dao.dto.CalculateLocalPriceDTO;
 import com.doumee.dao.dto.CalculateRemotePriceDTO;
-import com.doumee.dao.vo.AccountResponse;
+import com.doumee.dao.dto.SameCityCheckDTO;
 import com.doumee.dao.vo.PriceCalculateVO;
 import com.doumee.dao.vo.PlatformAboutVO;
 import com.doumee.service.business.*;
@@ -17,7 +19,7 @@
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
-import org.checkerframework.checker.units.qual.A;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -52,6 +54,15 @@
 
     @Autowired
     private MemberService memberService;
+
+    @ApiOperation("鍏ㄩ儴鍖哄垝鏍戝舰鏌ヨ")
+    @PostMapping("/treeList")
+    public ApiResponse<List<Areas>> treeList (@RequestBody AreasDto pageWrap) {
+        Areas a = new Areas();
+        BeanUtils.copyProperties(pageWrap,a);
+        areasService.cacheData();
+        return ApiResponse.success(areasService.findList(a));
+    }
 
     @ApiOperation(value = "鑾峰彇鍒嗙被鍒楄〃", notes = "灏忕▼搴忕")
     @GetMapping("/getCategoryList")
@@ -118,10 +129,20 @@
         return ApiResponse.success("鎿嶄綔鎴愬姛", ordersService.calculateRemotePrice(dto));
     }
 
+    @ApiOperation(value = "鏍¢獙涓や釜缁忕含搴︽槸鍚﹀悓鍩�", notes = "浼犲叆涓ょ粍缁忕含搴︼紝杩斿洖鏄惁鍦ㄥ悓涓�鍩庡競")
+    @PostMapping("/isSameCity")
+    public ApiResponse<Boolean> isSameCity(@RequestBody SameCityCheckDTO dto) {
+        return ApiResponse.success("鎿嶄綔鎴愬姛", MapUtil.isSameCity(dto.getLat1(), dto.getLng1(), dto.getLat2(), dto.getLng2()));
+    }
 
-
-
-
+    @ApiOperation(value = "鏍规嵁鍩庡競鍚嶇О鏌ヨ鍩庡競淇℃伅", notes = "浠呰繑鍥炲凡寮�閫氱殑鍩庡競锛屾湭寮�閫氳繑鍥炵┖")
+    @GetMapping("/getCityByName")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", dataType = "String", name = "cityName", value = "鍩庡競鍚嶇О", required = true)
+    })
+    public ApiResponse<Areas> getCityByName(@RequestParam String cityName) {
+        return ApiResponse.success("鏌ヨ鎴愬姛", areasService.getOpenedCityByName(cityName));
+    }
 
 
 }
diff --git a/server/web/src/main/java/com/doumee/api/web/DriverInfoApi.java b/server/web/src/main/java/com/doumee/api/web/DriverInfoApi.java
index 95cc355..2dc0bc4 100644
--- a/server/web/src/main/java/com/doumee/api/web/DriverInfoApi.java
+++ b/server/web/src/main/java/com/doumee/api/web/DriverInfoApi.java
@@ -1,12 +1,21 @@
 package com.doumee.api.web;
 
+import com.doumee.core.annotation.LoginDriverRequired;
 import com.doumee.core.annotation.LoginRequired;
 import com.doumee.core.annotation.trace.Trace;
 import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.DriverInfo;
+import com.doumee.dao.dto.DriverActiveOrderDTO;
+import com.doumee.dao.dto.DriverGrabOrderDTO;
 import com.doumee.dao.dto.DriverLoginRequest;
 import com.doumee.dao.dto.DriverRegisterRequest;
 import com.doumee.dao.dto.DriverVerifyRequest;
 import com.doumee.dao.vo.AccountResponse;
+import com.doumee.dao.vo.DriverCenterVO;
+import com.doumee.dao.vo.DriverGrabOrderVO;
+import com.doumee.dao.vo.DriverOrderDetailVO;
 import com.doumee.service.business.DriverInfoService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -15,6 +24,9 @@
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.List;
 
 /**
  * 鍙告満楠岃瘉鐮佺櫥褰曟帴鍙�
@@ -56,7 +68,7 @@
         return ApiResponse.success("鐧诲綍鎴愬姛", driverInfoService.login(request));
     }
 
-    @LoginRequired
+    @LoginDriverRequired
     @Trace
     @ApiOperation(value = "鎻愪氦瀹炲悕璁よ瘉", notes = "鍒濇鎻愪氦鎴栭┏鍥炲悗淇敼")
     @PostMapping("/submitVerify")
@@ -64,19 +76,104 @@
             @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true)
     })
     public ApiResponse submitVerify(@RequestBody DriverVerifyRequest request) {
-        driverInfoService.submitVerify(this.getMemberId(), request);
+        driverInfoService.submitVerify(this.getDriverId(), request);
         return ApiResponse.success("鎻愪氦鎴愬姛");
     }
 
-    @LoginRequired
+    @LoginDriverRequired
     @Trace
     @ApiOperation(value = "鏌ヨ瀹炲悕璁よ瘉璇︽儏", notes = "鍙告満绔煡璇�")
     @GetMapping("/verifyDetail")
     @ApiImplicitParams({
             @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true)
     })
-    public ApiResponse verifyDetail() {
-        return ApiResponse.success(driverInfoService.getVerifyDetail(this.getMemberId()));
+    public ApiResponse<DriverInfo> verifyDetail() {
+        return ApiResponse.success(driverInfoService.getVerifyDetail(this.getDriverId()));
+    }
+
+    @LoginDriverRequired
+    @Trace
+    @ApiOperation(value = "鍒囨崲鎺ュ崟鐘舵��", notes = "0=鏈帴鍗曪紱1=鎺ュ崟涓�")
+    @GetMapping("/updateAcceptingStatus")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+            @ApiImplicitParam(paramType = "query", dataType = "int", name = "status", value = "鎺ュ崟鐘舵�侊細0=鏈帴鍗曪紱1=鎺ュ崟涓�", required = true)
+    })
+    public ApiResponse updateAcceptingStatus(@RequestParam Integer status) {
+        driverInfoService.updateAcceptingStatus(this.getDriverId(), status);
+        return ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
+
+    @LoginDriverRequired
+    @Trace
+    @ApiOperation(value = "鏇存柊瀹炴椂瀹氫綅", notes = "鍙告満绔笂鎶ュ綋鍓嶄綅缃粡绾害")
+    @GetMapping("/updateLocation")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+            @ApiImplicitParam(paramType = "query", dataType = "Double", name = "longitude", value = "缁忓害", required = true),
+            @ApiImplicitParam(paramType = "query", dataType = "Double", name = "latitude", value = "绾害", required = true)
+    })
+    public ApiResponse updateLocation(@RequestParam Double longitude, @RequestParam Double latitude) {
+        driverInfoService.updateLocation(this.getDriverId(), longitude, latitude);
+        return ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
+
+    @LoginDriverRequired
+    @Trace
+    @ApiOperation(value = "鍙告満绔椤典俊鎭�", notes = "濮撳悕銆佸ご鍍忋�佽溅鐗屽彿銆佽瘎鍒嗐�佷粖鏃ヤ剑閲戙�佷粖鏃ユ帴鍗曟暟銆佷綑棰�")
+    @GetMapping("/centerInfo")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true)
+    })
+    public ApiResponse<DriverCenterVO> centerInfo() {
+        return ApiResponse.success("鎿嶄綔鎴愬姛", driverInfoService.getDriverCenterInfo(this.getDriverId()));
+    }
+
+    @LoginDriverRequired
+    @Trace
+    @ApiOperation(value = "鍙告満鎶㈠崟澶у巺", notes = "鍒嗛〉鏌ヨ鍙姠鐨勫紓鍦板瘎瀛樿鍗�")
+    @PostMapping("/grabOrderHall")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true)
+    })
+    public ApiResponse<PageData<DriverGrabOrderVO>> grabOrderHall(@RequestBody PageWrap<DriverGrabOrderDTO> pageWrap) {
+        return ApiResponse.success("鎿嶄綔鎴愬姛", driverInfoService.grabOrderHall(this.getDriverId(), pageWrap));
+    }
+
+    @LoginDriverRequired
+    @Trace
+    @ApiOperation(value = "鍙告満杩涜涓鍗�", notes = "鏌ヨ宸叉姠鍗�(status=3)鎴栨淳閫佷腑(status=4)鐨勮鍗曞垪琛�")
+    @PostMapping("/activeOrders")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true)
+    })
+    public ApiResponse<List<DriverGrabOrderVO>> activeOrders(@RequestBody @Valid DriverActiveOrderDTO dto) {
+        return ApiResponse.success("鎿嶄綔鎴愬姛", driverInfoService.activeOrders(this.getDriverId(), dto));
+    }
+
+    @LoginDriverRequired
+    @Trace
+    @ApiOperation(value = "鍙告満绔鍗曡鎯�", notes = "鏍规嵁璁㈠崟涓婚敭鏌ヨ璇︽儏")
+    @GetMapping("/orderDetail")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "orderId", value = "璁㈠崟涓婚敭", required = true)
+    })
+    public ApiResponse<DriverOrderDetailVO> orderDetail(@RequestParam Integer orderId) {
+        return ApiResponse.success("鎿嶄綔鎴愬姛", driverInfoService.driverOrderDetail(this.getDriverId(), orderId));
+    }
+
+    @LoginDriverRequired
+    @Trace
+    @ApiOperation(value = "鍙告満鍙栨秷璁㈠崟", notes = "宸叉帴鍗�(status=2)鏃跺彇娑堬紝閲婃斁璁㈠崟鍥炴姠鍗曞ぇ鍘�")
+    @PostMapping("/cancelOrder")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true)
+    })
+    public ApiResponse cancelOrder(@RequestParam Integer orderId,
+                                   @RequestParam(required = false) String reason) {
+        driverInfoService.cancelOrder(this.getDriverId(), orderId, reason);
+        return ApiResponse.success("鍙栨秷鎴愬姛");
     }
 
 }
diff --git a/server/web/src/main/java/com/doumee/api/web/OrdersApi.java b/server/web/src/main/java/com/doumee/api/web/OrdersApi.java
index 5292cb9..d966ade 100644
--- a/server/web/src/main/java/com/doumee/api/web/OrdersApi.java
+++ b/server/web/src/main/java/com/doumee/api/web/OrdersApi.java
@@ -214,5 +214,16 @@
         return ApiResponse.success("璇勪环鎴愬姛");
     }
 
+    @LoginRequired
+    @ApiOperation(value = "浼氬憳纭鏀惰揣", notes = "寮傚湴瀵勫瓨涓旀棤鍙栦欢闂ㄥ簵鐨勮鍗曪紝閫佽揪鍚庣‘璁ゆ敹璐ф爣璁拌鍗曞畬鎴�")
+    @PostMapping("/confirmReceipt")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true)
+    })
+    public ApiResponse confirmReceipt(@RequestParam Integer orderId) {
+        ordersService.memberConfirmReceipt(orderId, getMemberId());
+        return ApiResponse.success("纭鏀惰揣鎴愬姛");
+    }
+
 
 }
diff --git a/server/web/src/main/java/com/doumee/api/web/RevenueApi.java b/server/web/src/main/java/com/doumee/api/web/RevenueApi.java
new file mode 100644
index 0000000..0357de5
--- /dev/null
+++ b/server/web/src/main/java/com/doumee/api/web/RevenueApi.java
@@ -0,0 +1,72 @@
+package com.doumee.api.web;
+
+import com.doumee.core.annotation.LoginRequired;
+import com.doumee.core.annotation.LoginShopRequired;
+import com.doumee.core.annotation.trace.Trace;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.Revenue;
+import com.doumee.dao.dto.RevenueQueryDTO;
+import com.doumee.dao.vo.RevenueSummaryVO;
+import com.doumee.service.business.RevenueService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@Api(tags = "浜ゆ槗娴佹按")
+@Trace(exclude = true)
+@RestController
+@RequestMapping("/web/revenue")
+@Slf4j
+public class RevenueApi extends ApiController {
+
+    @Autowired
+    private RevenueService revenueService;
+
+    @LoginRequired
+    @ApiOperation(value = "鍙告満娴佹按鍒嗛〉", notes = "灏忕▼搴忕")
+    @PostMapping("/driverPage")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+    })
+    public ApiResponse<PageData<Revenue>> driverPage(@RequestBody @Validated PageWrap<RevenueQueryDTO> pageWrap) {
+        return ApiResponse.success("鏌ヨ鎴愬姛", revenueService.findDriverRevenuePage(pageWrap, getMemberId()));
+    }
+
+    @LoginRequired
+    @ApiOperation(value = "鍙告満娴佹按鏀舵敮缁熻", notes = "鏍规嵁鏌ヨ鏉′欢缁熻鏀跺叆涓庢敮鍑�")
+    @PostMapping("/driverSummary")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+    })
+    public ApiResponse<RevenueSummaryVO> driverSummary(@RequestBody RevenueQueryDTO queryDTO) {
+        return ApiResponse.success("鏌ヨ鎴愬姛", revenueService.getDriverRevenueSummary(queryDTO, getMemberId()));
+    }
+
+    @LoginShopRequired
+    @ApiOperation(value = "闂ㄥ簵娴佹按鍒嗛〉", notes = "灏忕▼搴忕")
+    @PostMapping("/shopPage")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "闂ㄥ簵token鍊�", required = true),
+    })
+    public ApiResponse<PageData<Revenue>> shopPage(@RequestBody @Validated PageWrap<RevenueQueryDTO> pageWrap) {
+        return ApiResponse.success("鏌ヨ鎴愬姛", revenueService.findShopRevenuePage(pageWrap, getShopId()));
+    }
+
+    @LoginShopRequired
+    @ApiOperation(value = "闂ㄥ簵娴佹按鏀舵敮缁熻", notes = "鏍规嵁鏌ヨ鏉′欢缁熻鏀跺叆涓庢敮鍑�")
+    @PostMapping("/shopSummary")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "闂ㄥ簵token鍊�", required = true),
+    })
+    public ApiResponse<RevenueSummaryVO> shopSummary(@RequestBody RevenueQueryDTO queryDTO) {
+        return ApiResponse.success("鏌ヨ鎴愬姛", revenueService.getShopRevenueSummary(queryDTO, getShopId()));
+    }
+
+}
diff --git a/server/web/src/main/java/com/doumee/api/web/ShopInfoApi.java b/server/web/src/main/java/com/doumee/api/web/ShopInfoApi.java
index 60b5eee..d16ee9f 100644
--- a/server/web/src/main/java/com/doumee/api/web/ShopInfoApi.java
+++ b/server/web/src/main/java/com/doumee/api/web/ShopInfoApi.java
@@ -45,8 +45,8 @@
     @ApiOperation("闂ㄥ簵鍏ラ┗鐢宠/淇敼")
     @PostMapping("/apply")
     public ApiResponse apply(@RequestBody @Validated ShopApplyDTO request) {
-        Member member = this.getMemberResponse();
-        shopInfoService.applyShop(request, member);
+        request.setMemberId(getMemberId());
+        shopInfoService.applyShop(request);
         return ApiResponse.success("鎿嶄綔鎴愬姛");
     }
 
diff --git a/server/web/src/main/java/com/doumee/api/web/WalletApi.java b/server/web/src/main/java/com/doumee/api/web/WalletApi.java
index ac0cb79..b94319c 100644
--- a/server/web/src/main/java/com/doumee/api/web/WalletApi.java
+++ b/server/web/src/main/java/com/doumee/api/web/WalletApi.java
@@ -5,6 +5,7 @@
 import com.doumee.core.model.ApiResponse;
 import com.doumee.dao.dto.WithdrawalDTO;
 import com.doumee.dao.vo.RevenueStatisticsVO;
+import com.doumee.dao.business.model.WithdrawalOrders;
 import com.doumee.service.business.RevenueService;
 import com.doumee.service.business.WithdrawalOrdersService;
 import io.swagger.annotations.Api;
@@ -14,6 +15,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -80,4 +82,15 @@
         return ApiResponse.success("鏌ヨ鎴愬姛", revenueService.getDriverRevenueStatistics(getMemberId()));
     }
 
+    @LoginRequired
+    @ApiOperation(value = "鎻愮幇璇︽儏", notes = "鏍规嵁鎻愮幇涓婚敭鏌ヨ璇︽儏锛堝惈瀹℃壒浜轰俊鎭級")
+    @GetMapping("/detail/{id}")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+            @ApiImplicitParam(paramType = "path", dataType = "Integer", name = "id", value = "鎻愮幇璁板綍涓婚敭", required = true)
+    })
+    public ApiResponse<WithdrawalOrders> detail(@PathVariable Integer id) {
+        return ApiResponse.success("鏌ヨ鎴愬姛", withdrawalOrdersService.findById(id));
+    }
+
 }
diff --git a/server/web/src/main/resources/application.yml b/server/web/src/main/resources/application.yml
index 28dea6f..17dde0d 100644
--- a/server/web/src/main/resources/application.yml
+++ b/server/web/src/main/resources/application.yml
@@ -12,7 +12,7 @@
 
 spring:
   profiles:
-    active: pro
+    active: dev
   # JSON杩斿洖閰嶇疆
   jackson:
     # 榛樿鏃跺尯

--
Gitblit v1.9.3