From e39dda2f25df9680e66c9e0dd3a606149e21bcc5 Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期三, 22 四月 2026 20:06:37 +0800
Subject: [PATCH] 代码生成

---
 server/services/src/main/java/com/doumee/dao/vo/DriverOrderDetailVO.java                  |   39 +
 server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java |  119 ++++
 server/web/src/main/java/com/doumee/api/web/PaymentCallback.java                          |  114 +++
 server/services/src/main/java/com/doumee/dao/dto/CommentOrderDTO.java                     |    5 
 server/services/src/main/java/com/doumee/service/business/ShopInfoService.java            |   10 
 server/web/src/main/java/com/doumee/api/web/ConfigApi.java                                |   28 +
 server/services/src/main/java/com/doumee/dao/dto/OperationConfigDTO.java                  |    6 
 server/services/src/main/java/com/doumee/config/jwt/WebMvcConfig.java                     |    6 
 server/services/src/main/java/com/doumee/dao/vo/MyOrderDetailVO.java                      |   77 ++
 server/services/src/main/java/com/doumee/core/constants/Constants.java                    |   58 +
 server/services/src/main/java/com/doumee/service/business/OrdersService.java              |   27 
 server/admin/src/main/java/com/doumee/job/SettleOrdersJob.java                            |   37 +
 server/services/src/main/java/com/doumee/dao/vo/ShopCenterVO.java                         |    6 
 server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java   |  101 +++
 server/services/pom.xml                                                                   |    8 
 server/services/src/main/resources/application-dev.yml                                    |   12 
 server/services/src/main/java/com/doumee/dao/business/model/Multifile.java                |    2 
 server/services/src/main/java/com/doumee/dao/business/model/OrdersRefund.java             |    5 
 server/admin/src/main/java/com/doumee/job/AutoCompleteOrderJob.java                       |   37 +
 server/web/src/main/java/com/doumee/api/web/ShopInfoApi.java                              |   12 
 server/services/src/main/java/com/doumee/biz/system/impl/OperationConfigBizImpl.java      |    8 
 server/services/src/main/java/com/doumee/dao/vo/ShopSalesStatsVO.java                     |   23 
 server/admin/src/main/java/com/doumee/job/NoGrabNotifyJob.java                            |   37 +
 server/pom.xml                                                                            |   15 
 server/services/src/main/java/com/doumee/service/business/impl/RevenueServiceImpl.java    |    7 
 server/admin/src/main/java/com/doumee/job/CancelTimeoutOrderJob.java                      |   37 +
 server/services/db/db_change.sql                                                          |   40 +
 server/services/src/main/java/com/doumee/dao/business/model/Orders.java                   |   11 
 server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java     |  564 +++++++++++++++++++-
 server/services/src/main/java/com/doumee/config/alipay/AlipayFundTransUniTransfer.java    |  139 ----
 30 files changed, 1,347 insertions(+), 243 deletions(-)

diff --git a/server/admin/src/main/java/com/doumee/job/AutoCompleteOrderJob.java b/server/admin/src/main/java/com/doumee/job/AutoCompleteOrderJob.java
new file mode 100644
index 0000000..fa873dd
--- /dev/null
+++ b/server/admin/src/main/java/com/doumee/job/AutoCompleteOrderJob.java
@@ -0,0 +1,37 @@
+package com.doumee.job;
+
+import com.doumee.core.job.BaseJob;
+import com.doumee.core.job.JobContext;
+import com.doumee.core.job.JobParam;
+import com.doumee.service.business.OrdersService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 鑷姩瀹屾垚瓒呮椂鏈‘璁ょ殑宸查�佽揪璁㈠崟
+ * 鏍规嵁杩愯惀閰嶇疆 AUTO_CONFIRM_RECEIPT锛堝ぉ锛夛紝灏嗗凡閫佽揪瓒呰繃璇ュぉ鏁扮殑璁㈠崟鑷姩鏍囪涓哄凡瀹屾垚
+ * @author rk
+ * @date 2026/04/22
+ */
+@Slf4j
+@Component("autoCompleteOrderJob")
+public class AutoCompleteOrderJob extends BaseJob {
+
+    @Autowired
+    private OrdersService ordersService;
+
+    @Override
+    public JobContext execute(JobParam param) {
+        JobContext jobContext = new JobContext();
+        try {
+            int count = ordersService.autoCompleteOrders();
+            jobContext.setHandleSuccessSize(count);
+            jobContext.setHandleTotalSize(count);
+            jobContext.setContext("鑷姩瀹屾垚瓒呮椂璁㈠崟瀹屾垚锛屽叡瀹屾垚" + count + "鍗�");
+        } catch (Exception e) {
+            log.error("鑷姩瀹屾垚璁㈠崟浠诲姟寮傚父", e);
+        }
+        return jobContext;
+    }
+}
diff --git a/server/admin/src/main/java/com/doumee/job/CancelTimeoutOrderJob.java b/server/admin/src/main/java/com/doumee/job/CancelTimeoutOrderJob.java
new file mode 100644
index 0000000..59a2347
--- /dev/null
+++ b/server/admin/src/main/java/com/doumee/job/CancelTimeoutOrderJob.java
@@ -0,0 +1,37 @@
+package com.doumee.job;
+
+import com.doumee.core.job.BaseJob;
+import com.doumee.core.job.JobContext;
+import com.doumee.core.job.JobParam;
+import com.doumee.service.business.OrdersService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 瓒呮椂鏈敮浠樿鍗曡嚜鍔ㄥ彇娑�
+ * 鏍规嵁杩愯惀閰嶇疆 AUTO_CANCEL_TIME锛堝垎閽燂級锛屽彇娑堣秴鏃舵湭鏀粯璁㈠崟
+ * @author rk
+ * @date 2026/04/22
+ */
+@Slf4j
+@Component("cancelTimeoutOrderJob")
+public class CancelTimeoutOrderJob extends BaseJob {
+
+    @Autowired
+    private OrdersService ordersService;
+
+    @Override
+    public JobContext execute(JobParam param) {
+        JobContext jobContext = new JobContext();
+        try {
+            int count = ordersService.cancelTimeoutUnpaidOrders();
+            jobContext.setHandleSuccessSize(count);
+            jobContext.setHandleTotalSize(count);
+            jobContext.setContext("瓒呮椂鏈敮浠樿鍗曡嚜鍔ㄥ彇娑堝畬鎴愶紝鍏卞彇娑�" + count + "鍗�");
+        } catch (Exception e) {
+            log.error("瓒呮椂鍙栨秷璁㈠崟浠诲姟寮傚父", e);
+        }
+        return jobContext;
+    }
+}
diff --git a/server/admin/src/main/java/com/doumee/job/NoGrabNotifyJob.java b/server/admin/src/main/java/com/doumee/job/NoGrabNotifyJob.java
new file mode 100644
index 0000000..42a2339
--- /dev/null
+++ b/server/admin/src/main/java/com/doumee/job/NoGrabNotifyJob.java
@@ -0,0 +1,37 @@
+package com.doumee.job;
+
+import com.doumee.core.job.BaseJob;
+import com.doumee.core.job.JobContext;
+import com.doumee.core.job.JobParam;
+import com.doumee.service.business.OrdersService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 鏃犱汉鎶㈠崟鐭俊閫氱煡骞冲彴浜哄憳
+ * 鏍规嵁杩愯惀閰嶇疆 NO_GRAB_NOTIFY_TIME锛堝垎閽燂級锛屽宸插瘎瀛樹笖鏃犱汉鎶㈠崟鐨勮鍗曞彂閫佺煭淇¢�氱煡
+ * @author rk
+ * @date 2026/04/22
+ */
+@Slf4j
+@Component("noGrabNotifyJob")
+public class NoGrabNotifyJob extends BaseJob {
+
+    @Autowired
+    private OrdersService ordersService;
+
+    @Override
+    public JobContext execute(JobParam param) {
+        JobContext jobContext = new JobContext();
+        try {
+            int count = ordersService.notifyUngrabbedOrders();
+            jobContext.setHandleSuccessSize(count);
+            jobContext.setHandleTotalSize(count);
+            jobContext.setContext("鏃犱汉鎶㈠崟鐭俊閫氱煡瀹屾垚锛屽叡閫氱煡" + count + "鍗�");
+        } catch (Exception e) {
+            log.error("鏃犱汉鎶㈠崟閫氱煡浠诲姟寮傚父", e);
+        }
+        return jobContext;
+    }
+}
diff --git a/server/admin/src/main/java/com/doumee/job/SettleOrdersJob.java b/server/admin/src/main/java/com/doumee/job/SettleOrdersJob.java
new file mode 100644
index 0000000..8d80356
--- /dev/null
+++ b/server/admin/src/main/java/com/doumee/job/SettleOrdersJob.java
@@ -0,0 +1,37 @@
+package com.doumee.job;
+
+import com.doumee.core.job.BaseJob;
+import com.doumee.core.job.JobContext;
+import com.doumee.core.job.JobParam;
+import com.doumee.service.business.OrdersService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 璁㈠崟鑷姩缁撶畻瀹氭椂浠诲姟
+ * 鏍规嵁杩愯惀閰嶇疆 SETTLEMENT_DATE锛屽皢宸插畬鎴愮殑寰呯粨绠楄鍗曡繘琛岀粨绠�
+ *
+ * @author rk
+ * @date 2026/04/22
+ */
+@Slf4j
+@Component("settleOrdersJob")
+public class SettleOrdersJob extends BaseJob {
+
+    @Autowired
+    private OrdersService ordersService;
+
+    @Override
+    public JobContext execute(JobParam param) {
+        JobContext jobContext = new JobContext();
+        try {
+            ordersService.settleOrders();
+            jobContext.setContext("璁㈠崟缁撶畻浠诲姟鎵ц瀹屾垚");
+        } catch (Exception e) {
+            log.error("璁㈠崟缁撶畻浠诲姟寮傚父", e);
+            jobContext.setContext("璁㈠崟缁撶畻浠诲姟寮傚父锛�" + e.getMessage());
+        }
+        return jobContext;
+    }
+}
diff --git a/server/pom.xml b/server/pom.xml
index 562c3aa..f8e767d 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -37,6 +37,9 @@
     <weixin-java-pay.version>4.1.0</weixin-java-pay.version>
     <!-- 闃块噷浜慜SS瀛樺偍 -->
     <aliyun-oss.version>3.8.0</aliyun-oss.version>
+    <okhttp3.version>4.9.3</okhttp3.version>
+    <kotlin.version>1.5.31</kotlin.version>
+    <okio.version>2.10.0</okio.version>
   </properties>
   <dependencies>
     <!-- Spring Boot -->
@@ -244,12 +247,12 @@
       <groupId>com.github.wechatpay-apiv3</groupId>
       <artifactId>wechatpay-java</artifactId>
       <version>0.2.15</version>
-      <exclusions>
-        <exclusion>
-          <artifactId>okhttp</artifactId>
-          <groupId>com.squareup.okhttp3</groupId>
-        </exclusion>
-      </exclusions>
+    </dependency>
+    <!-- OkHttp 4.x 闇�瑕� okio 2.x锛圞otlin 鐗堟湰锛� -->
+    <dependency>
+      <groupId>com.squareup.okio</groupId>
+      <artifactId>okio</artifactId>
+      <version>2.10.0</version>
     </dependency>
 
     <!--  闃块噷浜慜SS-->
diff --git a/server/services/db/db_change.sql b/server/services/db/db_change.sql
index 96b2a07..de96424 100644
--- a/server/services/db/db_change.sql
+++ b/server/services/db/db_change.sql
@@ -5,6 +5,46 @@
 
 
 -- ============================================================
+-- 2026/04/22 璁㈠崟閫�娆捐〃鏂板閫�娆惧墠璁㈠崟鐘舵�佸瓧娈�
+-- ============================================================
+ALTER TABLE `orders_refund` ADD COLUMN `BEFORE_STATUS` INT NULL DEFAULT NULL COMMENT '閫�娆惧墠璁㈠崟鐘舵��' AFTER `STATUS`;
+
+
+-- ============================================================
+-- 2026/04/22 璁㈠崟閫�娆捐〃鏂板閫�娆鹃噾棰濆瓧娈�
+-- ============================================================
+ALTER TABLE `orders_refund` ADD COLUMN `REFUND_AMOUNT` BIGINT NULL DEFAULT NULL COMMENT '閫�娆鹃噾棰濓紙鍒嗭級' AFTER `REFUND_REMARK`;
+
+
+-- ============================================================
+-- 2026/04/22 鏂板璁㈠崟鑷姩缁撶畻瀹氭椂浠诲姟
+-- ============================================================
+INSERT INTO `SYSTEM_JOB` VALUES (4, '璁㈠崟鑷姩缁撶畻', '鏍规嵁杩愯惀閰嶇疆SETTLEMENT_DATE锛屽皢宸插畬鎴愮殑寰呯粨绠楄鍗曡繘琛岀粨绠�', 'settleOrdersJob', NULL, NULL, 1, 0, 1, 1, '0 0 2 * * ?', '', 0, NULL, 0, 1, NOW(), NULL, NULL, 0);
+
+
+-- ============================================================
+-- 2026/04/22 杩愯惀閰嶇疆鏂板鏃犱汉鎶㈠崟閫氱煡鏃堕棿鍜岄�氱煡浜哄憳
+-- ============================================================
+INSERT INTO `SYSTEM_DICT_DATA` (`DICT_ID`, `CODE`, `LABEL`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `DELETED`) VALUES (105, '30', 'NO_GRAB_NOTIFY_TIME', 0, 0, 1, NOW(), 0);
+INSERT INTO `SYSTEM_DICT_DATA` (`DICT_ID`, `CODE`, `LABEL`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `DELETED`) VALUES (105, '', 'NO_GRAB_NOTIFY_USERS', 0, 0, 1, NOW(), 0);
+
+
+-- ============================================================
+-- 2026/04/22 璁㈠崟琛ㄥ鍔犳棤浜烘帴鍗曟槸鍚﹀凡鐭俊閫氱煡骞冲彴瀛楁
+-- ============================================================
+ALTER TABLE `orders` ADD COLUMN `PLATFORM_SMS_NOTIFIED` INT DEFAULT 0 COMMENT '鏃犱汉鎺ュ崟鏄惁宸茬煭淇¢�氱煡骞冲彴锛�0=鍚︼紱1=鏄�' AFTER `OUT_TRADE_NO`;
+ALTER TABLE `orders` ADD COLUMN `PLATFORM_SMS_NOTIFIED_TIME` DATETIME DEFAULT NULL COMMENT '鏃犱汉鎺ュ崟宸茬煭淇¢�氱煡骞冲彴鏃堕棿' AFTER `PLATFORM_SMS_NOTIFIED`;
+
+
+-- ============================================================
+-- 2026/04/22 鏂板璁㈠崟鐩稿叧瀹氭椂浠诲姟锛堜笁涓嫭绔嬩换鍔★級
+-- ============================================================
+INSERT INTO `SYSTEM_JOB` VALUES (3, '瓒呮椂鍙栨秷璁㈠崟', '鏍规嵁杩愯惀閰嶇疆AUTO_CANCEL_TIME锛堝垎閽燂級锛屽彇娑堣秴鏃舵湭鏀粯璁㈠崟', 'cancelTimeoutOrderJob', NULL, NULL, 1, 0, 1, 1, '0 */1 * * * ?', '', 0, NULL, 0, 1, NOW(), NULL, NULL, 0);
+INSERT INTO `SYSTEM_JOB` VALUES (5, '鏃犱汉鎶㈠崟閫氱煡', '鏍规嵁杩愯惀閰嶇疆NO_GRAB_NOTIFY_TIME锛堝垎閽燂級锛屽宸插瘎瀛樹笖鏃犱汉鎶㈠崟鐨勮鍗曞彂閫佺煭淇¢�氱煡骞冲彴浜哄憳', 'noGrabNotifyJob', NULL, NULL, 1, 0, 1, 1, '0 */1 * * * ?', '', 0, NULL, 0, 1, NOW(), NULL, NULL, 0);
+INSERT INTO `SYSTEM_JOB` VALUES (6, '鑷姩瀹屾垚璁㈠崟', '鏍规嵁杩愯惀閰嶇疆AUTO_CONFIRM_RECEIPT锛堝ぉ锛夛紝鑷姩瀹屾垚瓒呮椂鏈‘璁ょ殑宸查�佽揪璁㈠崟', 'autoCompleteOrderJob', NULL, NULL, 1, 0, 1, 1, '0 0 */1 * * ?', '', 0, NULL, 0, 1, NOW(), NULL, NULL, 0);
+
+
+-- ============================================================
 -- 2026/04/22 鎻愮幇璁板綍琛ㄥ鍔犳敮浠樺疂瀹炲悕濮撳悕瀛楁
 -- ============================================================
 ALTER TABLE `withdrawal_orders` ADD COLUMN `ALI_NAME` VARCHAR(50) DEFAULT NULL COMMENT '鏀粯瀹濆疄鍚嶅鍚�' AFTER `ALI_ACCOUNT`;
diff --git a/server/services/pom.xml b/server/services/pom.xml
index 47e7ddb..4790ba1 100644
--- a/server/services/pom.xml
+++ b/server/services/pom.xml
@@ -22,12 +22,6 @@
       <artifactId>alipay-sdk-java-v3</artifactId>
       <version>3.1.70.ALL</version>
     </dependency>
-    <dependency>
-      <groupId>com.squareup.okhttp3</groupId>
-      <artifactId>okhttp</artifactId>
-      <version>4.9.3</version>
-      <scope>compile</scope>
-    </dependency>
   </dependencies>
 
-</project>
\ No newline at end of file
+</project>
diff --git a/server/services/src/main/java/com/doumee/biz/system/impl/OperationConfigBizImpl.java b/server/services/src/main/java/com/doumee/biz/system/impl/OperationConfigBizImpl.java
index 5d569d9..640c7f3 100644
--- a/server/services/src/main/java/com/doumee/biz/system/impl/OperationConfigBizImpl.java
+++ b/server/services/src/main/java/com/doumee/biz/system/impl/OperationConfigBizImpl.java
@@ -34,6 +34,8 @@
         dto.setInsuranceRate(getValue(Constants.OP_INSURANCE_RATE));
         dto.setOrderAcceptLimit(getValue(Constants.OP_ORDER_ACCEPT_LIMIT));
         dto.setAutoConfirmReceipt(getValue(Constants.OP_AUTO_CONFIRM_RECEIPT));
+        dto.setNoGrabNotifyTime(getValue(Constants.OP_NO_GRAB_NOTIFY_TIME));
+        dto.setNoGrabNotifyUsers(getValue(Constants.OP_NO_GRAB_NOTIFY_USERS));
         return dto;
     }
 
@@ -49,6 +51,8 @@
         saveOrUpdate(Constants.OP_INSURANCE_RATE, "淇濊垂姣旂巼", dto.getInsuranceRate());
         saveOrUpdate(Constants.OP_ORDER_ACCEPT_LIMIT, "鎺ュ崟鏁伴噺", dto.getOrderAcceptLimit());
         saveOrUpdate(Constants.OP_AUTO_CONFIRM_RECEIPT, "鑷姩纭鏀惰揣", dto.getAutoConfirmReceipt());
+        saveOrUpdate(Constants.OP_NO_GRAB_NOTIFY_TIME, "鏃犱汉鎶㈠崟閫氱煡鏃堕棿", dto.getNoGrabNotifyTime());
+        saveOrUpdate(Constants.OP_NO_GRAB_NOTIFY_USERS, "鏃犱汉鎶㈠崟鐭俊閫氱煡浜哄憳", dto.getNoGrabNotifyUsers());
     }
 
     private String getValue(String label) {
@@ -82,7 +86,9 @@
                 || StringUtils.isBlank(dto.getAutoCancelTime())
                 || StringUtils.isBlank(dto.getInsuranceRate())
                 || StringUtils.isBlank(dto.getOrderAcceptLimit())
-                || StringUtils.isBlank(dto.getAutoConfirmReceipt())) {
+                || StringUtils.isBlank(dto.getAutoConfirmReceipt())
+                || StringUtils.isBlank(dto.getNoGrabNotifyTime())
+                || StringUtils.isBlank(dto.getNoGrabNotifyUsers())) {
             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鎵�鏈夐厤缃」鍧囦负蹇呭~");
         }
     }
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 49b9be6..5202daa 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
@@ -41,16 +41,17 @@
         this.loadAlipayConfig();
     }
 
+
     public void loadAlipayConfig() {
         try {
             AlipayConfig config = new AlipayConfig();
             config.setServerUrl("https://openapi.alipay.com");
-            config.setAppId("2021006147660139");
-            String privateKey  = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDEeqqkZztBHfK+vpyBi6ejgDTHZuZ3yiuXds+lRBbMo/g24F5trH+oLHW0gMhSxihFfQBBIpVBXDsPQK4ZkhDWTaOBktnU1UMRoOEiaaZU6EiWy10ePFUmpdXpkCQEp7rc88OwI90p58S3+L+Ckak60WqNwJBdB5YGBaUunryBA78U4zW1KNY7JvoRnZDcFMQiczikwUzhO7EAi0yVrVpsVsc9s87mcS4uOJKx4qb2E83r9RJ1z30db+cIIZRiLP2oNZBLYzgKpOouE+uIgxhQzlh6cOASNZQulXuUjoT/+Y9w4njfl4TmKIXWcJFKIMc6kMiux9tTncpp0TqRwk1tAgMBAAECggEALkSYtJheusnbpRFr95G0i2sggqh3s1PXihZ/dXKgT9Z5GCsj8X3Cng7CNRxykBN73kk+axhCv56Bhej8Vqcv8ddcnqG/TEBgR+Fzws/QTIRau6/uILWic7RvuE2qPbJl7aw1s9/uL/UVPSGFr7CvgltYVUM4e7/Sk1529JCK4XJfoXP5tKJ3OaXssvaFnCKEU8IGQkjRG+lUZJhAHVtClGHtgrhevgRhy2zre5wp2qSa8d/MqrPruSYS02hn9b5Nl6i2PlUS6dGlJ4lrxYTG22ukYYoxAPNPS7gnvmveXonWP7b5tPhKRpZjnoySojz3WECUlhz/v8wM1cDrpq+GQQKBgQDsc7y2rlx4f77a7ORfb5/qWHCOJs1cIzggj0kJ7TgFGe71kbCQ5nywD/Fe5V9OwbW+DCxOME+SrrHeiK4axWiu5si/1JlurJoxNy+4k4ywk3ZA3Nv2aBhlPqfkwDhJ0z7Mgsq2c/YgnVddmSvKZoC39wA77ovks4GDxaBOt8N7PQKBgQDUuPGgzkwcgb60UdaxfMbacrPsW26vDxaE4ceuXo2m8KDiCIqkF2y9r6AdWMTgGGSJwOsk7+FP+21VdRivCg9HcOLWngveUc6xDIuqKHVpemMo3SdCF4Wqf96rRc3VOBr5cfIdWxeorZf5umMyKnIAjAFETOOrK7eLTTmjyLD98QKBgB82S+Plcklpu3zUpnS+nGJn2Du7fYI7F+6cW2zXBn0N5lA+Mgt+kVkAUcFQD9uqkF4M51BO6kIXk10nt6vLAT2NM1S3MKW+XQBAI6l+uKSaYpK/VL3bEdVThwAYK5X7L5/5Z97bwdKeUmkFjhVCoJ0oGrzOiWLgGymUzct2UHSVAoGBAMb+7Cs+Ub0pMrmFBY6r52pbey1Uq0pglvRgMmhQU7sjx50r2GaA81zPer15WVM5/nNPYaoALYqg7jrPe/PjOT/fvpR+7SNg7DZ8QftANfYiY7jKifst/gDt9ePLPS6FedZ4XcJQgOVu34jicAFx64vPbS/zrddm4iEScSVijRBBAoGAXCheERsx8+n16Us/DttXFUa1nc7+D8WR6buM1QMZgQCVF2qp3XtM+FusCKL4+q1+dtag8svLjJFp9QbaAXqX8Zk7rn8wUHbDloPTPy9XWgrPowyL9MPU+e/Rq8Hr6TWPDBd4TU64YzIEfBQYpJXfZbXhVYmK3o7xHXKB1x4vvEM=";
-            config.setPrivateKey(privateKey);
-            config.setAppCertPath("pay/pro/appCertPublicKey.crt");
-            config.setAlipayPublicCertPath("pay/pro/alipayCertPublicKey_RSA2.crt");
-            config.setRootCertPath("pay/pro/alipayRootCert.crt");
+            config.setAppId(alipayProperties.getAppId());
+//            String privateKey  = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDEeqqkZztBHfK+vpyBi6ejgDTHZuZ3yiuXds+lRBbMo/g24F5trH+oLHW0gMhSxihFfQBBIpVBXDsPQK4ZkhDWTaOBktnU1UMRoOEiaaZU6EiWy10ePFUmpdXpkCQEp7rc88OwI90p58S3+L+Ckak60WqNwJBdB5YGBaUunryBA78U4zW1KNY7JvoRnZDcFMQiczikwUzhO7EAi0yVrVpsVsc9s87mcS4uOJKx4qb2E83r9RJ1z30db+cIIZRiLP2oNZBLYzgKpOouE+uIgxhQzlh6cOASNZQulXuUjoT/+Y9w4njfl4TmKIXWcJFKIMc6kMiux9tTncpp0TqRwk1tAgMBAAECggEALkSYtJheusnbpRFr95G0i2sggqh3s1PXihZ/dXKgT9Z5GCsj8X3Cng7CNRxykBN73kk+axhCv56Bhej8Vqcv8ddcnqG/TEBgR+Fzws/QTIRau6/uILWic7RvuE2qPbJl7aw1s9/uL/UVPSGFr7CvgltYVUM4e7/Sk1529JCK4XJfoXP5tKJ3OaXssvaFnCKEU8IGQkjRG+lUZJhAHVtClGHtgrhevgRhy2zre5wp2qSa8d/MqrPruSYS02hn9b5Nl6i2PlUS6dGlJ4lrxYTG22ukYYoxAPNPS7gnvmveXonWP7b5tPhKRpZjnoySojz3WECUlhz/v8wM1cDrpq+GQQKBgQDsc7y2rlx4f77a7ORfb5/qWHCOJs1cIzggj0kJ7TgFGe71kbCQ5nywD/Fe5V9OwbW+DCxOME+SrrHeiK4axWiu5si/1JlurJoxNy+4k4ywk3ZA3Nv2aBhlPqfkwDhJ0z7Mgsq2c/YgnVddmSvKZoC39wA77ovks4GDxaBOt8N7PQKBgQDUuPGgzkwcgb60UdaxfMbacrPsW26vDxaE4ceuXo2m8KDiCIqkF2y9r6AdWMTgGGSJwOsk7+FP+21VdRivCg9HcOLWngveUc6xDIuqKHVpemMo3SdCF4Wqf96rRc3VOBr5cfIdWxeorZf5umMyKnIAjAFETOOrK7eLTTmjyLD98QKBgB82S+Plcklpu3zUpnS+nGJn2Du7fYI7F+6cW2zXBn0N5lA+Mgt+kVkAUcFQD9uqkF4M51BO6kIXk10nt6vLAT2NM1S3MKW+XQBAI6l+uKSaYpK/VL3bEdVThwAYK5X7L5/5Z97bwdKeUmkFjhVCoJ0oGrzOiWLgGymUzct2UHSVAoGBAMb+7Cs+Ub0pMrmFBY6r52pbey1Uq0pglvRgMmhQU7sjx50r2GaA81zPer15WVM5/nNPYaoALYqg7jrPe/PjOT/fvpR+7SNg7DZ8QftANfYiY7jKifst/gDt9ePLPS6FedZ4XcJQgOVu34jicAFx64vPbS/zrddm4iEScSVijRBBAoGAXCheERsx8+n16Us/DttXFUa1nc7+D8WR6buM1QMZgQCVF2qp3XtM+FusCKL4+q1+dtag8svLjJFp9QbaAXqX8Zk7rn8wUHbDloPTPy9XWgrPowyL9MPU+e/Rq8Hr6TWPDBd4TU64YzIEfBQYpJXfZbXhVYmK3o7xHXKB1x4vvEM=";
+            config.setPrivateKey(alipayProperties.getPrivateKey());
+            config.setAppCertPath(alipayProperties.getAppCertPath());
+            config.setAlipayPublicCertPath(alipayProperties.getAlipayPublicCertPath());
+            config.setRootCertPath(alipayProperties.getRootCertPath());
             alipayConfig = config;
             log.info("鏀粯瀹濋厤缃垵濮嬪寲鎴愬姛, appId={}", config.getAppId());
         } catch (Exception e) {
@@ -58,110 +59,6 @@
         }
     }
 
-
-    public static void main(String[] args) throws ApiException  {
-        downLoadCertificates();
-    }
-    /**
-     * API瀹夊叏鍔犲瘑閰嶇疆
-     */
-    private static RSAAutoCertificateConfig rsaAutoCertificateConfig() {
-        return new RSAAutoCertificateConfig.Builder()
-                // 鍟嗘埛鍙�
-                .merchantId("1629568742")
-                // 鍟嗘埛API璇佷功绉侀挜鐨勫瓨鏀捐矾寰�
-                .privateKeyFromPath("D://ptzs/apiclient_key.pem")
-                // 鍟嗘埛API璇佷功搴忓垪鍙�
-                .merchantSerialNumber("25D19D18217F4588841E5CD1AA0D1533DE8AF84A")
-                // APIv3瀵嗛挜
-                .apiV3Key("NJTLJSTZYXZRGScaiwubuzichanbu666")
-                .build();
-    }
-    /**
-     * 涓嬭浇璇佷功
-     */
-    public static void downLoadCertificates() {
-        OkHttpClient okHttpClient = new OkHttpClient();
-        HttpClient httpClient = new DefaultHttpClientBuilder()
-                .config(rsaAutoCertificateConfig())
-                .okHttpClient(okHttpClient)
-                .build();
-        HttpHeaders headers = new HttpHeaders();
-        headers.addHeader("Accept", MediaType.APPLICATION_JSON.getValue());
-        HttpRequest executeSendGetHttpRequest = new HttpRequest.Builder()
-                .httpMethod(HttpMethod.GET)
-                .url("https://api.mch.weixin.qq.com/v3/certificates")
-                .headers(headers)
-                .build();
-        try {
-            HttpResponse<JSONObject> execute = httpClient.execute(executeSendGetHttpRequest, JSONObject.class);
-            JSONObject responseBody = execute.getServiceResponse();
-            log.info("涓嬭浇骞冲彴璇佷功杩斿洖:{}", responseBody.toString());
-        } catch (Exception e) {
-            log.error("涓嬭浇骞冲彴璇佷功寮傚父", e);
-        }
-    }
-
-//    public static void testTransger( ) throws ApiException  {
-//
-//        // 鍒濆鍖朣DK
-//        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噾鎶ラ叕");
-//
-//        // 璁剧疆杞处鍦烘櫙涓婃姤淇℃伅
-//        List<TransferSceneReportInfo> transferSceneReportInfos = new ArrayList<TransferSceneReportInfo>();
-//        TransferSceneReportInfo transferSceneReportInfos0 = new TransferSceneReportInfo();
-//        transferSceneReportInfos0.setInfoType("浣i噾鎶ラ叕璇存槑");
-//        transferSceneReportInfos0.setInfoContent("3鏈堝鏀挎湇鍔℃姤閰�");
-//        transferSceneReportInfos.add(transferSceneReportInfos0);
-//        data.setTransferSceneReportInfos(transferSceneReportInfos);
-//
-//        // 璁剧疆杞处涓氬姟璇锋眰鐨勬墿灞曞弬鏁�
-//        data.setBusinessParams("{\"payer_show_name_use_alias\":\"true\"}");
-//
-//       /* // 璁剧疆绛惧悕淇℃伅
-//        SignData signData = new SignData();
-//        signData.setOriSign("EqHFP0z4a9iaQ1ep==");
-//        signData.setPartnerId("绛惧悕琚巿鏉冩柟鏀粯瀹濊处鍙稩D");
-//        signData.setOriAppId("2021000185629012");
-//        signData.setOriOutBizNo("鍟嗘埛璁㈠崟鍙�");
-//        signData.setOriSignType("RSA2");
-//        signData.setOriCharSet("UTF-8");
-//        data.setSignData(signData);
-//*/
-//        try {
-//            AlipayFundTransUniTransferResponseModel response = api.transfer(data);
-//        } catch (ApiException e) {
-//            AlipayFundTransUniTransferDefaultResponse errorObject = (AlipayFundTransUniTransferDefaultResponse) e.getErrorObject();
-//            System.out.println("璋冪敤澶辫触:" + errorObject);
-//        }
-//    }
 
     /**
      * 鍗曠瑪杞处鍒版敮浠樺疂璐︽埛
@@ -220,16 +117,6 @@
         // 璁剧疆杞处涓氬姟璇锋眰鐨勬墿灞曞弬鏁�
         data.setBusinessParams("{\"payer_show_name_use_alias\":\"true\"}");
 
-       /* // 璁剧疆绛惧悕淇℃伅
-        SignData signData = new SignData();
-        signData.setOriSign("EqHFP0z4a9iaQ1ep==");
-        signData.setPartnerId("绛惧悕琚巿鏉冩柟鏀粯瀹濊处鍙稩D");
-        signData.setOriAppId("2021000185629012");
-        signData.setOriOutBizNo("鍟嗘埛璁㈠崟鍙�");
-        signData.setOriSignType("RSA2");
-        signData.setOriCharSet("UTF-8");
-        data.setSignData(signData);
-*/
         try {
             AlipayFundTransUniTransferResponseModel response = api.transfer(data);
             log.info("鏀粯瀹濊浆璐︽垚鍔�, outBizNo={}, orderId={}", dto.getOutBizNo(), response.getOrderId());
@@ -244,16 +131,4 @@
     }
 
 
-//    private static AlipayConfig getAlipayConfig() {
-//        AlipayConfig alipayConfig = new AlipayConfig();
-//        alipayConfig.setServerUrl("https://openapi.alipay.com");
-//        alipayConfig.setAppId("2021006147660139");
-//        String privateKey  = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDEeqqkZztBHfK+vpyBi6ejgDTHZuZ3yiuXds+lRBbMo/g24F5trH+oLHW0gMhSxihFfQBBIpVBXDsPQK4ZkhDWTaOBktnU1UMRoOEiaaZU6EiWy10ePFUmpdXpkCQEp7rc88OwI90p58S3+L+Ckak60WqNwJBdB5YGBaUunryBA78U4zW1KNY7JvoRnZDcFMQiczikwUzhO7EAi0yVrVpsVsc9s87mcS4uOJKx4qb2E83r9RJ1z30db+cIIZRiLP2oNZBLYzgKpOouE+uIgxhQzlh6cOASNZQulXuUjoT/+Y9w4njfl4TmKIXWcJFKIMc6kMiux9tTncpp0TqRwk1tAgMBAAECggEALkSYtJheusnbpRFr95G0i2sggqh3s1PXihZ/dXKgT9Z5GCsj8X3Cng7CNRxykBN73kk+axhCv56Bhej8Vqcv8ddcnqG/TEBgR+Fzws/QTIRau6/uILWic7RvuE2qPbJl7aw1s9/uL/UVPSGFr7CvgltYVUM4e7/Sk1529JCK4XJfoXP5tKJ3OaXssvaFnCKEU8IGQkjRG+lUZJhAHVtClGHtgrhevgRhy2zre5wp2qSa8d/MqrPruSYS02hn9b5Nl6i2PlUS6dGlJ4lrxYTG22ukYYoxAPNPS7gnvmveXonWP7b5tPhKRpZjnoySojz3WECUlhz/v8wM1cDrpq+GQQKBgQDsc7y2rlx4f77a7ORfb5/qWHCOJs1cIzggj0kJ7TgFGe71kbCQ5nywD/Fe5V9OwbW+DCxOME+SrrHeiK4axWiu5si/1JlurJoxNy+4k4ywk3ZA3Nv2aBhlPqfkwDhJ0z7Mgsq2c/YgnVddmSvKZoC39wA77ovks4GDxaBOt8N7PQKBgQDUuPGgzkwcgb60UdaxfMbacrPsW26vDxaE4ceuXo2m8KDiCIqkF2y9r6AdWMTgGGSJwOsk7+FP+21VdRivCg9HcOLWngveUc6xDIuqKHVpemMo3SdCF4Wqf96rRc3VOBr5cfIdWxeorZf5umMyKnIAjAFETOOrK7eLTTmjyLD98QKBgB82S+Plcklpu3zUpnS+nGJn2Du7fYI7F+6cW2zXBn0N5lA+Mgt+kVkAUcFQD9uqkF4M51BO6kIXk10nt6vLAT2NM1S3MKW+XQBAI6l+uKSaYpK/VL3bEdVThwAYK5X7L5/5Z97bwdKeUmkFjhVCoJ0oGrzOiWLgGymUzct2UHSVAoGBAMb+7Cs+Ub0pMrmFBY6r52pbey1Uq0pglvRgMmhQU7sjx50r2GaA81zPer15WVM5/nNPYaoALYqg7jrPe/PjOT/fvpR+7SNg7DZ8QftANfYiY7jKifst/gDt9ePLPS6FedZ4XcJQgOVu34jicAFx64vPbS/zrddm4iEScSVijRBBAoGAXCheERsx8+n16Us/DttXFUa1nc7+D8WR6buM1QMZgQCVF2qp3XtM+FusCKL4+q1+dtag8svLjJFp9QbaAXqX8Zk7rn8wUHbDloPTPy9XWgrPowyL9MPU+e/Rq8Hr6TWPDBd4TU64YzIEfBQYpJXfZbXhVYmK3o7xHXKB1x4vvEM=";
-//        alipayConfig.setPrivateKey(privateKey);
-//        alipayConfig.setAppCertPath("pay/pro/appCertPublicKey.crt");
-//        alipayConfig.setAlipayPublicCertPath("pay/pro/alipayCertPublicKey_RSA2.crt");
-//        alipayConfig.setRootCertPath("pay/pro/alipayRootCert.crt");
-//
-//        return alipayConfig;
-//    }
 }
\ No newline at end of file
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 3c85107..5792dcd 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
@@ -160,7 +160,7 @@
             }
             String openid = shop.getOpenid();
             Integer shopId = getTokenId(token);
-            Integer isDeleted = dao.queryForObject(" select COALESCE(ISDELETED,0)  from shop_info where id  = ?", Integer.class, shopId);
+            Integer isDeleted = dao.queryForObject(" select COALESCE(DELETED,0)  from shop_info where id  = ?", Integer.class, shopId);
             if(isDeleted== Constants.ONE){
                 throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍟嗘埛宸插垹闄�,璇疯仈绯荤鐞嗗憳");
             }
@@ -168,11 +168,11 @@
             if(isForbidden == Constants.ONE){
                 throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍟嗘埛宸茬鐢�,璇疯仈绯荤鐞嗗憳");
             }
-            String dbOpenid = dao.queryForObject(" select ifnull(openid,'')  from shop where id  = ?", String.class, shopId);
+            String dbOpenid = dao.queryForObject(" select ifnull(openid,'')  from shop_info where id  = ?", String.class, shopId);
             if(StringUtils.isBlank(dbOpenid)||!openid.equals(dbOpenid)){
                 throw new BusinessException(ResponseStatus.TOKEN_EXCEED_TIME);
             }
-            Integer count = dao.queryForObject("select count(1) from shop where id  = ?", Integer.class, shopId);
+            Integer count = dao.queryForObject("select count(1) from shop_info where id  = ?", Integer.class, shopId);
             if (count != null && count > 0) {
                 request.setAttribute(JwtTokenUtil.SHOP_ID, shop.getId());
                 return true;
diff --git a/server/services/src/main/java/com/doumee/core/constants/Constants.java b/server/services/src/main/java/com/doumee/core/constants/Constants.java
index c0e59b4..f26687a 100644
--- a/server/services/src/main/java/com/doumee/core/constants/Constants.java
+++ b/server/services/src/main/java/com/doumee/core/constants/Constants.java
@@ -82,6 +82,8 @@
     public static final String OP_INSURANCE_RATE = "INSURANCE_RATE";
     public static final String OP_ORDER_ACCEPT_LIMIT = "ORDER_ACCEPT_LIMIT";
     public static final String OP_AUTO_CONFIRM_RECEIPT = "AUTO_CONFIRM_RECEIPT";
+    public static final String OP_NO_GRAB_NOTIFY_TIME = "NO_GRAB_NOTIFY_TIME";
+    public static final String OP_NO_GRAB_NOTIFY_USERS = "NO_GRAB_NOTIFY_USERS";
     public static boolean WORKORDER_SHE_EMAIL_SENDING = false;
     public static  boolean DEALING_COMPANY_SYNC = false ;
     public static  boolean DEALING_MEMBER_SYNC = false ;
@@ -298,8 +300,8 @@
         LABOR_CONTRACT(11, "鏈夋晥鍔冲姩鍚堝悓"),
         ORDER_FILE(12,"涓嬪崟鍥剧墖"),
         STORE_OUT(13,"闂ㄥ簵鍑哄簱鍥剧墖"),
-        REFUND_TAKE(14,"閫�娆惧彇浠跺浘鐗�")
-
+        REFUND_TAKE(14,"閫�娆惧彇浠跺浘鐗�"),
+        COMMENT_ATTACH(15,"璇勪环闄勪欢鍥剧墖")
         ;
 
         private final int key;
@@ -350,9 +352,6 @@
         arrived(5, "宸插埌搴�/宸查�佽揪/寰呭彇浠�"),
         overdue(6, "瀛樺湪閫炬湡"), //寮冪敤
         finished(7, "宸插畬鎴�"),
-        closed(96, "璁㈠崟鍏抽棴锛堥��娆撅級"),
-        cancelOverdue(97, "鍙栨秷閫炬湡"), //寮冪敤
-        cancelling(98, "鍙栨秷涓�"),
         cancelled(99, "宸插彇娑�")
         ;
         private final int status;
@@ -398,7 +397,7 @@
         waitDeliver(2, "寰呴厤閫�", new int[]{OrderStatus.accepted.status}),
         waitReceive(3, "寰呮敹璐�", new int[]{ OrderStatus.delivering.status, OrderStatus.arrived.status}),
         finished(4, "宸插畬鎴�", new int[]{OrderStatus.finished.status}),
-        refund(5, "閫�娆�", new int[]{OrderStatus.closed.status, OrderStatus.cancelling.status}),
+        refund(5, "閫�娆�", new int[]{OrderStatus.cancelled.status}),
         home(6, "棣栭〉鏌ヨ", new int[]{OrderStatus.waitPay.status, OrderStatus.waitDeposit.status, OrderStatus.deposited.status
                 , OrderStatus.accepted.status, OrderStatus.delivering.status, OrderStatus.arrived.status})
         ;
@@ -458,8 +457,8 @@
         WAIT_PAY("waitPay", "璁㈠崟寰呮敮浠�", "鎮ㄧ殑琛屾潕璁㈠崟锛歿orderNo}宸插垱寤猴紝璇峰湪{timeout}鍒嗛挓鍐呭畬鎴愭敮浠橈紝瓒呮椂灏嗚嚜鍔ㄥ彇娑�"),
         WAIT_VERIFY("waitVerify", "璁㈠崟寰呮牳楠�", "鎮ㄧ殑琛屾潕璁㈠崟锛歿orderNo}宸叉彁浜わ紝绛夊緟闂ㄥ簵鏍搁獙鐗╁搧淇℃伅锛屽瓨浠剁爜{storeCode}"),
         WAIT_GRAB("waitGrab", "璁㈠崟寰呮姠鍗�", "鎮ㄧ殑琛屾潕璁㈠崟锛歿orderNo}宸叉牳楠岋紝姝e湪涓烘偍瀹夋帓鍙栦欢鍙告満"),
-        WAIT_PICKUP_REMIND("waitPickupRemind", "璁㈠崟寰呭彇浠�", "璁㈠崟{orderNo}琛屾潕宸插瘎瀛橈紝璇疯寰楀湪棰勭害鍙栦欢鏃堕棿鍑彇浠剁爜鍓嶅線鎸囧畾闂ㄥ簵鍙栧洖"),
-        WAIT_PICKUP_GRABBED("waitPickupGrabbed", "璁㈠崟宸叉姠鍗�", "鎮ㄧ殑琛屾潕璁㈠崟锛氬凡鏈夊徃鏈簕driverName}鎶㈠崟锛屾鍓嶅線鍙栦欢鍦扮偣"),
+        WAIT_PICKUP_REMIND("waitPickupRemind", "璁㈠崟寰呭彇浠�", "鎮ㄧ殑琛屾潕璁㈠崟锛歿orderNo}宸插瘎瀛橈紝璇疯寰楀湪棰勭害鍙栦欢鏃堕棿鍑彇浠剁爜鍓嶅線{shopName}闂ㄥ簵鍙栧洖"),
+        WAIT_PICKUP_GRABBED("waitPickupGrabbed", "璁㈠崟宸叉姠鍗�", "鎮ㄧ殑琛屾潕璁㈠崟锛歿orderNo}宸叉湁鍙告満{driverName}鎶㈠崟锛屾鍓嶅線鍙栦欢鍦扮偣"),
         DELIVERING("delivering", "璁㈠崟閰嶉�佷腑", "鎮ㄧ殑琛屾潕璁㈠崟锛歿orderNo}宸茬敱鍙告満{driverName}鍙栦欢锛屾杩愬線鐩殑鍦�"),
         ARRIVED_NO_SHOP("arrivedNoShop", "璁㈠崟宸查�佽揪", "鎮ㄧ殑琛屾潕璁㈠崟锛歿orderNo}宸查�佽揪{destination},璇峰強鏃剁‘璁ゆ敹璐�"),
         ARRIVED_HAS_SHOP("arrivedHasShop", "璁㈠崟宸查�佽揪", "鎮ㄧ殑琛屾潕璁㈠崟锛歿orderNo}宸查�佽揪{destination},璇峰強鏃跺彇浠讹紝鍙栦欢鐮亄pickupCode}"),
@@ -500,7 +499,7 @@
         WAIT_PICKUP("waitPickup", "璁㈠崟寰呭彇浠�", "琛屾潕璁㈠崟锛歿orderNo}宸叉姠鍗曪紝绛夊緟{name}鍙栦欢"),
         REFUNDING("refunding", "璁㈠崟閫�娆句腑", "琛屾潕璁㈠崟锛歿orderNo}鐢ㄦ埛鎻愪氦閫�娆剧敵璇凤紝璇风煡鎮�"),
         DELIVERING("delivering", "璁㈠崟閰嶉�佷腑", "琛屾潕璁㈠崟锛歿orderNo}宸茬敱鍙告満{driverName}鍙栦欢锛屾鍦ㄩ厤閫佷腑"),
-        ARRIVED("arrived", "宸查�佽揪", "琛屾潕璁㈠崟锛歿orderNo}宸查�佽揪{destination},璇疯仈绯荤敤鎴风‘璁ょ鏀�"),
+        ARRIVED("arrived", "璁㈠崟宸查�佽揪", "琛屾潕璁㈠崟锛歿orderNo}宸查�佽揪{destination},璇疯仈绯荤敤鎴风‘璁ょ鏀�"),
         FINISHED("finished", "璁㈠崟宸插畬鎴�", "琛屾潕璁㈠崟锛歿orderNo}宸插畬鎴愶紝鐩稿叧璁㈠崟缁撶畻浼氬湪{settleDays}涓伐浣滄棩鍐呭畬鎴�"),
         EVALUATED("evaluated", "璁㈠崟宸茶瘎浠�", "琛屾潕璁㈠崟锛歿orderNo}鐢ㄦ埛宸插畬鎴愯瘎浠凤紝鍙煡鐪嬭瘎浠峰唴瀹�"),
         SETTLED("settled", "璁㈠崟缁撶畻", "琛屾潕璁㈠崟锛歿orderNo}骞冲彴宸插畬鎴愮粨绠楋紝閲戦涓簕amount}鍏冿紝璇锋敞鎰忔煡鏀躲��")
@@ -531,12 +530,12 @@
     @Getter
     @AllArgsConstructor
     public enum DriverOrderNotify {
-        WAIT_DELIVER("waitDeliver", "璁㈠崟寰呴厤閫�", "鎮ㄥ凡鎶㈠崟鎴愬姛锛岃鍗曪細{orderNo}璇锋寜鏃跺埌{shopName}鍙栦欢"),
-        DELIVERING("delivering", "閰嶉�佷腑", "琛屾潕璁㈠崟锛歿orderNo}宸插彇浠讹紝姝e湪閰嶉�佷腑锛岃鎸夋椂閫佽揪"),
-        ARRIVED("arrived", "宸查�佽揪", "琛屾潕璁㈠崟锛歿orderNo}宸查�佽揪{destination},璇疯仈绯荤敤鎴风‘璁ょ鏀�"),
+        WAIT_DELIVER("waitDeliver", "璁㈠崟寰呴厤閫�", "鎮ㄥ凡鎶㈠崟鎴愬姛锛岃鏉庤鍗曪細{orderNo}璇锋寜鏃跺埌{shopName}鍙栦欢"),
+        DELIVERING("delivering", "璁㈠崟閰嶉�佷腑", "琛屾潕璁㈠崟锛歿orderNo}宸插彇浠讹紝姝e湪閰嶉�佷腑锛岃鎸夋椂閫佽揪"),
+        ARRIVED("arrived", "璁㈠崟宸查�佽揪", "琛屾潕璁㈠崟锛歿orderNo}宸查�佽揪{destination},璇疯仈绯荤敤鎴风‘璁ょ鏀�"),
         FINISHED("finished", "璁㈠崟宸插畬鎴�", "琛屾潕璁㈠崟锛歿orderNo}宸插畬鎴愶紝鐩稿叧璁㈠崟缁撶畻浼氬湪{settleDays}涓伐浣滄棩鍐呯粨绠�"),
         EVALUATED("evaluated", "璁㈠崟宸茶瘎浠�", "琛屾潕璁㈠崟锛歿orderNo}鐢ㄦ埛宸插畬鎴愯瘎浠凤紝鍙墠寰�璁㈠崟鏌ョ湅璇勪环鍐呭"),
-        REFUNDING("refunding", "閫�娆句腑", "琛屾潕璁㈠崟锛歿orderNo}鐢ㄦ埛宸叉彁浜ら��娆剧敵璇凤紝璇ヨ鍗曚换鍔″凡鍙栨秷锛岃鍕垮墠寰�銆�"),
+        REFUNDING("refunding", "璁㈠崟閫�娆句腑", "琛屾潕璁㈠崟锛歿orderNo}鐢ㄦ埛宸叉彁浜ら��娆剧敵璇凤紝璇ヨ鍗曚换鍔″凡鍙栨秷锛岃鍕垮墠寰�銆�"),
         SETTLED("settled", "璁㈠崟宸茬粨绠�", "琛屾潕璁㈠崟锛歿orderNo}骞冲彴宸插畬鎴愮粨绠楋紝閲戦涓簕amount}鍏冿紝璇锋敞鎰忔煡鏀躲��"),
         CANCELLED("cancelled", "璁㈠崟鍙栨秷鎴愬姛", "琛屾潕璁㈠崟锛歿orderNo}宸插府鎮ㄥ彇娑堬紝鎮ㄤ粖鏃ヨ繕鍙富鍔ㄥ彇娑坽cancelLimit}娆¤鍗曪紝璇峰悎鐞嗗畨鎺掓帴鍗曘��")
         ;
@@ -559,6 +558,39 @@
     }
 
     /**
+     * 鐭俊閫氱煡妯℃澘鏋氫妇
+     * templateCode: 闃块噷浜戠煭淇℃ā鏉緾ode
+     * content: 鐭俊鏂囨妯℃澘锛屽崰浣嶇鐢� {xxx} 琛ㄧず
+     */
+    @Getter
+    @AllArgsConstructor
+    public enum SmsNotify {
+        PLATFORM_WAIT_GRAB("SMS_505790009", "骞冲彴绔�-寰呮姠鍗�", "鎮ㄥソ锛岃鍗曪細{orderNo}宸茶秴杩噞time}鍒嗛挓鏃犲徃鏈烘姠鍗曪紝璇峰敖蹇姞鎬ユ淳鍗曪紝閬垮厤瀹㈡埛杩囦箙绛夊緟銆�"),
+        SHOP_REFUNDING("SMS_505900008", "闂ㄥ簵绔�-閫�娆句腑", "琛屾潕璁㈠崟锛歿orderNo}瀹㈡埛宸叉彁浜ら��娆剧敵璇凤紝璇峰敖蹇鐞嗐��"),
+        SHOP_WAIT_VERIFY("SMS_505925004", "闂ㄥ簵绔�-寰呮牳楠�", "鏂拌鏉庤鍗曪細{orderNo}瀹㈡埛宸叉敮浠橈紝璇峰敖蹇牳楠岀敤鎴风墿鍝佷俊鎭��"),
+        DRIVER_REFUNDING("SMS_505795005", "鍙告満绔�-閫�娆句腑", "琛屾潕璁㈠崟锛歿orderNo}鐢ㄦ埛宸叉彁浜ら��娆剧敵璇凤紝璇ヨ鍗曚换鍔″凡鍙栨秷锛岃鍕垮墠寰�銆�"),
+        DRIVER_WAIT_PICKUP("SMS_505650038", "鍙告満绔�-寰呭彇浠�", "鎮ㄥ凡鎶㈠崟鎴愬姛锛岃鍗晎orderNo}锛岃鎸夋椂鍒皗address}鍙栦欢銆�"),
+        MEMBER_CANCELLED("SMS_505605028", "浼氬憳绔�-宸插彇娑�", "鎮ㄧ殑琛屾潕璁㈠崟锛歿orderNo}宸插彇娑堬紝鎰熻阿鎮ㄧ殑鏀寔锛屾杩庝笅娆″啀浼氥��"),
+        MEMBER_REFUNDED("SMS_505920002", "浼氬憳绔�-宸查��娆�", "鎮ㄧ殑琛屾潕璁㈠崟锛歿orderNo}閫�娆惧凡瀹屾垚锛岄噾棰漿money}鍏冨皢鍘熻矾閫�鍥烇紝璇锋敞鎰忔煡鏀躲��"),
+        MEMBER_ARRIVED("SMS_505875004", "浼氬憳绔�-宸查�佽揪", "鎮ㄧ殑琛屾潕璁㈠崟锛歿orderNo}宸查�佸埌{address}锛岃鍙婃椂鍙栦欢锛屽彇浠剁爜锛歿code}銆�"),
+        MEMBER_DELIVERING("SMS_505935002", "浼氬憳绔�-閰嶉�佷腑", "鎮ㄧ殑琛屾潕璁㈠崟锛歿orderNo}宸茬敱鍙告満{name}鍙栦欢锛屾杩愬線鐩殑鍦般��"),
+        VERIFY_CODE("SMS_333770877", "楠岃瘉鐮佺煭淇�", "鎮ㄧ殑楠岃瘉鐮佷负锛歿code}锛岃鍕挎硠闇蹭簬浠栦汉锛�"),
+        ;
+
+        private final String templateCode;
+        private final String title;
+        private final String content;
+
+        public String format(String... params) {
+            String result = this.content;
+            for (int i = 0; i < params.length - 1; i += 2) {
+                result = result.replace("{" + params[i] + "}", params[i + 1]);
+            }
+            return result;
+        }
+    }
+
+    /**
      * 寰楀埌request瀵硅薄
      *
      * @return
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/Multifile.java b/server/services/src/main/java/com/doumee/dao/business/model/Multifile.java
index 5312c3f..de2c987 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/Multifile.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/Multifile.java
@@ -55,7 +55,7 @@
 
     @ApiModelProperty(value = "鍏宠仈瀵硅薄绫诲瀷锛�0=闂ㄥ簵鍏朵粬鏉愭枡锛�1=闂ㄥ簵鍐呴儴鐓х墖锛�2=璁㈠崟瀵勫瓨鍥剧墖锛�3=闂ㄥ簵鍏ュ簱鍥剧墖锛�4=鍙告満鍙栦欢鍥剧墖锛�5=鍙告満瀹屾垚鍥剧墖锛�6=鍙告満瀹炲悕璁よ瘉杞﹁締鐓х墖锛�" +
             "7=鍙告満瀹炲悕璁よ瘉椹鹃┒璇佺収鐗囷紱8=鍙告満瀹炲悕璁よ瘉鍏朵粬鍥剧墖锛�" +
-            "9=闂ㄥ簵闂ㄥご鐓э紱10=绀句繚缂寸撼璇佹槑锛�11=鏈夋晥鍔冲姩鍚堝悓锛�12=涓嬪崟鍥剧墖锛�13=闂ㄥ簵鍑哄簱鍥剧墖锛�", example = "1")
+            "9=闂ㄥ簵闂ㄥご鐓э紱10=绀句繚缂寸撼璇佹槑锛�11=鏈夋晥鍔冲姩鍚堝悓锛�12=涓嬪崟鍥剧墖锛�13=闂ㄥ簵鍑哄簱鍥剧墖锛�14=閫�娆惧浘鐗囷紱15=璇勪环鍥剧墖", example = "1")
     private Integer objType;
 
     @ApiModelProperty(value = "鏂囦欢鍦板潃")
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 ab1ac3d..802fd92 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
@@ -66,8 +66,8 @@
     private Integer selfTake;
 
     @ApiModelProperty(value = "璁㈠崟鐘舵��", example = "0")
-    @ExcelColumn(name = "璁㈠崟鐘舵��", valueMapping = "灏卞湴瀵勫瓨鐘舵�侊細0=寰呮敮浠�;1=寰呭瘎瀛�;2=宸插瘎瀛�;5=寰呭彇浠�;6=瀛樺湪閫炬湡;7=宸插畬鎴�;96:璁㈠崟鍏抽棴锛堥��娆撅級;97:鍙栨秷閫炬湡;98=鍙栨秷涓�;99=宸插彇娑�;" +
-            "寮傚湴瀵勫瓨鐘舵�侊細0=寰呮敮浠�;1=寰呭瘎瀛�;2=宸插瘎瀛�;3=宸叉帴鍗�;4=娲鹃�佷腑;5=宸插埌搴�/宸查�佽揪;6=瀛樺湪閫炬湡;7=宸插畬鎴�;96:璁㈠崟鍏抽棴锛堥��娆撅級;97:鍙栨秷閫炬湡;98=鍙栨秷涓�;99=宸插彇娑�;")
+    @ExcelColumn(name = "璁㈠崟鐘舵��", valueMapping = "灏卞湴瀵勫瓨鐘舵�侊細0=寰呮敮浠�;1=寰呭瘎瀛�;2=宸插瘎瀛�;5=寰呭彇浠�;6=瀛樺湪閫炬湡;7=宸插畬鎴�;99=宸插彇娑�;" +
+            "寮傚湴瀵勫瓨鐘舵�侊細0=寰呮敮浠�;1=寰呭瘎瀛�;2=宸插瘎瀛�;3=宸叉帴鍗�;4=娲鹃�佷腑;5=宸插埌搴�/宸查�佽揪;6=瀛樺湪閫炬湡;7=宸插畬鎴�;99=宸插彇娑�;")
     private Integer status;
 
     @ApiModelProperty(value = "鏄惁寮傚父璁㈠崟锛�0=鍚︼紱1=鏄�", example = "0")
@@ -362,6 +362,13 @@
     @ApiModelProperty(value = "涓夋柟璁㈠崟鍙�")
     private String outTradeNo;
 
+    @ApiModelProperty(value = "鏃犱汉鎺ュ崟鏄惁宸茬煭淇¢�氱煡骞冲彴锛�0=鍚︼紱1=鏄�", example = "0")
+    private Integer platformSmsNotified;
+
+    @ApiModelProperty(value = "鏃犱汉鎺ュ崟宸茬煭淇¢�氱煡骞冲彴鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date platformSmsNotifiedTime;
+
     @TableField(exist = false)
     @ApiModelProperty(value = "鍒涘缓寮�濮嬫椂闂�(鏌ヨ鐢�)", example = "2026-01-01")
     @JsonFormat(pattern = "yyyy-MM-dd")
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/OrdersRefund.java b/server/services/src/main/java/com/doumee/dao/business/model/OrdersRefund.java
index bfe5459..faeb79f 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/OrdersRefund.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/OrdersRefund.java
@@ -66,8 +66,13 @@
     @ApiModelProperty(value = "骞冲彴鎿嶄綔浜猴紙type=1浣跨敤锛�", example = "0")
     private Integer userId;
 
+    @ApiModelProperty(value = "閫�娆鹃噾棰濓紙鍒嗭級", example = "10000")
+    private Long refundAmount;
+
     @ApiModelProperty(value = "閫�娆剧姸鎬侊細0=閫�娆句腑锛�1=閫�娆炬垚鍔燂紱2=閫�娆惧け璐�", example = "0")
     private Integer status;
 
+    @ApiModelProperty(value = "閫�娆惧墠璁㈠崟鐘舵��", example = "1")
+    private Integer beforeStatus;
 
 }
diff --git a/server/services/src/main/java/com/doumee/dao/dto/CommentOrderDTO.java b/server/services/src/main/java/com/doumee/dao/dto/CommentOrderDTO.java
index d9e0059..92e251f 100644
--- a/server/services/src/main/java/com/doumee/dao/dto/CommentOrderDTO.java
+++ b/server/services/src/main/java/com/doumee/dao/dto/CommentOrderDTO.java
@@ -7,6 +7,8 @@
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
 import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.util.List;
 
 /**
  * 璁㈠崟璇勪环璇锋眰
@@ -41,4 +43,7 @@
     @ApiModelProperty(value = "璇勪环鍐呭")
     private String content;
 
+    @Size(max = 3, message = "鏈�澶氫笂浼�3寮犲浘鐗�")
+    @ApiModelProperty(value = "鍥剧墖鍦板潃鍒楄〃锛屾渶澶�3寮�")
+    private List<String> images;
 }
diff --git a/server/services/src/main/java/com/doumee/dao/dto/OperationConfigDTO.java b/server/services/src/main/java/com/doumee/dao/dto/OperationConfigDTO.java
index ac949d3..84b8ec0 100644
--- a/server/services/src/main/java/com/doumee/dao/dto/OperationConfigDTO.java
+++ b/server/services/src/main/java/com/doumee/dao/dto/OperationConfigDTO.java
@@ -37,4 +37,10 @@
     @ApiModelProperty(value = "鑷姩纭鏀惰揣(澶�)", required = true)
     private String autoConfirmReceipt;
 
+    @ApiModelProperty(value = "鏃犱汉鎶㈠崟閫氱煡鏃堕棿(鍒嗛挓)", required = true)
+    private String noGrabNotifyTime;
+
+    @ApiModelProperty(value = "鏃犱汉鎶㈠崟鐭俊閫氱煡浜哄憳涓婚敭(澶氫釜浠�,鍒嗗壊)", required = true)
+    private String noGrabNotifyUsers;
+
 }
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
index 9506d34..0d401f3 100644
--- a/server/services/src/main/java/com/doumee/dao/vo/DriverOrderDetailVO.java
+++ b/server/services/src/main/java/com/doumee/dao/vo/DriverOrderDetailVO.java
@@ -5,6 +5,7 @@
 import lombok.Data;
 
 import java.io.Serializable;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -76,6 +77,44 @@
     @ApiModelProperty(value = "涓嬪崟闄勪欢鍥剧墖鍏ㄨ矾寰勫垪琛�")
     private List<String> orderImages;
 
+    // ---- 瀹炴椂缁忕含搴︼紙寮傚湴瀵勫瓨鎸夌姸鎬佽繑鍥烇級 ----
+
+    @ApiModelProperty(value = "瀛樹欢闂ㄥ簵缁忓害")
+    private Double depositShopLng;
+
+    @ApiModelProperty(value = "瀛樹欢闂ㄥ簵绾害")
+    private Double depositShopLat;
+
+    @ApiModelProperty(value = "鍙栦欢鐐圭粡搴�")
+    private Double takeLng;
+
+    @ApiModelProperty(value = "鍙栦欢鐐圭含搴�")
+    private Double takeLat;
+
+    @ApiModelProperty(value = "鍙告満褰撳墠缁忓害")
+    private Double driverLng;
+
+    @ApiModelProperty(value = "鍙告満褰撳墠绾害")
+    private Double driverLat;
+
+    // ---- 璇勪环淇℃伅 ----
+
+    @ApiModelProperty(value = "鏄惁宸茶瘎浠凤細0=鍚� 1=鏄�")
+    private Integer commentStatus;
+
+    @ApiModelProperty(value = "璇勪环鏃堕棿")
+    @com.fasterxml.jackson.annotation.JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date commentTime;
+
+    @ApiModelProperty(value = "璇勪环鍐呭")
+    private String commentContent;
+
+    @ApiModelProperty(value = "璇勪环闄勪欢鍥剧墖")
+    private List<String> commentImages;
+
+    @ApiModelProperty(value = "鍙告満璇勫垎")
+    private Integer driverScore;
+
     @Data
     @ApiModel("鐗╁搧椤�")
     public static class OrderItem implements Serializable {
diff --git a/server/services/src/main/java/com/doumee/dao/vo/MyOrderDetailVO.java b/server/services/src/main/java/com/doumee/dao/vo/MyOrderDetailVO.java
index 9ba8fb7..0ff7adb 100644
--- a/server/services/src/main/java/com/doumee/dao/vo/MyOrderDetailVO.java
+++ b/server/services/src/main/java/com/doumee/dao/vo/MyOrderDetailVO.java
@@ -26,6 +26,9 @@
     @ApiModelProperty(value = "璁㈠崟鐘舵��")
     private Integer status;
 
+    @ApiModelProperty(value = "璁㈠崟鐘舵�佹枃妗�")
+    private String statusName;
+
     @ApiModelProperty(value = "璁㈠崟鐘舵�佹弿杩�")
     private String statusDesc;
 
@@ -87,6 +90,9 @@
 
     // ---- 鍙栦欢淇℃伅 ----
 
+    @ApiModelProperty(value = "鍙栦欢闂ㄥ簵涓婚敭", example = "1")
+    private Integer takeShopId;
+
     @ApiModelProperty(value = "鍙栦欢闂ㄥ簵鍚嶇О锛堟湁鍙栦欢闂ㄥ簵鏃惰繑鍥烇級")
     private String takeShopName;
 
@@ -133,6 +139,22 @@
     @ApiModelProperty(value = "閫炬湡璐圭敤锛堝垎锛�")
     private Long overdueFee;
 
+    // ---- 閫�娆撅紙status=96/99 鏃惰繑鍥烇級 ----
+
+    @ApiModelProperty(value = "閫�娆鹃噾棰濓紙鍒嗭級")
+    private Long refundAmount;
+
+    @ApiModelProperty(value = "閫�娆剧敵璇锋椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date refundApplyTime;
+
+    @ApiModelProperty(value = "閫�娆炬椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date refundTime;
+
+    @ApiModelProperty(value = "閫�娆惧娉�")
+    private String refundRemark;
+
     // ---- 鏍囪 ----
 
     @ApiModelProperty(value = "鏄惁寮傚父: 0=鍚� 1=鏄�")
@@ -151,4 +173,59 @@
 
     @ApiModelProperty(value = "鐗╁搧鏄庣粏鍒楄〃")
     private List<OrderItemVO> detailList;
+
+    // ---- 鍙告満淇℃伅 ----
+
+    @ApiModelProperty(value = "鍙告満涓婚敭")
+    private Integer driverId;
+
+    @ApiModelProperty(value = "鍙告満濮撳悕")
+    private String driverName;
+
+    @ApiModelProperty(value = "鍙告満鎵嬫満鍙�")
+    private String driverPhone;
+
+    // ---- 瀹炴椂缁忕含搴︼紙寮傚湴瀵勫瓨鎸夌姸鎬佽繑鍥烇級 ----
+
+    @ApiModelProperty(value = "瀛樹欢闂ㄥ簵缁忓害")
+    private Double depositShopLng;
+
+    @ApiModelProperty(value = "瀛樹欢闂ㄥ簵绾害")
+    private Double depositShopLat;
+
+    @ApiModelProperty(value = "鍙栦欢鐐圭粡搴�")
+    private Double takeLng;
+
+    @ApiModelProperty(value = "鍙栦欢鐐圭含搴�")
+    private Double takeLat;
+
+    @ApiModelProperty(value = "鍙告満褰撳墠缁忓害")
+    private Double driverLng;
+
+    @ApiModelProperty(value = "鍙告満褰撳墠绾害")
+    private Double driverLat;
+
+    // ---- 璇勪环淇℃伅 ----
+
+    @ApiModelProperty(value = "鏄惁宸茶瘎浠凤細0=鍚� 1=鏄�")
+    private Integer commentStatus;
+
+    @ApiModelProperty(value = "璇勪环鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date commentTime;
+
+    @ApiModelProperty(value = "璇勪环鍐呭")
+    private String commentContent;
+
+    @ApiModelProperty(value = "璇勪环闄勪欢鍥剧墖")
+    private List<String> commentImages;
+
+    @ApiModelProperty(value = "瀛樹欢闂ㄥ簵璇勫垎")
+    private Integer depositScore;
+
+    @ApiModelProperty(value = "鍙栦欢闂ㄥ簵璇勫垎")
+    private Integer takeScore;
+
+    @ApiModelProperty(value = "鍙告満璇勫垎")
+    private Integer driverScore;
 }
diff --git a/server/services/src/main/java/com/doumee/dao/vo/ShopCenterVO.java b/server/services/src/main/java/com/doumee/dao/vo/ShopCenterVO.java
index c129682..56b90b1 100644
--- a/server/services/src/main/java/com/doumee/dao/vo/ShopCenterVO.java
+++ b/server/services/src/main/java/com/doumee/dao/vo/ShopCenterVO.java
@@ -30,4 +30,10 @@
     @ApiModelProperty(value = "寰呮敹璐ц鍗曟暟閲�")
     private Integer waitReceiveCount;
 
+    @ApiModelProperty(value = "鏀粯瀹濇彁鐜拌处鎴�")
+    private String aliAccount;
+
+    @ApiModelProperty(value = "鏀粯瀹濆疄鍚嶅鍚�")
+    private String aliName;
+
 }
diff --git a/server/services/src/main/java/com/doumee/dao/vo/ShopSalesStatsVO.java b/server/services/src/main/java/com/doumee/dao/vo/ShopSalesStatsVO.java
new file mode 100644
index 0000000..c5a0ef3
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/vo/ShopSalesStatsVO.java
@@ -0,0 +1,23 @@
+package com.doumee.dao.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("闂ㄥ簵閿�鍞粺璁�")
+public class ShopSalesStatsVO {
+
+    @ApiModelProperty(value = "閿�鍞锛堝垎锛�")
+    private Long salesAmount;
+
+    @ApiModelProperty(value = "缁撶畻鍒╂鼎锛堝垎锛�")
+    private Long settlementProfit;
+
+    @ApiModelProperty(value = "璁㈠崟鎬绘暟")
+    private Integer orderCount;
+
+    @ApiModelProperty(value = "鍦ㄥ簱璁㈠崟鏁�")
+    private Integer storageCount;
+
+}
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 3a9df6a..935b2a5 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
@@ -122,7 +122,7 @@
     MyOrderDetailVO findMyOrderDetail(Integer id, Integer memberId);
 
     /**
-     * 浼氬憳鍙栨秷璁㈠崟锛堜粎寮傚湴瀵勫瓨锛�
+     * 浼氬憳鍙栨秷璁㈠崟
      *
      * @param orderId  璁㈠崟涓婚敭
      * @param memberId 浼氬憳涓婚敭
@@ -381,4 +381,29 @@
      */
     ActiveOrderTipVO getActiveOrderTip(Integer memberId);
 
+    /**
+     * 鍙栨秷瓒呮椂鏈敮浠樿鍗�
+     * 鏍规嵁杩愯惀閰嶇疆 AUTO_CANCEL_TIME锛堝垎閽燂級锛屽皢鍒涘缓鏃堕棿瓒呰繃璇ュ�间笖浠嶄负寰呮敮浠樼殑璁㈠崟鎵归噺鍙栨秷
+     *
+     * @return 鍙栨秷鐨勮鍗曟暟閲�
+     */
+    int cancelTimeoutUnpaidOrders();
+
+    /**
+     * 閫氱煡骞冲彴浜哄憳锛氬凡瀵勫瓨璁㈠崟瓒呮椂鏃犱汉鎶㈠崟
+     * 鏍规嵁杩愯惀閰嶇疆 NO_GRAB_NOTIFY_TIME锛堝垎閽燂級锛屾壂鎻忓紓鍦板凡瀵勫瓨(status=2)涓旇秴鏃剁殑璁㈠崟锛�
+     * 缁欓厤缃殑閫氱煡浜哄憳鍙戦�佺煭淇★紙PLATFORM_WAIT_GRAB锛夛紝骞舵爣璁板凡閫氱煡闃叉閲嶅
+     *
+     * @return 閫氱煡鐨勮鍗曟暟閲�
+     */
+    int notifyUngrabbedOrders();
+
+    /**
+     * 鑷姩瀹屾垚瓒呮椂鏈‘璁ょ殑璁㈠崟
+     * 鏍规嵁杩愯惀閰嶇疆 AUTO_CONFIRM_RECEIPT锛堝ぉ锛夛紝灏嗗凡閫佽揪(status=5)瓒呰繃璇ュぉ鏁扮殑璁㈠崟鑷姩鏍囪涓哄凡瀹屾垚
+     *
+     * @return 鑷姩瀹屾垚鐨勮鍗曟暟閲�
+     */
+    int autoCompleteOrders();
+
 }
\ No newline at end of file
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 4fe95a7..7f1f255 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
@@ -9,6 +9,7 @@
 import com.doumee.dao.vo.ShopCenterVO;
 import com.doumee.dao.vo.ShopDetailVO;
 import com.doumee.dao.vo.ShopNearbyVO;
+import com.doumee.dao.vo.ShopSalesStatsVO;
 import com.doumee.dao.vo.ShopWebDetailVO;
 
 import java.math.BigDecimal;
@@ -199,4 +200,13 @@
      */
     ShopLoginVO shopSilentLogin(Integer memberId);
 
+    /**
+     * 闂ㄥ簵閿�鍞粺璁�
+     *
+     * @param shopId  闂ㄥ簵涓婚敭
+     * @param period  缁熻鍛ㄦ湡锛�0=浠婃棩, 1=鏈湀, 2=涓婃湀
+     * @return 閿�鍞粺璁�
+     */
+    ShopSalesStatsVO getShopSalesStats(Integer shopId, Integer period);
+
 }
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 b0b876c..548fc41 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
@@ -15,9 +15,11 @@
 import com.doumee.dao.business.DriverInfoMapper;
 import com.doumee.dao.business.MemberMapper;
 import com.doumee.dao.business.MultifileMapper;
+import com.doumee.dao.business.OrderCommentMapper;
 import com.doumee.dao.business.SmsrecordMapper;
 import com.doumee.dao.business.CategoryMapper;
 import com.doumee.dao.business.OrdersMapper;
+import com.doumee.dao.business.ShopInfoMapper;
 import com.doumee.dao.business.OrdersDetailMapper;
 import com.doumee.dao.business.RevenueMapper;
 import com.doumee.biz.system.SystemDictDataBiz;
@@ -26,6 +28,8 @@
 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.OrderComment;
+import com.doumee.dao.business.model.ShopInfo;
 import com.doumee.dao.business.model.Member;
 import com.doumee.dao.business.model.Multifile;
 import com.doumee.dao.business.model.Smsrecord;
@@ -43,6 +47,7 @@
 import com.doumee.service.business.NoticeService;
 import com.alibaba.fastjson.JSONObject;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -59,6 +64,7 @@
  * @author rk
  * @date 2026/04/08
  */
+@Slf4j
 @Service
 public class DriverInfoServiceImpl implements DriverInfoService {
 
@@ -88,6 +94,12 @@
 
     @Autowired
     private OrdersMapper ordersMapper;
+
+    @Autowired
+    private ShopInfoMapper shopInfoMapper;
+
+    @Autowired
+    private OrderCommentMapper orderCommentMapper;
 
     @Autowired
     private RevenueMapper revenueMapper;
@@ -1114,10 +1126,59 @@
             }
         }
 
+        // 寮傚湴瀵勫瓨瀹炴椂缁忕含搴︼紙鎸夌姸鎬佽繑鍥烇級
+        if (Constants.ONE.equals(order.getType())) {
+            // 鍙告満鑷韩缁忕含搴�
+            vo.setDriverLng(driverLng);
+            vo.setDriverLat(driverLat);
+
+            // status=3(宸叉帴鍗�)锛氳繑鍥炲瓨浠堕棬搴楃粡绾害
+            if (Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.accepted.getStatus())) {
+                if (order.getDepositShopId() != null) {
+                    ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId());
+                    if (depositShop != null) {
+                        vo.setDepositShopLng(depositShop.getLongitude());
+                        vo.setDepositShopLat(depositShop.getLatitude());
+                    }
+                }
+            }
+            // status=4(閰嶉�佷腑)锛氳繑鍥炲彇浠剁偣缁忕含搴�
+            if (Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.delivering.getStatus())) {
+                if (order.getTakeShopId() != null) {
+                    ShopInfo takeShop = shopInfoMapper.selectById(order.getTakeShopId());
+                    if (takeShop != null) {
+                        vo.setTakeLng(takeShop.getLongitude());
+                        vo.setTakeLat(takeShop.getLatitude());
+                    }
+                } else if (order.getTakeLgt() != null && order.getTakeLat() != null) {
+                    vo.setTakeLng(order.getTakeLgt().doubleValue());
+                    vo.setTakeLat(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));
+
+        // 璇勪环淇℃伅
+        vo.setCommentStatus(order.getCommentStatus());
+        if (Constants.equalsInteger(order.getCommentStatus(), Constants.ONE)) {
+            vo.setCommentTime(order.getCommentTime());
+            // 鏌ヨ鍙告満璇勪环璁板綍
+            OrderComment driverComment = orderCommentMapper.selectOne(new QueryWrapper<OrderComment>().lambda()
+                    .eq(OrderComment::getOrderId, orderId)
+                    .eq(OrderComment::getTargetType, Constants.THREE)
+                    .eq(OrderComment::getDeleted, Constants.ZERO)
+                    .last("limit 1"));
+            if (driverComment != null) {
+                vo.setDriverScore(driverComment.getScore());
+                vo.setCommentContent(driverComment.getContent());
+            }
+            // 璇勪环闄勪欢鍥剧墖
+            vo.setCommentImages(getFileUrls(orderId, Constants.FileType.COMMENT_ATTACH.getKey(), imgPrefix));
+        }
 
         return vo;
     }
@@ -1276,6 +1337,12 @@
         sendDriverNotice(driverId, Constants.DriverOrderNotify.WAIT_DELIVER, orderId,
                 "orderNo", order.getCode(),
                 "shopName", shopName != null ? shopName : "");
+
+        // 鐭俊閫氱煡鍙告満锛氭姠鍗曟垚鍔燂紝寰呭彇浠�
+        String pickupAddress = order.getDepositShopAddress() != null ? order.getDepositShopAddress() : order.getDepositLocation();
+        sendSmsNotify(driver.getTelephone(), Constants.SmsNotify.DRIVER_WAIT_PICKUP,
+                "orderNo", order.getCode(),
+                "address", pickupAddress != null ? pickupAddress : "");
     }
 
     @Override
@@ -1355,6 +1422,14 @@
         // 閫氱煡鍙告満锛氬凡鍙栦欢閰嶉�佷腑
         sendDriverNotice(driverId, Constants.DriverOrderNotify.DELIVERING, orderId,
                 "orderNo", order.getCode());
+
+        // 鐭俊閫氱煡浼氬憳锛氬徃鏈哄凡鍙栦欢锛岄厤閫佷腑
+        Member deliveringMember = memberMapper.selectById(order.getMemberId());
+        if (deliveringMember != null) {
+            sendSmsNotify(deliveringMember.getTelephone(), Constants.SmsNotify.MEMBER_DELIVERING,
+                    "orderNo", order.getCode(),
+                    "name", driver.getName());
+        }
     }
 
     @Override
@@ -1567,4 +1642,48 @@
         return vo;
     }
 
+    /**
+     * 鍙戦�佺煭淇¢�氱煡锛堝け璐ヤ笉褰卞搷涓讳笟鍔★級
+     */
+    private void sendSmsNotify(String phone, Constants.SmsNotify smsNotify, String... paramPairs) {
+        if (StringUtils.isBlank(phone)) {
+            return;
+        }
+        String content = smsNotify.format(paramPairs);
+        try {
+            JSONObject templateParam = new JSONObject();
+            for (int i = 0; i < paramPairs.length - 1; i += 2) {
+                templateParam.put(paramPairs[i], paramPairs[i + 1]);
+            }
+            boolean result = AliSmsService.sendSms(phone, smsNotify.getTemplateCode(),
+                    templateParam.toJSONString());
+            if (result) {
+                log.info("鐭俊鍙戦�佹垚鍔�: phone={}, template={}", phone, smsNotify.name());
+            } else {
+                log.warn("鐭俊鍙戦�佸け璐�: phone={}, template={}", phone, smsNotify.name());
+            }
+            // 瀛樺偍鐭俊璁板綍
+            Smsrecord record = new Smsrecord();
+            record.setPhone(phone);
+            record.setContent(content);
+            record.setType(Constants.ONE); // 1=璁㈠崟閫氱煡
+            record.setStatus(result ? Constants.ONE : Constants.ZERO);
+            record.setCreateTime(new Date());
+            record.setDeleted(Constants.ZERO);
+            smsrecordMapper.insert(record);
+        } catch (Exception e) {
+            log.error("鐭俊鍙戦�佸紓甯�: phone={}, template={}, error={}", phone, smsNotify.name(), e.getMessage());
+            try {
+                Smsrecord record = new Smsrecord();
+                record.setPhone(phone);
+                record.setContent(content);
+                record.setType(Constants.ONE);
+                record.setStatus(Constants.ZERO);
+                record.setCreateTime(new Date());
+                record.setDeleted(Constants.ZERO);
+                smsrecordMapper.insert(record);
+            } catch (Exception ignored) {}
+        }
+    }
+
 }
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 01df4f5..800731b 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
@@ -19,6 +19,7 @@
 import com.doumee.core.utils.DateUtil;
 import com.doumee.core.utils.geocode.MapUtil;
 import com.doumee.core.utils.Utils;
+import com.doumee.core.utils.aliyun.AliSmsService;
 import com.doumee.dao.business.*;
 import com.doumee.dao.business.model.*;
 import com.doumee.dao.system.SystemUserMapper;
@@ -43,6 +44,7 @@
 import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
@@ -59,6 +61,7 @@
  * @author rk
  * @date 2026/04/10
  */
+@Slf4j
 @Service
 public class OrdersServiceImpl implements OrdersService {
 
@@ -126,6 +129,9 @@
 
     @Autowired
     private NoticeService noticeService;
+
+    @Autowired
+    private SmsrecordMapper smsrecordMapper;
 
     @Autowired
     private WxPayV3Service wxPayV3Service;
@@ -680,7 +686,7 @@
                 if (takeShop == null || Constants.equalsInteger(takeShop.getDeleted(), Constants.ONE)) {
                     throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鍙栦欢搴楅摵涓嶅瓨鍦�");
                 }
-                if (takeShop.getStatus() == null || !Constants.equalsInteger(takeShop.getStatus(), Constants.ONE)) {
+                if (takeShop.getStatus() == null || Constants.equalsInteger(takeShop.getStatus(), Constants.ONE)) {
                     throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鍙栦欢搴楅摵宸插仠涓氾紝璇烽�夋嫨鍏朵粬闂ㄥ簵");
                 }
                 takeLat = BigDecimal.valueOf(takeShop.getLatitude());
@@ -822,6 +828,10 @@
         // 钖叕璁$畻涓庡崰姣斿瓨鍌�
         calculateAndSetFeeAllocation(orders, depositShop, takeShop);
 
+        // 鏃犱汉鎺ュ崟閫氱煡鐩稿叧鍒濆鍖�
+        orders.setPlatformSmsNotified(Constants.ZERO);
+        orders.setPlatformSmsNotifiedTime(now);
+
         ordersMapper.insert(orders);
         Integer orderId = orders.getId();
 
@@ -892,6 +902,7 @@
         // 5. 閲嶆柊鐢熸垚绗笁鏂硅鍗曠紪鍙凤紙閬垮厤閲嶅锛�
         String orderTradeNo = generateOrderTradeNo();
         orders.setOutTradeNo(orderTradeNo);
+        orders.setPlatformSmsNotifiedTime(new Date());
         orders.setUpdateTime(new Date());
         ordersMapper.updateById(orders);
         // 6. 鍞よ捣寰俊鏀粯
@@ -1034,9 +1045,6 @@
         // 鍙栨秷/閫�娆剧姸鎬佹椂鏌ヨ閫�娆捐褰�
         Integer status = order.getStatus();
         if (status != null && (status == Constants.OrderStatus.overdue.getStatus()
-                || status == Constants.OrderStatus.closed.getStatus()
-                || status == Constants.OrderStatus.cancelOverdue.getStatus()
-                || status == Constants.OrderStatus.cancelling.getStatus()
                 || status == Constants.OrderStatus.cancelled.getStatus())) {
             OrdersRefund ordersRefund = ordersRefundMapper.selectOne(
                     new QueryWrapper<OrdersRefund>().lambda()
@@ -1124,6 +1132,8 @@
                 .eq(Orders::getId, order.getId())
                 .set(Orders::getIsUrgent, Constants.ONE)
                 .set(Orders::getPlatformRewardAmount, urgentFeeFen)
+                .set(Orders::getPlatformSmsNotified, Constants.ZERO) // 閲嶇疆閫氱煡鐘舵�佷负鏈�氱煡
+                .set(Orders::getPlatformSmsNotifiedTime, new Date()) // 閲嶇疆閫氱煡鍩哄噯鏃堕棿涓哄綋鍓�
                 .set(Orders::getUpdateTime, new Date());
 
         // 寮傚湴瀵勫瓨涓旀湁鍙栦欢闂ㄥ簵鏃讹紝鐢熸垚鍙告満鏍搁攢鐮�
@@ -1597,13 +1607,14 @@
         vo.setExpectedDepositTime(order.getExpectedDepositTime());
         vo.setExpectedTakeTime(order.getExpectedTakeTime());
         vo.setArriveTime(order.getArriveTime());
+        vo.setStatusName(Constants.OrderStatus.getDescByKey(order.getStatus(),order.getType()));
 
         // 璐圭敤锛堝垎锛�
         vo.setBasicAmount(order.getBasicAmount());
         vo.setDeclaredAmount(order.getDeclaredAmount());
         vo.setDeclaredFee(order.getDeclaredFee());
         vo.setUrgentAmount(order.getUrgentAmount());
-        vo.setActualPayAmount(order.getPayAmount());
+        vo.setActualPayAmount(Constants.equalsInteger(order.getPayStatus(), Constants.ONE)?order.getPayAmount():order.getEstimatedAmount());
 
         // 鏍囪
         vo.setExceptionStatus(order.getExceptionStatus());
@@ -1630,6 +1641,7 @@
 
         // 鍙栦欢淇℃伅
         if (order.getTakeShopId() != null) {
+            vo.setTakeShopId(order.getTakeShopId());
             ShopInfo takeShop = shopInfoMapper.selectById(order.getTakeShopId());
             if (takeShop != null) {
                 vo.setTakeShopName(takeShop.getName());
@@ -1643,6 +1655,16 @@
         // 鍙栦欢鑱旂郴浜�
         vo.setTakeUser(order.getTakeUser());
         vo.setTakePhone(order.getTakePhone());
+
+        // 鍙告満淇℃伅
+        if (order.getAcceptDriver() != null) {
+            DriverInfo driver = driverInfoMapper.selectById(order.getAcceptDriver());
+            if (driver != null) {
+                vo.setDriverId(driver.getId());
+                vo.setDriverName(driver.getName());
+                vo.setDriverPhone(driver.getTelephone());
+            }
+        }
 
         // 鐗╁搧绫诲瀷鍚嶇О
         if (order.getGoodType() != null) {
@@ -1663,11 +1685,67 @@
                         .eq(OrdersDetail::getDeleted, Constants.ZERO));
         vo.setDetailList(buildDetailList(details));
 
-        // 閫炬湡淇℃伅
-        OverdueFeeVO overdueInfo = calculateOverdueFeeInternal(order, details);
-        vo.setOverdue(overdueInfo.getOverdue());
-        vo.setOverdueDays(overdueInfo.getOverdueDays());
-        vo.setOverdueFee(overdueInfo.getOverdueFee());
+        Integer orderStatus = order.getStatus();
+        if(Constants.equalsInteger(orderStatus, Constants.FIVE)){
+            // 閫炬湡淇℃伅
+            OverdueFeeVO overdueInfo = calculateOverdueFeeInternal(order, details);
+            if (Constants.ONE.equals(order.getType())
+                    && order.getTakeShopId() != null) {
+                // 寮傚湴瀵勫瓨 + 鏈夊彇浠堕棬搴楋細
+                // 鏍规嵁琛屾潕杞Щ鍒板簵鏃堕棿(arriveTime)褰撳ぉ鏅氫笂12鐐瑰垽鏂槸鍚﹂�炬湡
+                if (order.getArriveTime() != null) {
+                    Calendar arriveCal = Calendar.getInstance();
+                    arriveCal.setTime(order.getArriveTime());
+                    arriveCal.set(Calendar.HOUR_OF_DAY, 23);
+                    arriveCal.set(Calendar.MINUTE, 59);
+                    arriveCal.set(Calendar.SECOND, 59);
+                    Date arriveEndOfDay = arriveCal.getTime();
+                    boolean isOverdue = new Date().after(arriveEndOfDay);
+                    vo.setOverdue(isOverdue);
+                    if (isOverdue) {
+                        vo.setOverdueDays(overdueInfo.getOverdueDays() > 0 ? overdueInfo.getOverdueDays() : 1);
+                        vo.setOverdueFee(overdueInfo.getOverdueFee());
+                    } else {
+                        vo.setOverdueDays(0);
+                        vo.setOverdueFee(0L);
+                    }
+                } else {
+                    vo.setOverdue(false);
+                    vo.setOverdueDays(0);
+                    vo.setOverdueFee(0L);
+                }
+            } else if (Constants.ZERO.equals(order.getType())) {
+                // 灏卞湴瀵勫瓨锛氫繚鎸佸師閫昏緫
+                vo.setOverdue(overdueInfo.getOverdue());
+                vo.setOverdueDays(overdueInfo.getOverdueDays());
+                vo.setOverdueFee(overdueInfo.getOverdueFee());
+            }
+        } else {
+            vo.setOverdue(false);
+            vo.setOverdueDays(0);
+            vo.setOverdueFee(0L);
+        }
+
+        // 閫�娆句俊鎭紙status=96鍏抽棴/99鍙栨秷鏃惰繑鍥烇級
+        if (orderStatus != null &&
+                (Constants.equalsInteger(orderStatus, Constants.OrderStatus.cancelled.getStatus()))) {
+            vo.setRefundApplyTime(order.getCancelTime());
+            // 鏌ヨ閫�娆捐褰曡幏鍙栭��娆鹃噾棰濆拰澶囨敞
+            OrdersRefund ordersRefund = ordersRefundMapper.selectOne(
+                    new QueryWrapper<OrdersRefund>().lambda()
+                            .eq(OrdersRefund::getOrderId, order.getId())
+                            .eq(OrdersRefund::getDeleted, Constants.ZERO)
+                            .orderByDesc(OrdersRefund::getCreateTime)
+                            .last("limit 1"));
+            if (ordersRefund != null) {
+                vo.setRefundAmount(ordersRefund.getRefundAmount() != null
+                        ? ordersRefund.getRefundAmount() : order.getRefundAmount());
+                vo.setRefundRemark(ordersRefund.getRemark());
+                vo.setRefundTime(ordersRefund.getRefundTime());
+            } else {
+                vo.setRefundAmount(order.getRefundAmount());
+            }
+        }
 
         // 鏍搁攢鐮�
         Integer status = order.getStatus();
@@ -1687,6 +1765,68 @@
         } else {
             // 闂ㄥ簵绔細濮嬬粓杩斿洖浼氬憳鏍搁攢鐮�
             vo.setMemberVerifyCode(order.getMemberVerifyCode());
+        }
+
+        // 寮傚湴瀵勫瓨缁忕含搴︼紙灏卞湴瀵勫瓨涓嶈繑鍥烇級
+        if (Constants.ONE.equals(order.getType())) {
+            // status=3(宸叉帴鍗�)锛氳繑鍥炲瓨浠堕棬搴楃粡绾害 + 鍙告満缁忕含搴�
+            if (Constants.equalsInteger(status, Constants.OrderStatus.accepted.getStatus())) {
+                ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId());
+                if (depositShop != null) {
+                    vo.setDepositShopLng(depositShop.getLongitude());
+                    vo.setDepositShopLat(depositShop.getLatitude());
+                }
+                if (order.getAcceptDriver() != null) {
+                    DriverInfo driver = driverInfoMapper.selectById(order.getAcceptDriver());
+                    if (driver != null) {
+                        vo.setDriverLng(driver.getLongitude());
+                        vo.setDriverLat(driver.getLatitude());
+                    }
+                }
+            }
+            // status=4(閰嶉�佷腑)锛氳繑鍥炲彇浠剁偣缁忕含搴� + 鍙告満缁忕含搴�
+            if (Constants.equalsInteger(status, Constants.OrderStatus.delivering.getStatus())) {
+                // 鍙栦欢鐐圭粡绾害锛堜紭鍏堝彇浠堕棬搴楋紝鍚﹀垯璁㈠崟涓婄殑鍙栦欢鍧愭爣锛�
+                if (order.getTakeShopId() != null) {
+                    ShopInfo takeShop = shopInfoMapper.selectById(order.getTakeShopId());
+                    if (takeShop != null) {
+                        vo.setTakeLng(takeShop.getLongitude());
+                        vo.setTakeLat(takeShop.getLatitude());
+                    }
+                } else if (order.getTakeLgt() != null && order.getTakeLat() != null) {
+                    vo.setTakeLng(order.getTakeLgt().doubleValue());
+                    vo.setTakeLat(order.getTakeLat().doubleValue());
+                }
+                if (order.getAcceptDriver() != null) {
+                    DriverInfo driver = driverInfoMapper.selectById(order.getAcceptDriver());
+                    if (driver != null) {
+                        vo.setDriverLng(driver.getLongitude());
+                        vo.setDriverLat(driver.getLatitude());
+                    }
+                }
+            }
+        }
+
+        // 璇勪环淇℃伅
+        vo.setCommentStatus(order.getCommentStatus());
+        if (Constants.equalsInteger(order.getCommentStatus(), Constants.ONE)) {
+            vo.setCommentTime(order.getCommentTime());
+            // 鏌ヨ璇勪环璁板綍锛岃幏鍙栧悇瀵硅薄璇勫垎
+            List<OrderComment> comments = orderCommentMapper.selectList(new QueryWrapper<OrderComment>().lambda()
+                    .eq(OrderComment::getOrderId, order.getId())
+                    .eq(OrderComment::getDeleted, Constants.ZERO));
+            for (OrderComment c : comments) {
+                if (Constants.equalsInteger(c.getTargetType(), Constants.ONE)) {
+                    vo.setDepositScore(c.getScore());
+                    vo.setCommentContent(c.getContent());
+                } else if (Constants.equalsInteger(c.getTargetType(), Constants.TWO)) {
+                    vo.setTakeScore(c.getScore());
+                } else if (Constants.equalsInteger(c.getTargetType(), Constants.THREE)) {
+                    vo.setDriverScore(c.getScore());
+                }
+            }
+            // 璇勪环闄勪欢鍥剧墖
+            vo.setCommentImages(getFileUrls(order.getId(), Constants.FileType.COMMENT_ATTACH.getKey(), imgPrefix));
         }
 
         return vo;
@@ -1716,11 +1856,42 @@
             order.setCancelTime(now);
             ordersMapper.updateById(order);
             saveCancelLog(order, "浼氬憳鍙栨秷璁㈠崟锛堝緟鏀粯锛�", reason, memberId);
+            // 鐭俊閫氱煡浼氬憳锛氳鍗曞凡鍙栨秷
+            Member cancelMember1 = memberMapper.selectById(memberId);
+            sendSmsNotify(cancelMember1 != null ? cancelMember1.getTelephone() : null,
+                    Constants.SmsNotify.MEMBER_CANCELLED, "orderNo", order.getCode());
             return;
         }
 
         // 寰呭瘎瀛橈細鐩存帴鍙栨秷锛屽叏棰濋��娆撅紙涓嶉檺璁㈠崟绫诲瀷锛�
         if (Constants.equalsInteger(status, Constants.OrderStatus.waitDeposit.getStatus())) {
+            // 鍏堟爣璁拌鍗曞凡鍙栨秷
+            order.setStatus(Constants.OrderStatus.cancelled.getStatus());
+            order.setCancelTime(now);
+            order.setRefundAmount(order.getPayAmount());
+            ordersMapper.updateById(order);
+
+            saveCancelLog(order, "浼氬憳鍙栨秷璁㈠崟锛堝緟瀵勫瓨锛屽叏棰濋��娆撅級", reason, memberId);
+            // 閫氱煡浼氬憳锛氬凡鍙栨秷
+            sendOrderNotice(memberId, Constants.MemberOrderNotify.CANCELLED, orderId,
+                    "orderNo", order.getCode());
+            // 鐭俊閫氱煡浼氬憳锛氳鍗曞凡鍙栨秷
+            Member cancelMember2 = memberMapper.selectById(memberId);
+            sendSmsNotify(cancelMember2 != null ? cancelMember2.getTelephone() : null,
+                    Constants.SmsNotify.MEMBER_CANCELLED, "orderNo", order.getCode());
+
+            // 璋冪敤寰俊閫�娆綱3锛屽叏棰濋��娆�
+            com.wechat.pay.java.service.refund.model.Refund refundResult;
+            try {
+                refundResult = wxPayV3Service.refund(order.getOutTradeNo(), order.getPayAmount(), order.getPayAmount(),
+                        "璁㈠崟閫�娆�", wxPayProperties.getV3RefundNotifyUrl());
+            } catch (Exception e) {
+                log.error("寰呭瘎瀛樿鍗曢��娆捐皟鐢ㄥ紓甯�, orderId={}", orderId, e);
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "閫�娆惧け璐ワ紝璇风◢鍚庨噸璇�");
+            }
+
+            com.wechat.pay.java.service.refund.model.Status refundStatus = refundResult.getStatus();
+
             // 璁板綍閫�娆句俊鎭�
             OrdersRefund refund = new OrdersRefund();
             refund.setOrderId(orderId);
@@ -1728,23 +1899,22 @@
             refund.setCancelInfo(reason);
             refund.setCreateTime(now);
             refund.setDeleted(Constants.ZERO);
-
-            // 璋冪敤寰俊閫�娆綱3锛屽叏棰濋��娆�
-            Refund refundResult = wxPayV3Service.refund(order.getOutTradeNo(), order.getPayAmount(), order.getPayAmount(),
-                    "璁㈠崟閫�娆�", wxPayProperties.getV3RefundNotifyUrl());
+            refund.setBeforeStatus(Constants.OrderStatus.waitDeposit.getStatus());
+            refund.setRefundAmount(order.getPayAmount());
             refund.setRefundCode(refundResult.getOutRefundNo());
-            refund.setStatus(Constants.ZERO); // 閫�娆句腑
+
+            if (com.wechat.pay.java.service.refund.model.Status.SUCCESS.equals(refundStatus)) {
+                // 閫�娆炬垚鍔�
+                refund.setStatus(Constants.ONE);
+            } else if (com.wechat.pay.java.service.refund.model.Status.PROCESSING.equals(refundStatus)) {
+                // 閫�娆句腑锛岀瓑鍥炶皟澶勭悊
+                refund.setStatus(Constants.ZERO);
+            } else {
+                // 閫�娆惧け璐�/寮傚父锛圕LOSED / ABNORMAL / 鍏朵粬锛�
+                log.error("寰呭瘎瀛樿鍗曢��娆惧け璐�, orderId={}, refundStatus={}", orderId, refundStatus);
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "閫�娆惧け璐ワ紝璇疯仈绯诲鏈嶅鐞�");
+            }
             ordersRefundMapper.insert(refund);
-
-            order.setStatus(Constants.OrderStatus.cancelled.getStatus());
-            order.setCancelTime(now);
-            order.setRefundAmount(order.getPayAmount());
-            ordersMapper.updateById(order);
-
-            saveCancelLog(order, "浼氬憳鍙栨秷璁㈠崟锛堝緟瀵勫瓨锛屽叏棰濋��娆撅級", reason, memberId);
-            // 閫氱煡浼氬憳锛氶��娆句腑
-            sendOrderNotice(memberId, Constants.MemberOrderNotify.REFUNDING, orderId,
-                    "orderNo", order.getCode());
             return;
         }
 
@@ -1753,22 +1923,27 @@
             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "浠呭紓鍦板瘎瀛樿鍗曞彲鍙栨秷");
         }
 
-        // 宸插瘎瀛�/宸叉帴鍗曪細杩涘叆鍙栨秷涓姸鎬�
+        // 宸插瘎瀛�/宸叉帴鍗曪細鐩存帴灏嗚鍗曠被鍨嬫敼涓哄氨鍦板瘎瀛�
         if (Constants.equalsInteger(status, Constants.OrderStatus.deposited.getStatus())
                 || Constants.equalsInteger(status, Constants.OrderStatus.accepted.getStatus())) {
-            order.setStatus(Constants.OrderStatus.cancelling.getStatus());
-            order.setCancelTime(now);
+            order.setType(Constants.ZERO); // 灏卞湴瀵勫瓨
             ordersMapper.updateById(order);
-            saveCancelLog(order, "浼氬憳鐢宠鍙栨秷璁㈠崟锛堝凡瀵勫瓨/宸叉帴鍗曪級", reason, memberId);
-            // 閫氱煡瀛樹欢闂ㄥ簵锛氶��娆剧敵璇�
+            saveCancelLog(order, "浼氬憳鍙栨秷寮傚湴瀵勫瓨璁㈠崟锛岃浆涓哄氨鍦板瘎瀛�", reason, memberId);
+            // 閫氱煡瀛樹欢闂ㄥ簵
             if (order.getDepositShopId() != null) {
                 sendShopNotice(order.getDepositShopId(), Constants.ShopOrderNotify.REFUNDING, orderId,
                         "orderNo", order.getCode());
+                ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId());
+                sendSmsNotify(depositShop != null ? depositShop.getLinkPhone() : null,
+                        Constants.SmsNotify.SHOP_REFUNDING, "orderNo", order.getCode());
             }
-            // 閫氱煡鍙告満锛氳鍗曢��娆句腑锛堝凡鎺ュ崟鎯呭喌涓嬪徃鏈洪渶鍋滄鏈嶅姟锛�
-            if (order.getAcceptDriver() != null && Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.accepted.getStatus())) {
+            // 閫氱煡鍙告満锛氳鍗曞凡鍙栨秷锛堝凡鎺ュ崟鎯呭喌涓嬪徃鏈洪渶鍋滄鏈嶅姟锛�
+            if (order.getAcceptDriver() != null && Constants.equalsInteger(status, Constants.OrderStatus.accepted.getStatus())) {
                 sendDriverNotice(order.getAcceptDriver(), Constants.DriverOrderNotify.REFUNDING, orderId,
                         "orderNo", order.getCode());
+                DriverInfo driver = driverInfoMapper.selectById(order.getAcceptDriver());
+                sendSmsNotify(driver != null ? driver.getTelephone() : null,
+                        Constants.SmsNotify.DRIVER_REFUNDING, "orderNo", order.getCode());
             }
             return;
         }
@@ -1930,6 +2105,15 @@
             sendShopNotice(order.getDepositShopId(), Constants.ShopOrderNotify.WAIT_VERIFY, order.getId(),
                     "orderNo", order.getCode());
         }
+
+        // 鐭俊閫氱煡瀛樹欢闂ㄥ簵锛氭湁鏂拌鍗曞緟鏍搁獙
+        if (order.getDepositShopId() != null) {
+            ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId());
+            if (depositShop != null) {
+                sendSmsNotify(depositShop.getLinkPhone(), Constants.SmsNotify.SHOP_WAIT_VERIFY,
+                        "orderNo", order.getCode());
+            }
+        }
     }
 
     @Override
@@ -2027,11 +2211,10 @@
         if (!Constants.equalsInteger(order.getMemberId(), memberId)) {
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "鏃犳潈鎿嶄綔姝よ鍗�");
         }
-        // 浠呭凡瀹屾垚(7)銆佸凡鍙栨秷(99)銆佸凡閫�娆�(96)鍙垹闄�
+        // 浠呭凡瀹屾垚(7)銆佸凡鍙栨秷(99)
         int status = Constants.formatIntegerNum(order.getStatus());
         if (status != Constants.OrderStatus.finished.getStatus()
-                && status != Constants.OrderStatus.cancelled.getStatus()
-                && status != Constants.OrderStatus.closed.getStatus()) {
+                && status != Constants.OrderStatus.cancelled.getStatus()) {
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "褰撳墠璁㈠崟鐘舵�佷笉鍙垹闄�");
         }
         ordersMapper.update(new UpdateWrapper<Orders>().lambda()
@@ -2316,6 +2499,9 @@
             orderCommentMapper.insert(driverComment);
         }
 
+        // 4.4 淇濆瓨璇勪环闄勪欢鍥剧墖锛坥bj_type=15锛屾渶澶�3寮狅級
+        saveVerifyImages(order.getId(), dto.getImages(), Constants.FileType.COMMENT_ATTACH.getKey(), null);
+
         // 5. 鏇存柊闂ㄥ簵/鍙告満骞冲潎璇勫垎
         updateTargetScore(Constants.ONE, order.getDepositShopId());
         if (isRemote && order.getTakeShopId() != null) {
@@ -2559,7 +2745,9 @@
             refundRecord.setType(3); // 鍑哄簱閫�娆�
             refundRecord.setCreateTime(now);
             refundRecord.setRefundRemark(remark);
+            refundRecord.setRefundAmount(order.getRefundAmount());
             refundRecord.setDeleted(Constants.ZERO);
+            refundRecord.setBeforeStatus(order.getStatus());
             ordersRefundMapper.insert(refundRecord);
 
             // 璋冪敤寰俊閫�娆綱3锛堟斁鍦ㄦ渶鍚庯紝纭繚鍓嶇疆鎿嶄綔鍏ㄩ儴鎴愬姛锛�
@@ -2674,7 +2862,7 @@
         Long takeShopFee = 0L;
         Long driverFee = 0L;
 
-        if (Constants.equalsInteger(order.getType(), Constants.TWO)) {
+        if (Constants.equalsInteger(order.getType(), Constants.ONE)) {
             // 寮傚湴瀵勫瓨锛氬瓨浠堕棬搴� + 鍙告満
             driverFee = new BigDecimal(totalAmount)
                     .multiply(driverRate)
@@ -2819,6 +3007,15 @@
             sendShopNotice(order.getTakeShopId(), Constants.ShopOrderNotify.ARRIVED, order.getId(),
                     "orderNo", order.getCode(),
                     "destination", destination);
+        }
+
+        // 鐭俊閫氱煡浼氬憳锛氳鏉庡凡閫佽揪
+        Member arrivedMember = memberMapper.selectById(order.getMemberId());
+        if (arrivedMember != null) {
+            sendSmsNotify(arrivedMember.getTelephone(), Constants.SmsNotify.MEMBER_ARRIVED,
+                    "orderNo", order.getCode(),
+                    "address", destination,
+                    "code", order.getMemberVerifyCode() != null ? order.getMemberVerifyCode() : "");
         }
     }
 
@@ -2993,12 +3190,6 @@
         }
         if (Constants.equalsInteger(status, Constants.OrderStatus.cancelled.getStatus())) {
             return "璁㈠崟宸插彇娑堬紝鎰熻阿鎮ㄧ殑鏀寔锛屾杩庝笅娆″啀浼氾紒";
-        }
-        if (Constants.equalsInteger(status, Constants.OrderStatus.cancelling.getStatus())) {
-            return "閫�娆剧敵璇峰凡鎻愪氦锛屽钩鍙颁細灏藉揩涓烘偍澶勭悊閫�娆�";
-        }
-        if (Constants.equalsInteger(status, Constants.OrderStatus.closed.getStatus())) {
-            return "閫�娆惧凡鎴愬姛鍘熻矾杩斿洖锛岃娉ㄦ剰鏌ユ敹";
         }
         return "";
     }
@@ -3294,4 +3485,293 @@
         return vo;
     }
 
+    @Override
+    public int cancelTimeoutUnpaidOrders() {
+        // 鑾峰彇瓒呮椂閰嶇疆锛堝垎閽燂級
+        String autoCancelTimeStr = operationConfigBiz.getConfig().getAutoCancelTime();
+        if (StringUtils.isBlank(autoCancelTimeStr)) {
+            log.info("鏈厤缃秴鏃跺彇娑堟椂闂达紝璺宠繃");
+            return 0;
+        }
+        int autoCancelMinutes;
+        try {
+            autoCancelMinutes = Integer.parseInt(autoCancelTimeStr);
+        } catch (NumberFormatException e) {
+            log.warn("瓒呮椂鍙栨秷鏃堕棿閰嶇疆寮傚父: {}", autoCancelTimeStr);
+            return 0;
+        }
+        if (autoCancelMinutes <= 0) {
+            return 0;
+        }
+
+        // 鏌ヨ鎵�鏈夎秴鏃舵湭鏀粯璁㈠崟锛歴tatus=0 涓� 鍒涘缓鏃堕棿 + 閰嶇疆鍒嗛挓鏁� < 褰撳墠鏃堕棿
+        Date deadline = new Date(System.currentTimeMillis() - (long) autoCancelMinutes * 60 * 1000);
+        List<Orders> timeoutOrders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda()
+                .eq(Orders::getStatus, Constants.OrderStatus.waitPay.getStatus())
+                .eq(Orders::getDeleted, Constants.ZERO)
+                .lt(Orders::getCreateTime, deadline));
+
+        if (timeoutOrders == null || timeoutOrders.isEmpty()) {
+            return 0;
+        }
+
+        int count = 0;
+        Date now = new Date();
+        for (Orders order : timeoutOrders) {
+            try {
+                order.setStatus(Constants.OrderStatus.cancelled.getStatus());
+                order.setCancelTime(now);
+                order.setUpdateTime(now);
+                ordersMapper.updateById(order);
+
+                // 鍐欏叆鎿嶄綔鏃ュ織
+                OrderLog orderLog = new OrderLog();
+                orderLog.setOrderId(order.getId());
+                orderLog.setTitle("绯荤粺鑷姩鍙栨秷锛堣秴鏃舵湭鏀粯锛�");
+                orderLog.setLogInfo("璁㈠崟瓒呮椂" + autoCancelMinutes + "鍒嗛挓鏈敮浠橈紝绯荤粺鑷姩鍙栨秷");
+                orderLog.setObjType(Constants.ORDER_LOG_CANCEL);
+                orderLog.setOrderStatus(Constants.OrderStatus.cancelled.getStatus());
+                orderLog.setOptUserType(3); // 3=绯荤粺
+                orderLog.setCreateTime(now);
+                orderLog.setDeleted(Constants.ZERO);
+                orderLogService.create(orderLog);
+
+                // 鐭俊閫氱煡浼氬憳锛氳鍗曞凡鍙栨秷
+                if (order.getMemberId() != null) {
+                    Member member = memberMapper.selectById(order.getMemberId());
+                    sendSmsNotify(member != null ? member.getTelephone() : null,
+                            Constants.SmsNotify.MEMBER_CANCELLED, "orderNo", order.getCode());
+                }
+
+                count++;
+            } catch (Exception e) {
+                log.error("鍙栨秷瓒呮椂璁㈠崟寮傚父, orderId={}, error={}", order.getId(), e.getMessage());
+            }
+        }
+        log.info("瓒呮椂鏈敮浠樿鍗曡嚜鍔ㄥ彇娑堝畬鎴愶紝鍏卞彇娑坽}鍗�", count);
+        return count;
+    }
+
+    @Override
+    public int notifyUngrabbedOrders() {
+        // 鑾峰彇鏃犱汉鎶㈠崟閫氱煡鏃堕棿閰嶇疆锛堝垎閽燂級
+        String noGrabTimeStr = operationConfigBiz.getConfig().getNoGrabNotifyTime();
+        if (StringUtils.isBlank(noGrabTimeStr)) {
+            return 0;
+        }
+        int noGrabMinutes;
+        try {
+            noGrabMinutes = Integer.parseInt(noGrabTimeStr);
+        } catch (NumberFormatException e) {
+            log.warn("鏃犱汉鎶㈠崟閫氱煡鏃堕棿閰嶇疆寮傚父: {}", noGrabTimeStr);
+            return 0;
+        }
+        if (noGrabMinutes <= 0) {
+            return 0;
+        }
+
+        // 鑾峰彇閫氱煡浜哄憳涓婚敭鍒楄〃
+        String noGrabUsers = operationConfigBiz.getConfig().getNoGrabNotifyUsers();
+        if (StringUtils.isBlank(noGrabUsers)) {
+            return 0;
+        }
+        List<String> userIdStrList = Arrays.asList(noGrabUsers.split(","));
+        List<Integer> userIds = new ArrayList<>();
+        for (String idStr : userIdStrList) {
+            if (StringUtils.isNotBlank(idStr.trim())) {
+                userIds.add(Integer.parseInt(idStr.trim()));
+            }
+        }
+        if (userIds.isEmpty()) {
+            return 0;
+        }
+
+        // 鏌ヨ閫氱煡浜哄憳鎵嬫満鍙�
+        List<String> notifyPhones = new ArrayList<>();
+        for (Integer userId : userIds) {
+            SystemUser user = systemUserMapper.selectById(userId);
+            if (user != null && StringUtils.isNotBlank(user.getMobile())) {
+                notifyPhones.add(user.getMobile());
+            }
+        }
+        if (notifyPhones.isEmpty()) {
+            log.warn("鏃犱汉鎶㈠崟閫氱煡浜哄憳鍧囨棤鏈夋晥鎵嬫満鍙�");
+            return 0;
+        }
+
+        // 鏌ヨ寮傚湴宸插瘎瀛�(status=2)銆佹湭閫氱煡(platformSmsNotified=0鎴杗ull)銆佽秴鏃剁殑璁㈠崟
+        Date deadline = new Date(System.currentTimeMillis() - (long) noGrabMinutes * 60 * 1000);
+        List<Orders> ungrabbedOrders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda()
+                .eq(Orders::getType, Constants.ONE) // 寮傚湴瀵勫瓨
+                .eq(Orders::getStatus, Constants.OrderStatus.deposited.getStatus()) // 宸插瘎瀛�
+                .eq(Orders::getDeleted, Constants.ZERO)
+                .ne(Orders::getPlatformSmsNotified, Constants.ONE) // 鏈�氱煡
+                .lt(Orders::getPlatformSmsNotifiedTime, deadline)); // 閫氱煡鍩哄噯鏃堕棿瓒呰繃閰嶇疆鏃堕棿
+
+        if (ungrabbedOrders == null || ungrabbedOrders.isEmpty()) {
+            return 0;
+        }
+
+        int count = 0;
+        Date now = new Date();
+        for (Orders order : ungrabbedOrders) {
+            try {
+                // 缁欐墍鏈夐�氱煡浜哄憳鍙戠煭淇�
+                for (String phone : notifyPhones) {
+                    sendSmsNotify(phone, Constants.SmsNotify.PLATFORM_WAIT_GRAB,
+                            "orderNo", order.getCode(),
+                            "time", String.valueOf(noGrabMinutes));
+                }
+                // 鏍囪宸查�氱煡 + 璁板綍閫氱煡鏃堕棿
+                order.setPlatformSmsNotified(Constants.ONE);
+                order.setPlatformSmsNotifiedTime(now);
+                order.setUpdateTime(now);
+                ordersMapper.updateById(order);
+                count++;
+            } catch (Exception e) {
+                log.error("鏃犱汉鎶㈠崟鐭俊閫氱煡寮傚父, orderId={}, error={}", order.getId(), e.getMessage());
+            }
+        }
+        log.info("鏃犱汉鎶㈠崟鐭俊閫氱煡瀹屾垚锛屽叡閫氱煡{}鍗�", count);
+        return count;
+    }
+
+    @Override
+    public int autoCompleteOrders() {
+        // 鑾峰彇鑷姩纭鏀惰揣澶╂暟閰嶇疆
+        String autoConfirmDaysStr = operationConfigBiz.getConfig().getAutoConfirmReceipt();
+        if (StringUtils.isBlank(autoConfirmDaysStr)) {
+            return 0;
+        }
+        int autoConfirmDays;
+        try {
+            autoConfirmDays = Integer.parseInt(autoConfirmDaysStr);
+        } catch (NumberFormatException e) {
+            log.warn("鑷姩纭鏀惰揣澶╂暟閰嶇疆寮傚父: {}", autoConfirmDaysStr);
+            return 0;
+        }
+        if (autoConfirmDays <= 0) {
+            return 0;
+        }
+
+        // 鏌ヨ宸查�佽揪(status=5)涓旈�佽揪鏃堕棿瓒呰繃閰嶇疆澶╂暟鐨勮鍗�
+        Date deadline = new Date(System.currentTimeMillis() - (long) autoConfirmDays * 24 * 60 * 60 * 1000);
+        List<Orders> orders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda()
+                .eq(Orders::getStatus, Constants.OrderStatus.arrived.getStatus())
+                .eq(Orders::getDeleted, Constants.ZERO)
+                .isNotNull(Orders::getArriveTime)
+                .lt(Orders::getArriveTime, deadline));
+
+        if (orders == null || orders.isEmpty()) {
+            return 0;
+        }
+
+        int count = 0;
+        Date now = new Date();
+        for (Orders order : orders) {
+            try {
+                // 閫炬湡鏈敮浠樼殑涓嶈嚜鍔ㄥ畬鎴�
+                if (Constants.equalsInteger(order.getOverdueStatus(), Constants.ONE)) {
+                    continue;
+                }
+
+                // 鏇存柊璁㈠崟鐘舵�佷负宸插畬鎴�
+                order.setStatus(Constants.OrderStatus.finished.getStatus());
+                order.setFinishTime(now);
+                order.setUpdateTime(now);
+                ordersMapper.updateById(order);
+
+                // 閲婃斁鏍搁攢鐮�
+                if (StringUtils.isNotBlank(order.getMemberVerifyCode())) {
+                    releaseVerifyCode(order.getMemberVerifyCode());
+                }
+
+                // 鐢熸垚鏀剁泭璁板綍
+                calculateAndSaveOrderFees(order.getId());
+                generateRevenueRecords(order.getId());
+
+                // 璁板綍鎿嶄綔鏃ュ織
+                OrderLog orderLog = new OrderLog();
+                orderLog.setOrderId(order.getId());
+                orderLog.setTitle("绯荤粺鑷姩瀹屾垚");
+                orderLog.setLogInfo("璁㈠崟宸查�佽揪瓒呰繃" + autoConfirmDays + "澶╂湭纭锛岀郴缁熻嚜鍔ㄥ畬鎴�");
+                orderLog.setObjType(Constants.ORDER_LOG_CANCEL);
+                orderLog.setOrderStatus(Constants.OrderStatus.finished.getStatus());
+                orderLog.setOptUserType(3); // 3=绯荤粺
+                orderLog.setCreateTime(now);
+                orderLog.setDeleted(Constants.ZERO);
+                orderLogService.create(orderLog);
+
+                // 閫氱煡浼氬憳锛氳鍗曞凡瀹屾垚
+                sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.FINISHED, order.getId(),
+                        "orderNo", order.getCode());
+                // 閫氱煡瀛樹欢闂ㄥ簵鍜屽彇浠堕棬搴�
+                String settleDays = operationConfigBiz.getConfig().getSettlementDate();
+                notifyBothShops(order, Constants.ShopOrderNotify.FINISHED,
+                        "orderNo", order.getCode(),
+                        "settleDays", settleDays != null ? settleDays : "7");
+                // 閫氱煡鍙告満
+                if (order.getAcceptDriver() != null) {
+                    sendDriverNotice(order.getAcceptDriver(), Constants.DriverOrderNotify.FINISHED, order.getId(),
+                            "orderNo", order.getCode(),
+                            "settleDays", settleDays != null ? settleDays : "7");
+                }
+
+                count++;
+            } catch (Exception e) {
+                log.error("鑷姩瀹屾垚璁㈠崟寮傚父, orderId={}, error={}", order.getId(), e.getMessage());
+            }
+        }
+        log.info("鑷姩瀹屾垚瓒呮椂璁㈠崟瀹屾垚锛屽叡瀹屾垚{}鍗�", count);
+        return count;
+    }
+
+    /**
+     * 鍙戦�佺煭淇¢�氱煡锛堝け璐ヤ笉褰卞搷涓讳笟鍔★級
+     * @param phone       鎺ユ敹鎵嬫満鍙�
+     * @param smsNotify   鐭俊妯℃澘鏋氫妇
+     * @param paramPairs  妯℃澘鍙傛暟锛宬ey-value 浜ゆ浛浼犲叆锛屽 "orderNo", "XL202604220001"
+     */
+    private void sendSmsNotify(String phone, Constants.SmsNotify smsNotify, String... paramPairs) {
+        if (StringUtils.isBlank(phone)) {
+            return;
+        }
+        String content = smsNotify.format(paramPairs);
+        try {
+            JSONObject templateParam = new JSONObject();
+            for (int i = 0; i < paramPairs.length - 1; i += 2) {
+                templateParam.put(paramPairs[i], paramPairs[i + 1]);
+            }
+            boolean result = AliSmsService.sendSms(phone, smsNotify.getTemplateCode(),
+                    templateParam.toJSONString());
+            if (result) {
+                log.info("鐭俊鍙戦�佹垚鍔�: phone={}, template={}", phone, smsNotify.name());
+            } else {
+                log.warn("鐭俊鍙戦�佸け璐�: phone={}, template={}", phone, smsNotify.name());
+            }
+            // 瀛樺偍鐭俊璁板綍
+            Smsrecord record = new Smsrecord();
+            record.setPhone(phone);
+            record.setContent(content);
+            record.setType(Constants.ONE); // 1=璁㈠崟閫氱煡
+            record.setStatus(result ? Constants.ONE : Constants.ZERO); // 1=宸插彂閫�, 0=鍙戦�佸け璐�
+            record.setCreateTime(new Date());
+            record.setDeleted(Constants.ZERO);
+            smsrecordMapper.insert(record);
+        } catch (Exception e) {
+            log.error("鐭俊鍙戦�佸紓甯�: phone={}, template={}, error={}", phone, smsNotify.name(), e.getMessage());
+            // 寮傚父涔熻褰�
+            try {
+                Smsrecord record = new Smsrecord();
+                record.setPhone(phone);
+                record.setContent(content);
+                record.setType(Constants.ONE);
+                record.setStatus(Constants.ZERO); // 鍙戦�佸け璐�
+                record.setCreateTime(new Date());
+                record.setDeleted(Constants.ZERO);
+                smsrecordMapper.insert(record);
+            } catch (Exception ignored) {}
+        }
+    }
+
 }
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 bf73fc6..1fb1f71 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
@@ -173,8 +173,7 @@
         if (shop == null || Constants.equalsInteger(shop.getDeleted(), Constants.ONE)) {
             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "闂ㄥ簵涓嶅瓨鍦�");
         }
-        Integer memberId = shop.getRegionMemberId();
-        return buildRevenueStatistics(memberId, Constants.TWO, shop.getBalance());
+        return buildRevenueStatistics(shop.getId(), Constants.TWO, shop.getBalance());
     }
 
     @Override
@@ -257,7 +256,7 @@
             throw new BusinessException(ResponseStatus.DATA_EMPTY);
         }
         IPage<Revenue> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
-        QueryWrapper<Revenue> qw = buildRevenueQueryWrapper(pageWrap.getModel(), shop.getRegionMemberId());
+        QueryWrapper<Revenue> qw = buildRevenueQueryWrapper(pageWrap.getModel(), shop.getId());
         PageData<Revenue> result = PageData.from(revenueMapper.selectPage(page, qw));
         if (result != null && result.getRecords() != null) {
             for (Revenue model : result.getRecords()) {
@@ -278,7 +277,7 @@
         if (shop == null || Constants.equalsInteger(shop.getDeleted(), Constants.ONE)) {
             throw new BusinessException(ResponseStatus.DATA_EMPTY);
         }
-        return buildRevenueSummary(queryDTO, shop.getRegionMemberId());
+        return buildRevenueSummary(queryDTO, shop.getId());
     }
 
     private QueryWrapper<Revenue> buildRevenueQueryWrapper(RevenueQueryDTO query, Integer memberId) {
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 cfc176a..efd4e45 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
@@ -32,6 +32,7 @@
 import com.doumee.dao.vo.ShopCenterVO;
 import com.doumee.dao.vo.ShopLoginVO;
 import com.doumee.dao.vo.ShopNearbyVO;
+import com.doumee.dao.vo.ShopSalesStatsVO;
 import com.doumee.dao.vo.ShopWebDetailVO;
 import com.doumee.service.business.AreasService;
 import com.doumee.service.business.ShopInfoService;
@@ -996,6 +997,106 @@
                 .eq(Orders::getDeleted, Constants.ZERO)
                 .in(Orders::getStatus, Constants.OrderStatus.delivering.getStatus(), Constants.OrderStatus.arrived.getStatus()));
         vo.setWaitReceiveCount(waitReceiveCount.intValue());
+        // 鏀粯瀹濇彁鐜拌处鍙�
+        vo.setAliAccount(shop.getAliAccount());
+        vo.setAliName(shop.getAliName());
+        return vo;
+    }
+
+    @Override
+    public ShopSalesStatsVO getShopSalesStats(Integer shopId, Integer period) {
+        // 璁$畻鏃堕棿鑼冨洿 0=浠婃棩 1=鏈湀 2=涓婃湀
+        Calendar cal = Calendar.getInstance();
+        Date startTime;
+        Date endTime;
+
+        if (Constants.equalsInteger(period, 2)) {
+            // 涓婃湀锛氫笂鏈�1鍙�00:00:00 ~ 鏈湀1鍙�00:00:00
+            cal.set(Calendar.DAY_OF_MONTH, 1);
+            cal.set(Calendar.HOUR_OF_DAY, 0);
+            cal.set(Calendar.MINUTE, 0);
+            cal.set(Calendar.SECOND, 0);
+            cal.set(Calendar.MILLISECOND, 0);
+            endTime = cal.getTime();
+            cal.add(Calendar.MONTH, -1);
+            startTime = cal.getTime();
+        } else if (Constants.equalsInteger(period, 1)) {
+            // 鏈湀锛氭湰鏈�1鍙�00:00:00 ~ 涓嬫湀1鍙�00:00:00
+            cal.set(Calendar.DAY_OF_MONTH, 1);
+            cal.set(Calendar.HOUR_OF_DAY, 0);
+            cal.set(Calendar.MINUTE, 0);
+            cal.set(Calendar.SECOND, 0);
+            cal.set(Calendar.MILLISECOND, 0);
+            startTime = cal.getTime();
+            cal.add(Calendar.MONTH, 1);
+            endTime = cal.getTime();
+        } else {
+            // 浠婃棩锛氫粖澶�00:00:00 ~ 鏄庡ぉ00:00:00
+            cal.set(Calendar.HOUR_OF_DAY, 0);
+            cal.set(Calendar.MINUTE, 0);
+            cal.set(Calendar.SECOND, 0);
+            cal.set(Calendar.MILLISECOND, 0);
+            startTime = cal.getTime();
+            cal.add(Calendar.DAY_OF_MONTH, 1);
+            endTime = cal.getTime();
+        }
+
+        ShopSalesStatsVO vo = new ShopSalesStatsVO();
+
+        // 1. 閿�鍞 + 璁㈠崟鏁帮細鎸夎鍗曞垱寤烘椂闂达紝瀛樹欢闂ㄥ簵鎴栧彇浠堕棬搴楁槸鏈棬搴�
+        // 瀛樹欢闂ㄥ簵
+        List<Orders> depositSalesOrders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda()
+                .eq(Orders::getDeleted, Constants.ZERO)
+                .ge(Orders::getCreateTime, startTime)
+                .lt(Orders::getCreateTime, endTime)
+                .eq(Orders::getDepositShopId, shopId));
+        // 鍙栦欢闂ㄥ簵
+        List<Orders> takeSalesOrders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda()
+                .eq(Orders::getDeleted, Constants.ZERO)
+                .ge(Orders::getCreateTime, startTime)
+                .lt(Orders::getCreateTime, endTime)
+                .eq(Orders::getTakeShopId, shopId));
+        long salesAmount = depositSalesOrders.stream().mapToLong(o -> o.getTotalAmount() != null ? o.getTotalAmount() : 0L).sum()
+                + takeSalesOrders.stream().mapToLong(o -> o.getTotalAmount() != null ? o.getTotalAmount() : 0L).sum();
+        vo.setSalesAmount(salesAmount);
+        vo.setOrderCount(depositSalesOrders.size() + takeSalesOrders.size());
+
+        // 2. 缁撶畻鍒╂鼎锛氭寜缁撶畻鏃堕棿锛屾牴鎹棬搴楄鑹插彇depositShopFee鎴杢akeShopFee
+        // 瀛樹欢闂ㄥ簵 = 鏈棬搴� 鐨勮鍗曪紝鍙� depositShopFee
+        List<Orders> depositSettleOrders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda()
+                .eq(Orders::getDeleted, Constants.ZERO)
+                .eq(Orders::getSettlementStatus, Constants.ONE)
+                .ge(Orders::getSettlementTime, startTime)
+                .lt(Orders::getSettlementTime, endTime)
+                .eq(Orders::getDepositShopId, shopId));
+        // 鍙栦欢闂ㄥ簵 = 鏈棬搴� 鐨勮鍗曪紝鍙� takeShopFee
+        List<Orders> takeSettleOrders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda()
+                .eq(Orders::getDeleted, Constants.ZERO)
+                .eq(Orders::getSettlementStatus, Constants.ONE)
+                .ge(Orders::getSettlementTime, startTime)
+                .lt(Orders::getSettlementTime, endTime)
+                .eq(Orders::getTakeShopId, shopId));
+        long depositFee = depositSettleOrders.stream()
+                .mapToLong(o -> o.getDepositShopFee() != null ? o.getDepositShopFee() : 0L).sum();
+        long takeFee = takeSettleOrders.stream()
+                .mapToLong(o -> o.getTakeShopFee() != null ? o.getTakeShopFee() : 0L).sum();
+        vo.setSettlementProfit(depositFee + takeFee);
+
+        // 3. 鍦ㄥ簱璁㈠崟鏁�
+        // 3.1 瀛樹欢闂ㄥ簵=鏈棬搴楋紝status in (2宸插瘎瀛�, 5寰呭彇浠�)
+        Long depositStorageCount = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda()
+                .eq(Orders::getDeleted, Constants.ZERO)
+                .eq(Orders::getDepositShopId, shopId)
+                .in(Orders::getStatus,
+                        Constants.OrderStatus.deposited.getStatus(),
+                        Constants.OrderStatus.arrived.getStatus()));
+        // 3.2 鍙栦欢闂ㄥ簵=鏈棬搴楋紝status = 5寰呭彇浠�
+        Long takeStorageCount = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda()
+                .eq(Orders::getDeleted, Constants.ZERO)
+                .eq(Orders::getTakeShopId, shopId)
+                .eq(Orders::getStatus, Constants.OrderStatus.arrived.getStatus()));
+        vo.setStorageCount(depositStorageCount.intValue() + takeStorageCount.intValue());
+
         return vo;
     }
 
diff --git a/server/services/src/main/resources/application-dev.yml b/server/services/src/main/resources/application-dev.yml
index 04d8331..2f1df3b 100644
--- a/server/services/src/main/resources/application-dev.yml
+++ b/server/services/src/main/resources/application-dev.yml
@@ -95,17 +95,17 @@
 
 alipay:
   pay:
-    appId: 2021006146614417
-    privateKey: MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC0zIy4Ej8yG34uQ8zECWu12INdTWYuvSudhrf1qtUrPx4FO9vDGc8NdPz63M3y+akWh9o8gsl7qQqOoB7o8gYebLTzF2ZP3ByxgkNRGUwZBIi0iL/28eq/2uDCWnqNBDEeFQpfWeRcErC28LCB6JSI7F6owH78LiU8pNO0pVvqwvcLovlVee4UDtLThBegUxkkHXq4EM9yutkfps1ruDiTGFYyTjS8g9BmNJ7rJoRSKTE85Gl8OYp1SuFbyurPEaFLBW9yGHbsqMqegys2PwV6PxZq3WBbFMiuWI5fane+VL2jyVoV36CYPS2GFjq0stuUHZvPL1uYk+bwAAei7a2JAgMBAAECggEBAJMnTX1gNJl28Qt82YPRWx6F292r6nguNfqftMi6Q4hQdgGyh5rTPcfpKSKRZvrVIz+YURMhLBZ/Ln2Ja78ThdFrjxewOvDS6XO830d5vIs8OnweNYgrvHJtFrR5afeuqr+eRnP3OTuLZtNvMWp6v7J2GFFnY7OjZ2Flkn4cfKSkqnLQnZ/oDKA/a40OclHRmaQZcS5YkGZqeR+NssanUDad89IVz7NU0kXTbaXjbGHyJscLr6hM3otdfrYsboJ5XHLOnnpSLptv3I0HSUeHBSdhAbP5Hlot+xOo6EbeougefmT2FZWaDA+kPHgajCOdZHW3v+13Xp+PioRW0IPcsLUCgYEA+11Fqm+tpP351tdkJyW+weTy0/OnvUuSVQP/0/kvzQ84kjfkxdoyTKe6kT8+K5b5dkCQhGRfWgb7/amKEe1loCQsujf7/6aebUgTevrOs96LErMT1fCqId1t/MWgXVFpzo8n2OTks2r0nleHY7C9VZiPIbGBQDbkJChIFRAiRXsCgYEAuCIg2p4RrlOG/i4/r1xKmOIwba9snTBnAB8/bri913xMy055OVF6P46hC6d/J25QNqYGODBBF4kmiBuco+vtuz6C94Uo3h/oYD3jetmwlAnRWjEl9Z3Pkf5cbE+o5KBZmUa+M7BTrBDutzdRDqX2SANvnoDWVF03teY9lcVNL8sCgYEAoFdeEhtNC/tKfKZG58XnCe4Oi+9YJ6LmRD7Z2RCSUl8MOhFXaHIINeekVfSeptWWab1DsoAIZvgflC6quUbS1bVdpqgBopFZa+JXMtJ8OjaSRipfU9BB5npGJ8C0y/Ib6TxeMbfIvz5RrhOtdIUQMWKwotCE3z5khz/+wxjYk7MCgYBrMesgeo9ehl/7T99hboA7GssIv+yiYhBEoOxjwAc9EK8AWNH3zXg20gjtaPh8cxsdhW/vfCAY3I5jBHgfcfU3YcAK6ymMjtTQWpc46MyEkmafdCdeIx45JvSVVZbEaplewzFtlARSEpV2ciytM276I43yn5ynBpGtQrmtnGxAGwKBgQCy8imu84IhC+BivLRYdsQ+hMsqs0nih4wfVPKWr6K64QO6CZ4riL76lppH8UBG5EXtRd6cjBbORgvQtr22OJxFcj8WuZjBvYvvCOsTE0jGMdiyBqx9k0PsLrtlVZPFP4kj9vDSFNIyAgIOiAmYY4kBtGfhQqRcDgZK+mgHY0zMbg==
-    appCertPath: foo/dev/appCertPublicKey_2021006146614417.crt
-    alipayPublicCertPath: foo/dev/alipayCertPublicKey_RSA2.crt
-    rootCertPath: foo/dev/alipayRootCert.crt
+    appId: 2021006147660139
+    privateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDEeqqkZztBHfK+vpyBi6ejgDTHZuZ3yiuXds+lRBbMo/g24F5trH+oLHW0gMhSxihFfQBBIpVBXDsPQK4ZkhDWTaOBktnU1UMRoOEiaaZU6EiWy10ePFUmpdXpkCQEp7rc88OwI90p58S3+L+Ckak60WqNwJBdB5YGBaUunryBA78U4zW1KNY7JvoRnZDcFMQiczikwUzhO7EAi0yVrVpsVsc9s87mcS4uOJKx4qb2E83r9RJ1z30db+cIIZRiLP2oNZBLYzgKpOouE+uIgxhQzlh6cOASNZQulXuUjoT/+Y9w4njfl4TmKIXWcJFKIMc6kMiux9tTncpp0TqRwk1tAgMBAAECggEALkSYtJheusnbpRFr95G0i2sggqh3s1PXihZ/dXKgT9Z5GCsj8X3Cng7CNRxykBN73kk+axhCv56Bhej8Vqcv8ddcnqG/TEBgR+Fzws/QTIRau6/uILWic7RvuE2qPbJl7aw1s9/uL/UVPSGFr7CvgltYVUM4e7/Sk1529JCK4XJfoXP5tKJ3OaXssvaFnCKEU8IGQkjRG+lUZJhAHVtClGHtgrhevgRhy2zre5wp2qSa8d/MqrPruSYS02hn9b5Nl6i2PlUS6dGlJ4lrxYTG22ukYYoxAPNPS7gnvmveXonWP7b5tPhKRpZjnoySojz3WECUlhz/v8wM1cDrpq+GQQKBgQDsc7y2rlx4f77a7ORfb5/qWHCOJs1cIzggj0kJ7TgFGe71kbCQ5nywD/Fe5V9OwbW+DCxOME+SrrHeiK4axWiu5si/1JlurJoxNy+4k4ywk3ZA3Nv2aBhlPqfkwDhJ0z7Mgsq2c/YgnVddmSvKZoC39wA77ovks4GDxaBOt8N7PQKBgQDUuPGgzkwcgb60UdaxfMbacrPsW26vDxaE4ceuXo2m8KDiCIqkF2y9r6AdWMTgGGSJwOsk7+FP+21VdRivCg9HcOLWngveUc6xDIuqKHVpemMo3SdCF4Wqf96rRc3VOBr5cfIdWxeorZf5umMyKnIAjAFETOOrK7eLTTmjyLD98QKBgB82S+Plcklpu3zUpnS+nGJn2Du7fYI7F+6cW2zXBn0N5lA+Mgt+kVkAUcFQD9uqkF4M51BO6kIXk10nt6vLAT2NM1S3MKW+XQBAI6l+uKSaYpK/VL3bEdVThwAYK5X7L5/5Z97bwdKeUmkFjhVCoJ0oGrzOiWLgGymUzct2UHSVAoGBAMb+7Cs+Ub0pMrmFBY6r52pbey1Uq0pglvRgMmhQU7sjx50r2GaA81zPer15WVM5/nNPYaoALYqg7jrPe/PjOT/fvpR+7SNg7DZ8QftANfYiY7jKifst/gDt9ePLPS6FedZ4XcJQgOVu34jicAFx64vPbS/zrddm4iEScSVijRBBAoGAXCheERsx8+n16Us/DttXFUa1nc7+D8WR6buM1QMZgQCVF2qp3XtM+FusCKL4+q1+dtag8svLjJFp9QbaAXqX8Zk7rn8wUHbDloPTPy9XWgrPowyL9MPU+e/Rq8Hr6TWPDBd4TU64YzIEfBQYpJXfZbXhVYmK3o7xHXKB1x4vvEM=
+    appCertPath: pay/pro/appCertPublicKey.crt
+    alipayPublicCertPath: pay/pro/alipayCertPublicKey_RSA2.crt
+    rootCertPath: pay/pro/alipayRootCert.crt
 
 upload:
   type: ftp
 
 # 鑵捐鍦板浘apikey
-tencent_key: WE3BZ-HN6WS-ONDOH-62QCV-MNL6F-5NFNE
+tencent_key:
 
 # 楂樺痉鍦板浘apikey
 geocode_map_key: 9a6c1f0eff2e5aa91989ca9d4c21e262
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 42e0df5..7113803 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
@@ -1,6 +1,7 @@
 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.constants.Constants;
 import com.doumee.core.model.ApiResponse;
@@ -168,6 +169,33 @@
     }
 
 
+    @LoginShopRequired
+    @ApiOperation(value = "闂ㄥ簵閫氱煡娑堟伅鍒嗛〉", notes = "鏈浼樺厛锛屾椂闂村�掑簭")
+    @PostMapping("/shopNoticePage")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true)
+    })
+    public ApiResponse<PageData<Notice>> shopNoticePage(@RequestBody PageWrap<Notice> pageWrap) {
+        if (pageWrap.getModel() == null) {
+            pageWrap.setModel(new Notice());
+        }
+        pageWrap.getModel().setUserId(this.getShopId());
+        pageWrap.getModel().setUserType(Constants.TWO);
+        return ApiResponse.success("鏌ヨ鎴愬姛", noticeService.findPage(pageWrap));
+    }
+
+    @LoginRequired
+    @ApiOperation(value = "闂ㄥ簵鏍囪鍏ㄩ儴宸茶", notes = "鏍囪褰撳墠鐢ㄦ埛鎵�鏈夋湭璇婚�氱煡涓哄凡璇�")
+    @PostMapping("/shopReadAllNotice")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true)
+    })
+    public ApiResponse shopReadAllNotice() {
+        noticeService.readAllNotice(Constants.TWO, this.getShopId());
+        return ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
+
+
     @LoginRequired
     @ApiOperation(value = "棣栭〉杩涜涓鍗曟彁绀�", notes = "杩斿洖鏈�鏂颁竴鏉¤繘琛屼腑璁㈠崟鐨勭姸鎬佸拰鎻愮ず鏂囨锛屾棤璁㈠崟杩斿洖null")
     @GetMapping("/getActiveOrderTip")
diff --git a/server/web/src/main/java/com/doumee/api/web/PaymentCallback.java b/server/web/src/main/java/com/doumee/api/web/PaymentCallback.java
index 40e530d..43989ac 100644
--- a/server/web/src/main/java/com/doumee/api/web/PaymentCallback.java
+++ b/server/web/src/main/java/com/doumee/api/web/PaymentCallback.java
@@ -4,11 +4,17 @@
 import com.doumee.config.wx.WxPayV3Service;
 import com.doumee.core.constants.Constants;
 import com.doumee.core.utils.ID;
+import com.doumee.core.utils.aliyun.AliSmsService;
+import com.doumee.dao.business.MemberMapper;
 import com.doumee.dao.business.OrdersRefundMapper;
 import com.doumee.dao.business.OrdersMapper;
+import com.doumee.dao.business.SmsrecordMapper;
+import com.doumee.dao.business.model.Member;
 import com.doumee.dao.business.model.Notice;
 import com.doumee.dao.business.model.Orders;
 import com.doumee.dao.business.model.OrdersRefund;
+import com.doumee.dao.business.model.Smsrecord;
+import com.alibaba.fastjson.JSONObject;
 import com.doumee.service.business.NoticeService;
 import com.doumee.service.business.OrdersService;
 import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
@@ -49,6 +55,12 @@
 
     @Autowired
     private NoticeService noticeService;
+
+    @Autowired
+    private SmsrecordMapper smsrecordMapper;
+
+    @Autowired
+    private MemberMapper memberMapper;
 
 
     // ==================== V2 鍥炶皟 ====================
@@ -171,32 +183,84 @@
                             .last("limit 1"));
             if (refundRecord != null) {
                 Status refundStatus = refundNotification.getRefundStatus();
-                if (Status.SUCCESS.equals(refundStatus)) {
-                    refundRecord.setStatus(Constants.ONE); // 閫�娆炬垚鍔�
-                    refundRecord.setRefundTime(new java.util.Date());
-                } else if (Status.CLOSED.equals(refundStatus) || Status.ABNORMAL.equals(refundStatus)) {
-                    refundRecord.setStatus(Constants.TWO); // 閫�娆惧け璐�
-                }
-                ordersRefundMapper.updateById(refundRecord);
-                log.info("閫�娆捐褰曠姸鎬佸凡鏇存柊, refundRecordId={}, status={}", refundRecord.getId(), refundRecord.getStatus());
 
-                // 閫�娆炬垚鍔� 鈫� 閫氱煡浼氬憳
-                if (Status.SUCCESS.equals(refundStatus) && refundRecord.getOrderId() != null) {
-                    Orders refundOrder = ordersMapper.selectById(refundRecord.getOrderId());
-                    if (refundOrder != null) {
-                        Notice notice = new Notice();
-                        notice.setUserType(0);
-                        notice.setUserId(refundOrder.getMemberId());
-                        notice.setTitle(Constants.MemberOrderNotify.REFUNDED.getTitle());
-                        notice.setContent(Constants.MemberOrderNotify.REFUNDED.format(
-                                "orderNo", refundOrder.getCode(),
-                                "amount", String.valueOf(Constants.getFormatMoney(refundOrder.getRefundAmount() != null ? refundOrder.getRefundAmount() : 0L))));
-                        notice.setObjId(refundOrder.getId());
-                        notice.setObjType(0);
-                        notice.setStatus(0);
-                        notice.setIsdeleted(Constants.ZERO);
-                        notice.setCreateDate(new java.util.Date());
-                        noticeService.create(notice);
+                // 骞傜瓑鍒ゆ柇锛氬凡鎴愬姛/宸插け璐ョ殑涓嶉噸澶嶅鐞�
+                if (!Constants.equalsInteger(refundRecord.getStatus(), Constants.ZERO)) {
+                    log.info("閫�娆捐褰曞凡澶勭悊, refundRecordId={}, status={}, 璺宠繃", refundRecord.getId(), refundRecord.getStatus());
+                } else {
+                    if (Status.SUCCESS.equals(refundStatus)) {
+                        refundRecord.setStatus(Constants.ONE); // 閫�娆炬垚鍔�
+                        refundRecord.setRefundTime(new java.util.Date());
+                    } else if (Status.CLOSED.equals(refundStatus) || Status.ABNORMAL.equals(refundStatus)) {
+                        refundRecord.setStatus(Constants.TWO); // 閫�娆惧け璐�
+                        refundRecord.setRemark("寰俊閫�娆惧け璐�: " + refundStatus.name());
+                    }
+                    // PROCESSING 鐘舵�佹棤鍙樺寲锛屼笉鏇存柊
+                    ordersRefundMapper.updateById(refundRecord);
+                    log.info("閫�娆捐褰曠姸鎬佸凡鏇存柊, refundRecordId={}, status={}", refundRecord.getId(), refundRecord.getStatus());
+
+                    // 閫�娆炬垚鍔� 鈫� 閫氱煡浼氬憳
+                    if (Status.SUCCESS.equals(refundStatus) && refundRecord.getOrderId() != null) {
+                        Orders refundOrder = ordersMapper.selectById(refundRecord.getOrderId());
+                        if (refundOrder != null) {
+                            Notice notice = new Notice();
+                            notice.setUserType(0);
+                            notice.setUserId(refundOrder.getMemberId());
+                            notice.setTitle(Constants.MemberOrderNotify.REFUNDED.getTitle());
+                            notice.setContent(Constants.MemberOrderNotify.REFUNDED.format(
+                                    "orderNo", refundOrder.getCode(),
+                                    "amount", String.valueOf(Constants.getFormatMoney(refundOrder.getRefundAmount() != null ? refundOrder.getRefundAmount() : 0L))));
+                            notice.setObjId(refundOrder.getId());
+                            notice.setObjType(0);
+                            notice.setStatus(0);
+                            notice.setIsdeleted(Constants.ZERO);
+                            notice.setCreateDate(new java.util.Date());
+                            noticeService.create(notice);
+
+                            // 鐭俊閫氱煡浼氬憳锛氶��娆惧凡瀹屾垚
+                            Member refundMember = memberMapper.selectById(refundOrder.getMemberId());
+                            if (refundMember != null && StringUtils.isNotBlank(refundMember.getTelephone())) {
+                                String smsContent = Constants.SmsNotify.MEMBER_REFUNDED.format(
+                                        "orderNo", refundOrder.getCode(),
+                                        "money", String.valueOf(Constants.getFormatMoney(
+                                                refundOrder.getRefundAmount() != null ? refundOrder.getRefundAmount() : 0L)));
+                                try {
+                                    JSONObject templateParam = new JSONObject();
+                                    templateParam.put("orderNo", refundOrder.getCode());
+                                    templateParam.put("money", String.valueOf(Constants.getFormatMoney(
+                                            refundOrder.getRefundAmount() != null ? refundOrder.getRefundAmount() : 0L)));
+                                    boolean smsResult = AliSmsService.sendSms(refundMember.getTelephone(),
+                                            Constants.SmsNotify.MEMBER_REFUNDED.getTemplateCode(),
+                                            templateParam.toJSONString());
+                                    if (smsResult) {
+                                        log.info("閫�娆剧煭淇″彂閫佹垚鍔�: phone={}", refundMember.getTelephone());
+                                    } else {
+                                        log.warn("閫�娆剧煭淇″彂閫佸け璐�: phone={}", refundMember.getTelephone());
+                                    }
+                                    // 瀛樺偍鐭俊璁板綍
+                                    Smsrecord smsRecord = new Smsrecord();
+                                    smsRecord.setPhone(refundMember.getTelephone());
+                                    smsRecord.setContent(smsContent);
+                                    smsRecord.setType(Constants.ONE);
+                                    smsRecord.setStatus(smsResult ? Constants.ONE : Constants.ZERO);
+                                    smsRecord.setCreateTime(new java.util.Date());
+                                    smsRecord.setDeleted(Constants.ZERO);
+                                    smsrecordMapper.insert(smsRecord);
+                                } catch (Exception smsEx) {
+                                    log.error("閫�娆剧煭淇″彂閫佸紓甯�: {}", smsEx.getMessage());
+                                    try {
+                                        Smsrecord smsRecord = new Smsrecord();
+                                        smsRecord.setPhone(refundMember.getTelephone());
+                                        smsRecord.setContent(smsContent);
+                                        smsRecord.setType(Constants.ONE);
+                                        smsRecord.setStatus(Constants.ZERO);
+                                        smsRecord.setCreateTime(new java.util.Date());
+                                        smsRecord.setDeleted(Constants.ZERO);
+                                        smsrecordMapper.insert(smsRecord);
+                                    } catch (Exception ignored) {}
+                                }
+                            }
+                        }
                     }
                 }
             }
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 6595950..9897cb0 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
@@ -13,6 +13,7 @@
 import com.doumee.dao.vo.ShopDetailVO;
 import com.doumee.dao.vo.ShopCenterVO;
 import com.doumee.dao.vo.ShopNearbyVO;
+import com.doumee.dao.vo.ShopSalesStatsVO;
 import com.doumee.dao.vo.ShopWebDetailVO;
 import com.doumee.dao.vo.PayResponse;
 import com.doumee.service.business.OrdersService;
@@ -80,6 +81,17 @@
     }
 
     @LoginShopRequired
+    @ApiOperation("闂ㄥ簵閿�鍞粺璁�")
+    @GetMapping("/salesStats")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "闂ㄥ簵token鍊�", required = true),
+            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "period", value = "缁熻鍛ㄦ湡锛�0=浠婃棩, 1=鏈湀, 2=涓婃湀", required = true)
+    })
+    public ApiResponse<ShopSalesStatsVO> salesStats(@RequestParam Integer period) {
+        return ApiResponse.success("鏌ヨ鎴愬姛", shopInfoService.getShopSalesStats(getShopId(), period));
+    }
+
+    @LoginShopRequired
     @ApiOperation("缁存姢闂ㄥ簵淇℃伅锛堟敮浠樻娂閲戝悗锛�")
     @PostMapping("/maintain")
     public ApiResponse maintain(@RequestBody ShopInfoMaintainDTO dto) {

--
Gitblit v1.9.3