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

---
 server/services/src/main/java/com/doumee/dao/dto/OrderItemDTO.java                              |   26 
 server/services/src/main/java/com/doumee/dao/business/model/Addr.java                           |  106 
 server/services/src/main/java/com/doumee/dao/business/model/ShopInfo.java                       |   29 
 server/services/src/main/java/com/doumee/service/business/CategoryService.java                  |    8 
 server/services/src/main/java/com/doumee/dao/vo/OrderItemVO.java                                |   33 
 server/web/src/main/java/com/doumee/api/web/PaymentCallback.java                                |   82 
 server/.gitignore                                                                               |    2 
 server/services/src/main/java/com/doumee/service/business/impl/SmsrecordServiceImpl.java        |   81 
 server/services/src/main/java/com/doumee/dao/dto/ShopVerifyDTO.java                             |   31 
 server/services/src/main/java/com/doumee/dao/dto/CalculateLocalPriceDTO.java                    |   41 
 server/services/src/main/java/com/doumee/service/business/ShopInfoService.java                  |   53 
 server/services/src/main/java/com/doumee/dao/dto/CancelOrderDTO.java                            |   25 
 server/services/src/main/java/com/doumee/dao/dto/ShopLoginDTO.java                              |   20 
 server/services/src/main/java/com/doumee/dao/vo/AccountResponse.java                            |   12 
 server/services/src/main/java/com/doumee/dao/business/AddrMapper.java                           |   13 
 server/services/src/main/java/com/doumee/dao/dto/OperationConfigDTO.java                        |   40 
 server/services/src/main/java/com/doumee/dao/business/model/DriverInfo.java                     |   48 
 server/services/src/main/java/com/doumee/service/business/impl/AddrServiceImpl.java             |  287 +
 server/services/src/main/java/com/doumee/core/constants/Constants.java                          |  207 +
 server/services/src/main/java/com/doumee/dao/vo/ShopNearbyVO.java                               |   39 
 server/services/src/main/java/com/doumee/service/business/impl/IdentityInfoServiceImpl.java     |   26 
 server/services/src/main/java/com/doumee/service/business/impl/OrdersRefundServiceImpl.java     |  113 
 server/services/src/main/java/com/doumee/dao/dto/DispatchDTO.java                               |   29 
 server/services/src/main/java/com/doumee/dao/dto/AuditDTO.java                                  |    3 
 server/admin/src/main/java/com/doumee/api/business/RevenueController.java                       |    3 
 server/services/src/main/java/com/doumee/core/utils/Strings.java                                |   55 
 server/services/src/main/java/com/doumee/dao/business/model/OrdersRefund.java                   |   70 
 server/web/src/main/java/com/doumee/api/web/ShopInfoApi.java                                    |   35 
 server/admin/src/main/java/com/doumee/api/business/WithdrawalOrdersController.java              |   18 
 server/services/src/main/java/com/doumee/biz/system/impl/OperationConfigBizImpl.java            |   89 
 server/admin/src/main/java/com/doumee/api/business/BannerController.java                        |    8 
 server/services/src/main/java/com/doumee/biz/system/OperationConfigBiz.java                     |   21 
 server/services/src/main/java/com/doumee/dao/dto/ShopNearbyDTO.java                             |   39 
 server/services/src/main/java/com/doumee/dao/vo/OrderDetailVO.java                              |   76 
 server/services/src/main/java/com/doumee/dao/vo/OverdueFeeVO.java                               |   31 
 server/admin/src/main/java/com/doumee/api/business/AgreementConfigController.java               |   41 
 server/services/src/main/resources/application-pro.yml                                          |    7 
 server/services/src/main/java/com/doumee/dao/vo/ShopWebDetailVO.java                            |   36 
 server/services/src/main/java/com/doumee/dao/business/model/Orders.java                         |   60 
 server/admin/src/main/java/com/doumee/api/business/OperationConfigController.java               |   40 
 server/admin/src/main/java/com/doumee/api/business/OrdersRefundController.java                  |   82 
 server/services/src/main/java/com/doumee/core/utils/Tencent/MapUtil.java                        |  124 
 server/services/src/main/java/com/doumee/dao/dto/ShopInfoMaintainDTO.java                       |   40 
 server/admin/src/main/java/com/doumee/api/business/DriverInfoController.java                    |   18 
 server/services/src/main/java/com/doumee/service/business/BannerService.java                    |    8 
 server/services/src/main/java/com/doumee/config/jwt/WebMvcConfig.java                           |   96 
 server/services/src/main/java/com/doumee/dao/vo/MyOrderDetailVO.java                            |  154 +
 server/admin/src/main/java/com/doumee/api/business/AddrController.java                          |  100 
 server/services/src/main/java/com/doumee/dao/business/model/WithdrawalOrders.java               |   43 
 server/services/src/main/java/com/doumee/dao/dto/UpdMobileRequest.java                          |   26 
 server/services/src/main/java/com/doumee/service/business/WithdrawalOrdersService.java          |   16 
 server/services/src/main/java/com/doumee/service/business/OrdersService.java                    |  164 +
 server/services/src/main/java/com/doumee/dao/dto/CalculateRemotePriceDTO.java                   |   56 
 server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java         |  365 ++
 server/services/src/main/java/com/doumee/dao/dto/ShopDetailQueryDTO.java                        |   28 
 server/services/src/main/java/com/doumee/dao/dto/WithdrawalApproveDTO.java                      |   24 
 server/services/src/main/java/com/doumee/biz/system/impl/AgreementConfigBizImpl.java            |   74 
 server/services/src/main/resources/application-dev.yml                                          |    3 
 server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java         |   44 
 server/services/src/main/java/com/doumee/dao/vo/PayResponse.java                                |   28 
 server/services/src/main/java/com/doumee/dao/business/model/Revenue.java                        |   12 
 server/services/src/main/java/com/doumee/service/business/OrdersRefundService.java              |   98 
 server/services/db/db_change.sql                                                                |  239 +
 server/services/src/main/java/com/doumee/service/business/OrderLogService.java                  |   37 
 server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java           | 1934 ++++++++++++
 server/services/src/main/java/com/doumee/dao/business/model/Member.java                         |   21 
 server/services/src/main/java/com/doumee/core/constants/ResponseStatus.java                     |    2 
 server/services/src/main/java/com/doumee/dao/vo/ShopLoginVO.java                                |   33 
 server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java       |  198 
 server/services/src/main/java/com/doumee/core/utils/RandomString.java                           |   60 
 server/web/src/main/java/com/doumee/api/web/ApiController.java                                  |    5 
 server/services/src/main/java/com/doumee/dao/business/model/Banner.java                         |   17 
 server/services/src/main/java/com/doumee/service/business/impl/OrderLogServiceImpl.java         |  139 
 server/services/src/main/java/com/doumee/dao/business/model/OrderLog.java                       |   79 
 server/web/src/main/java/com/doumee/api/web/ConfigApi.java                                      |   96 
 server/services/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java                           |    4 
 server/services/src/main/java/com/doumee/service/business/impl/AreasServiceImpl.java            |   19 
 server/services/src/main/java/com/doumee/dao/business/OrdersRefundMapper.java                   |   12 
 server/services/src/main/java/com/doumee/service/business/AddrService.java                      |   59 
 server/services/src/main/java/com/doumee/service/business/MemberService.java                    |   42 
 server/services/src/main/java/com/doumee/dao/dto/EstimatedDeliverySaveDTO.java                  |   38 
 server/admin/src/main/java/com/doumee/api/business/OrdersController.java                        |   42 
 server/services/src/main/java/com/doumee/biz/system/AgreementConfigBiz.java                     |   21 
 server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java |  190 +
 server/services/src/main/java/com/doumee/service/business/impl/PricingRuleServiceImpl.java      |  138 
 server/services/src/main/java/com/doumee/dao/vo/MemberDetailVO.java                             |   88 
 server/services/src/main/java/com/doumee/dao/dto/DriverVerifyDTO.java                           |   31 
 server/web/src/main/java/com/doumee/api/web/AccountApi.java                                     |   44 
 server/services/src/main/java/com/doumee/dao/vo/ItemPriceVO.java                                |   53 
 server/services/src/main/java/com/doumee/dao/business/model/Smsrecord.java                      |    3 
 server/services/src/main/java/com/doumee/service/business/PricingRuleService.java               |   18 
 server/services/src/main/java/com/doumee/dao/dto/MyOrderDTO.java                                |   24 
 server/services/src/main/java/com/doumee/dao/business/model/PricingRule.java                    |    2 
 server/services/src/main/java/com/doumee/dao/vo/MyOrderVO.java                                  |   94 
 server/web/src/main/java/com/doumee/api/web/OrdersApi.java                                      |  149 
 server/services/src/main/java/com/doumee/dao/dto/MemberListQueryDTO.java                        |   33 
 server/admin/src/main/java/com/doumee/api/business/MemberController.java                        |   25 
 server/services/src/main/java/com/doumee/dao/business/OrderLogMapper.java                       |   12 
 server/services/src/main/java/com/doumee/dao/dto/ConfirmArriveDTO.java                          |   25 
 server/services/src/main/java/com/doumee/dao/vo/UserCenterVO.java                               |    3 
 server/services/src/main/java/com/doumee/service/business/DriverInfoService.java                |   15 
 server/services/src/main/java/com/doumee/core/utils/aliyun/ALiYunSmSUtil.java                   |   59 
 server/services/src/main/java/com/doumee/dao/vo/OrderDispatchVO.java                            |   32 
 server/services/src/main/java/com/doumee/service/business/SmsrecordService.java                 |    6 
 server/web/src/main/java/com/doumee/api/web/AddrApi.java                                        |   95 
 server/services/src/main/java/com/doumee/dao/dto/CreateOrderDTO.java                            |   84 
 server/services/src/main/resources/application-test.yml                                         |    6 
 server/services/src/main/java/com/doumee/dao/vo/EstimatedDeliveryVO.java                        |    3 
 server/web/src/main/java/com/doumee/api/web/MemberApi.java                                      |  116 
 server/admin/src/main/java/com/doumee/api/business/PricingRuleController.java                   |    2 
 server/services/src/main/java/com/doumee/dao/business/model/OrdersDetail.java                   |   11 
 server/services/src/main/java/com/doumee/dao/vo/OrderSummaryVO.java                             |   28 
 server/services/src/main/java/com/doumee/core/utils/ID.java                                     |   89 
 server/services/src/main/java/com/doumee/service/business/AreasService.java                     |    7 
 server/admin/src/main/java/com/doumee/api/business/OrderLogController.java                      |   65 
 server/services/src/main/java/com/doumee/dao/business/model/Multifile.java                      |    4 
 server/services/src/main/java/com/doumee/dao/vo/ShopDetailVO.java                               |   31 
 server/services/src/main/java/com/doumee/service/business/impl/BannerServiceImpl.java           |  136 
 /dev/null                                                                                       |  162 -
 server/services/src/main/java/com/doumee/config/wx/WxMiniUtilService.java                       |   50 
 server/services/src/main/java/com/doumee/dao/vo/PriceCalculateVO.java                           |   40 
 server/services/src/main/java/com/doumee/dao/dto/AgreementConfigDTO.java                        |   25 
 server/services/src/main/java/com/doumee/dao/business/model/MemberRevenue.java                  |   22 
 server/services/src/main/java/com/doumee/dao/vo/MemberListVO.java                               |   44 
 server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java           |  220 +
 server/services/src/main/java/com/doumee/core/annotation/LoginShopRequired.java                 |   10 
 126 files changed, 8,444 insertions(+), 533 deletions(-)

diff --git a/server/.gitignore b/server/.gitignore
index 9c5e6bd..c98790c 100644
--- a/server/.gitignore
+++ b/server/.gitignore
@@ -25,3 +25,5 @@
 *.jar
 *.war
 /CLAUDE.md
+/.claude/settings.local.json
+/.vscode/settings.json
diff --git a/server/admin/src/main/java/com/doumee/api/business/AddrController.java b/server/admin/src/main/java/com/doumee/api/business/AddrController.java
new file mode 100644
index 0000000..1a25cdf
--- /dev/null
+++ b/server/admin/src/main/java/com/doumee/api/business/AddrController.java
@@ -0,0 +1,100 @@
+package com.doumee.api.business;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.Addr;
+import com.doumee.service.business.AddrService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 鍦板潃绨�
+ * @author rk
+ * @date 2026/04/15
+ */
+@Api(tags = "鍦板潃绨�")
+@RestController
+@RequestMapping("/business/addr")
+public class AddrController extends BaseController {
+
+    @Autowired
+    private AddrService addrService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:addr:create")
+    public ApiResponse create(@RequestBody Addr addr) {
+        return ApiResponse.success(addrService.create(addr));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:addr:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        addrService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:addr:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String[] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        addrService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:addr:update")
+    public ApiResponse updateById(@RequestBody Addr addr) {
+        addrService.updateById(addr);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("淇敼鐘舵��")
+    @PostMapping("/updateStatus")
+    @RequiresPermissions("business:addr:update")
+    public ApiResponse updateStatus(@RequestBody Addr addr) {
+        addrService.updateStatus(addr);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:addr:query")
+    public ApiResponse<PageData<Addr>> findPage(@RequestBody PageWrap<Addr> pageWrap) {
+        return ApiResponse.success(addrService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:addr:exportExcel")
+    public void exportExcel(@RequestBody PageWrap<Addr> pageWrap, HttpServletResponse response) {
+        List<Addr> addrList = addrService.findPage(pageWrap).getRecords();
+        ExcelExporter.build(Addr.class).export(addrList, "鍦板潃绨�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:addr:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(addrService.findById(id));
+    }
+}
diff --git a/server/admin/src/main/java/com/doumee/api/business/AgreementConfigController.java b/server/admin/src/main/java/com/doumee/api/business/AgreementConfigController.java
new file mode 100644
index 0000000..a245517
--- /dev/null
+++ b/server/admin/src/main/java/com/doumee/api/business/AgreementConfigController.java
@@ -0,0 +1,41 @@
+package com.doumee.api.business;
+
+import com.doumee.api.BaseController;
+import com.doumee.biz.system.AgreementConfigBiz;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.dao.dto.AgreementConfigDTO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 鍗忚閰嶇疆绠$悊
+ * @author rk
+ * @date 2026/04/13
+ */
+@Api(tags = "鍗忚閰嶇疆")
+@RestController
+@RequestMapping("/business/agreementConfig")
+public class AgreementConfigController extends BaseController {
+
+    @Autowired
+    private AgreementConfigBiz agreementConfigBiz;
+
+    @ApiOperation("鏌ヨ鍗忚閰嶇疆")
+    @GetMapping
+    public ApiResponse<AgreementConfigDTO> getConfig() {
+        return ApiResponse.success(agreementConfigBiz.getConfig());
+    }
+
+    @PreventRepeat
+    @ApiOperation("淇濆瓨鍗忚閰嶇疆")
+    @PostMapping("/save")
+    @RequiresPermissions("business:agreementConfig:update")
+    public ApiResponse saveConfig(@RequestBody AgreementConfigDTO dto) {
+        agreementConfigBiz.saveConfig(dto);
+        return ApiResponse.success(null);
+    }
+}
diff --git a/server/admin/src/main/java/com/doumee/api/business/BannerController.java b/server/admin/src/main/java/com/doumee/api/business/BannerController.java
index b3a59aa..ba8fb47 100644
--- a/server/admin/src/main/java/com/doumee/api/business/BannerController.java
+++ b/server/admin/src/main/java/com/doumee/api/business/BannerController.java
@@ -68,6 +68,14 @@
         return ApiResponse.success(null);
     }
 
+    @ApiOperation("淇敼鐘舵��")
+    @PostMapping("/updateStatus")
+    @RequiresPermissions("business:banner:update")
+    public ApiResponse updateStatus(@RequestBody Banner banner) {
+        bannerService.updateStatus(banner);
+        return ApiResponse.success(null);
+    }
+
     @ApiOperation("鍒嗛〉鏌ヨ")
     @PostMapping("/page")
     @RequiresPermissions("business:banner:query")
diff --git a/server/admin/src/main/java/com/doumee/api/business/DriverInfoController.java b/server/admin/src/main/java/com/doumee/api/business/DriverInfoController.java
index 65b80b1..4d4b717 100644
--- a/server/admin/src/main/java/com/doumee/api/business/DriverInfoController.java
+++ b/server/admin/src/main/java/com/doumee/api/business/DriverInfoController.java
@@ -8,6 +8,7 @@
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.DriverInfo;
 import com.doumee.dao.dto.AuditDTO;
+import com.doumee.dao.dto.ChangeStatusDTO;
 import com.doumee.service.business.DriverInfoService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -91,13 +92,28 @@
         return ApiResponse.success(driverInfoService.findById(id));
     }
 
+    @ApiOperation("鍙告満璇︽儏(鍚檮浠�)")
+    @GetMapping("/detail/{id}")
+    @RequiresPermissions("business:driverInfo:query")
+    public ApiResponse getDetail(@PathVariable Integer id) {
+        return ApiResponse.success(driverInfoService.getDetail(id));
+    }
+
     @ApiOperation("瀹℃壒鍙告満瀹炲悕璁よ瘉")
     @PostMapping("/audit")
-    @RequiresPermissions("business:driverInfo:audit")
+    @RequiresPermissions("business:driverInfo:update")
     public ApiResponse audit(@RequestBody AuditDTO auditDTO) {
         auditDTO.setAuditUser(this.getLoginUser().getId());
         driverInfoService.auditVerify(auditDTO);
         return ApiResponse.success("瀹℃壒鎴愬姛");
     }
 
+    @ApiOperation("淇敼鍙告満鐘舵��")
+    @PostMapping("/changeStatus")
+    @RequiresPermissions("business:driverInfo:update")
+    public ApiResponse changeStatus(@RequestBody ChangeStatusDTO dto) {
+        driverInfoService.changeStatus(dto);
+        return ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
+
 }
diff --git a/server/admin/src/main/java/com/doumee/api/business/MemberController.java b/server/admin/src/main/java/com/doumee/api/business/MemberController.java
index 44f1dd1..16544ac 100644
--- a/server/admin/src/main/java/com/doumee/api/business/MemberController.java
+++ b/server/admin/src/main/java/com/doumee/api/business/MemberController.java
@@ -8,6 +8,9 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.Member;
+import com.doumee.dao.dto.MemberListQueryDTO;
+import com.doumee.dao.vo.MemberDetailVO;
+import com.doumee.dao.vo.MemberListVO;
 import com.doumee.service.business.MemberService;
 import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
 import io.swagger.annotations.Api;
@@ -93,4 +96,26 @@
     public ApiResponse findById(@PathVariable Integer id) {
         return ApiResponse.success(memberService.findById(id));
     }
+
+    @ApiOperation("浼氬憳鍒楄〃鍒嗛〉鏌ヨ")
+    @PostMapping("/list/page")
+    @RequiresPermissions("business:member:query")
+    public ApiResponse<PageData<MemberListVO>> findMemberListPage(@RequestBody PageWrap<MemberListQueryDTO> pageWrap) {
+        return ApiResponse.success(memberService.findMemberListPage(pageWrap));
+    }
+
+    @ApiOperation("浼氬憳鍒楄〃瀵煎嚭Excel")
+    @PostMapping("/list/exportExcel")
+    @RequiresPermissions("business:member:exportExcel")
+    public void exportMemberListExcel(@RequestBody PageWrap<MemberListQueryDTO> pageWrap, HttpServletResponse response) {
+        List<MemberListVO> list = memberService.findMemberListPage(pageWrap).getRecords();
+        ExcelExporter.build(MemberListVO.class).export(list, "浼氬憳鍒楄〃", response);
+    }
+
+    @ApiOperation("浼氬憳璇︽儏鏌ヨ")
+    @GetMapping("/detail/{id}")
+    @RequiresPermissions("business:member:query")
+    public ApiResponse<MemberDetailVO> findMemberDetail(@PathVariable Integer id) {
+        return ApiResponse.success(memberService.findMemberDetail(id));
+    }
 }
diff --git a/server/admin/src/main/java/com/doumee/api/business/OperationConfigController.java b/server/admin/src/main/java/com/doumee/api/business/OperationConfigController.java
new file mode 100644
index 0000000..a417e01
--- /dev/null
+++ b/server/admin/src/main/java/com/doumee/api/business/OperationConfigController.java
@@ -0,0 +1,40 @@
+package com.doumee.api.business;
+
+import com.doumee.api.BaseController;
+import com.doumee.biz.system.OperationConfigBiz;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.dao.dto.OperationConfigDTO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 杩愯惀閰嶇疆绠$悊
+ * @author rk
+ * @date 2026/04/13
+ */
+@Api(tags = "杩愯惀閰嶇疆")
+@RestController
+@RequestMapping("/business/operationConfig")
+public class OperationConfigController extends BaseController {
+
+    @Autowired
+    private OperationConfigBiz operationConfigBiz;
+
+    @ApiOperation("鏌ヨ杩愯惀閰嶇疆")
+    @GetMapping
+    public ApiResponse<OperationConfigDTO> getConfig() {
+        return ApiResponse.success(operationConfigBiz.getConfig());
+    }
+
+    @PreventRepeat
+    @ApiOperation("淇濆瓨杩愯惀閰嶇疆")
+    @PostMapping("/save")
+    public ApiResponse saveConfig(@RequestBody OperationConfigDTO dto) {
+        operationConfigBiz.saveConfig(dto);
+        return ApiResponse.success(null);
+    }
+}
diff --git a/server/admin/src/main/java/com/doumee/api/business/OrderLogController.java b/server/admin/src/main/java/com/doumee/api/business/OrderLogController.java
new file mode 100644
index 0000000..22fbf52
--- /dev/null
+++ b/server/admin/src/main/java/com/doumee/api/business/OrderLogController.java
@@ -0,0 +1,65 @@
+package com.doumee.api.business;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.OrderLog;
+import com.doumee.service.business.OrderLogService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 璁㈠崟鎿嶄綔鏃ュ織
+ * @author rk
+ * @date 2026/04/13
+ */
+@Api(tags = "璁㈠崟鎿嶄綔鏃ュ織")
+@RestController
+@RequestMapping("/business/orderLog")
+public class OrderLogController extends BaseController {
+
+    @Autowired
+    private OrderLogService orderLogService;
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:orderLog:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        orderLogService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:orderLog:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String[] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        orderLogService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:orderLog:query")
+    public ApiResponse<PageData<OrderLog>> findPage(@RequestBody PageWrap<OrderLog> pageWrap) {
+        return ApiResponse.success(orderLogService.findPage(pageWrap));
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:orderLog:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(orderLogService.findById(id));
+    }
+}
diff --git a/server/admin/src/main/java/com/doumee/api/business/OrdersController.java b/server/admin/src/main/java/com/doumee/api/business/OrdersController.java
index 54d4698..5a7f66b 100644
--- a/server/admin/src/main/java/com/doumee/api/business/OrdersController.java
+++ b/server/admin/src/main/java/com/doumee/api/business/OrdersController.java
@@ -6,6 +6,11 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.Orders;
+import com.doumee.dao.dto.ConfirmArriveDTO;
+import com.doumee.dao.dto.DispatchDTO;
+import com.doumee.dao.vo.OrderDetailVO;
+import com.doumee.dao.vo.OrderDispatchVO;
+import com.doumee.dao.vo.OrderSummaryVO;
 import com.doumee.service.business.OrdersService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -66,6 +71,13 @@
         return ApiResponse.success(ordersService.findPage(pageWrap));
     }
 
+    @ApiOperation("璁㈠崟姹囨�荤粺璁�")
+    @PostMapping("/summary")
+    @RequiresPermissions("business:orders:query")
+    public ApiResponse<OrderSummaryVO> findSummary(@RequestBody PageWrap<Orders> pageWrap) {
+        return ApiResponse.success(ordersService.findSummary(pageWrap));
+    }
+
     @ApiOperation("瀵煎嚭Excel")
     @PostMapping("/exportExcel")
     @RequiresPermissions("business:orders:exportExcel")
@@ -80,4 +92,34 @@
         return ApiResponse.success(ordersService.findById(id));
     }
 
+    @ApiOperation("璁㈠崟璇︽儏")
+    @GetMapping("/detail/{id}")
+    @RequiresPermissions("business:orders:query")
+    public ApiResponse<OrderDetailVO> findDetail(@PathVariable Integer id) {
+        return ApiResponse.success(ordersService.findDetail(id));
+    }
+
+    @ApiOperation("鎵嬪姩娲惧崟淇℃伅")
+    @GetMapping("/dispatch/{id}")
+    @RequiresPermissions("business:orders:query")
+    public ApiResponse<OrderDispatchVO> findDispatchInfo(@PathVariable Integer id) {
+        return ApiResponse.success(ordersService.findDispatchInfo(id));
+    }
+
+    @ApiOperation("璁㈠崟娲惧崟")
+    @PostMapping("/dispatch")
+    @RequiresPermissions("business:orders:update")
+    public ApiResponse dispatch(@RequestBody DispatchDTO dto) {
+        ordersService.dispatch(dto);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("纭椤惧鍒板簵")
+    @PostMapping("/confirmArrived")
+    @RequiresPermissions("business:orders:update")
+    public ApiResponse confirmArrived(@RequestBody ConfirmArriveDTO dto) {
+        ordersService.confirmCustomerArrived(dto.getOrderId(), dto.getShopId());
+        return ApiResponse.success(null);
+    }
+
 }
diff --git a/server/admin/src/main/java/com/doumee/api/business/OrdersRefundController.java b/server/admin/src/main/java/com/doumee/api/business/OrdersRefundController.java
new file mode 100644
index 0000000..fa4d284
--- /dev/null
+++ b/server/admin/src/main/java/com/doumee/api/business/OrdersRefundController.java
@@ -0,0 +1,82 @@
+package com.doumee.api.business;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.OrdersRefund;
+import com.doumee.service.business.OrdersRefundService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 璁㈠崟閫�娆捐褰�
+ * @author rk
+ * @date 2026/04/13
+ */
+@Api(tags = "璁㈠崟閫�娆捐褰�")
+@RestController
+@RequestMapping("/business/ordersRefund")
+public class OrdersRefundController extends BaseController {
+
+    @Autowired
+    private OrdersRefundService ordersRefundService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:ordersRefund:create")
+    public ApiResponse create(@RequestBody OrdersRefund ordersRefund) {
+        return ApiResponse.success(ordersRefundService.create(ordersRefund));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:ordersRefund:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        ordersRefundService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:ordersRefund:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String[] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        ordersRefundService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:ordersRefund:update")
+    public ApiResponse updateById(@RequestBody OrdersRefund ordersRefund) {
+        ordersRefundService.updateById(ordersRefund);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:ordersRefund:query")
+    public ApiResponse<PageData<OrdersRefund>> findPage(@RequestBody PageWrap<OrdersRefund> pageWrap) {
+        return ApiResponse.success(ordersRefundService.findPage(pageWrap));
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:ordersRefund:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(ordersRefundService.findById(id));
+    }
+}
diff --git a/server/admin/src/main/java/com/doumee/api/business/PricingRuleController.java b/server/admin/src/main/java/com/doumee/api/business/PricingRuleController.java
index 452168f..8efa3d4 100644
--- a/server/admin/src/main/java/com/doumee/api/business/PricingRuleController.java
+++ b/server/admin/src/main/java/com/doumee/api/business/PricingRuleController.java
@@ -145,7 +145,7 @@
     @ApiOperation("鏌ヨ棰勮鏃舵晥閰嶇疆")
     @GetMapping("/estimatedDelivery/list")
     @RequiresPermissions("business:pricingRule:query")
-    public ApiResponse<EstimatedDeliveryVO> listEstimatedDelivery(@RequestParam Integer cityId) {
+    public ApiResponse<List<EstimatedDeliveryVO>> listEstimatedDelivery(@RequestParam Integer cityId) {
         return ApiResponse.success(pricingRuleService.getEstimatedDelivery(cityId));
     }
 
diff --git a/server/admin/src/main/java/com/doumee/api/business/RevenueController.java b/server/admin/src/main/java/com/doumee/api/business/RevenueController.java
index 85d30d9..f9cfeae 100644
--- a/server/admin/src/main/java/com/doumee/api/business/RevenueController.java
+++ b/server/admin/src/main/java/com/doumee/api/business/RevenueController.java
@@ -70,21 +70,18 @@
 
     @ApiOperation("鍒嗛〉鏌ヨ")
     @PostMapping("/page")
-    @RequiresPermissions("business:revenue:query")
     public ApiResponse<PageData<Revenue>> findPage(@RequestBody PageWrap<Revenue> pageWrap) {
         return ApiResponse.success(revenueService.findPage(pageWrap));
     }
 
     @ApiOperation("瀵煎嚭Excel")
     @PostMapping("/exportExcel")
-    @RequiresPermissions("business:revenue:exportExcel")
     public void exportExcel(@RequestBody PageWrap<Revenue> pageWrap, HttpServletResponse response) {
         ExcelExporter.build(Revenue.class).export(revenueService.findPage(pageWrap).getRecords(), "鏀舵敮璁板綍", response);
     }
 
     @ApiOperation("鏍规嵁ID鏌ヨ")
     @GetMapping("/{id}")
-    @RequiresPermissions("business:revenue:query")
     public ApiResponse findById(@PathVariable Integer id) {
         return ApiResponse.success(revenueService.findById(id));
     }
diff --git a/server/admin/src/main/java/com/doumee/api/business/WithdrawalOrdersController.java b/server/admin/src/main/java/com/doumee/api/business/WithdrawalOrdersController.java
index 02556f7..4b5b7b2 100644
--- a/server/admin/src/main/java/com/doumee/api/business/WithdrawalOrdersController.java
+++ b/server/admin/src/main/java/com/doumee/api/business/WithdrawalOrdersController.java
@@ -6,6 +6,7 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.WithdrawalOrders;
+import com.doumee.dao.dto.WithdrawalApproveDTO;
 import com.doumee.service.business.WithdrawalOrdersService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -76,8 +77,23 @@
     @ApiOperation("鏍规嵁ID鏌ヨ")
     @GetMapping("/{id}")
     @RequiresPermissions("business:withdrawalOrders:query")
-    public ApiResponse findById(@PathVariable Integer id) {
+    public ApiResponse<WithdrawalOrders> findById(@PathVariable Integer id) {
         return ApiResponse.success(withdrawalOrdersService.findById(id));
     }
 
+    @ApiOperation("宸叉彁鐜扮粺璁¢噾棰�")
+    @PostMapping("/totalAmount")
+    @RequiresPermissions("business:withdrawalOrders:query")
+    public ApiResponse<Long> totalAmount(@RequestBody PageWrap<WithdrawalOrders> pageWrap) {
+        return ApiResponse.success(withdrawalOrdersService.totalAmount(pageWrap));
+    }
+
+    @ApiOperation("鎻愮幇瀹℃壒")
+    @PostMapping("/approve")
+    @RequiresPermissions("business:withdrawalOrders:update")
+    public ApiResponse approve(@RequestBody WithdrawalApproveDTO dto) {
+        withdrawalOrdersService.approve(dto);
+        return ApiResponse.success(null);
+    }
+
 }
diff --git a/server/services/db/business.banner.permissions.sql b/server/services/db/business.banner.permissions.sql
deleted file mode 100644
index b200283..0000000
--- a/server/services/db/business.banner.permissions.sql
+++ /dev/null
@@ -1,5 +0,0 @@
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:banner:create', '鏂板缓杞挱鍥�', '杞挱鍥�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:banner:delete', '鍒犻櫎杞挱鍥�', '杞挱鍥�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:banner:update', '淇敼杞挱鍥�', '杞挱鍥�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:banner:query', '鏌ヨ杞挱鍥�', '杞挱鍥�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:banner:exportExcel', '瀵煎嚭杞挱鍥�(Excel)', '杞挱鍥�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
diff --git a/server/services/db/business.category.permissions.sql b/server/services/db/business.category.permissions.sql
deleted file mode 100644
index 8006d69..0000000
--- a/server/services/db/business.category.permissions.sql
+++ /dev/null
@@ -1,6 +0,0 @@
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:category:create', '鏂板缓鍒嗙被淇℃伅琛�', '鍒嗙被淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:category:delete', '鍒犻櫎鍒嗙被淇℃伅琛�', '鍒嗙被淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:category:update', '淇敼鍒嗙被淇℃伅琛�', '鍒嗙被淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:category:query', '鏌ヨ鍒嗙被淇℃伅琛�', '鍒嗙被淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:category:exportExcel', '瀵煎嚭鍒嗙被淇℃伅琛�(Excel)', '鍒嗙被淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-
diff --git a/server/services/db/business.company.permissions.sql b/server/services/db/business.company.permissions.sql
deleted file mode 100644
index 8b23918..0000000
--- a/server/services/db/business.company.permissions.sql
+++ /dev/null
@@ -1,6 +0,0 @@
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:company:create', '鏂板缓缁勭粐淇℃伅琛�', '缁勭粐淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:company:delete', '鍒犻櫎缁勭粐淇℃伅琛�', '缁勭粐淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:company:update', '淇敼缁勭粐淇℃伅琛�', '缁勭粐淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:company:query', '鏌ヨ缁勭粐淇℃伅琛�', '缁勭粐淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:company:exportExcel', '瀵煎嚭缁勭粐淇℃伅琛�(Excel)', '缁勭粐淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-
diff --git a/server/services/db/business.managers.permissions.sql b/server/services/db/business.managers.permissions.sql
deleted file mode 100644
index 71b6973..0000000
--- a/server/services/db/business.managers.permissions.sql
+++ /dev/null
@@ -1,6 +0,0 @@
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:managers:create', '鏂板缓璐d换浜轰俊鎭〃', '璐d换浜轰俊鎭〃', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:managers:delete', '鍒犻櫎璐d换浜轰俊鎭〃', '璐d换浜轰俊鎭〃', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:managers:update', '淇敼璐d换浜轰俊鎭〃', '璐d换浜轰俊鎭〃', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:managers:query', '鏌ヨ璐d换浜轰俊鎭〃', '璐d换浜轰俊鎭〃', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:managers:exportExcel', '瀵煎嚭璐d换浜轰俊鎭〃(Excel)', '璐d换浜轰俊鎭〃', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-
diff --git a/server/services/db/business.member.permissions.sql b/server/services/db/business.member.permissions.sql
deleted file mode 100644
index d313669..0000000
--- a/server/services/db/business.member.permissions.sql
+++ /dev/null
@@ -1,6 +0,0 @@
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:member:create', '鏂板缓浜哄憳淇℃伅琛�', '浜哄憳淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:member:delete', '鍒犻櫎浜哄憳淇℃伅琛�', '浜哄憳淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:member:update', '淇敼浜哄憳淇℃伅琛�', '浜哄憳淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:member:query', '鏌ヨ浜哄憳淇℃伅琛�', '浜哄憳淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:member:exportExcel', '瀵煎嚭浜哄憳淇℃伅琛�(Excel)', '浜哄憳淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-
diff --git a/server/services/db/business.multifile.permissions.sql b/server/services/db/business.multifile.permissions.sql
deleted file mode 100644
index d5e24ef..0000000
--- a/server/services/db/business.multifile.permissions.sql
+++ /dev/null
@@ -1,6 +0,0 @@
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:multifile:create', '鏂板缓闄勪欢涓婁紶淇℃伅琛�', '闄勪欢涓婁紶淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:multifile:delete', '鍒犻櫎闄勪欢涓婁紶淇℃伅琛�', '闄勪欢涓婁紶淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:multifile:update', '淇敼闄勪欢涓婁紶淇℃伅琛�', '闄勪欢涓婁紶淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:multifile:query', '鏌ヨ闄勪欢涓婁紶淇℃伅琛�', '闄勪欢涓婁紶淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:multifile:exportExcel', '瀵煎嚭闄勪欢涓婁紶淇℃伅琛�(Excel)', '闄勪欢涓婁紶淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-
diff --git a/server/services/db/business.notices.permissions.sql b/server/services/db/business.notices.permissions.sql
deleted file mode 100644
index cc86518..0000000
--- a/server/services/db/business.notices.permissions.sql
+++ /dev/null
@@ -1,6 +0,0 @@
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:notices:create', '鏂板缓绯荤粺娑堟伅淇℃伅琛�', '绯荤粺娑堟伅淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:notices:delete', '鍒犻櫎绯荤粺娑堟伅淇℃伅琛�', '绯荤粺娑堟伅淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:notices:update', '淇敼绯荤粺娑堟伅淇℃伅琛�', '绯荤粺娑堟伅淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:notices:query', '鏌ヨ绯荤粺娑堟伅淇℃伅琛�', '绯荤粺娑堟伅淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:notices:exportExcel', '瀵煎嚭绯荤粺娑堟伅淇℃伅琛�(Excel)', '绯荤粺娑堟伅淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-
diff --git a/server/services/db/business.workorder.permissions.sql b/server/services/db/business.workorder.permissions.sql
deleted file mode 100644
index 5e9c87b..0000000
--- a/server/services/db/business.workorder.permissions.sql
+++ /dev/null
@@ -1,6 +0,0 @@
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorder:create', '鏂板缓宸ュ崟淇℃伅琛�', '宸ュ崟淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorder:delete', '鍒犻櫎宸ュ崟淇℃伅琛�', '宸ュ崟淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorder:update', '淇敼宸ュ崟淇℃伅琛�', '宸ュ崟淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorder:query', '鏌ヨ宸ュ崟淇℃伅琛�', '宸ュ崟淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorder:exportExcel', '瀵煎嚭宸ュ崟淇℃伅琛�(Excel)', '宸ュ崟淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-
diff --git a/server/services/db/business.workorder_log.permissions.sql b/server/services/db/business.workorder_log.permissions.sql
deleted file mode 100644
index 32d5607..0000000
--- a/server/services/db/business.workorder_log.permissions.sql
+++ /dev/null
@@ -1,6 +0,0 @@
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorderlog:create', '鏂板缓宸ュ崟鎿嶄綔鍘嗗彶琛�', '宸ュ崟鎿嶄綔鍘嗗彶琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorderlog:delete', '鍒犻櫎宸ュ崟鎿嶄綔鍘嗗彶琛�', '宸ュ崟鎿嶄綔鍘嗗彶琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorderlog:update', '淇敼宸ュ崟鎿嶄綔鍘嗗彶琛�', '宸ュ崟鎿嶄綔鍘嗗彶琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorderlog:query', '鏌ヨ宸ュ崟鎿嶄綔鍘嗗彶琛�', '宸ュ崟鎿嶄綔鍘嗗彶琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorderlog:exportExcel', '瀵煎嚭宸ュ崟鎿嶄綔鍘嗗彶琛�(Excel)', '宸ュ崟鎿嶄綔鍘嗗彶琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-
diff --git a/server/services/db/db_change.sql b/server/services/db/db_change.sql
new file mode 100644
index 0000000..dacb433
--- /dev/null
+++ b/server/services/db/db_change.sql
@@ -0,0 +1,239 @@
+-- ============================================================
+-- 鏁版嵁搴撳彉鏇磋剼鏈紙鍏ㄩ儴鍙樻洿缁熶竴璁板綍鍦ㄦ鏂囦欢锛�
+-- 鎸夋棩鏈熷�掑簭鎺掑垪锛屾瘡娆″彉鏇寸敤鏃ユ湡娉ㄩ噴鍧楀垎闅�
+-- ============================================================
+
+
+-- ============================================================
+-- 2026/04/15 璁㈠崟琛ㄦ坊鍔犳牳閿�鐮佸瓧娈�
+-- ============================================================
+
+ALTER TABLE `orders` ADD COLUMN `MEMBER_VERIFY_CODE` VARCHAR(32) DEFAULT NULL COMMENT '浼氬憳璁㈠崟鏍搁攢鐮�' AFTER `OVERDUE_STATUS`;
+ALTER TABLE `orders` ADD COLUMN `DRIVER_VERIFY_CODE` VARCHAR(32) DEFAULT NULL COMMENT '鍙告満璁㈠崟鏍搁攢鐮�' AFTER `MEMBER_VERIFY_CODE`;
+
+
+-- ============================================================
+-- 2026/04/15 璁㈠崟琛ㄦ坊鍔犳槸鍚﹂�炬湡瀛楁
+-- ============================================================
+
+ALTER TABLE `orders` ADD COLUMN `OVERDUE_STATUS` TINYINT DEFAULT 0 COMMENT '鏄惁閫炬湡: 0=鍚� 1=鏄� 2=宸叉敮浠�' AFTER `OVERDUE_DAYS`;
+
+
+-- ============================================================
+-- 2026/04/15 璁㈠崟鐗╁搧鏄庣粏琛ㄦ坊鍔犲氨鍦板瓨鍙栧崟浠峰瓧娈�
+-- ============================================================
+
+ALTER TABLE `orders_detail` ADD COLUMN `LOCALLY_PRICE` BIGINT DEFAULT NULL COMMENT '灏卞湴瀛樺彇鍗曚环(鍒�/澶�)' AFTER `EXTRA_PRICE`;
+
+
+-- ============================================================
+-- 2026/04/14 闂ㄥ簵钀ヤ笟绫诲瀷瀛楁
+-- ============================================================
+
+ALTER TABLE `shop_info` ADD COLUMN `BUSINESS_TYPE` INT DEFAULT 0 COMMENT '闂ㄥ簵钀ヤ笟绫诲瀷锛�0=闈炲叏澶╋紱1=鍏ㄥぉ' AFTER `SHOP_HOURS`;
+
+
+-- ============================================================
+-- 2026/04/14 闂ㄥ簵淇℃伅缁存姢瀛楁
+-- ============================================================
+
+ALTER TABLE `shop_info` ADD COLUMN `COVER_IMG` VARCHAR(500) DEFAULT NULL COMMENT '闂ㄥ簵澶村儚' AFTER `PAY_MEMBER_OPEN_ID`;
+ALTER TABLE `shop_info` ADD COLUMN `CONTENT` TEXT DEFAULT NULL COMMENT '闂ㄥ簵浠嬬粛' AFTER `COVER_IMG`;
+ALTER TABLE `shop_info` ADD COLUMN `DEPOSIT_TYPES` VARCHAR(500) DEFAULT NULL COMMENT '瀵勫瓨绫诲瀷锛堥�楀彿鍒嗛殧鐨刢ategory涓婚敭锛�' AFTER `CONTENT`;
+ALTER TABLE `shop_info` ADD COLUMN `FEE_STANDARD` VARCHAR(500) DEFAULT NULL COMMENT '鏀惰垂鏍囧噯' AFTER `DEPOSIT_TYPES`;
+ALTER TABLE `shop_info` ADD COLUMN `DELIVERY_AREA` DECIMAL(10,2) DEFAULT NULL COMMENT '閰嶉�佽寖鍥�(km)' AFTER `FEE_STANDARD`;
+ALTER TABLE `shop_info` ADD COLUMN `SHOP_HOURS` VARCHAR(100) DEFAULT NULL COMMENT '钀ヤ笟鏃堕棿' AFTER `DELIVERY_AREA`;
+
+
+-- ============================================================
+-- 2026/04/13 鎻愮幇鐢宠鐢ㄦ埛绫诲瀷瀛楁
+-- ============================================================
+
+ALTER TABLE `withdrawal_orders` ADD COLUMN `MEMBER_TYPE` INT DEFAULT NULL COMMENT '鐢ㄦ埛绫诲瀷锛�1=鍙告満锛�2=搴楅摵' AFTER `MEMBER_ID`;
+
+
+-- ============================================================
+-- 2026/04/13 鎻愮幇鐢宠瀹℃壒瀛楁 + 瀹℃壒鏉冮檺
+-- ============================================================
+
+ALTER TABLE `withdrawal_orders` ADD COLUMN `USER_ID` INT DEFAULT NULL COMMENT '瀹℃壒鎿嶄綔浜猴紙鍏宠仈system_user锛�' AFTER `ALI_ACCOUNT`;
+ALTER TABLE `withdrawal_orders` ADD COLUMN `APPROVE_TIME` DATETIME DEFAULT NULL COMMENT '瀹℃壒鏃堕棿' AFTER `USER_ID`;
+ALTER TABLE `withdrawal_orders` ADD COLUMN `APPROVE_REMARK` VARCHAR(500) DEFAULT NULL COMMENT '瀹℃壒澶囨敞' AFTER `APPROVE_TIME`;
+
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:withdrawalOrders:create', '鏂板缓鎻愮幇鐢宠', '鎻愮幇鐢宠', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:withdrawalOrders:delete', '鍒犻櫎鎻愮幇鐢宠', '鎻愮幇鐢宠', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:withdrawalOrders:update', '淇敼鎻愮幇鐢宠', '鎻愮幇鐢宠', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:withdrawalOrders:query', '鏌ヨ鎻愮幇鐢宠', '鎻愮幇鐢宠', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:withdrawalOrders:exportExcel', '瀵煎嚭鎻愮幇鐢宠(Excel)', '鎻愮幇鐢宠', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
+
+-- ============================================================
+-- 2026/04/13 璁㈠崟閫�娆捐褰曟潈闄�
+-- ============================================================
+
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ordersRefund:create', '鏂板缓璁㈠崟閫�娆捐褰�', '璁㈠崟閫�娆捐褰�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ordersRefund:delete', '鍒犻櫎璁㈠崟閫�娆捐褰�', '璁㈠崟閫�娆捐褰�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ordersRefund:update', '淇敼璁㈠崟閫�娆捐褰�', '璁㈠崟閫�娆捐褰�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:ordersRefund:query', '鏌ヨ璁㈠崟閫�娆捐褰�', '璁㈠崟閫�娆捐褰�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
+
+-- ============================================================
+-- 2026/04/13 浼氬憳鍒楄〃涓庤鎯呮潈闄�
+-- ============================================================
+
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:member:list', '鏌ヨ浼氬憳鍒楄〃', '浼氬憳绠$悊', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:member:listExport', '瀵煎嚭浼氬憳鍒楄〃(Excel)', '浼氬憳绠$悊', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
+
+-- ============================================================
+-- 2026/04/13 璁㈠崟鏂板鍙栨秷澶囨敞瀛楁 + 璁㈠崟鏂囦欢璺緞瀛楀吀
+-- ============================================================
+
+ALTER TABLE `orders` ADD COLUMN `CANCEL_REMARK` VARCHAR(500) DEFAULT NULL COMMENT '鍙栨秷澶囨敞' AFTER `CANCEL_TIME`;
+
+INSERT INTO `system_dict_data`(`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`)
+SELECT 100, '/orders/', 'ORDERS_FILES', '璁㈠崟鏂囦欢璺緞', 22, 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0
+FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `system_dict_data` WHERE `DICT_ID` = 100 AND `LABEL` = 'ORDERS_FILES' AND `DELETED` = 0);
+
+
+-- ============================================================
+-- 2026/04/13 鍗忚閰嶇疆瀛楀吀鏁版嵁锛堥殣绉佸崗璁�佺敤鎴峰崗璁柊澧烇紝鍏充簬鎴戜滑宸插瓨鍦級
+-- ============================================================
+
+-- 鐖剁骇瀛楀吀ID 100 (SYSTEM) 宸插瓨鍦紝鏃犻渶鏂板缓
+
+INSERT INTO `system_dict_data`(`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`)
+SELECT 100, '', 'PRIVACY_AGREEMENT', '闅愮鍗忚', 20, 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0
+FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `system_dict_data` WHERE `DICT_ID` = 100 AND `LABEL` = 'PRIVACY_AGREEMENT' AND `DELETED` = 0);
+
+INSERT INTO `system_dict_data`(`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`)
+SELECT 100, '', 'USER_AGREEMENT', '鐢ㄦ埛鍗忚', 21, 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0
+FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `system_dict_data` WHERE `DICT_ID` = 100 AND `LABEL` = 'USER_AGREEMENT' AND `DELETED` = 0);
+
+-- 鍗忚閰嶇疆鏉冮檺
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:agreementConfig:update', '淇敼鍗忚閰嶇疆', '鍗忚閰嶇疆', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
+
+-- ============================================================
+-- 2026/04/13 杩愯惀閰嶇疆瀛楀吀鏁版嵁
+-- ============================================================
+
+-- 鐖剁骇瀛楀吀锛氳繍钀ラ厤缃紙濡傛灉ID 105宸插瓨鍦ㄥ垯璺宠繃锛�
+INSERT INTO `system_dict`(`ID`, `CODE`, `NAME`, `REMARK`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`)
+SELECT 105, 'OPERATION_CONFIG', '杩愯惀閰嶇疆', '杩愯惀鍙傛暟閰嶇疆椤�', 1, CURRENT_TIMESTAMP, NULL, NULL, 0
+FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `system_dict` WHERE `ID` = 105);
+
+-- 瀛楀吀瀛愰」
+INSERT INTO `system_dict_data`(`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`)
+VALUES (105, '3', 'DRIVER_DAILY_CANCEL_LIMIT', '鍙告満姣忔棩鍙栨秷娆℃暟', 0, 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `system_dict_data`(`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`)
+VALUES (105, '0.8', 'UNPICKED_DISCOUNT', '鏈彇浠舵姌鎵�', 1, 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `system_dict_data`(`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`)
+VALUES (105, '7', 'SETTLEMENT_DATE', '璁㈠崟缁撶畻鏃ユ湡(澶�)', 2, 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `system_dict_data`(`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`)
+VALUES (105, '1.5', 'URGENT_COEFFICIENT', '鍔犳�ョ郴鏁�', 3, 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `system_dict_data`(`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`)
+VALUES (105, '30', 'AUTO_CANCEL_TIME', '瓒呮椂鏈敮浠樿嚜鍔ㄥ彇娑堟椂闂�(鍒嗛挓)', 4, 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `system_dict_data`(`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`)
+VALUES (105, '0.01', 'INSURANCE_RATE', '淇濊垂姣旂巼', 5, 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `system_dict_data`(`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`)
+VALUES (105, '5', 'ORDER_ACCEPT_LIMIT', '鎺ュ崟鏁伴噺', 6, 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `system_dict_data`(`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`)
+VALUES (105, '7', 'AUTO_CONFIRM_RECEIPT', '鑷姩纭鏀惰揣(澶�)', 7, 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
+-- 杩愯惀閰嶇疆鏉冮檺
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:operationConfig:query', '鏌ヨ杩愯惀閰嶇疆', '杩愯惀閰嶇疆', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:operationConfig:update', '淇敼杩愯惀閰嶇疆', '杩愯惀閰嶇疆', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
+
+-- ============================================================
+-- 2026/04/13 鏀粯瀹濇彁鐜拌处鎴峰瓧娈�
+-- ============================================================
+
+ALTER TABLE `withdrawal_orders` ADD COLUMN `ALI_ACCOUNT` VARCHAR(64) DEFAULT NULL COMMENT '鏀粯瀹濇彁鐜拌处鎴�' AFTER `OUT_BILL_NO`;
+ALTER TABLE `shop_info` ADD COLUMN `ALI_ACCOUNT` VARCHAR(64) DEFAULT NULL COMMENT '鏀粯瀹濇彁鐜拌处鎴�' AFTER `DELIVERY_AREA`;
+
+
+-- ============================================================
+-- 2026/04/13 杞挱鍥句笟鍔¤皟鏁�
+-- ============================================================
+
+ALTER TABLE `banner` MODIFY COLUMN `TITLE` VARCHAR(255) DEFAULT NULL COMMENT '鏍囬';
+
+INSERT INTO `SYSTEM_DICT_DATA`(`TYPE`, `CODE`, `NAME`, `VALUE`, `REMARK`, `CREATE_TIME`, `DELETED`)
+VALUES ('SYSTEM', 'BANNER_FILES', '杞挱鍥炬枃浠惰矾寰�', '/banner/', '杞挱鍥惧浘鐗囧瓨鍌ㄥ瓙璺緞', CURRENT_TIMESTAMP, 0);
+
+
+-- ============================================================
+-- 2026/04/10 鎻愮幇鐢宠鍒濆鏉冮檺
+-- ============================================================
+
+-- 鎻愮幇鐢宠鐩稿叧鏉冮檺鏆傛湭褰曞叆锛屽悗缁ˉ鍏�
+
+
+-- ============================================================
+-- 2026/04/08 鍚勬ā鍧楀垵濮嬫潈闄�
+-- ============================================================
+
+-- 杞挱鍥�
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:banner:create', '鏂板缓杞挱鍥�', '杞挱鍥�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:banner:delete', '鍒犻櫎杞挱鍥�', '杞挱鍥�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:banner:update', '淇敼杞挱鍥�', '杞挱鍥�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:banner:query', '鏌ヨ杞挱鍥�', '杞挱鍥�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:banner:exportExcel', '瀵煎嚭杞挱鍥�(Excel)', '杞挱鍥�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
+-- 鍒嗙被淇℃伅琛�
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:category:create', '鏂板缓鍒嗙被淇℃伅琛�', '鍒嗙被淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:category:delete', '鍒犻櫎鍒嗙被淇℃伅琛�', '鍒嗙被淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:category:update', '淇敼鍒嗙被淇℃伅琛�', '鍒嗙被淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:category:query', '鏌ヨ鍒嗙被淇℃伅琛�', '鍒嗙被淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:category:exportExcel', '瀵煎嚭鍒嗙被淇℃伅琛�(Excel)', '鍒嗙被淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
+-- 缁勭粐淇℃伅琛�
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:company:create', '鏂板缓缁勭粐淇℃伅琛�', '缁勭粐淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:company:delete', '鍒犻櫎缁勭粐淇℃伅琛�', '缁勭粐淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:company:update', '淇敼缁勭粐淇℃伅琛�', '缁勭粐淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:company:query', '鏌ヨ缁勭粐淇℃伅琛�', '缁勭粐淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:company:exportExcel', '瀵煎嚭缁勭粐淇℃伅琛�(Excel)', '缁勭粐淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
+-- 璐d换浜轰俊鎭〃
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:managers:create', '鏂板缓璐d换浜轰俊鎭〃', '璐d换浜轰俊鎭〃', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:managers:delete', '鍒犻櫎璐d换浜轰俊鎭〃', '璐d换浜轰俊鎭〃', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:managers:update', '淇敼璐d换浜轰俊鎭〃', '璐d换浜轰俊鎭〃', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:managers:query', '鏌ヨ璐d换浜轰俊鎭〃', '璐d换浜轰俊鎭〃', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:managers:exportExcel', '瀵煎嚭璐d换浜轰俊鎭〃(Excel)', '璐d换浜轰俊鎭〃', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
+-- 浜哄憳淇℃伅琛�
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:member:create', '鏂板缓浜哄憳淇℃伅琛�', '浜哄憳淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:member:delete', '鍒犻櫎浜哄憳淇℃伅琛�', '浜哄憳淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:member:update', '淇敼浜哄憳淇℃伅琛�', '浜哄憳淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:member:query', '鏌ヨ浜哄憳淇℃伅琛�', '浜哄憳淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:member:exportExcel', '瀵煎嚭浜哄憳淇℃伅琛�(Excel)', '浜哄憳淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
+-- 闄勪欢涓婁紶淇℃伅琛�
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:multifile:create', '鏂板缓闄勪欢涓婁紶淇℃伅琛�', '闄勪欢涓婁紶淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:multifile:delete', '鍒犻櫎闄勪欢涓婁紶淇℃伅琛�', '闄勪欢涓婁紶淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:multifile:update', '淇敼闄勪欢涓婁紶淇℃伅琛�', '闄勪欢涓婁紶淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:multifile:query', '鏌ヨ闄勪欢涓婁紶淇℃伅琛�', '闄勪欢涓婁紶淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:multifile:exportExcel', '瀵煎嚭闄勪欢涓婁紶淇℃伅琛�(Excel)', '闄勪欢涓婁紶淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
+-- 绯荤粺娑堟伅淇℃伅琛�
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:notices:create', '鏂板缓绯荤粺娑堟伅淇℃伅琛�', '绯荤粺娑堟伅淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:notices:delete', '鍒犻櫎绯荤粺娑堟伅淇℃伅琛�', '绯荤粺娑堟伅淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:notices:update', '淇敼绯荤粺娑堟伅淇℃伅琛�', '绯荤粺娑堟伅淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:notices:query', '鏌ヨ绯荤粺娑堟伅淇℃伅琛�', '绯荤粺娑堟伅淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:notices:exportExcel', '瀵煎嚭绯荤粺娑堟伅淇℃伅琛�(Excel)', '绯荤粺娑堟伅淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
+-- 宸ュ崟淇℃伅琛�
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorder:create', '鏂板缓宸ュ崟淇℃伅琛�', '宸ュ崟淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorder:delete', '鍒犻櫎宸ュ崟淇℃伅琛�', '宸ュ崟淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorder:update', '淇敼宸ュ崟淇℃伅琛�', '宸ュ崟淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorder:query', '鏌ヨ宸ュ崟淇℃伅琛�', '宸ュ崟淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorder:exportExcel', '瀵煎嚭宸ュ崟淇℃伅琛�(Excel)', '宸ュ崟淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
+-- 宸ュ崟鎿嶄綔鍘嗗彶琛�
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorderlog:create', '鏂板缓宸ュ崟鎿嶄綔鍘嗗彶琛�', '宸ュ崟鎿嶄綔鍘嗗彶琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorderlog:delete', '鍒犻櫎宸ュ崟鎿嶄綔鍘嗗彶琛�', '宸ュ崟鎿嶄綔鍘嗗彶琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorderlog:update', '淇敼宸ュ崟鎿嶄綔鍘嗗彶琛�', '宸ュ崟鎿嶄綔鍘嗗彶琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorderlog:query', '鏌ヨ宸ュ崟鎿嶄綔鍘嗗彶琛�', '宸ュ崟鎿嶄綔鍘嗗彶琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorderlog:exportExcel', '瀵煎嚭宸ュ崟鎿嶄綔鍘嗗彶琛�(Excel)', '宸ュ崟鎿嶄綔鍘嗗彶琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
diff --git a/server/services/src/main/java/com/doumee/biz/system/AgreementConfigBiz.java b/server/services/src/main/java/com/doumee/biz/system/AgreementConfigBiz.java
new file mode 100644
index 0000000..fb8867d
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/biz/system/AgreementConfigBiz.java
@@ -0,0 +1,21 @@
+package com.doumee.biz.system;
+
+import com.doumee.dao.dto.AgreementConfigDTO;
+
+/**
+ * 鍗忚閰嶇疆涓氬姟澶勭悊
+ * @author rk
+ * @date 2026/04/13
+ */
+public interface AgreementConfigBiz {
+
+    /**
+     * 鏌ヨ鍗忚閰嶇疆
+     */
+    AgreementConfigDTO getConfig();
+
+    /**
+     * 淇濆瓨鍗忚閰嶇疆
+     */
+    void saveConfig(AgreementConfigDTO dto);
+}
diff --git a/server/services/src/main/java/com/doumee/biz/system/OperationConfigBiz.java b/server/services/src/main/java/com/doumee/biz/system/OperationConfigBiz.java
new file mode 100644
index 0000000..c4285f5
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/biz/system/OperationConfigBiz.java
@@ -0,0 +1,21 @@
+package com.doumee.biz.system;
+
+import com.doumee.dao.dto.OperationConfigDTO;
+
+/**
+ * 杩愯惀閰嶇疆涓氬姟澶勭悊
+ * @author rk
+ * @date 2026/04/13
+ */
+public interface OperationConfigBiz {
+
+    /**
+     * 鏌ヨ杩愯惀閰嶇疆
+     */
+    OperationConfigDTO getConfig();
+
+    /**
+     * 鎵归噺淇濆瓨杩愯惀閰嶇疆锛堟柊澧炴垨鏇存柊锛�
+     */
+    void saveConfig(OperationConfigDTO dto);
+}
diff --git a/server/services/src/main/java/com/doumee/biz/system/impl/AgreementConfigBizImpl.java b/server/services/src/main/java/com/doumee/biz/system/impl/AgreementConfigBizImpl.java
new file mode 100644
index 0000000..89636d3
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/biz/system/impl/AgreementConfigBizImpl.java
@@ -0,0 +1,74 @@
+package com.doumee.biz.system.impl;
+
+import com.doumee.biz.system.AgreementConfigBiz;
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.core.constants.Constants;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.dao.dto.AgreementConfigDTO;
+import com.doumee.dao.system.model.SystemDictData;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * 鍗忚閰嶇疆涓氬姟瀹炵幇
+ * @author rk
+ * @date 2026/04/13
+ */
+@Service
+public class AgreementConfigBizImpl implements AgreementConfigBiz {
+
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+
+    @Override
+    public AgreementConfigDTO getConfig() {
+        AgreementConfigDTO dto = new AgreementConfigDTO();
+        dto.setPrivacyAgreement(getValue(Constants.PRIVACY_AGREEMENT));
+        dto.setUserAgreement(getValue(Constants.USER_AGREEMENT));
+        dto.setAboutUs(getValue(Constants.ABOUT_US));
+        return dto;
+    }
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
+    public void saveConfig(AgreementConfigDTO dto) {
+        validate(dto);
+        saveOrUpdate(Constants.PRIVACY_AGREEMENT, "闅愮鍗忚", dto.getPrivacyAgreement());
+        saveOrUpdate(Constants.USER_AGREEMENT, "鐢ㄦ埛鍗忚", dto.getUserAgreement());
+        saveOrUpdate(Constants.ABOUT_US, "鍏充簬鎴戜滑", dto.getAboutUs());
+    }
+
+    private String getValue(String label) {
+        SystemDictData data = systemDictDataBiz.queryByCode(Constants.SYSTEM, label);
+        return data != null ? data.getCode() : null;
+    }
+
+    private void saveOrUpdate(String label, String remark, String value) {
+        SystemDictData existing = systemDictDataBiz.queryByCode(Constants.SYSTEM, label);
+        if (existing != null && existing.getId() != null) {
+            existing.setCode(value);
+            systemDictDataBiz.updateById(existing);
+        } else {
+            SystemDictData newData = new SystemDictData();
+            newData.setDictId(100);
+            newData.setLabel(label);
+            newData.setRemark(remark);
+            newData.setCode(value);
+            newData.setDisabled(false);
+            newData.setDeleted(false);
+            systemDictDataBiz.create(newData);
+        }
+    }
+
+    private void validate(AgreementConfigDTO dto) {
+        if (dto == null
+                || StringUtils.isBlank(dto.getPrivacyAgreement())
+                || StringUtils.isBlank(dto.getUserAgreement())
+                || StringUtils.isBlank(dto.getAboutUs())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鎵�鏈夐厤缃」鍧囦负蹇呭~");
+        }
+    }
+}
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
new file mode 100644
index 0000000..5d569d9
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/biz/system/impl/OperationConfigBizImpl.java
@@ -0,0 +1,89 @@
+package com.doumee.biz.system.impl;
+
+import com.doumee.biz.system.OperationConfigBiz;
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.core.constants.Constants;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.dao.dto.OperationConfigDTO;
+import com.doumee.dao.system.model.SystemDictData;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * 杩愯惀閰嶇疆涓氬姟瀹炵幇
+ * @author rk
+ * @date 2026/04/13
+ */
+@Service
+public class OperationConfigBizImpl implements OperationConfigBiz {
+
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+
+    @Override
+    public OperationConfigDTO getConfig() {
+        OperationConfigDTO dto = new OperationConfigDTO();
+        dto.setDriverDailyCancelLimit(getValue(Constants.OP_DRIVER_DAILY_CANCEL_LIMIT));
+        dto.setUnpickedDiscount(getValue(Constants.OP_UNPICKED_DISCOUNT));
+        dto.setSettlementDate(getValue(Constants.OP_SETTLEMENT_DATE));
+        dto.setUrgentCoefficient(getValue(Constants.OP_URGENT_COEFFICIENT));
+        dto.setAutoCancelTime(getValue(Constants.OP_AUTO_CANCEL_TIME));
+        dto.setInsuranceRate(getValue(Constants.OP_INSURANCE_RATE));
+        dto.setOrderAcceptLimit(getValue(Constants.OP_ORDER_ACCEPT_LIMIT));
+        dto.setAutoConfirmReceipt(getValue(Constants.OP_AUTO_CONFIRM_RECEIPT));
+        return dto;
+    }
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
+    public void saveConfig(OperationConfigDTO dto) {
+        validate(dto);
+        saveOrUpdate(Constants.OP_DRIVER_DAILY_CANCEL_LIMIT, "鍙告満姣忔棩鍙栨秷娆℃暟", dto.getDriverDailyCancelLimit());
+        saveOrUpdate(Constants.OP_UNPICKED_DISCOUNT, "鏈彇浠舵姌鎵�", dto.getUnpickedDiscount());
+        saveOrUpdate(Constants.OP_SETTLEMENT_DATE, "璁㈠崟缁撶畻鏃ユ湡", dto.getSettlementDate());
+        saveOrUpdate(Constants.OP_URGENT_COEFFICIENT, "鍔犳�ョ郴鏁�", dto.getUrgentCoefficient());
+        saveOrUpdate(Constants.OP_AUTO_CANCEL_TIME, "瓒呮椂鏈敮浠樿嚜鍔ㄥ彇娑堟椂闂�", dto.getAutoCancelTime());
+        saveOrUpdate(Constants.OP_INSURANCE_RATE, "淇濊垂姣旂巼", dto.getInsuranceRate());
+        saveOrUpdate(Constants.OP_ORDER_ACCEPT_LIMIT, "鎺ュ崟鏁伴噺", dto.getOrderAcceptLimit());
+        saveOrUpdate(Constants.OP_AUTO_CONFIRM_RECEIPT, "鑷姩纭鏀惰揣", dto.getAutoConfirmReceipt());
+    }
+
+    private String getValue(String label) {
+        SystemDictData data = systemDictDataBiz.queryByCode(Constants.OPERATION_CONFIG, label);
+        return data != null ? data.getCode() : null;
+    }
+
+    private void saveOrUpdate(String label, String name, String value) {
+        SystemDictData existing = systemDictDataBiz.queryByCode(Constants.OPERATION_CONFIG, label);
+        if (existing != null && existing.getId() != null) {
+            existing.setCode(value);
+            systemDictDataBiz.updateById(existing);
+        } else {
+            SystemDictData newData = new SystemDictData();
+            newData.setDictId(105);
+            newData.setLabel(label);
+            newData.setRemark(name);
+            newData.setCode(value);
+            newData.setDisabled(false);
+            newData.setDeleted(false);
+            systemDictDataBiz.create(newData);
+        }
+    }
+
+    private void validate(OperationConfigDTO dto) {
+        if (dto == null
+                || StringUtils.isBlank(dto.getDriverDailyCancelLimit())
+                || StringUtils.isBlank(dto.getUnpickedDiscount())
+                || StringUtils.isBlank(dto.getSettlementDate())
+                || StringUtils.isBlank(dto.getUrgentCoefficient())
+                || StringUtils.isBlank(dto.getAutoCancelTime())
+                || StringUtils.isBlank(dto.getInsuranceRate())
+                || StringUtils.isBlank(dto.getOrderAcceptLimit())
+                || StringUtils.isBlank(dto.getAutoConfirmReceipt())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鎵�鏈夐厤缃」鍧囦负蹇呭~");
+        }
+    }
+}
diff --git a/server/services/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java b/server/services/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java
index 54bdf66..aab481a 100644
--- a/server/services/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java
+++ b/server/services/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java
@@ -31,6 +31,10 @@
 
     public static final String MEMBER_INFO = "MEMBER_INFO";
 
+    public static final String SHOP_ID = "SHOP_ID";
+
+    public static final String SHOP_INFO = "SHOP_INFO";
+
     @Resource
     private RedisTemplate<String,Object> redisTemplate;
 
diff --git a/server/services/src/main/java/com/doumee/config/jwt/WebMvcConfig.java b/server/services/src/main/java/com/doumee/config/jwt/WebMvcConfig.java
index a52062a..6a3bcd9 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
@@ -2,15 +2,18 @@
 
 import com.alibaba.fastjson.JSONObject;
 import com.doumee.core.annotation.LoginRequired;
+import com.doumee.core.annotation.LoginShopRequired;
 import com.doumee.core.constants.Constants;
 import com.doumee.core.constants.ResponseStatus;
 import com.doumee.core.exception.BusinessException;
 import com.doumee.dao.business.model.Member;
+import com.doumee.dao.business.model.ShopInfo;
 import io.jsonwebtoken.JwtException;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.client.RestTemplate;
 import org.springframework.web.method.HandlerMethod;
@@ -30,8 +33,9 @@
     @Autowired
     private JdbcTemplate dao;
 
-    @Resource
-    private JwtTokenUtil jwtTokenUtil;
+    @Autowired
+    private RedisTemplate<String,Object> redisTemplate;
+
 
     /**
      * 娣诲姞鎷︽埅鍣�
@@ -55,7 +59,7 @@
                     //鑾峰彇token
                     String token = request.getHeader(JwtTokenUtil.HEADER_KEY);  // 浠� http 璇锋眰澶翠腑鍙栧嚭 token
                     if (StringUtils.isNotBlank(token)) {
-                        checkLogin(request,response);
+                        checkMemberLogin(request,response);
                     } else {
                         throw new BusinessException(ResponseStatus.BE_OVERDUE.getCode(),"鏈櫥褰�");
                     }
@@ -63,7 +67,23 @@
                     //鑾峰彇token
                     String token = request.getHeader(JwtTokenUtil.HEADER_KEY);  // 浠� http 璇锋眰澶翠腑鍙栧嚭 token
                     if (StringUtils.isNotBlank(token)) {
-                        checkLogin(request,response);
+                        checkMemberLogin(request,response);
+                    } else {
+                        throw new BusinessException(ResponseStatus.BE_OVERDUE.getCode(),"鏈櫥褰�");
+                    }
+                }else if (beanType.isAnnotationPresent(LoginShopRequired.class)) {
+                    //鑾峰彇token
+                    String token = request.getHeader(JwtTokenUtil.HEADER_KEY);  // 浠� http 璇锋眰澶翠腑鍙栧嚭 token
+                    if (StringUtils.isNotBlank(token)) {
+                        checkShopLogin(request,response);
+                    } else {
+                        throw new BusinessException(ResponseStatus.BE_OVERDUE.getCode(),"鏈櫥褰�");
+                    }
+                }else if (handlerMethod.hasMethodAnnotation(LoginShopRequired.class)){
+                    //鑾峰彇token
+                    String token = request.getHeader(JwtTokenUtil.HEADER_KEY);  // 浠� http 璇锋眰澶翠腑鍙栧嚭 token
+                    if (StringUtils.isNotBlank(token)) {
+                        checkShopLogin(request,response);
                     } else {
                         throw new BusinessException(ResponseStatus.BE_OVERDUE.getCode(),"鏈櫥褰�");
                     }
@@ -76,12 +96,20 @@
 
 
 
-    public Boolean checkLogin(HttpServletRequest request, HttpServletResponse response){
+    public Boolean checkMemberLogin(HttpServletRequest request, HttpServletResponse response){
         String token = request.getHeader(JwtTokenUtil.HEADER_KEY);
         try {
-            Member member  = jwtTokenUtil.getUserInfoByToken(token);
+
+            if(!token.startsWith(Constants.ZERO+"")){
+                throw new BusinessException(ResponseStatus.TOKEN_EXCEED_TIME);
+            }
+            String tokenRedis = (String) redisTemplate.opsForValue().get(token);
+            if(StringUtils.isBlank(tokenRedis)){
+                throw new BusinessException(ResponseStatus.BE_OVERDUE);
+            }
+            Member member = JSONObject.parseObject(tokenRedis, Member.class);
             if(Objects.isNull(member)){
-                throw new BusinessException(ResponseStatus.TOKEN_EXCEED_TIME.getCode(),"闀挎椂闂存湭鎿嶄綔,璇烽噸鏂扮櫥褰�");
+                throw new BusinessException(ResponseStatus.TOKEN_EXCEED_TIME);
             }
             Integer isDeleted = dao.queryForObject(" select COALESCE(DELETED,1)  from member where id  = ?", Integer.class, member.getId());
             if(isDeleted.equals(Constants.ONE)){
@@ -89,7 +117,6 @@
             }
             Integer count = dao.queryForObject("select count(1) from member where id  = ?", Integer.class, member.getId());
             if (count != null && count > 0) {
-//                jwtTokenUtil.refreshToken(token,member);
                 request.setAttribute(JwtTokenUtil.MEMBER_INFO, JSONObject.toJSONString(member));
                 request.setAttribute(JwtTokenUtil.MEMBER_ID, member.getId());
                 return true;
@@ -101,6 +128,59 @@
         }
     }
 
+
+    public Boolean checkShopLogin(HttpServletRequest request, HttpServletResponse response){
+        String token = request.getHeader(JwtTokenUtil.HEADER_KEY);
+        try {
+            if(!token.startsWith(Constants.TWO+"")){
+                throw new BusinessException(ResponseStatus.TOKEN_EXCEED_TIME);
+            }
+            String tokenRedis = (String) redisTemplate.opsForValue().get(token);
+            if(StringUtils.isBlank(tokenRedis)){
+                throw new BusinessException(ResponseStatus.BE_OVERDUE);
+            }
+            ShopInfo shop = JSONObject.parseObject(tokenRedis, ShopInfo.class);
+            if(Objects.isNull(shop)){
+                throw new BusinessException(ResponseStatus.BE_OVERDUE);
+            }
+            String openid = shop.getOpenid();
+            Integer shopId = getTokenId(token);
+            Integer isDeleted = dao.queryForObject(" select COALESCE(ISDELETED,0)  from shop_info where id  = ?", Integer.class, shopId);
+            if(isDeleted== Constants.ONE){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍟嗘埛宸插垹闄�,璇疯仈绯荤鐞嗗憳");
+            }
+            Integer isForbidden = dao.queryForObject(" select COALESCE(STATUS,0)  from shop_info where id  = ?", Integer.class, shopId);
+            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);
+            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);
+            if (count != null && count > 0) {
+                request.setAttribute(JwtTokenUtil.SHOP_INFO, JSONObject.toJSONString(shop));
+                request.setAttribute(JwtTokenUtil.SHOP_ID, shop.getId());
+                return true;
+            }else{
+                throw new BusinessException(ResponseStatus.BE_OVERDUE.getCode(),"鐢ㄦ埛淇℃伅鍑洪敊");
+            }
+        } catch (IllegalArgumentException | JwtException e) {
+            throw new BusinessException(ResponseStatus.BE_OVERDUE);
+        }
+    }
+
+
+    public Integer getTokenId(String token){
+        try {
+            Integer lastIndex = token.lastIndexOf("_")+1;
+            Integer tokenId = Integer.valueOf(token.substring(lastIndex));
+            return tokenId;
+        }catch (Exception e){
+            throw new BusinessException(ResponseStatus.BE_OVERDUE);
+        }
+    }
+
     @Bean
     public RestTemplate getRestTemplate(){
         return new RestTemplate();
diff --git a/server/services/src/main/java/com/doumee/config/wx/TransferDetailEntityNew.java b/server/services/src/main/java/com/doumee/config/wx/TransferDetailEntityNew.java
deleted file mode 100644
index c40e6df..0000000
--- a/server/services/src/main/java/com/doumee/config/wx/TransferDetailEntityNew.java
+++ /dev/null
@@ -1,213 +0,0 @@
-package com.doumee.config.wx;
-
-
-import com.google.gson.annotations.SerializedName;
-import com.wechat.pay.java.core.cipher.PrivacyDecryptor;
-import lombok.Data;
-
-import java.util.Objects;
-
-/**
- * 鍟嗘埛鍗曞彿鏌ヨ杞处鍗曞疄浣撶被淇℃伅
- *
- * @author: suhai
- * @date: 2025/05/13  11:28
- */
-@Data
-public class TransferDetailEntityNew {
-    /** 鍟嗘埛鍙� Y 璇存槑锛氬井淇℃敮浠樺垎閰嶇殑鍟嗘埛鍙� */
-    @SerializedName("mch_id")
-    private String mchId;
-
-    /** 鍟嗘埛鍗曞彿 Y 璇存槑锛氬晢鎴风郴缁熷唴閮ㄧ殑鍟嗗鍗曞彿锛岃姹傛鍙傛暟鍙兘鐢辨暟瀛椼�佸ぇ灏忓啓瀛楁瘝缁勬垚锛屽湪鍟嗘埛绯荤粺鍐呴儴鍞竴 */
-    @SerializedName("out_bill_no")
-    private String outBillNo;
-
-    /** 鍟嗗杞处璁㈠崟鍙� Y 璇存槑锛氬晢瀹惰浆璐﹁鍗曠殑涓婚敭锛屽敮涓�瀹氫箟姝よ祫婧愮殑鏍囪瘑 */
-    @SerializedName("transfer_bill_no")
-    private String transferBillNo;
-
-    /** 鍟嗘埛appid Y 璇存槑锛氱敵璇峰晢鎴峰彿鐨刟ppid鎴栧晢鎴峰彿缁戝畾鐨刟ppid锛堜紒涓氬彿corpid鍗充负姝ppid锛� */
-    @SerializedName("appid")
-    private String appid;
-
-    /** 鍗曟嵁鐘舵�� Y 璇存槑锛氬崟鎹姸鎬�  */
-    @SerializedName("state")
-    private String state;
-
-    /** 杞处閲戦 Y 璇存槑锛氳浆璐﹂噾棰濆崟浣嶄负鈥滃垎鈥濄��*/
-    @SerializedName("transfer_amount")
-    private Integer transferAmount;
-
-    /** 杞处澶囨敞 Y 璇存槑锛氳浆璐﹀娉紝鐢ㄦ埛鏀舵鏃跺彲瑙佽澶囨敞淇℃伅锛孶TF8缂栫爜锛屾渶澶氬厑璁�32涓瓧绗︺��*/
-    @SerializedName("transfer_remark")
-    private String transferRemark;
-
-    /** 澶辫触鍘熷洜 N 璇存槑锛氳鍗曞凡澶辫触鎴栬�呭凡閫�璧勯噾鏃讹紝杩斿洖澶辫触鍘熷洜銆� */
-    @SerializedName("fail_reason")
-    private String failReason;
-
-    /** 鏀舵鐢ㄦ埛OpenID Y 璇存槑锛氬晢鎴稟ppID涓嬶紝鏌愮敤鎴风殑OpenID  */
-    @SerializedName("openid")
-    private String openid;
-
-    /** 鏀舵鐢ㄦ埛濮撳悕 N 璇存槑锛氭敹娆炬柟鐪熷疄濮撳悕銆傞渶瑕佸姞瀵嗕紶鍏ワ紝鏀寔鏍囧噯RSA绠楁硶鍜屽浗瀵嗙畻娉曪紝鍏挜鐢卞井淇′晶鎻愪緵銆�
-     杞处閲戦 >= 2,000鍏冩椂锛岃绗旀槑缁嗗繀椤诲~鍐�
-     鑻ュ晢鎴蜂紶鍏ユ敹娆剧敤鎴峰鍚嶏紝寰俊鏀粯浼氭牎楠屾敹娆剧敤鎴蜂笌杈撳叆濮撳悕鏄惁涓�鑷达紝骞舵彁渚涚數瀛愬洖鍗� */
-    @SerializedName("user_name")
-    private String userName;
-
-    /** 鍗曟嵁鍒涘缓鏃堕棿 N 璇存槑锛氬崟鎹彈鐞嗘垚鍔熸椂杩斿洖锛屾寜鐓т娇鐢╮fc3339鎵�瀹氫箟鐨勬牸寮忥紝鏍煎紡涓簓yyy-MM-DDThh:mm:ss+TIMEZONE */
-    @SerializedName("create_time")
-    private String createTime;
-
-    /** 鏈�鍚庝竴娆$姸鎬佸彉鏇存椂闂� N 璇存槑锛氬崟鎹渶鍚庢洿鏂版椂闂达紝鎸夌収浣跨敤rfc3339鎵�瀹氫箟鐨勬牸寮忥紝鏍煎紡涓簓yyy-MM-DDThh:mm:ss+TIMEZONE */
-    @SerializedName("update_time")
-    private String updateTime;
-
-    public String getMchId() {
-        return mchId;
-    }
-
-    public void setMchId(String mchId) {
-        this.mchId = mchId;
-    }
-
-    public String getOutBillNo() {
-        return outBillNo;
-    }
-
-    public void setOutBillNo(String outBillNo) {
-        this.outBillNo = outBillNo;
-    }
-
-    public String getTransferBillNo() {
-        return transferBillNo;
-    }
-
-    public void setTransferBillNo(String transferBillNo) {
-        this.transferBillNo = transferBillNo;
-    }
-
-    public String getAppid() {
-        return appid;
-    }
-
-    public void setAppid(String appid) {
-        this.appid = appid;
-    }
-
-    public String getState() {
-        return state;
-    }
-
-    public void setState(String state) {
-        this.state = state;
-    }
-
-    public Integer getTransferAmount() {
-        return transferAmount;
-    }
-
-    public void setTransferAmount(Integer transferAmount) {
-        this.transferAmount = transferAmount;
-    }
-
-    public String getTransferRemark() {
-        return transferRemark;
-    }
-
-    public void setTransferRemark(String transferRemark) {
-        this.transferRemark = transferRemark;
-    }
-
-    public String getFailReason() {
-        return failReason;
-    }
-
-    public void setFailReason(String failReason) {
-        this.failReason = failReason;
-    }
-
-    public String getOpenid() {
-        return openid;
-    }
-
-    public void setOpenid(String openid) {
-        this.openid = openid;
-    }
-
-    public String getUserName() {
-        return userName;
-    }
-
-    public void setUserName(String userName) {
-        this.userName = userName;
-    }
-
-    public String getCreateTime() {
-        return createTime;
-    }
-
-    public void setCreateTime(String createTime) {
-        this.createTime = createTime;
-    }
-
-    public String getUpdateTime() {
-        return updateTime;
-    }
-
-    public void setUpdateTime(String updateTime) {
-        this.updateTime = updateTime;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (o == null || getClass() != o.getClass()) return false;
-        TransferDetailEntityNew that = (TransferDetailEntityNew) o;
-        return Objects.equals(mchId, that.mchId) && Objects.equals(outBillNo, that.outBillNo) && Objects.equals(transferBillNo, that.transferBillNo) && Objects.equals(appid, that.appid) && Objects.equals(state, that.state) && Objects.equals(transferAmount, that.transferAmount) && Objects.equals(transferRemark, that.transferRemark) && Objects.equals(failReason, that.failReason) && Objects.equals(openid, that.openid) && Objects.equals(userName, that.userName) && Objects.equals(createTime, that.createTime) && Objects.equals(updateTime, that.updateTime);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(mchId, outBillNo, transferBillNo, appid, state, transferAmount, transferRemark, failReason, openid, userName, createTime, updateTime);
-    }
-
-    @Override
-    public String toString() {
-        return "TransferDetailEntityNew{" +
-                "mchId='" + mchId + '\'' +
-                ", outBillNo='" + outBillNo + '\'' +
-                ", transferBillNo='" + transferBillNo + '\'' +
-                ", appid='" + appid + '\'' +
-                ", state='" + state + '\'' +
-                ", transferAmount=" + transferAmount +
-                ", transferRemark='" + transferRemark + '\'' +
-                ", failReason='" + failReason + '\'' +
-                ", openid='" + openid + '\'' +
-                ", userName='" + userName + '\'' +
-                ", createTime='" + createTime + '\'' +
-                ", updateTime='" + updateTime + '\'' +
-                '}';
-    }
-
-    public TransferDetailEntityNew cloneWithCipher(PrivacyDecryptor encryptor) {
-        TransferDetailEntityNew copy = new TransferDetailEntityNew();
-        copy.mchId = mchId;
-        copy.outBillNo = outBillNo;
-        copy.transferBillNo = transferBillNo;
-        copy.appid = appid;
-        copy.state = state;
-        copy.transferAmount = transferAmount;
-        copy.transferRemark = transferRemark;
-        copy.failReason = failReason;
-        copy.openid = openid;
-        if (userName != null && !userName.isEmpty()) {
-            copy.userName = encryptor.decrypt(userName);
-        }
-        copy.createTime = createTime;
-        copy.updateTime = updateTime;
-        return copy;
-    }
-}
-
diff --git a/server/services/src/main/java/com/doumee/config/wx/WXPayUtility.java b/server/services/src/main/java/com/doumee/config/wx/WXPayUtility.java
deleted file mode 100644
index bf29e52..0000000
--- a/server/services/src/main/java/com/doumee/config/wx/WXPayUtility.java
+++ /dev/null
@@ -1,456 +0,0 @@
-package com.doumee.config.wx;
-
-
-import com.google.gson.ExclusionStrategy;
-import com.google.gson.FieldAttributes;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
-import com.google.gson.JsonSyntaxException;
-import com.google.gson.annotations.Expose;
-import com.wechat.pay.java.core.util.GsonUtil;
-import okhttp3.Headers;
-import okhttp3.Response;
-import okio.BufferedSource;
-
-import javax.crypto.BadPaddingException;
-import javax.crypto.Cipher;
-import javax.crypto.IllegalBlockSizeException;
-import javax.crypto.NoSuchPaddingException;
-import java.io.IOException;
-import java.io.UncheckedIOException;
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.security.InvalidKeyException;
-import java.security.KeyFactory;
-import java.security.NoSuchAlgorithmException;
-import java.security.PrivateKey;
-import java.security.PublicKey;
-import java.security.SecureRandom;
-import java.security.Signature;
-import java.security.SignatureException;
-import java.security.spec.InvalidKeySpecException;
-import java.security.spec.PKCS8EncodedKeySpec;
-import java.security.spec.X509EncodedKeySpec;
-import java.time.DateTimeException;
-import java.time.Duration;
-import java.time.Instant;
-import java.util.Base64;
-import java.util.Map;
-import java.util.Objects;
-
-public class WXPayUtility {
-    private static final Gson gson = new GsonBuilder()
-            .disableHtmlEscaping()
-            .addSerializationExclusionStrategy(new ExclusionStrategy() {
-                @Override
-                public boolean shouldSkipField(FieldAttributes fieldAttributes) {
-                    final Expose expose = fieldAttributes.getAnnotation(Expose.class);
-                    return expose != null && !expose.serialize();
-                }
-
-                @Override
-                public boolean shouldSkipClass(Class<?> aClass) {
-                    return false;
-                }
-            })
-            .addDeserializationExclusionStrategy(new ExclusionStrategy() {
-                @Override
-                public boolean shouldSkipField(FieldAttributes fieldAttributes) {
-                    final Expose expose = fieldAttributes.getAnnotation(Expose.class);
-                    return expose != null && !expose.deserialize();
-                }
-
-                @Override
-                public boolean shouldSkipClass(Class<?> aClass) {
-                    return false;
-                }
-            })
-            .create();
-    private static final char[] SYMBOLS =
-            "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
-    private static final SecureRandom random = new SecureRandom();
-
-    /**
-     * 灏� Object 杞崲涓� JSON 瀛楃涓�
-     */
-    public static String toJson(Object object) {
-        return gson.toJson(object);
-    }
-
-    /**
-     * 灏� JSON 瀛楃涓茶В鏋愪负鐗瑰畾绫诲瀷鐨勫疄渚�
-     */
-    public static <T> T fromJson(String json, Class<T> classOfT) throws JsonSyntaxException {
-        return gson.fromJson(json, classOfT);
-    }
-
-    /**
-     * 浠庡叕绉侀挜鏂囦欢璺緞涓鍙栨枃浠跺唴瀹�
-     *
-     * @param keyPath 鏂囦欢璺緞
-     * @return 鏂囦欢鍐呭
-     */
-    private static String readKeyStringFromPath(String keyPath) {
-        try {
-            return new String(Files.readAllBytes(Paths.get(keyPath)), StandardCharsets.UTF_8);
-        } catch (IOException e) {
-            throw new UncheckedIOException(e);
-        }
-    }
-
-    /**
-     * 璇诲彇 PKCS#8 鏍煎紡鐨勭閽ュ瓧绗︿覆骞跺姞杞戒负绉侀挜瀵硅薄
-     *
-     * @param keyString 绉侀挜鏂囦欢鍐呭锛屼互 -----BEGIN PRIVATE KEY----- 寮�澶�
-     * @return PrivateKey 瀵硅薄
-     */
-    public static PrivateKey loadPrivateKeyFromString(String keyString) {
-        try {
-            keyString = keyString.replace("-----BEGIN PRIVATE KEY-----", "")
-                    .replace("-----END PRIVATE KEY-----", "")
-                    .replaceAll("\\s+", "");
-            return KeyFactory.getInstance("RSA").generatePrivate(
-                    new PKCS8EncodedKeySpec(Base64.getDecoder().decode(keyString)));
-        } catch (NoSuchAlgorithmException e) {
-            throw new UnsupportedOperationException(e);
-        } catch (InvalidKeySpecException e) {
-            throw new IllegalArgumentException(e);
-        }
-    }
-
-    /**
-     * 浠� PKCS#8 鏍煎紡鐨勭閽ユ枃浠朵腑鍔犺浇绉侀挜
-     *
-     * @param keyPath 绉侀挜鏂囦欢璺緞
-     * @return PrivateKey 瀵硅薄
-     */
-    public static PrivateKey loadPrivateKeyFromPath(String keyPath) {
-        return loadPrivateKeyFromString(readKeyStringFromPath(keyPath));
-    }
-
-    /**
-     * 璇诲彇 PKCS#8 鏍煎紡鐨勫叕閽ュ瓧绗︿覆骞跺姞杞戒负鍏挜瀵硅薄
-     *
-     * @param keyString 鍏挜鏂囦欢鍐呭锛屼互 -----BEGIN PUBLIC KEY----- 寮�澶�
-     * @return PublicKey 瀵硅薄
-     */
-    public static PublicKey loadPublicKeyFromString(String keyString) {
-        try {
-            keyString = keyString.replace("-----BEGIN PUBLIC KEY-----", "")
-                    .replace("-----END PUBLIC KEY-----", "")
-                    .replaceAll("\\s+", "");
-            return KeyFactory.getInstance("RSA").generatePublic(
-                    new X509EncodedKeySpec(Base64.getDecoder().decode(keyString)));
-        } catch (NoSuchAlgorithmException e) {
-            throw new UnsupportedOperationException(e);
-        } catch (InvalidKeySpecException e) {
-            throw new IllegalArgumentException(e);
-        }
-    }
-
-    /**
-     * 浠� PKCS#8 鏍煎紡鐨勫叕閽ユ枃浠朵腑鍔犺浇鍏挜
-     *
-     * @param keyPath 鍏挜鏂囦欢璺緞
-     * @return PublicKey 瀵硅薄
-     */
-    public static PublicKey loadPublicKeyFromPath(String keyPath) {
-        return loadPublicKeyFromString(readKeyStringFromPath(keyPath));
-    }
-
-    /**
-     * 鍒涘缓鎸囧畾闀垮害鐨勯殢鏈哄瓧绗︿覆锛屽瓧绗﹂泦涓篬0-9a-zA-Z]锛屽彲鐢ㄤ簬瀹夊叏鐩稿叧鐢ㄩ��
-     */
-    public static String createNonce(int length) {
-        char[] buf = new char[length];
-        for (int i = 0; i < length; ++i) {
-            buf[i] = SYMBOLS[random.nextInt(SYMBOLS.length)];
-        }
-        return new String(buf);
-    }
-
-    /**
-     * 浣跨敤鍏挜鎸夌収 RSA_PKCS1_OAEP_PADDING 绠楁硶杩涜鍔犲瘑
-     *
-     * @param publicKey 鍔犲瘑鐢ㄥ叕閽ュ璞�
-     * @param plaintext 寰呭姞瀵嗘槑鏂�
-     * @return 鍔犲瘑鍚庡瘑鏂�
-     */
-    public static String encrypt(PublicKey publicKey, String plaintext) {
-        final String transformation = "RSA/ECB/OAEPWithSHA-1AndMGF1Padding";
-
-        try {
-            Cipher cipher = Cipher.getInstance(transformation);
-            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
-            return Base64.getEncoder().encodeToString(cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8)));
-        } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
-            throw new IllegalArgumentException("The current Java environment does not support " + transformation, e);
-        } catch (InvalidKeyException e) {
-            throw new IllegalArgumentException("RSA encryption using an illegal publicKey", e);
-        } catch (BadPaddingException | IllegalBlockSizeException e) {
-            throw new IllegalArgumentException("Plaintext is too long", e);
-        }
-    }
-
-    /**
-     * 浣跨敤绉侀挜鎸夌収鎸囧畾绠楁硶杩涜绛惧悕
-     *
-     * @param message 寰呯鍚嶄覆
-     * @param algorithm 绛惧悕绠楁硶锛屽 SHA256withRSA
-     * @param privateKey 绛惧悕鐢ㄧ閽ュ璞�
-     * @return 绛惧悕缁撴灉
-     */
-    public static String sign(String message, String algorithm, PrivateKey privateKey) {
-        byte[] sign;
-        try {
-            Signature signature = Signature.getInstance(algorithm);
-            signature.initSign(privateKey);
-            signature.update(message.getBytes(StandardCharsets.UTF_8));
-            sign = signature.sign();
-        } catch (NoSuchAlgorithmException e) {
-            throw new UnsupportedOperationException("The current Java environment does not support " + algorithm, e);
-        } catch (InvalidKeyException e) {
-            throw new IllegalArgumentException(algorithm + " signature uses an illegal privateKey.", e);
-        } catch (SignatureException e) {
-            throw new RuntimeException("An error occurred during the sign process.", e);
-        }
-        return Base64.getEncoder().encodeToString(sign);
-    }
-
-    /**
-     * 浣跨敤鍏挜鎸夌収鐗瑰畾绠楁硶楠岃瘉绛惧悕
-     *
-     * @param message 寰呯鍚嶄覆
-     * @param signature 寰呴獙璇佺殑绛惧悕鍐呭
-     * @param algorithm 绛惧悕绠楁硶锛屽锛歋HA256withRSA
-     * @param publicKey 楠岀鐢ㄥ叕閽ュ璞�
-     * @return 绛惧悕楠岃瘉鏄惁閫氳繃
-     */
-    public static boolean verify(String message, String signature, String algorithm,
-                                 PublicKey publicKey) {
-        try {
-            Signature sign = Signature.getInstance(algorithm);
-            sign.initVerify(publicKey);
-            sign.update(message.getBytes(StandardCharsets.UTF_8));
-            return sign.verify(Base64.getDecoder().decode(signature));
-        } catch (SignatureException e) {
-            return false;
-        } catch (InvalidKeyException e) {
-            throw new IllegalArgumentException("verify uses an illegal publickey.", e);
-        } catch (NoSuchAlgorithmException e) {
-            throw new UnsupportedOperationException("The current Java environment does not support" + algorithm, e);
-        }
-    }
-
-    /**
-     * 鏍规嵁寰俊鏀粯APIv3璇锋眰绛惧悕瑙勫垯鏋勯�� Authorization 绛惧悕
-     *
-     * @param mchid 鍟嗘埛鍙�
-     * @param certificateSerialNo 鍟嗘埛API璇佷功搴忓垪鍙�
-     * @param privateKey 鍟嗘埛API璇佷功绉侀挜
-     * @param method 璇锋眰鎺ュ彛鐨凥TTP鏂规硶锛岃浣跨敤鍏ㄥぇ鍐欒〃杩帮紝濡� GET銆丳OST銆丳UT銆丏ELETE
-     * @param uri 璇锋眰鎺ュ彛鐨刄RL
-     * @param body 璇锋眰鎺ュ彛鐨凚ody
-     * @return 鏋勯�犲ソ鐨勫井淇℃敮浠楢PIv3 Authorization 澶�
-     */
-    public static String buildAuthorization(String mchid, String certificateSerialNo,
-                                            PrivateKey privateKey,
-                                            String method, String uri, String body) {
-        String nonce = createNonce(32);
-        long timestamp = Instant.now().getEpochSecond();
-
-        String message = String.format("%s\n%s\n%d\n%s\n%s\n", method, uri, timestamp, nonce,
-                body == null ? "" : body);
-
-        String signature = sign(message, "SHA256withRSA", privateKey);
-
-        return String.format(
-                "WECHATPAY2-SHA256-RSA2048 mchid=\"%s\",nonce_str=\"%s\",signature=\"%s\"," +
-                        "timestamp=\"%d\",serial_no=\"%s\"",
-                mchid, nonce, signature, timestamp, certificateSerialNo);
-    }
-
-    /**
-     * 瀵瑰弬鏁拌繘琛� URL 缂栫爜
-     *
-     * @param content 鍙傛暟鍐呭
-     * @return 缂栫爜鍚庣殑鍐呭
-     */
-    public static String urlEncode(String content) {
-        try {
-            return URLEncoder.encode(content, StandardCharsets.UTF_8.name());
-        } catch (UnsupportedEncodingException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    /**
-     * 瀵瑰弬鏁癕ap杩涜 URL 缂栫爜锛岀敓鎴� QueryString
-     *
-     * @param params Query鍙傛暟Map
-     * @return QueryString
-     */
-    public static String urlEncode(Map<String, Object> params) {
-        if (params == null || params.isEmpty()) {
-            return "";
-        }
-
-        int index = 0;
-        StringBuilder result = new StringBuilder();
-        for (Map.Entry<String, Object> entry : params.entrySet()) {
-            result.append(entry.getKey())
-                    .append("=")
-                    .append(urlEncode(entry.getValue().toString()));
-            index++;
-            if (index < params.size()) {
-                result.append("&");
-            }
-        }
-        return result.toString();
-    }
-
-    /**
-     * 浠庡簲绛斾腑鎻愬彇 Body
-     *
-     * @param response HTTP 璇锋眰搴旂瓟瀵硅薄
-     * @return 搴旂瓟涓殑Body鍐呭锛孊ody涓虹┖鏃惰繑鍥炵┖瀛楃涓�
-     */
-    public static String extractBody(Response response) {
-        if (response.body() == null) {
-            return "";
-        }
-
-        try {
-            BufferedSource source = response.body().source();
-            return source.readUtf8();
-        } catch (IOException e) {
-            throw new RuntimeException(String.format("An error occurred during reading response body. Status: %d", response.code()), e);
-        }
-    }
-
-    /**
-     * 鏍规嵁寰俊鏀粯APIv3搴旂瓟楠岀瑙勫垯瀵瑰簲绛旂鍚嶈繘琛岄獙璇侊紝楠岃瘉涓嶉�氳繃鏃舵姏鍑哄紓甯�
-     *
-     * @param wechatpayPublicKeyId 寰俊鏀粯鍏挜ID
-     * @param wechatpayPublicKey 寰俊鏀粯鍏挜瀵硅薄
-     * @param headers 寰俊鏀粯搴旂瓟 Header 鍒楄〃
-     * @param body 寰俊鏀粯搴旂瓟 Body
-     */
-    public static void validateResponse(String wechatpayPublicKeyId, PublicKey wechatpayPublicKey,
-                                        Headers headers,
-                                        String body) {
-        String timestamp = headers.get("Wechatpay-Timestamp");
-        try {
-            Instant responseTime = Instant.ofEpochSecond(Long.parseLong(timestamp));
-            // 鎷掔粷杩囨湡璇锋眰
-            if (Duration.between(responseTime, Instant.now()).abs().toMinutes() >= 5) {
-                throw new IllegalArgumentException(
-                        String.format("Validate http response,timestamp[%s] of httpResponse is expires, "
-                                        + "request-id[%s]",
-                                timestamp, headers.get("Request-ID")));
-            }
-        } catch (DateTimeException | NumberFormatException e) {
-            throw new IllegalArgumentException(
-                    String.format("Validate http response,timestamp[%s] of httpResponse is invalid, " +
-                                    "request-id[%s]", timestamp,
-                            headers.get("Request-ID")));
-        }
-        String message = String.format("%s\n%s\n%s\n", timestamp, headers.get("Wechatpay-Nonce"),
-                body == null ? "" : body);
-        String serialNumber = headers.get("Wechatpay-Serial");
-        if (!Objects.equals(serialNumber, wechatpayPublicKeyId)) {
-            throw new IllegalArgumentException(
-                    String.format("Invalid Wechatpay-Serial, Local: %s, Remote: %s", wechatpayPublicKeyId,
-                            serialNumber));
-        }
-        String signature = headers.get("Wechatpay-Signature");
-
-        boolean success = verify(message, signature, "SHA256withRSA", wechatpayPublicKey);
-        if (!success) {
-            throw new IllegalArgumentException(
-                    String.format("Validate response failed,the WechatPay signature is incorrect.%n"
-                                    + "Request-ID[%s]\tresponseHeader[%s]\tresponseBody[%.1024s]",
-                            headers.get("Request-ID"), headers, body));
-        }
-    }
-
-    /**
-     * 寰俊鏀粯API閿欒寮傚父锛屽彂閫丠TTP璇锋眰鎴愬姛锛屼絾杩斿洖鐘舵�佺爜涓嶆槸 2XX 鏃舵姏鍑烘湰寮傚父
-     */
-    public static class ApiException extends RuntimeException {
-        private static final long serialVersionUID = 2261086748874802175L;
-
-        private final int statusCode;
-        private final String body;
-        private final Headers headers;
-        private final String errorCode;
-        private final String errorMessage;
-
-        public ApiException(int statusCode, String body, Headers headers) {
-            super(String.format("寰俊鏀粯API璁块棶澶辫触锛孲tatusCode: [%s], Body: [%s], Headers: [%s]", statusCode, body, headers));
-            this.statusCode = statusCode;
-            this.body = body;
-            this.headers = headers;
-
-            if (body != null && !body.isEmpty()) {
-                JsonElement code;
-                JsonElement message;
-
-                try {
-                    JsonObject jsonObject = GsonUtil.getGson().fromJson(body, JsonObject.class);
-                    code = jsonObject.get("code");
-                    message = jsonObject.get("message");
-                } catch (JsonSyntaxException ignored) {
-                    code = null;
-                    message = null;
-                }
-                this.errorCode = code == null ? null : code.getAsString();
-                this.errorMessage = message == null ? null : message.getAsString();
-            } else {
-                this.errorCode = null;
-                this.errorMessage = null;
-            }
-        }
-
-        /**
-         * 鑾峰彇 HTTP 搴旂瓟鐘舵�佺爜
-         */
-        public int getStatusCode() {
-            return statusCode;
-        }
-
-        /**
-         * 鑾峰彇 HTTP 搴旂瓟鍖呬綋鍐呭
-         */
-        public String getBody() {
-            return body;
-        }
-
-        /**
-         * 鑾峰彇 HTTP 搴旂瓟 Header
-         */
-        public Headers getHeaders() {
-            return headers;
-        }
-
-        /**
-         * 鑾峰彇 閿欒鐮� 锛堥敊璇簲绛斾腑鐨� code 瀛楁锛�
-         */
-        public String getErrorCode() {
-            return errorCode;
-        }
-
-        /**
-         * 鑾峰彇 閿欒娑堟伅 锛堥敊璇簲绛斾腑鐨� message 瀛楁锛�
-         */
-        public String getErrorMessage() {
-            return errorMessage;
-        }
-    }
-}
\ No newline at end of file
diff --git a/server/services/src/main/java/com/doumee/config/wx/WxMiniUtilService.java b/server/services/src/main/java/com/doumee/config/wx/WxMiniUtilService.java
new file mode 100644
index 0000000..1b650b8
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/config/wx/WxMiniUtilService.java
@@ -0,0 +1,50 @@
+package com.doumee.config.wx;
+
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.utils.ID;
+import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
+import com.github.binarywang.wxpay.bean.result.WxPayRefundResult;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+
+/**
+ * 寰俊灏忕▼搴�-鍏叡鏂规硶
+ */
+@Service
+@Slf4j
+public class WxMiniUtilService {
+
+
+    /**
+     * 璁㈠崟寰俊閫�娆�
+     * orderNo:鍟嗘埛璁㈠崟鍙�
+     * totalPrice锛氳鍗曟�婚噾棰�
+     * refundPrice锛涢��娆鹃噾棰�
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public String wxRefund(String orderNo, Long totalPrice, Long refundPrice) {
+        try {
+            // 鍙戦�侀��娆捐姹�
+            String refNum = ID.nextGUID();
+            WxPayRefundRequest request = new WxPayRefundRequest();
+            request.setOutTradeNo(orderNo);
+            request.setOutRefundNo(refNum);
+            request.setTotalFee(totalPrice.intValue());
+            request.setRefundFee(refundPrice.intValue());
+            WxPayRefundResult response = WxMiniConfig.wxPayService.refund(request);
+            if ("SUCCESS".equals(response.getReturnCode()) && "SUCCESS".equals(response.getResultCode())) {
+                return refNum;
+            } else {
+                throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),response.getErrCode() + response.getErrCodeDes());
+            }
+        } catch (WxPayException e) {
+            e.printStackTrace();
+        }
+        throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"閫�娆惧彂鐢熷紓甯歌鑱旂郴绠$悊鍛�");
+    }
+}
diff --git a/server/services/src/main/java/com/doumee/core/annotation/LoginShopRequired.java b/server/services/src/main/java/com/doumee/core/annotation/LoginShopRequired.java
new file mode 100644
index 0000000..62f414d
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/core/annotation/LoginShopRequired.java
@@ -0,0 +1,10 @@
+package com.doumee.core.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target({ElementType.METHOD,ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface LoginShopRequired {}
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 0e3677d..d49123b 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
@@ -66,6 +66,20 @@
     public static final String MEMBER_FILES = "MEMBER_FILES";
     public static final String CATEGORY_FILES = "CATEGORY_FILES";
     public static final String SHOP_FILES = "SHOP_FILES";
+    public static final String DRIVER_FILES = "DRIVER_FILES";
+    public static final String BANNER_FILES = "BANNER_FILES";
+    public static final String ORDERS_FILES = "ORDERS_FILES";
+
+    // 杩愯惀閰嶇疆
+    public static final String OPERATION_CONFIG = "OPERATION_CONFIG";
+    public static final String OP_DRIVER_DAILY_CANCEL_LIMIT = "DRIVER_DAILY_CANCEL_LIMIT";
+    public static final String OP_UNPICKED_DISCOUNT = "UNPICKED_DISCOUNT";
+    public static final String OP_SETTLEMENT_DATE = "SETTLEMENT_DATE";
+    public static final String OP_URGENT_COEFFICIENT = "URGENT_COEFFICIENT";
+    public static final String OP_AUTO_CANCEL_TIME = "AUTO_CANCEL_TIME";
+    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 boolean WORKORDER_SHE_EMAIL_SENDING = false;
     public static  boolean DEALING_COMPANY_SYNC = false ;
     public static  boolean DEALING_MEMBER_SYNC = false ;
@@ -73,6 +87,18 @@
     public static final String WORKORDER_LOG_FILE_PATH ="WORKORDER_LOG_FILE_PATH" ;
 
     public static final String REDIS_TOKEN_KEY = "token_";
+    public static final String REDIS_VERIFY_CODE_KEY = "verify_code_";
+
+
+
+    public final static String GOODS_ORDER_CREATE_LOCK = "goods:order:create:lock:";
+
+    // 璁㈠崟鏃ュ織鎿嶄綔绫诲瀷
+    public static final int ORDER_LOG_DISPATCH = 1;         // 娲惧崟
+    public static final int ORDER_LOG_URGENT_FEE = 2;       // 鍔犳�ヨ垂
+    public static final int ORDER_LOG_ASSIGN_DRIVER = 3;    // 鎸囨淳鍙告満
+    public static final int ORDER_LOG_CANCEL = 4;           // 鍙栨秷璁㈠崟
+    public static final int ORDER_LOG_CONFIRM_ARRIVE = 5;   // 纭椤惧鍒板簵
 
     public static final String SUCCESS = "SUCCESS";
     public static final String FAIL = "FAIL";
@@ -247,26 +273,6 @@
     }
 
 
-    /**
-     * 鏂囦欢闄勪欢绫诲瀷
-     */
-    public interface multiFileType{
-        //0闂涓婃姤 1璺岀粖婊戜笂鎶� 2璺岀粖婊戝鐞� 3鍒嗛厤鐗╀笟涓荤 4鍒嗛厤澶勭悊浜� 5DCA椋庨櫓涓婃姤 6DCA椋庨櫓澶勭悊 7DCA闂宸ュ崟鍥剧墖
-//        int sheUpload = 0;
-//        int dbhUpload = 1;
-//        int dbhDeal = 2;
-//        int dbhAllocation = 3;
-//        int dbhDealUser = 4;
-//        int dcaUpload = 5;
-//        int dcaDeal = 6;
-//        int dcaWorkOrder= 7;
-
-        //0宸ュ崟涓婃姤 1宸ュ崟澶勭悊 2宸ュ崟杞氦
-        int  upload = 0;
-        int deal = 1;
-        int passOn = 2;
-    }
-
 
     public enum WorkOrderStatus{
         waitConfirm( 0, "寰呭垎閰峎TS","{title}涓婃姤","","寰呭垎閰峎TS" ),
@@ -368,7 +374,7 @@
         OTHER_MATERIAL(0, "闂ㄥ簵鍏朵粬鏉愭枡"),
         STORE_INTERIOR(1, "闂ㄥ簵鍐呴儴鐓х墖"),
         ORDER_DEPOSIT(2, "璁㈠崟瀵勫瓨鍥剧墖"),
-        ORDER_TAKE(3, "璁㈠崟鍙栦欢鍥剧墖"),
+        ORDER_TAKE(3, "闂ㄥ簵鍏ュ簱鍥剧墖"),
         DRIVER_TAKE(4, "鍙告満鍙栦欢鍥剧墖"),
         DRIVER_DONE(5, "鍙告満瀹屾垚鍥剧墖"),
         DRIVER_CAR(6, "鍙告満瀹炲悕璁よ瘉杞﹁締鐓х墖"),
@@ -377,15 +383,130 @@
         STORE_FRONT(9, "闂ㄥ簵闂ㄥご鐓�"),
         SOCIAL_SECURITY(10, "绀句繚缂寸撼璇佹槑"),
         LABOR_CONTRACT(11, "鏈夋晥鍔冲姩鍚堝悓"),
+        ORDER_FILE(12,"涓嬪崟鍥剧墖"),
+        STORE_OUT(13,"闂ㄥ簵鍑哄簱鍥剧墖"),
+        REFUND_TAKE(14,"閫�娆惧彇浠跺浘鐗�")
+
         ;
 
         private final int key;
         private final String name;
     }
 
+    @Getter
+    @AllArgsConstructor
+    public enum OrderLogType {
+        urgent(0, "骞冲彴鍔犳��", "骞冲彴鍔犳�ワ紝濂栧姳閲� {param} 鍏冦��"),
+        dispatch(1, "骞冲彴鎸囨淳", "骞冲彴鎸囨淳鍙告満 {param} 鎺ュ崟銆�")
+        ;
+        private int status;
+        private String title;
+        private String statusInfo;
+    }
 
-    public  static String getIpAddr() {
+    /**
+     * 璁㈠崟鏀粯绫诲瀷
+     */
+    @Getter
+    @AllArgsConstructor
+    public enum OrdersAttach {
+        STORAGE_ORDER("storageOrder", "瀵勫瓨璁㈠崟"),
+        SHOP_DEPOSIT("shopDeposit", "搴楅摵鎶奸噾璁㈠崟"),
+        DRIVER_DEPOSIT("driverDeposit", "鍙告満鎶奸噾璁㈠崟"),
+        OVERDUE_FEE("overdueFee", "閫炬湡璐圭敤璁㈠崟")
+        ;
+
+        private final String key;
+        private final String name;
+    }
+
+
+    /**
+     * 璁㈠崟鐘舵�侊紙灏卞湴/寮傚湴缁熶竴锛�
+     * 灏卞湴瀵勫瓨: 0鈫�1鈫�2鈫�3鈫�(6)鈫�7 / 96~99
+     * 寮傚湴瀵勫瓨: 0鈫�1鈫�2鈫�3鈫�4鈫�5鈫�(6)鈫�7 / 96~99
+     */
+    @Getter
+    @AllArgsConstructor
+    public enum OrderStatus {
+        waitPay(0, "寰呮敮浠�"),
+        waitDeposit(1, "寰呭瘎瀛�"),
+        deposited(2, "宸插瘎瀛�"),
+        accepted(3, "宸叉帴鍗�"),
+        delivering(4, "娲鹃�佷腑"),
+        arrived(5, "宸插埌搴�/宸查�佽揪/寰呭彇浠�"),
+        overdue(6, "瀛樺湪閫炬湡"), //寮冪敤
+        finished(7, "宸插畬鎴�"),
+        closed(96, "璁㈠崟鍏抽棴锛堥��娆撅級"),
+        cancelOverdue(97, "鍙栨秷閫炬湡"), //寮冪敤
+        cancelling(98, "鍙栨秷涓�"),
+        cancelled(99, "宸插彇娑�")
+        ;
+        private final int status;
+        private final String desc;
+
+        public int getKey() { return status; }
+        public String getValue() { return desc; }
+
+        public static OrderStatus getByKey(int index) {
+            for (OrderStatus c : OrderStatus.values()) {
+                if (c.getKey() == index) {
+                    return c;
+                }
+            }
+            return null;
+        }
+
+        public static String getDescByKey(int index) {
+            for (OrderStatus c : OrderStatus.values()) {
+                if (c.getKey() == index) {
+                    return c.getValue();
+                }
+            }
+            return "";
+        }
+    }
+
+    /**
+     * 浼氬憳绔悎骞惰鍗曠姸鎬侊紙鐢ㄤ簬鍒嗛〉绛涢�夛級
+     */
+    @Getter
+    @AllArgsConstructor
+    public enum OrderCombinedStatus {
+        waitPay(0, "寰呮敮浠�", new int[]{OrderStatus.waitPay.status}),
+        waitDeposit(1, "寰呮牳楠�", new int[]{OrderStatus.waitDeposit.status}),
+        waitDeliver(2, "寰呴厤閫�", new int[]{OrderStatus.deposited.status}),
+        waitReceive(3, "寰呮敹璐�", new int[]{OrderStatus.accepted.status, OrderStatus.delivering.status, OrderStatus.arrived.status}),
+        finished(4, "宸插畬鎴�", new int[]{OrderStatus.finished.status}),
+        refund(5, "閫�娆�", new int[]{OrderStatus.closed.status, OrderStatus.cancelling.status})
+        ;
+        private final int key;
+        private final String desc;
+        private final int[] statuses;
+
+        public static OrderCombinedStatus getByKey(int key) {
+            for (OrderCombinedStatus c : OrderCombinedStatus.values()) {
+                if (c.getKey() == key) {
+                    return c;
+                }
+            }
+            return null;
+        }
+    }
+
+    /**
+     * 寰楀埌request瀵硅薄
+     *
+     * @return
+     */
+    public static HttpServletRequest getRequest() {
         HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+        return request;
+    }
+
+
+    public static String getIpAddr() {
+        HttpServletRequest request = Constants.getRequest();
         String ipAddress = null;
         try {
             ipAddress = request.getHeader("x-forwarded-for");
@@ -424,4 +545,46 @@
     }
 
 
+    /**
+     * 鏍规嵁韬唤璇佸彿鐮佽幏鍙栨�у埆
+     * @param idCard 韬唤璇佸彿鐮侊紙15浣嶆垨18浣嶏級
+     * @return 1-鐢凤紝2-濂筹紝null-鏃犳硶鍒ゆ柇
+     */
+    public static Integer getGenderByIdCard(String idCard) {
+        if (idCard == null || (idCard.length() != 15 && idCard.length() != 18)) {
+            return null;
+        }
+        // 15浣嶈韩浠借瘉锛氭渶鍚庝竴浣嶄负鎬у埆鐮侊紱18浣嶈韩浠借瘉锛氱17浣嶏紙绱㈠紩16锛変负鎬у埆鐮�
+        int genderIndex = idCard.length() == 15 ? 14 : 16;
+        int genderCode = Character.getNumericValue(idCard.charAt(genderIndex));
+        return genderCode % 2 == 1 ? 1 : 2;
+    }
+
+    public static BigDecimal formatBigdecimal4Float(BigDecimal d) {
+        if (d == null) {
+            d = new BigDecimal(0.0);
+        }
+        //淇濈暀涓や綅灏忔暟涓斿洓鑸嶄簲鍏�
+        d = d.setScale(4, BigDecimal.ROUND_HALF_UP);
+        return  d;
+    }
+
+    /**
+     * 鍙告満瀹氱骇锛�5=S 4=A 3=B 2=C 1=D
+     *
+     * @param level 绛夌骇 1-5
+     * @return 绛夌骇鏂囨湰
+     */
+    public static String getDriverLevelName(Integer level) {
+        if (level == null) return null;
+        switch (level) {
+            case 5: return "S";
+            case 4: return "A";
+            case 3: return "B";
+            case 2: return "C";
+            case 1: return "D";
+            default: return null;
+        }
+    }
+
 }
diff --git a/server/services/src/main/java/com/doumee/core/constants/ResponseStatus.java b/server/services/src/main/java/com/doumee/core/constants/ResponseStatus.java
index 6e58040..87f54b5 100644
--- a/server/services/src/main/java/com/doumee/core/constants/ResponseStatus.java
+++ b/server/services/src/main/java/com/doumee/core/constants/ResponseStatus.java
@@ -29,7 +29,7 @@
     MASSIVE_REQUEST(5101, "璇锋眰杩囦簬棰戠箒"),
     NOT_ALLOWED(5110, "涓嶅厑璁哥殑鎿嶄綔"),
     BE_OVERDUE(5112, "鏈櫥褰�"),
-    TOKEN_EXCEED_TIME(5113, "鐧婚檰宸茶繃鏈�"),
+    TOKEN_EXCEED_TIME(5113, "瀵逛笉璧凤紝鐧诲綍宸插け鏁堬紒"),
     ;
 
     private int code;
diff --git a/server/services/src/main/java/com/doumee/core/utils/ID.java b/server/services/src/main/java/com/doumee/core/utils/ID.java
new file mode 100644
index 0000000..236191b
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/core/utils/ID.java
@@ -0,0 +1,89 @@
+package com.doumee.core.utils;
+
+import org.apache.logging.log4j.util.Strings;
+
+import java.util.UUID;
+
+/**
+ * A utility to generate id using various strategies.
+ *
+ * @author Guang YANG
+ * @version 1.0
+ */
+public class ID {
+
+  private static final SnowflakeIdGenerator snowflake = new SnowflakeIdGenerator(0);
+
+
+
+  /**
+   * Generate a random guid string of 32 byte.
+   */
+  public static String nextGUID() {
+    return UUID.randomUUID().toString().replace("-", Strings.EMPTY).toUpperCase();
+  }
+
+  /**
+   * Generate a random uuid string of 36 byte.
+   */
+  public static String nextUUID() {
+    return UUID.randomUUID().toString();
+  }
+
+  /**
+   * Generate a long number of 20 bit which is monotonically increasing by each call.
+   */
+  public static long nextSnowflakeId() {
+    return snowflake.nextId();
+  }
+
+  public static class SnowflakeIdGenerator {
+
+    private final long workerIdBits = 10L;
+    private final long maxWorkerId = -1L ^ (-1L << workerIdBits);
+    private final long sequenceBits = 12L;
+    private final long workerIdShift = sequenceBits;
+    private final long timestampLeftShift = sequenceBits + workerIdBits;
+    private final long sequenceMask = -1L ^ (-1L << sequenceBits);
+
+    private long workerId;
+    private long sequence = 0L;
+    private long lastTimestamp = -1L;
+
+    public SnowflakeIdGenerator(long workerId) {
+      if (workerId > maxWorkerId || workerId < 0) {
+        throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
+      }
+      this.workerId = workerId;
+    }
+
+    public synchronized long nextId() {
+      long timestamp = System.currentTimeMillis();
+      if (timestamp < lastTimestamp) {
+        throw new RuntimeException(String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
+      }
+      if (lastTimestamp == timestamp) {
+        sequence = (sequence + 1) & sequenceMask;
+        if (sequence == 0) {
+          timestamp = tilNextMillis(lastTimestamp);
+        }
+      } else {
+        sequence = 0L;
+      }
+
+      lastTimestamp = timestamp;
+
+      return (timestamp << timestampLeftShift) | (workerId << workerIdShift) | sequence;
+    }
+
+    protected long tilNextMillis(long lastTimestamp) {
+      long timestamp = System.currentTimeMillis();
+      while (timestamp <= lastTimestamp) {
+        timestamp = System.currentTimeMillis();
+      }
+      return timestamp;
+    }
+
+  }
+
+}
diff --git a/server/services/src/main/java/com/doumee/core/utils/RandomString.java b/server/services/src/main/java/com/doumee/core/utils/RandomString.java
new file mode 100644
index 0000000..7b407cd
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/core/utils/RandomString.java
@@ -0,0 +1,60 @@
+package com.doumee.core.utils;
+
+import java.security.SecureRandom;
+import java.util.Locale;
+import java.util.Objects;
+import java.util.Random;
+
+public class RandomString {
+
+  protected static final String upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+  protected static final String lower = upper.toLowerCase(Locale.ROOT);
+  protected static final String digits = "0123456789";
+  protected static final String alphaNumeric = upper + lower + digits;
+  private final Random random;
+  private final char[] symbols;
+  private final char[] buf;
+
+  public RandomString(int length, Random random, String symbols) {
+    if (length < 1) {
+      throw new IllegalArgumentException();
+    }
+    if (symbols.length() < 2) {
+      throw new IllegalArgumentException();
+    }
+    this.random = Objects.requireNonNull(random);
+    this.symbols = symbols.toCharArray();
+    this.buf = new char[length];
+  }
+
+  /**
+   * Create an alphanumeric string generator.
+   */
+  public RandomString(int length, Random random) {
+    this(length, random, alphaNumeric);
+  }
+
+  /**
+   * Create an alphanumeric strings from a secure generator.
+   */
+  public RandomString(int length) {
+    this(length, new SecureRandom());
+  }
+
+  /**
+   * Create session identifiers.
+   */
+  public RandomString() {
+    this(21);
+  }
+
+  /**
+   * Generate a random string.
+   */
+  public String nextString() {
+    for (int idx = 0; idx < buf.length; ++idx) {
+      buf[idx] = symbols[random.nextInt(symbols.length)];
+    }
+    return new String(buf);
+  }
+}
diff --git a/server/services/src/main/java/com/doumee/core/utils/Strings.java b/server/services/src/main/java/com/doumee/core/utils/Strings.java
new file mode 100644
index 0000000..9ae0196
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/core/utils/Strings.java
@@ -0,0 +1,55 @@
+package com.doumee.core.utils;
+
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.security.SecureRandom;
+import java.util.Random;
+
+/**
+ * A null-safe utility to handle the String instances.
+ *
+ * @author Guang YANG
+ * @version 1.1
+ */
+public final class Strings {
+
+    public static final String EMPTY = "";
+    public static final String INSTANTIATION_PROHIBITED = "Instantiation prohibited.";
+    private static final Logger LOGGER = LoggerFactory.getLogger(Strings.class);
+
+    private Strings() {
+        throw new AssertionError(INSTANTIATION_PROHIBITED);
+    }
+
+    /**
+     * Generate random string with alpha and numeric of given length.
+     */
+    public static String randomAlphanumeric(int length) {
+        return new RandomString(length).nextString();
+    }
+
+    public static String randomNumeric(int length) {
+        return new RandomString(length, new SecureRandom(), "0123456789").nextString();
+    }
+
+    public static String getRandomNumberString(Integer strLength) {
+
+        Random rnd = new Random();
+
+        String str = "9999";
+
+        if(strLength >= str.length()){
+            str = StringUtils.leftPad(str,strLength,"9");
+        }
+
+        int number = rnd.nextInt(Integer.parseInt(str));
+
+        return String.format("%06d", number);
+
+    }
+
+
+}
diff --git a/server/services/src/main/java/com/doumee/core/utils/Tencent/MapUtil.java b/server/services/src/main/java/com/doumee/core/utils/Tencent/MapUtil.java
new file mode 100644
index 0000000..cf377b8
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/core/utils/Tencent/MapUtil.java
@@ -0,0 +1,124 @@
+package com.doumee.core.utils.Tencent;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.doumee.core.utils.Http;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 鑵捐鍦板浘宸ュ叿绫�
+ *
+ * @Author : Rk
+ * @create 2026/4/14 15:58
+ */
+@Slf4j
+@Component
+public class MapUtil {
+
+    private static String tencentKey;
+
+    /** 璺濈鐭╅樀API */
+    public static final String MATRIX_URL = "https://apis.map.qq.com/ws/distance/v1/matrix";
+
+    /** 鏀寔鐨勬ā寮� */
+    private static final List<String> SUPPORTED_MODES = Arrays.asList("driving", "bicycling");
+
+    @Value("${tencent_key}")
+    public void setTencentKey(String tencentKey) {
+        MapUtil.tencentKey = tencentKey;
+    }
+
+    /**
+     * 鎵归噺璺濈鐭╅樀璁$畻
+     *
+     * @param mode       妯″紡锛歞riving(椹捐溅)銆乥icycling(鑷杞�)
+     * @param fromPoints 璧风偣鍒楄〃锛屾牸寮忥細lat,lng锛堟渶澶�10涓級
+     * @param toPoints   缁堢偣鍒楄〃锛屾牸寮忥細lat,lng锛堟渶澶�20涓級
+     * @return result.rows 鐭╅樀鏁版嵁锛屾瘡涓厓绱犲寘鍚� distance(绫�) 鍜� duration(绉�)
+     */
+    public static JSONObject distanceMatrix(String mode, List<String> fromPoints, List<String> toPoints) {
+        if (!SUPPORTED_MODES.contains(mode)) {
+            throw new IllegalArgumentException("涓嶆敮鎸佺殑妯″紡: " + mode + "锛屼粎鏀寔: " + SUPPORTED_MODES);
+        }
+        if (fromPoints == null || fromPoints.isEmpty() || toPoints == null || toPoints.isEmpty()) {
+            throw new IllegalArgumentException("璧风偣鍜岀粓鐐瑰垪琛ㄤ笉鑳戒负绌�");
+        }
+
+        String from = String.join(";", fromPoints);
+        String to = String.join(";", toPoints);
+
+        try {
+            String url = MATRIX_URL
+                    + "?key=" + tencentKey
+                    + "&mode=" + mode
+                    + "&from=" + URLEncoder.encode(from, "UTF-8")
+                    + "&to=" + URLEncoder.encode(to, "UTF-8");
+
+            log.info("鑵捐鍦板浘鐭╅樀API璇锋眰: mode={}, from={}, to={}", mode, from, to);
+
+            JSONObject json = new Http().build(url)
+                    .setConnectTimeout(5000)
+                    .setReadTimeout(10000)
+                    .get()
+                    .toJSONObject();
+
+            log.info("鑵捐鍦板浘鐭╅樀API鍝嶅簲: {}", json);
+
+            if (json.getIntValue("status") != 0) {
+                throw new RuntimeException("鑵捐鍦板浘鐭╅樀API璋冪敤澶辫触: " + json.getString("message"));
+            }
+
+            return json.getJSONObject("result");
+        } catch (IOException e) {
+            log.error("鑵捐鍦板浘鐭╅樀API璋冪敤寮傚父", e);
+            throw new RuntimeException("鑵捐鍦板浘鐭╅樀API璋冪敤寮傚父", e);
+        }
+    }
+
+    /**
+     * 鍗曞璺濈璁$畻锛堜究鎹锋柟娉曪級
+     *
+     * @param mode 妯″紡锛歞riving(椹捐溅)銆乥icycling(鑷杞�)
+     * @param from 璧风偣鏍煎紡锛歭at,lng
+     * @param to   缁堢偣鏍煎紡锛歭at,lng
+     * @return 绗竴涓厓绱犵殑 distance(绫�) 鍜� duration(绉�)
+     */
+    public static JSONObject distanceSingle(String mode, String from, String to) {
+        JSONObject result = distanceMatrix(mode,
+                Arrays.asList(from),
+                Arrays.asList(to));
+        JSONArray rows = result.getJSONArray("rows");
+        if (rows != null && !rows.isEmpty()) {
+            JSONArray elements = rows.getJSONObject(0).getJSONArray("elements");
+            if (elements != null && !elements.isEmpty()) {
+                return elements.getJSONObject(0);
+            }
+        }
+        return new JSONObject();
+    }
+
+    /**
+     * 澶氳捣鐐瑰埌鍗曠粓鐐癸紙渚挎嵎鏂规硶锛�
+     * 杩斿洖姣忎釜璧风偣鍒扮粓鐐圭殑璺濈鍜岃�楁椂锛岄『搴忎笌fromPoints瀵瑰簲
+     *
+     * @param mode       妯″紡
+     * @param fromPoints 璧风偣鍒楄〃
+     * @param to         鍗曚釜缁堢偣
+     * @return 璺濈鑰楁椂鍒楄〃锛岄『搴忎笌fromPoints瀵瑰簲
+     */
+    public static List<JSONObject> distanceToOne(String mode, List<String> fromPoints, String to) {
+        JSONObject result = distanceMatrix(mode, fromPoints, Arrays.asList(to));
+        JSONArray rows = result.getJSONArray("rows");
+        return rows == null ? Arrays.asList() : rows.stream()
+                .map(row -> ((JSONObject) row).getJSONArray("elements").getJSONObject(0))
+                .collect(Collectors.toList());
+    }
+}
diff --git a/server/services/src/main/java/com/doumee/core/utils/aliyun/ALiYunSmSUtil.java b/server/services/src/main/java/com/doumee/core/utils/aliyun/ALiYunSmSUtil.java
new file mode 100644
index 0000000..f1ac972
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/core/utils/aliyun/ALiYunSmSUtil.java
@@ -0,0 +1,59 @@
+package com.doumee.core.utils.aliyun;
+
+import com.alibaba.fastjson.JSONObject;
+import com.aliyuncs.CommonRequest;
+import com.aliyuncs.CommonResponse;
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.http.MethodType;
+import com.aliyuncs.profile.DefaultProfile;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+
+import java.util.Map;
+
+/**
+ * 闃块噷浜� SMS 鐭俊宸ュ叿绫�
+ * @author RenKang
+ */
+public class ALiYunSmSUtil {
+
+    public static CommonResponse sendMessage(String phone, Map<String, Object> codeMap) {
+        /**
+         * 杩炴帴闃块噷浜戯細
+         *
+         * 涓変釜鍙傛暟锛�
+         * regionId 涓嶈鍔紝榛樿浣跨敤瀹樻柟鐨�
+         * accessKeyId 鑷繁鐨勭敤鎴穉ccessKeyId
+         * accessSecret 鑷繁鐨勭敤鎴穉ccessSecret
+         */
+        DefaultProfile profile = DefaultProfile.getProfile(
+                "cn-hangzhou", "LTAI5tDuA9DXBJvVfJfMb19L", "IUsWIhUXd9pEgTNEkz1b3POI3javKN");
+        IAcsClient client = new DefaultAcsClient(profile);
+        // 鏋勫缓璇锋眰锛�
+        CommonRequest request = new CommonRequest();
+        request.setSysMethod(MethodType.POST);
+        request.setSysDomain("dysmsapi.aliyuncs.com");
+        request.setSysVersion("2017-05-25");
+        request.setSysAction("SendSms");
+        // 鑷畾涔夊弬鏁帮細
+        // 鎵嬫満鍙�
+        request.putQueryParameter("PhoneNumbers", phone);
+        // 鐭俊绛惧悕
+        request.putQueryParameter("SignName", "");//鍚堣偉榧庡厓鏃嬪帇绉戞妧
+        // 鐭俊妯$増CODE
+        request.putQueryParameter("TemplateCode", "");//SMS_332555204
+        // 鏋勫缓鐭俊楠岃瘉鐮�
+        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(codeMap));
+        try {
+            CommonResponse response = client.getCommonResponse(request);
+            return response;
+        }catch (Exception e) {
+            e.printStackTrace();
+        }
+        throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍙戦�佸け璐ワ紝璇疯仈绯荤鐞嗗憳");
+    }
+
+
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/business/AddrMapper.java b/server/services/src/main/java/com/doumee/dao/business/AddrMapper.java
new file mode 100644
index 0000000..925a02d
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/business/AddrMapper.java
@@ -0,0 +1,13 @@
+package com.doumee.dao.business;
+
+import com.doumee.dao.business.model.Addr;
+import com.github.yulichang.base.MPJBaseMapper;
+
+/**
+ * 鍦板潃绨縈apper
+ * @author rk
+ * @date 2026/04/15
+ */
+public interface AddrMapper extends MPJBaseMapper<Addr> {
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/business/OrderLogMapper.java b/server/services/src/main/java/com/doumee/dao/business/OrderLogMapper.java
new file mode 100644
index 0000000..b7d185a
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/business/OrderLogMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.doumee.dao.business.model.OrderLog;
+import com.github.yulichang.base.MPJBaseMapper;
+
+/**
+ * 璁㈠崟鎿嶄綔鏃ュ織Mapper
+ * @author rk
+ * @date 2026/04/13
+ */
+public interface OrderLogMapper extends MPJBaseMapper<OrderLog> {
+}
diff --git a/server/services/src/main/java/com/doumee/dao/business/OrdersRefundMapper.java b/server/services/src/main/java/com/doumee/dao/business/OrdersRefundMapper.java
new file mode 100644
index 0000000..cadea58
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/business/OrdersRefundMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.doumee.dao.business.model.OrdersRefund;
+import com.github.yulichang.base.MPJBaseMapper;
+
+/**
+ * 璁㈠崟閫�娆捐褰昅apper
+ * @author rk
+ * @date 2026/04/13
+ */
+public interface OrdersRefundMapper extends MPJBaseMapper<OrdersRefund> {
+}
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/Addr.java b/server/services/src/main/java/com/doumee/dao/business/model/Addr.java
new file mode 100644
index 0000000..6351c45
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/business/model/Addr.java
@@ -0,0 +1,106 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 鍦板潃绨�
+ * @author rk
+ * @date 2026/04/15
+ */
+@Data
+@ApiModel("鍦板潃绨�")
+@TableName("`addr`")
+public class Addr {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    private Integer id;
+
+    @ApiModelProperty(value = "鏄惁宸插垹闄� 0鏈垹闄� 1宸插垹闄�", example = "0")
+    private Integer deleted;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    private Integer createUser;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    private Integer updateUser;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鐢ㄦ埛缂栫爜锛堝叧鑱攎ember琛級", example = "1")
+    private Integer memberId;
+
+    @ApiModelProperty(value = "鏄惁榛樿 0鍚� 1鏄�", example = "0")
+    private Integer isDefault;
+
+    @ApiModelProperty(value = "濮撳悕")
+    private String name;
+
+    @ApiModelProperty(value = "鎵嬫満鍙�")
+    private String phone;
+
+    @ApiModelProperty(value = "璇︾粏鍦板潃")
+    private String addr;
+
+    @ApiModelProperty(value = "鎵�灞炲尯鍩熺紪鐮�", example = "1")
+    private Integer areaId;
+
+    @ApiModelProperty(value = "缁忓害")
+    private BigDecimal longitude;
+
+    @ApiModelProperty(value = "绾害")
+    private BigDecimal latitude;
+
+    // ---- 鐪佸競鍖轰俊鎭紙铏氭嫙瀛楁锛孧PJ鏌ヨ濉厖锛� ----
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鐪佺紪鐮�")
+    private Integer provinceId;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鐪佸悕绉�")
+    private String provinceName;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鐪佽鏀夸唬鐮�")
+    private String provinceCode;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "甯傜紪鐮�")
+    private Integer cityId;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "甯傚悕绉�")
+    private String cityName;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "甯傝鏀夸唬鐮�")
+    private String cityCode;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鍖哄悕绉�")
+    private String districtName;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鍖鸿鏀夸唬鐮�")
+    private String districtCode;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/Banner.java b/server/services/src/main/java/com/doumee/dao/business/model/Banner.java
index 27e85d7..95ef60f 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/Banner.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/Banner.java
@@ -1,6 +1,7 @@
 package com.doumee.dao.business.model;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.doumee.core.annotation.excel.ExcelColumn;
@@ -45,8 +46,8 @@
     @ApiModelProperty(value = "澶囨敞")
     private String remark;
 
-    @ApiModelProperty(value = "娲诲姩涓婚敭")
-    private Integer title;
+    @ApiModelProperty(value = "鏍囬")
+    private String title;
 
     @ApiModelProperty(value = "鎺掑簭鍙�")
     private Integer sortnum;
@@ -58,12 +59,12 @@
     @ApiModelProperty(value = "鍒楄〃鍥�")
     private String imgurl;
 
-    @ApiModelProperty(value = "璺宠浆绫诲瀷 0瀵屾枃鏈� 1澶栭摼", example = "0")
-    @ExcelColumn(name = "璺宠浆绫诲瀷", index = 3, width = 10, valueMapping = "0=瀵屾枃鏈�;1=澶栭摼;")
+    @ApiModelProperty(value = "璺宠浆绫诲瀷 0鏃� 1瀵屾枃鏈� 2澶栭摼", example = "0")
+    @ExcelColumn(name = "璺宠浆绫诲瀷", index = 3, width = 10, valueMapping = "0鏃� 1瀵屾枃鏈� 2澶栭摼")
     private Integer type;
 
-    @ApiModelProperty(value = "浣嶇疆 0棣栭〉 1搴楅摵棣栭〉", example = "0")
-    @ExcelColumn(name = "浣嶇疆", index = 4, width = 10, valueMapping = "0=棣栭〉;1=搴楅摵棣栭〉;")
+    @ApiModelProperty(value = "浣嶇疆 0浼氬憳绔椤佃疆鎾� 1鍙告満APP寮曞椤�", example = "0")
+    @ExcelColumn(name = "浣嶇疆", index = 4, width = 10, valueMapping = "浣嶇疆 0浼氬憳绔椤佃疆鎾� 1鍙告満APP寮曞椤�")
     private Integer position;
 
     @ApiModelProperty(value = "搴楅摵涓婚敭")
@@ -71,4 +72,8 @@
 
     @ApiModelProperty(value = "鍐呭")
     private String content;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鍥剧墖瀹屾暣璺緞")
+    private String imgurlFull;
 }
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/DriverInfo.java b/server/services/src/main/java/com/doumee/dao/business/model/DriverInfo.java
index 7e3a6aa..b7494ce 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/DriverInfo.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/DriverInfo.java
@@ -35,7 +35,7 @@
     private Integer createUser;
 
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
-    @ExcelColumn(name = "鍒涘缓鏃堕棿", index = 1, width = 16, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    @ExcelColumn(name = "鍒涘缓鏃堕棿", index = 7, width = 18, dateFormat = "yyyy-MM-dd HH:mm:ss")
     private Date createTime;
 
     @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
@@ -49,19 +49,23 @@
     private String remark;
 
     @ApiModelProperty(value = "濮撳悕")
-    @ExcelColumn(name = "濮撳悕", index = 2, width = 10)
+    @ExcelColumn(name = "鍙告満濮撳悕", index = 1, width = 10)
     private String name;
 
     @ApiModelProperty(value = "鎵嬫満鍙�")
     @ExcelColumn(name = "鎵嬫満鍙�", index = 3, width = 12)
     private String telephone;
 
+    @ApiModelProperty(value = "鎬у埆锛�1=鐢凤紱2=濂�", example = "1")
+    @TableField(exist = false)
+    @ExcelColumn(name = "鎬у埆", index = 2, width = 6, valueMapping = "1=鐢凤紱2=濂�")
+    private Integer gender;
+
     @ApiModelProperty(value = "韬唤璇佸彿鐮�")
     @ExcelColumn(name = "韬唤璇佸彿鐮�", index = 4, width = 18)
     private String idcard;
 
     @ApiModelProperty(value = "濠氬Щ鐘舵�侊細0=鏈锛�1=宸插锛�2=绂诲紓锛�3=涓у伓", example = "0")
-    @ExcelColumn(name = "濠氬Щ鐘舵��", index = 5, width = 10, valueMapping = "0=鏈;1=宸插;2=绂诲紓;3=涓у伓;")
     private Integer maritalStatus;
 
     @ApiModelProperty(value = "鍖哄垝涓婚敭", example = "1")
@@ -77,7 +81,7 @@
     private Integer carType;
 
     @ApiModelProperty(value = "杞︾墝鍙�")
-    @ExcelColumn(name = "杞︾墝鍙�", index = 6, width = 10)
+    @ExcelColumn(name = "杞︾墝鍙�", index = 6, width = 12)
     private String carCode;
 
     @ApiModelProperty(value = "杞﹁締棰滆壊")
@@ -91,9 +95,13 @@
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date cardEndDate;
 
-    @ApiModelProperty(value = "鍙告満鐘舵�侊細0=娉ㄥ唽锛�1=寰呭鎵癸紱2=瀹℃壒閫氳繃锛�3=瀹℃壒椹冲洖", example = "0")
-    @ExcelColumn(name = "鐘舵��", index = 7, width = 10, valueMapping = "0=娉ㄥ唽;1=寰呭鎵�;2=瀹℃壒閫氳繃;3=瀹℃壒椹冲洖;")
+    @ApiModelProperty(value = "鍙告満鐘舵�侊細0=鍚敤锛�1=绂佺敤锛�", example = "0")
+    @ExcelColumn(name = "鐘舵��", index = 8, width = 8, valueMapping = "0=鍚敤锛�1=绂佺敤锛�")
     private Integer status;
+
+    @ApiModelProperty(value = "瀹℃壒鐘舵�侊細0=寰呭鎵癸紱1=瀹℃壒閫氳繃锛�2=瀹℃壒椹冲洖", example = "0")
+    @ExcelColumn(name = "瀹℃壒鐘舵��", index = 9, width = 10, valueMapping = "0=寰呭鎵癸紱1=瀹℃壒閫氳繃锛�2=瀹℃壒椹冲洖")
+    private Integer auditStatus;
 
     @ApiModelProperty(value = "OPENID(APP)")
     private String openid;
@@ -120,6 +128,9 @@
     @ApiModelProperty(value = "韬唤璇佸弽闈㈢収")
     private String idcardImgBack;
 
+    @ApiModelProperty(value = "鍙告満瀹氱骇锛�( 5 - 1 S A B C D )", example = "1")
+    private Integer driverLevel;
+
     @ApiModelProperty(value = "杞﹁締鐓х墖鍒楄〃")
     @TableField(exist = false)
     private List<Multifile> carImgList = new ArrayList<>();
@@ -140,6 +151,31 @@
     @TableField(exist = false)
     private String carTypeName;
 
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鐘舵�佸垪琛�(鏌ヨ鐢�)", example = "0,1,2")
+    private List<Integer> statusList;
 
+    @TableField(exist = false)
+    @ApiModelProperty(value = "褰撳墠浣欓(鍗曚綅:鍒�)", example = "10000")
+    @ExcelColumn(name = "璐︽埛浣欓", index = 5, width = 12)
+    private Long memberAmount;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鍥剧墖鍓嶇紑鍦板潃")
+    private String imgPrefix;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鏌ヨ鍏抽敭瀛楋紙鍙告満濮撳悕/鎵嬫満鍙凤級")
+    private String keyword;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鍒涘缓寮�濮嬫棩鏈�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date createTimeStart;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鍒涘缓缁撴潫鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date createTimeEnd;
 
 }
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/Member.java b/server/services/src/main/java/com/doumee/dao/business/model/Member.java
index b52946e..8e11bf3 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/Member.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/Member.java
@@ -67,15 +67,6 @@
     @ExcelColumn(name="鐪熷疄濮撳悕",index = 4,width = 10)
     private String name;
 
-    @ApiModelProperty(value = "鐢ㄥ伐韬唤:0=鏈敵璇凤紱1=鐢宠涓紱2=宸查�氳繃锛�3=鏈�氳繃锛�", example = "1") //寮冪敤
-    private Integer workerIdentity;
-
-    @ApiModelProperty(value = "璐ц繍韬唤:0=鏈敵璇凤紱1=鐢宠涓紱2=宸查�氳繃锛�3=鏈�氳繃锛�", example = "1") //寮冪敤
-    private Integer driverIdentity;
-
-    @ApiModelProperty(value = "渚涢韬唤:0=鏈敵璇凤紱1=鐢宠涓紱2=宸查�氳繃锛�3=鏈�氳繃锛�", example = "1") //寮冪敤
-    private Integer chefIdentity;
-
     @ApiModelProperty(value = "褰撳墠浣欓(鍗曚綅:鍒�)", example = "1")
     private Long amount;
 
@@ -163,18 +154,6 @@
     @ApiModelProperty(value = "澶村儚鍏ㄨ矾寰�")
     @TableField(exist = false)
     private String fullCoverImage;
-
-    @ApiModelProperty(value = "鐢ㄥ伐韬唤", example = "1")
-    @TableField(exist = false)
-    private IdentityInfo workerIdentityModel;
-
-    @ApiModelProperty(value = "鍙告満韬唤淇℃伅", example = "1")
-    @TableField(exist = false)
-    private IdentityInfo driverIdentityModel;
-
-    @ApiModelProperty(value = "閫侀韬唤淇℃伅", example = "1")
-    @TableField(exist = false)
-    private IdentityInfo chefIdentityModel;
 
     @ApiModelProperty(value = "鎺ュ崟鏉冮噸", example = "1")
     @TableField(exist = false)
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/MemberRevenue.java b/server/services/src/main/java/com/doumee/dao/business/model/MemberRevenue.java
index dd1f568..b494a9a 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/MemberRevenue.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/MemberRevenue.java
@@ -32,7 +32,8 @@
     private Integer createUser;
 
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
-    @ExcelColumn(name="浜ゆ槗鏃堕棿",index = 8,dateFormat = "yyyy-MM-dd HH:mm:ss",width = 10)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelColumn(name = "鏀舵敮鏃堕棿", index = 3, dateFormat = "yyyy-MM-dd HH:mm:ss", width = 16)
     private Date createTime;
 
     @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
@@ -48,10 +49,11 @@
     private Integer memberId;
 
     @ApiModelProperty(value = "鍙樺姩绫诲瀷:0=鐢ㄥ伐鍗曟敹鍏ワ紱1=璐ц繍鍗曟敹鍏ワ紱2=渚涢鍗曟敹鍏ワ紱3=鎻愮幇鐢宠锛�4=鎻愮幇澶辫触閫�鍥�", example = "1")
+    @ExcelColumn(name = "涓氬姟绫诲瀷", valueMapping = "0=鐢ㄥ伐鍗曟敹鍏�;1=璐ц繍鍗曟敹鍏�;2=渚涢鍗曟敹鍏�;3=鎻愮幇鐢宠;4=鎻愮幇澶辫触閫�鍥�;", index = 4, width = 12)
     private Integer type;
 
     @ApiModelProperty(value = "鏀舵敮绫诲瀷:1=鏀跺叆锛�-1=鏀嚭锛�", example = "1")
-    @ExcelColumn(name="鏀舵敮绫诲瀷", valueMapping="1=鏀跺叆;-1=鏀嚭;",index = 5,width = 5)
+    @ExcelColumn(name = "鏀跺叆/鏀嚭", valueMapping = "1=鏀跺叆;-1=鏀嚭;", index = 1, width = 8)
     private Integer optType;
 
     @ApiModelProperty(value = "鍙樺姩閲戦", example = "1")
@@ -70,13 +72,15 @@
     private Integer objType;
 
     @ApiModelProperty(value = "涓氬姟鐘舵��:0=鎴愬姛锛�1=澶辫触锛�2=澶勭悊涓紱", example = "1")
+    @ExcelColumn(name = "鐘舵��", valueMapping = "0=鎴愬姛;1=澶辫触;2=澶勭悊涓�;", index = 6, width = 8)
     private Integer status;
+
     @ApiModelProperty(value = "鍙樺姩绫诲瀷:0=鐢ㄥ伐鍗曟敹鍏ワ紱1=璐ц繍鍗曟敹鍏ワ紱2=渚涢鍗曟敹鍏ワ紱3=鎻愮幇鐢宠锛�", example = "1")
     @TableField(exist = false)
-    @ExcelColumn(name="鍙樺姩涓氬姟绫诲瀷",index = 7,width = 8)
     private String typeName;
+
     @ApiModelProperty(value = "寰俊浜ゆ槗娴佹按鍙�", example = "1")
-    @ExcelColumn(name="寰俊浜ゆ槗娴佹按鍙�",index = 9,width = 8)
+    @ExcelColumn(name = "浜ゆ槗鍙�", index = 5, width = 15)
     private String transactionNo;
 
     @ApiModelProperty(value = "鍙樻煡璇㈠紑濮嬫椂闂�", example = "1")
@@ -87,23 +91,23 @@
     private Date endTime;
     @ApiModelProperty(value = "鍙樺姩閲戦(鍏冿級", example = "1")
     @TableField(exist = false)
-    @ExcelColumn(name="鍙樺姩閲戦(鍏�)",index = 6,width = 8)
+    @ExcelColumn(name = "閲戦锛堝厓锛�", index = 2, width = 10)
     private Double amountInfo;
+
     @ApiModelProperty(value = "鐢ㄦ埛濮撳悕", example = "1")
     @TableField(exist = false)
-    @ExcelColumn(name="鐢ㄦ埛濮撳悕",index = 3,width = 5)
     private String memberName;
+
     @ApiModelProperty(value = "鐢ㄦ埛鏄电О", example = "1")
     @TableField(exist = false)
-    @ExcelColumn(name="鐢ㄦ埛鏄电О",index = 2,width = 5)
     private String memberNickname;
+
     @ApiModelProperty(value = "鐢ㄦ埛鎵嬫満鍙�", example = "1")
     @TableField(exist = false)
-    @ExcelColumn(name="鐢ㄦ埛鎵嬫満鍙�",index = 4,width = 6)
     private String memberPhone;
+
     @ApiModelProperty(value = "鐢ㄦ埛openId", example = "1")
     @TableField(exist = false)
-    @ExcelColumn(name="鐢ㄦ埛openid" ,index = 1,width = 6)
     private String openid;
     @ApiModelProperty(value = "鐢ㄥ伐绫诲瀷:0=閲囨憳宸�;1=鍒嗘嫞宸�;2=鍖呰宸�", example = "1")
     @TableField(exist = false)
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 8ff48b7..5312c3f 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
@@ -53,9 +53,9 @@
     @ApiModelProperty(value = "绫诲瀷0鍥剧墖 1瑙嗛 2鍏朵粬", example = "1")
     private Integer type;
 
-    @ApiModelProperty(value = "鍏宠仈瀵硅薄绫诲瀷锛�0=闂ㄥ簵鍏朵粬鏉愭枡锛�1=闂ㄥ簵鍐呴儴鐓х墖锛�2=璁㈠崟瀵勫瓨鍥剧墖锛�3=璁㈠崟鍙栦欢鍥剧墖锛�4=鍙告満鍙栦欢鍥剧墖锛�5=鍙告満瀹屾垚鍥剧墖锛�6=鍙告満瀹炲悕璁よ瘉杞﹁締鐓х墖锛�" +
+    @ApiModelProperty(value = "鍏宠仈瀵硅薄绫诲瀷锛�0=闂ㄥ簵鍏朵粬鏉愭枡锛�1=闂ㄥ簵鍐呴儴鐓х墖锛�2=璁㈠崟瀵勫瓨鍥剧墖锛�3=闂ㄥ簵鍏ュ簱鍥剧墖锛�4=鍙告満鍙栦欢鍥剧墖锛�5=鍙告満瀹屾垚鍥剧墖锛�6=鍙告満瀹炲悕璁よ瘉杞﹁締鐓х墖锛�" +
             "7=鍙告満瀹炲悕璁よ瘉椹鹃┒璇佺収鐗囷紱8=鍙告満瀹炲悕璁よ瘉鍏朵粬鍥剧墖锛�" +
-            "9=闂ㄥ簵闂ㄥご鐓э紱10=绀句繚缂寸撼璇佹槑锛�11=鏈夋晥鍔冲姩鍚堝悓锛�", example = "1")
+            "9=闂ㄥ簵闂ㄥご鐓э紱10=绀句繚缂寸撼璇佹槑锛�11=鏈夋晥鍔冲姩鍚堝悓锛�12=涓嬪崟鍥剧墖锛�13=闂ㄥ簵鍑哄簱鍥剧墖锛�", example = "1")
     private Integer objType;
 
     @ApiModelProperty(value = "鏂囦欢鍦板潃")
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/OrderLog.java b/server/services/src/main/java/com/doumee/dao/business/model/OrderLog.java
new file mode 100644
index 0000000..e066b66
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/business/model/OrderLog.java
@@ -0,0 +1,79 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 璁㈠崟鎿嶄綔鏃ュ織
+ * @author rk
+ * @date 2026/04/13
+ */
+@Data
+@ApiModel("璁㈠崟鎿嶄綔鏃ュ織")
+@TableName("`order_log`")
+public class OrderLog {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    private Integer id;
+
+    @ApiModelProperty(value = "鏄惁宸插垹闄� 0鏈垹闄� 1宸插垹闄�", example = "0")
+    private Integer deleted;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    private Integer createUser;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    private Integer updateUser;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "璁㈠崟涓婚敭锛坥rders锛�", example = "1")
+    private Integer orderId;
+
+    @ApiModelProperty(value = "鏍囬")
+    private String title;
+
+    @ApiModelProperty(value = "鏃ュ織鍐呭")
+    private String logInfo;
+
+    @ApiModelProperty(value = "鎿嶄綔绫诲瀷")
+    private Integer objType;
+
+    @ApiModelProperty(value = "鎿嶄綔浜�")
+    private Integer optUserId;
+
+    @ApiModelProperty(value = "鎿嶄綔浜哄悕绉�")
+    private String optUserName;
+
+    @ApiModelProperty(value = "鎿嶄綔鍓嶆暟鎹�")
+    private String beforeInfo;
+
+    @ApiModelProperty(value = "鎿嶄綔鍚庢暟鎹�")
+    private String afterInfo;
+
+    @ApiModelProperty(value = "璁㈠崟鐘舵��:灏卞湴瀵勫瓨鐘舵�侊細0=寰呮敮浠�;1=寰呭瘎瀛�;2=宸插瘎瀛�;3=寰呭彇浠�;6=瀛樺湪閫炬湡;7=宸插畬鎴�;96:璁㈠崟鍏抽棴锛堥��娆撅級;97:鍙栨秷閫炬湡;98=鍙栨秷涓�;99=宸插彇娑�; " +
+            " 寮傚湴瀵勫瓨鐘舵�侊細0=寰呮敮浠�;1=寰呭瘎瀛�;2=宸插瘎瀛�;3=宸叉帴鍗�;4=娲鹃�佷腑;5=宸插埌搴�/宸查�佽揪;6=瀛樺湪閫炬湡;7=宸插畬鎴�;96:璁㈠崟鍏抽棴锛堥��娆撅級;97:鍙栨秷閫炬湡;98=鍙栨秷涓�;99=宸插彇娑�;", example = "0")
+    private Integer orderStatus;
+
+    @ApiModelProperty(value = "鎿嶄綔浜虹被鍨嬶細0=鐢ㄦ埛锛�1=鍙告満锛�2=闂ㄥ簵锛�3=绯荤粺绠$悊鍛�", example = "0")
+    private Integer optUserType;
+
+}
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 f4a690c..773a95e 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,7 +66,8 @@
     private Integer selfTake;
 
     @ApiModelProperty(value = "璁㈠崟鐘舵��", example = "0")
-    @ExcelColumn(name = "璁㈠崟鐘舵��", valueMapping = "0=寰呮敮浠�;1=寰呭瘎瀛�;2=宸插瘎瀛�;3=寰呭彇浠�;6=瀛樺湪閫炬湡;7=宸插畬鎴�;98=宸叉寕璧�;99=宸插彇娑�;")
+    @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=宸插彇娑�;")
     private Integer status;
 
     @ApiModelProperty(value = "鏄惁寮傚父璁㈠崟锛�0=鍚︼紱1=鏄�", example = "0")
@@ -89,13 +90,13 @@
     @ExcelColumn(name = "瀛樹欢搴楅摵")
     private Integer depositShopId;
 
-    @ApiModelProperty(value = "棰勮鍒板簵瀛樹欢鏃堕棿璧�")
+    @ApiModelProperty(value = "棰勮鍒板簵瀛樹欢鏃堕棿")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private Date arriveStartTime;
+    private Date expectedDepositTime;
 
-    @ApiModelProperty(value = "棰勮鍒板簵瀛樹欢鏃堕棿姝�")
+    @ApiModelProperty(value = "棰勮鍒板簵鍙栦欢鏃堕棿姝�")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private Date arriveEndTime;
+    private Date expectedTakeTime;
 
     @ApiModelProperty(value = "瀛樹欢鍦扮偣")
     @ExcelColumn(name = "瀛樹欢鍦扮偣")
@@ -103,7 +104,7 @@
 
     @ApiModelProperty(value = "瀛樹欢鍦扮偣鎻忚堪")
     @ExcelColumn(name = "瀛樹欢鍦扮偣鎻忚堪")
-    private String depositLocationReamrk;
+    private String depositLocationRemark;
 
     @ApiModelProperty(value = "瀛樹欢鐐圭粡搴�")
     private BigDecimal depositLat;
@@ -121,7 +122,7 @@
 
     @ApiModelProperty(value = "鍙栦欢鍦扮偣璇︾粏鍦板潃")
     @ExcelColumn(name = "鍙栦欢鍦扮偣璇︾粏鍦板潃")
-    private String takeLocationReamrk;
+    private String takeLocationRemark;
 
     @ApiModelProperty(value = "鍙栦欢缁忓害")
     private BigDecimal takeLat;
@@ -237,6 +238,10 @@
     @ExcelColumn(name = "鎸囨淳鍙告満")
     private Integer assignDriverId;
 
+    @ApiModelProperty(value = "鍩虹瀵勫瓨璐圭敤锛堝垎锛�")
+    @ExcelColumn(name = "鍩虹瀵勫瓨璐圭敤")
+    private Long basicAmount;
+
     @ApiModelProperty(value = "璁㈠崟鎬昏垂鐢紙鍒嗭級")
     @ExcelColumn(name = "璁㈠崟鎬昏垂鐢�")
     private Long totalAmount;
@@ -256,6 +261,16 @@
     @ApiModelProperty(value = "閫炬湡澶╂暟")
     @ExcelColumn(name = "閫炬湡澶╂暟")
     private Integer overdueDays;
+
+    @ApiModelProperty(value = "鏄惁閫炬湡: 0=鍚� 1=鏄� 2=宸叉敮浠�")
+    @ExcelColumn(name = "鏄惁閫炬湡", valueMapping = "0=鍚�;1=鏄�;2=宸叉敮浠�;")
+    private Integer overdueStatus;
+
+    @ApiModelProperty(value = "浼氬憳璁㈠崟鏍搁攢鐮�")
+    private String memberVerifyCode;
+
+    @ApiModelProperty(value = "鍙告満璁㈠崟鏍搁攢鐮�")
+    private String driverVerifyCode;
 
     @ApiModelProperty(value = "鏀粯鐘舵�侊細0=鏈敮浠橈紱1=宸叉敮浠�", example = "0")
     @ExcelColumn(name = "鏀粯鐘舵��", valueMapping = "0=鏈敮浠�;1=宸叉敮浠�;")
@@ -333,6 +348,9 @@
     @ApiModelProperty(value = "缁撶畻鐘舵�侊細0=寰呯粨绠楋紱1=宸茬粨绠楋紱")
     private Integer settlementStatus;
 
+    @ApiModelProperty(value = "涓夋柟璁㈠崟鍙�")
+    private String outTradeNo;
+
     @TableField(exist = false)
     @ApiModelProperty(value = "鍒涘缓寮�濮嬫椂闂�(鏌ヨ鐢�)", example = "2026-01-01")
     @JsonFormat(pattern = "yyyy-MM-dd")
@@ -347,4 +365,32 @@
     @ApiModelProperty(value = "璁㈠崟绾у埆")
     private String orderLevel;
 
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鍙告満鍏抽敭瀛楋紙濮撳悕/鎵嬫満鍙凤級")
+    private String driverKeyword;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "瀵勪欢闂ㄥ簵鍚嶇О锛堝叧鑱旀煡璇級")
+    private String depositShopName;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "瀵勪欢闂ㄥ簵鑱旂郴浜猴紙鍏宠仈鏌ヨ锛�")
+    private String depositShopLinkName;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "瀵勪欢闂ㄥ簵鑱旂郴鐢佃瘽锛堝叧鑱旀煡璇級")
+    private String depositShopLinkPhone;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "瀵勪欢闂ㄥ簵鍦板潃锛堝叧鑱旀煡璇級")
+    private String depositShopAddress;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鍙栦欢闂ㄥ簵鍚嶇О锛堝叧鑱旀煡璇級")
+    private String takeShopName;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鍙栦欢闂ㄥ簵鍦板潃锛堝叧鑱旀煡璇級")
+    private String takeShopAddress;
+
 }
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/OrdersDetail.java b/server/services/src/main/java/com/doumee/dao/business/model/OrdersDetail.java
index 87d9a98..91519b1 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/OrdersDetail.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/OrdersDetail.java
@@ -60,11 +60,16 @@
     @ExcelColumn(name = "灏哄鍚嶇О")
     private String luggageName;
 
+    @ApiModelProperty(value = "灏哄璇︽儏")
+    @ExcelColumn(name = "灏哄璇︽儏")
+    private String luggageDetail;
+
+
     @ApiModelProperty(value = "鏁伴噺", example = "1")
     @ExcelColumn(name = "鏁伴噺")
     private Integer num;
 
-    @ApiModelProperty(value = "灏卞湴瀛樺彇 - 鍗曚环锛堝垎锛�")
+    @ApiModelProperty(value = "鍗曚环锛堝垎锛�")
     @ExcelColumn(name = "鍗曚环")
     private Long unitPrice;
 
@@ -84,4 +89,8 @@
     @ExcelColumn(name = "瓒呭嚭棣栧崟閲岀▼鍗曚环")
     private Long extraPrice;
 
+    @ApiModelProperty(value = "灏卞湴瀛樺彇 - 鍗曚环锛堝垎锛�")
+    @ExcelColumn(name = "灏卞湴瀛樺彇 - 鍗曚环")
+    private Long locallyPrice;
+
 }
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
new file mode 100644
index 0000000..8928774
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/business/model/OrdersRefund.java
@@ -0,0 +1,70 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 璁㈠崟閫�娆捐褰�
+ * @author rk
+ * @date 2026/04/13
+ */
+@Data
+@ApiModel("璁㈠崟閫�娆捐褰�")
+@TableName("`orders_refund`")
+public class OrdersRefund {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    private Integer id;
+
+    @ApiModelProperty(value = "鏄惁宸插垹闄� 0鏈垹闄� 1宸插垹闄�", example = "0")
+    private Integer deleted;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    private Integer createUser;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    private Integer updateUser;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "璁㈠崟涓婚敭", example = "1")
+    private Integer orderId;
+
+    @ApiModelProperty(value = "閫�娆炬柟寮忥細0=鏈瓨浠剁洿鎺ュ彇娑堬紱1=骞冲彴鐩存帴鍙栨秷锛�2=宸插瓨浠剁敵璇峰彇娑�", example = "0")
+    private Integer type;
+
+    @ApiModelProperty(value = "鍙栨秷鍘熷洜")
+    private String cancelInfo;
+
+    @ApiModelProperty(value = "璁㈠崟閫�娆惧崟鍙凤紙宸叉敮浠樿鍗曚娇鐢級")
+    private String refundCode;
+
+    @ApiModelProperty(value = "閫�娆炬椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date refundTime;
+
+    @ApiModelProperty(value = "闂ㄥ簵澶囨敞")
+    private String refundRemark;
+
+    @ApiModelProperty(value = "骞冲彴鎿嶄綔浜猴紙type=1浣跨敤锛�", example = "0")
+    private Integer userId;
+
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/PricingRule.java b/server/services/src/main/java/com/doumee/dao/business/model/PricingRule.java
index fa81fd9..18fb878 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/PricingRule.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/PricingRule.java
@@ -52,7 +52,7 @@
     @ExcelColumn(name = "绫诲瀷", index = 2, width = 10, valueMapping = "0=灏卞湴瀛樺彇瑙勫垯;1=寮傚湴瀛樺彇瑙勫垯;2=棰勮澶辨晥;3=闂ㄥ簵娉ㄥ唽鎶奸噾;4=鍒嗘垚姣斾緥;")
     private Integer type;
 
-    @ApiModelProperty(value = "鍙傛暟1锛歵ype 锛�0/1锛�=  鍏宠仈 鐗╁搧灏哄锛坈ategory type =4锛�;type 锛�2锛�= 榛樿 1 锛� type (3)  = 浼佷笟绫诲瀷锛�0=浼佷笟锛�1=涓汉锛夛紱type (4) = 绫诲瀷锛堜紒涓�/涓汉/閰嶉�佸憳锛�")
+    @ApiModelProperty(value = "鍙傛暟1锛歵ype 锛�0/1锛�=  鍏宠仈 鐗╁搧灏哄锛坈ategory type =4锛�;type 锛�2锛� 锛堥粯璁� 1鏍囬�熻揪锛�2=鏋侀�熻揪锛� 锛� type (3)  = 浼佷笟绫诲瀷锛�0=浼佷笟锛�1=涓汉锛夛紱type (4) = 绫诲瀷锛堜紒涓�/涓汉/閰嶉�佸憳锛�")
     private String fieldA;
 
     @ApiModelProperty(value = "鍙傛暟2锛歵ype 锛�0锛�=  鏀惰垂鍗曚环 ;type 锛�1锛�= 閰嶉�佽捣姝ラ噷绋嬪叕閲屾暟 锛泃ype 锛�2锛�= 璧烽�侀噷绋� km 锛� type (3)  = 鎶奸噾锛泃ype (4) = 鍦扮偣绫诲瀷锛堝瘎浠剁偣/鍙栦欢鐐�/鍒嗘垚姣斾緥锛�")
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/Revenue.java b/server/services/src/main/java/com/doumee/dao/business/model/Revenue.java
index 71f8a58..70d241c 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/Revenue.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/Revenue.java
@@ -34,7 +34,7 @@
 
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @ExcelColumn(name = "鍒涘缓鏃堕棿", index = 6, width = 16, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    @ExcelColumn(name = "鏀舵敮鏃堕棿", index = 3, width = 16, dateFormat = "yyyy-MM-dd HH:mm:ss")
     private Date createTime;
 
     @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
@@ -54,15 +54,15 @@
     private Integer memberType;
 
     @ApiModelProperty(value = "鏄惁鐢熸晥锛�0=鍏ヨ处涓紱1=宸插叆璐︼紱")
-    @ExcelColumn(name = "鏄惁鐢熸晥", valueMapping = "0=鍏ヨ处涓�;1=宸插叆璐�;", index = 5, width = 8)
+    @ExcelColumn(name = "鐘舵��", valueMapping = "0=鍏ヨ处涓�;1=宸插叆璐�;", index = 6, width = 8)
     private Integer vaildStatus;
 
     @ApiModelProperty(value = "绫诲瀷锛�0=瀹屾垚璁㈠崟锛�1=鎻愮幇鏀嚭锛�2=鎻愮幇閫�鍥烇紱3=骞冲彴濂栧姳", example = "0")
-    @ExcelColumn(name = "鍙樺姩绫诲瀷", valueMapping = "0=瀹屾垚璁㈠崟;1=鎻愮幇鏀嚭;2=鎻愮幇閫�鍥�;3=骞冲彴濂栧姳;", index = 3, width = 10)
+    @ExcelColumn(name = "涓氬姟绫诲瀷", valueMapping = "0=瀹屾垚璁㈠崟;1=鎻愮幇鏀嚭;2=鎻愮幇閫�鍥�;3=骞冲彴濂栧姳;", index = 4, width = 12)
     private Integer type;
 
     @ApiModelProperty(value = "鏀舵敮绫诲瀷锛�1=鏀跺叆锛�-1=鏀嚭", example = "1")
-    @ExcelColumn(name = "鏀舵敮绫诲瀷", valueMapping = "1=鏀跺叆;-1=鏀嚭;", index = 1, width = 8)
+    @ExcelColumn(name = "鏀跺叆/鏀嚭", valueMapping = "1=鏀跺叆;-1=鏀嚭;", index = 1, width = 8)
     private Integer optType;
 
     @ApiModelProperty(value = "閲戦锛堝垎锛�")
@@ -84,7 +84,7 @@
     private Integer status;
 
     @ApiModelProperty(value = "璁㈠崟鍙�")
-    @ExcelColumn(name = "璁㈠崟鍙�", index = 4, width = 16)
+    @ExcelColumn(name = "浜ゆ槗鍙�", index = 5, width = 16)
     private String orderNo;
 
     @ApiModelProperty(value = "鏌ヨ寮�濮嬫椂闂�")
@@ -97,7 +97,7 @@
 
     @ApiModelProperty(value = "鍙樺姩閲戦锛堝厓锛�")
     @TableField(exist = false)
-    @ExcelColumn(name = "鍙樺姩閲戦(鍏�)", index = 2, width = 10)
+    @ExcelColumn(name = "閲戦锛堝厓锛�", index = 2, width = 10)
     private Double amountInfo;
 
 }
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/ShopInfo.java b/server/services/src/main/java/com/doumee/dao/business/model/ShopInfo.java
index 9e9ff65..4147f2a 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/ShopInfo.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/ShopInfo.java
@@ -125,7 +125,7 @@
     @ApiModelProperty(value = "瀹℃壒澶囨敞")
     private String auditRemark;
 
-    @ApiModelProperty(value = "OPENID")
+    @ApiModelProperty(value = "褰撳墠鐧诲綍鐢ㄦ埛openid")
     private String openid;
 
     @ApiModelProperty(value = "鏀粯鐘舵�侊細0=寰呮敮浠橈紱1=宸叉敮浠�", example = "0")
@@ -155,6 +155,29 @@
 
     @ApiModelProperty(value = "閰嶉�佽寖鍥�(km)")
     private BigDecimal deliveryArea;
+
+    @ApiModelProperty(value = "鏀粯瀹濇彁鐜拌处鎴�")
+    private String aliAccount;
+
+    @ApiModelProperty(value = "钀ヤ笟鏃堕棿")
+    private String shopHours;
+
+    @ApiModelProperty(value = "闂ㄥ簵浠嬬粛")
+    private String content;
+
+    @ApiModelProperty(value = "闂ㄥ簵澶村儚")
+    private String coverImg;
+
+    @ApiModelProperty(value = "瀵勫瓨绫诲瀷锛堥�楀彿鍒嗛殧鐨刢ategory涓婚敭锛�")
+    private String depositTypes;
+
+    @ApiModelProperty(value = "鏀惰垂鏍囧噯")
+    private String feeStandard;
+
+    @ApiModelProperty(value = "闂ㄥ簵钀ヤ笟绫诲瀷锛�0=闈炲叏澶╋紱1=鍏ㄥぉ", example = "0")
+    private Integer businessType;
+
+
     // 闈炴寔涔呭寲锛氶檮浠跺垪琛�
     @TableField(exist = false)
     @ApiModelProperty(value = "闂ㄥ簵闂ㄥご鐓�", hidden = true)
@@ -186,4 +209,8 @@
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date createEndTime;
 
+    @TableField(exist = false)
+    @ApiModelProperty(value = "瀹℃壒鐘舵�佸垪琛�(鏌ヨ鐢紝閫楀彿鍒嗛殧)", example = "0,1,2")
+    private List<Integer> auditStatusList;
+
 }
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/Smsrecord.java b/server/services/src/main/java/com/doumee/dao/business/model/Smsrecord.java
index c1897aa..c86eb84 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/Smsrecord.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/Smsrecord.java
@@ -46,6 +46,9 @@
     private String remark;
 
     @ApiModelProperty(value = "鎵嬫満鍙�")
+    private Integer memberId;
+
+    @ApiModelProperty(value = "鎵嬫満鍙�")
     @ExcelColumn(name = "鎵嬫満鍙�", index = 2, width = 12)
     private String phone;
 
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/WithdrawalOrders.java b/server/services/src/main/java/com/doumee/dao/business/model/WithdrawalOrders.java
index 61ea0e9..51edffa 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/WithdrawalOrders.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/WithdrawalOrders.java
@@ -56,6 +56,11 @@
     @ExcelColumn(name = "浼氬憳涓婚敭")
     private Integer memberId;
 
+    @ApiModelProperty(value = "鐢ㄦ埛绫诲瀷锛�1= 鍙告満锛�2=搴楅摵锛�", example = "1")
+    @ExcelColumn(name = "鐢ㄦ埛绫诲瀷锛�1= 鍙告満锛�2=搴楅摵锛�")
+    private Integer memberType;
+
+
     @ApiModelProperty(value = "鎻愮幇閲戦(鍗曚綅:鍒�)")
     @ExcelColumn(name = "鎻愮幇閲戦")
     private Long amount;
@@ -88,6 +93,19 @@
     @ExcelColumn(name = "鎻愮幇鐢宠鍗曞彿")
     private String outBillNo;
 
+    @ApiModelProperty(value = "鏀粯瀹濇彁鐜拌处鎴�")
+    private String aliAccount;
+
+    @ApiModelProperty(value = "瀹℃壒鎿嶄綔浜猴紙鍏宠仈system_user锛�", example = "1")
+    private Integer userId;
+
+    @ApiModelProperty(value = "瀹℃壒鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date approveTime;
+
+    @ApiModelProperty(value = "瀹℃壒澶囨敞")
+    private String approveRemark;
+
     @TableField(exist = false)
     @ApiModelProperty(value = "鍒涘缓寮�濮嬫椂闂�(鏌ヨ鐢�)", example = "2026-01-01")
     @JsonFormat(pattern = "yyyy-MM-dd")
@@ -98,4 +116,29 @@
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date createEndTime;
 
+    @TableField(exist = false)
+    @ApiModelProperty(value = "瀹℃壒浜哄悕绉�")
+    private String updateUserName;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鍙告満濮撳悕")
+    private String memberName;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鍙告満鑱旂郴鐢佃瘽")
+    private String memberTelephone;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "闂ㄥ簵鍚嶇О")
+    private String shopName;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鑱旂郴浜�")
+    private String linkName;
+
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "闂ㄥ簵璇︽儏")
+    private ShopInfo shopInfo;
+
 }
diff --git a/server/services/src/main/java/com/doumee/dao/dto/AgreementConfigDTO.java b/server/services/src/main/java/com/doumee/dao/dto/AgreementConfigDTO.java
new file mode 100644
index 0000000..74adbfb
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/AgreementConfigDTO.java
@@ -0,0 +1,25 @@
+package com.doumee.dao.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 鍗忚閰嶇疆DTO
+ * @author rk
+ * @date 2026/04/13
+ */
+@Data
+@ApiModel("鍗忚閰嶇疆")
+public class AgreementConfigDTO {
+
+    @ApiModelProperty(value = "闅愮鍗忚")
+    private String privacyAgreement;
+
+    @ApiModelProperty(value = "鐢ㄦ埛鍗忚")
+    private String userAgreement;
+
+    @ApiModelProperty(value = "鍏充簬鎴戜滑")
+    private String aboutUs;
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/AuditDTO.java b/server/services/src/main/java/com/doumee/dao/dto/AuditDTO.java
index 93ea87d..dafcaca 100644
--- a/server/services/src/main/java/com/doumee/dao/dto/AuditDTO.java
+++ b/server/services/src/main/java/com/doumee/dao/dto/AuditDTO.java
@@ -23,6 +23,9 @@
     @ApiModelProperty(value = "瀹℃壒鎻忚堪")
     private String auditRemark;
 
+    @ApiModelProperty(value = "鍙告満瀹氱骇锛�5=S锛�4=A锛�3=B锛�2=C锛�1=D锛堝鎵归�氳繃鏃跺繀濉級", example = "5")
+    private Integer driverLevel;
+
     @ApiModelProperty(value = "瀹℃壒浜虹紪鐮侊紙鏈嶅姟绔~鍏咃級", hidden = true)
     private Integer auditUser;
 
diff --git a/server/services/src/main/java/com/doumee/dao/dto/CalculateLocalPriceDTO.java b/server/services/src/main/java/com/doumee/dao/dto/CalculateLocalPriceDTO.java
new file mode 100644
index 0000000..c411602
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/CalculateLocalPriceDTO.java
@@ -0,0 +1,41 @@
+package com.doumee.dao.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 灏卞湴瀛樺彇棰勪及璐圭敤璇锋眰DTO
+ *
+ * @Author : Rk
+ * @create 2026/4/14
+ */
+@Data
+@ApiModel("灏卞湴瀛樺彇棰勪及璐圭敤璇锋眰")
+public class CalculateLocalPriceDTO {
+
+    @ApiModelProperty(value = "鍩庡競涓婚敭", required = true)
+    @NotNull(message = "鍩庡競涓嶈兘涓虹┖")
+    private Integer cityId;
+
+    @ApiModelProperty(value = "棰勮瀛樻斁澶╂暟", required = true)
+    @NotNull(message = "棰勮瀛樻斁澶╂暟涓嶈兘涓虹┖")
+    private Integer estimatedDepositDays;
+
+    @ApiModelProperty(value = "鐗╁搧鍒楄〃", required = true)
+    @NotEmpty(message = "鐗╁搧鍒楄〃涓嶈兘涓虹┖")
+    @Valid
+    private List<OrderItemDTO> items;
+
+    @ApiModelProperty(value = "鏄惁淇濅环")
+    private Boolean insured;
+
+    @ApiModelProperty(value = "淇濅环閲戦(鍏�)")
+    private BigDecimal declaredAmount;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/CalculateRemotePriceDTO.java b/server/services/src/main/java/com/doumee/dao/dto/CalculateRemotePriceDTO.java
new file mode 100644
index 0000000..b512f85
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/CalculateRemotePriceDTO.java
@@ -0,0 +1,56 @@
+package com.doumee.dao.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 寮傚湴瀛樺彇棰勪及璐圭敤璇锋眰DTO
+ *
+ * @Author : Rk
+ * @create 2026/4/14
+ */
+@Data
+@ApiModel("寮傚湴瀛樺彇棰勪及璐圭敤璇锋眰")
+public class CalculateRemotePriceDTO {
+
+    @ApiModelProperty(value = "鍩庡競涓婚敭", required = true)
+    @NotNull(message = "鍩庡競涓嶈兘涓虹┖")
+    private Integer cityId;
+
+    @ApiModelProperty(value = "瀵勪欢绾害", required = true)
+    @NotNull(message = "瀵勪欢绾害涓嶈兘涓虹┖")
+    private BigDecimal fromLat;
+
+    @ApiModelProperty(value = "瀵勪欢缁忓害", required = true)
+    @NotNull(message = "瀵勪欢缁忓害涓嶈兘涓虹┖")
+    private BigDecimal fromLgt;
+
+    @ApiModelProperty(value = "鍙栦欢绾害", required = true)
+    @NotNull(message = "鍙栦欢绾害涓嶈兘涓虹┖")
+    private BigDecimal toLat;
+
+    @ApiModelProperty(value = "鍙栦欢缁忓害", required = true)
+    @NotNull(message = "鍙栦欢缁忓害涓嶈兘涓虹┖")
+    private BigDecimal toLgt;
+
+    @ApiModelProperty(value = "鐗╁搧鍒楄〃", required = true)
+    @NotEmpty(message = "鐗╁搧鍒楄〃涓嶈兘涓虹┖")
+    @Valid
+    private List<OrderItemDTO> items;
+
+    @ApiModelProperty(value = "鏄惁淇濅环")
+    private Boolean insured;
+
+    @ApiModelProperty(value = "淇濅环閲戦(鍏�)")
+    private BigDecimal declaredAmount;
+
+    @ApiModelProperty(value = "鏄惁鍔犳��")
+    private Boolean urgent;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/CancelOrderDTO.java b/server/services/src/main/java/com/doumee/dao/dto/CancelOrderDTO.java
new file mode 100644
index 0000000..47bac52
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/CancelOrderDTO.java
@@ -0,0 +1,25 @@
+package com.doumee.dao.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 浼氬憳鍙栨秷璁㈠崟璇锋眰
+ *
+ * @author rk
+ * @date 2026/04/15
+ */
+@Data
+@ApiModel("浼氬憳鍙栨秷璁㈠崟璇锋眰")
+public class CancelOrderDTO {
+
+    @NotNull(message = "璁㈠崟涓婚敭涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "璁㈠崟涓婚敭", required = true, example = "1")
+    private Integer orderId;
+
+    @ApiModelProperty(value = "鍙栨秷鍘熷洜")
+    private String cancelReason;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/ConfirmArriveDTO.java b/server/services/src/main/java/com/doumee/dao/dto/ConfirmArriveDTO.java
new file mode 100644
index 0000000..396b2c4
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/ConfirmArriveDTO.java
@@ -0,0 +1,25 @@
+package com.doumee.dao.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 纭椤惧鍒板簵DTO
+ * @author rk
+ * @date 2026/04/15
+ */
+@Data
+@ApiModel("纭椤惧鍒板簵")
+public class ConfirmArriveDTO {
+
+    @NotNull(message = "璁㈠崟涓婚敭涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "璁㈠崟涓婚敭", required = true)
+    private Integer orderId;
+
+    @NotNull(message = "闂ㄥ簵涓婚敭涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "褰撳墠鎿嶄綔闂ㄥ簵涓婚敭", required = true)
+    private Integer shopId;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/CreateOrderDTO.java b/server/services/src/main/java/com/doumee/dao/dto/CreateOrderDTO.java
new file mode 100644
index 0000000..8b205f6
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/CreateOrderDTO.java
@@ -0,0 +1,84 @@
+package com.doumee.dao.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 鍒涘缓璁㈠崟璇锋眰DTO
+ *
+ * @Author : Rk
+ * @create 2026/4/14
+ */
+@Data
+@ApiModel("鍒涘缓璁㈠崟璇锋眰")
+public class CreateOrderDTO {
+
+    @ApiModelProperty(value = "瀵勫瓨绫诲瀷: 0=灏卞湴瀵勫瓨 1=寮傚湴瀵勫瓨", required = true)
+    @NotNull(message = "瀵勫瓨绫诲瀷涓嶈兘涓虹┖")
+    private Integer type;
+
+    @ApiModelProperty(value = "鍩庡競涓婚敭", required = true)
+    @NotNull(message = "鍩庡競涓嶈兘涓虹┖")
+    private Integer cityId;
+
+    @ApiModelProperty(value = "瀵勪欢搴楅摵涓婚敭", required = true)
+    @NotNull(message = "瀵勪欢搴楅摵涓嶈兘涓虹┖")
+    private Integer depositShopId;
+
+    @ApiModelProperty(value = "鍙栦欢搴楅摵涓婚敭(寮傚湴,搴楅摵鍙栦欢鏃�)")
+    private Integer takeShopId;
+
+    @ApiModelProperty(value = "鍙栦欢绾害(寮傚湴,鑷�夌偣鏃�)")
+    private BigDecimal takeLat;
+
+    @ApiModelProperty(value = "鍙栦欢缁忓害(寮傚湴,鑷�夌偣鏃�)")
+    private BigDecimal takeLgt;
+
+    @ApiModelProperty(value = "鍙栦欢璇︾粏鍦板潃(寮傚湴,鑷�夌偣鏃�)")
+    private String takeLocation;
+
+    @ApiModelProperty(value = "鍙栦欢浜哄鍚�", required = true)
+    @NotEmpty(message = "鍙栦欢浜哄鍚嶄笉鑳戒负绌�")
+    private String takeUser;
+
+    @ApiModelProperty(value = "鍙栦欢浜虹數璇�", required = true)
+    @NotEmpty(message = "鍙栦欢浜虹數璇濅笉鑳戒负绌�")
+    private String takePhone;
+
+    @ApiModelProperty(value = "棰勮鍒板簵瀛樹欢鏃堕棿(yyyy-MM-dd HH:mm)", required = true)
+    @NotEmpty(message = "棰勮鍒板簵瀛樹欢鏃堕棿涓嶈兘涓虹┖")
+    private String expectedDepositTime;
+
+    @ApiModelProperty(value = "棰勮鍒板簵鍙栦欢鏃堕棿(yyyy-MM-dd HH:mm)", required = true)
+    @NotEmpty(message = "棰勮鍒板簵鍙栦欢鏃堕棿涓嶈兘涓虹┖")
+    private String expectedTakeTime;
+
+    @ApiModelProperty(value = "鐗╁搧绫诲瀷(category涓婚敭)", required = true)
+    @NotNull(message = "鐗╁搧绫诲瀷涓嶈兘涓虹┖")
+    private Integer goodType;
+
+    @ApiModelProperty(value = "鐗╁搧灏哄涓庢暟閲忓垪琛�", required = true)
+    @NotEmpty(message = "鐗╁搧灏哄涓庢暟閲忎笉鑳戒负绌�")
+    @Valid
+    private List<OrderItemDTO> items;
+
+    @ApiModelProperty(value = "鐗╁搧鍥剧墖URL鍒楄〃(鏈�澶�3寮�)", required = true)
+    @NotEmpty(message = "鐗╁搧鍥剧墖涓嶈兘涓虹┖")
+    private List<String> goodsImages;
+
+    @ApiModelProperty(value = "鏈嶅姟鏃舵晥: 0=鏍囬�熻揪 1=鏋侀�熻揪(寮傚湴蹇呭~)")
+    private Integer isUrgent;
+
+    @ApiModelProperty(value = "淇濅环閲戦(鍏�,闈炲繀濉�)")
+    private BigDecimal declaredAmount;
+
+    @ApiModelProperty(value = "璁㈠崟澶囨敞(闈炲繀濉�)")
+    private String remark;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/DispatchDTO.java b/server/services/src/main/java/com/doumee/dao/dto/DispatchDTO.java
new file mode 100644
index 0000000..de8da73
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/DispatchDTO.java
@@ -0,0 +1,29 @@
+package com.doumee.dao.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 璁㈠崟娲惧崟DTO
+ * @author rk
+ * @date 2026/04/13
+ */
+@Data
+@ApiModel("璁㈠崟娲惧崟")
+public class DispatchDTO {
+
+    @ApiModelProperty(value = "璁㈠崟涓婚敭", required = true)
+    private Integer orderId;
+
+    @ApiModelProperty(value = "鍔犳�ヨ垂鐢紙鍏冿級", required = true, example = "10.00")
+    private BigDecimal urgentFee;
+
+    @ApiModelProperty(value = "娲鹃�佸徃鏈猴紙浼氬憳涓婚敭锛�")
+    private Integer driverId;
+
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/DriverVerifyDTO.java b/server/services/src/main/java/com/doumee/dao/dto/DriverVerifyDTO.java
new file mode 100644
index 0000000..8bb603b
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/DriverVerifyDTO.java
@@ -0,0 +1,31 @@
+package com.doumee.dao.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+import java.util.List;
+
+/**
+ * 鍙告満鏍搁攢璇锋眰
+ *
+ * @author rk
+ * @date 2026/04/15
+ */
+@Data
+@ApiModel("鍙告満鏍搁攢璇锋眰")
+public class DriverVerifyDTO {
+
+    @NotBlank(message = "鏍搁攢鐮佷笉鑳戒负绌�")
+    @ApiModelProperty(value = "鍙告満鏍搁攢鐮�", required = true)
+    private String verifyCode;
+
+    @Size(max = 3, message = "鏈�澶氫笂浼�3寮犲浘鐗�")
+    @ApiModelProperty(value = "鍥剧墖鍦板潃鍒楄〃锛屾渶澶�3寮�")
+    private List<String> images;
+
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/EstimatedDeliverySaveDTO.java b/server/services/src/main/java/com/doumee/dao/dto/EstimatedDeliverySaveDTO.java
index eb70d14..93108d7 100644
--- a/server/services/src/main/java/com/doumee/dao/dto/EstimatedDeliverySaveDTO.java
+++ b/server/services/src/main/java/com/doumee/dao/dto/EstimatedDeliverySaveDTO.java
@@ -6,6 +6,7 @@
 
 import javax.validation.constraints.NotNull;
 import java.io.Serializable;
+import java.util.List;
 
 /**
  * 棰勮鏃舵晥閰嶇疆淇濆瓨璇锋眰
@@ -20,19 +21,32 @@
     @NotNull(message = "鍩庡競涓婚敭涓嶈兘涓虹┖")
     private Integer cityId;
 
-    @ApiModelProperty(value = "璧烽�侀噷绋�(鍏噷)", required = true, example = "10")
-    @NotNull(message = "璧烽�侀噷绋嬩笉鑳戒负绌�")
-    private String startDistance;
+    @ApiModelProperty(value = "鏃舵晥閰嶇疆鍒楄〃锛坒ieldA=1鏍囬�熻揪锛宖ieldA=2鏋侀�熻揪锛�")
+    @NotNull(message = "鏃舵晥閰嶇疆鍒楄〃涓嶈兘涓虹┖")
+    private List<EstimatedDeliveryItem> items;
 
-    @ApiModelProperty(value = "璧烽�佹椂闀�", required = true, example = "2")
-    @NotNull(message = "璧烽�佹椂闀夸笉鑳戒负绌�")
-    private String startTime;
+    @Data
+    @ApiModel("棰勮鏃舵晥閰嶇疆椤�")
+    public static class EstimatedDeliveryItem implements Serializable {
 
-    @ApiModelProperty(value = "缁�侀噷绋�(鍏噷)", required = true, example = "5")
-    @NotNull(message = "缁�侀噷绋嬩笉鑳戒负绌�")
-    private String continueDistance;
+        @ApiModelProperty(value = "绫诲瀷锛�1=鏍囬�熻揪锛�2=鏋侀�熻揪", required = true, example = "1")
+        @NotNull(message = "绫诲瀷涓嶈兘涓虹┖")
+        private Integer fieldA;
 
-    @ApiModelProperty(value = "缁�佹椂闀�", required = true, example = "1")
-    @NotNull(message = "缁�佹椂闀夸笉鑳戒负绌�")
-    private String continueTime;
+        @ApiModelProperty(value = "璧烽�侀噷绋�(鍏噷)", required = true, example = "10")
+        @NotNull(message = "璧烽�侀噷绋嬩笉鑳戒负绌�")
+        private String startDistance;
+
+        @ApiModelProperty(value = "璧烽�佹椂闀�", required = true, example = "2")
+        @NotNull(message = "璧烽�佹椂闀夸笉鑳戒负绌�")
+        private String startTime;
+
+        @ApiModelProperty(value = "缁�侀噷绋�(鍏噷)", required = true, example = "5")
+        @NotNull(message = "缁�侀噷绋嬩笉鑳戒负绌�")
+        private String continueDistance;
+
+        @ApiModelProperty(value = "缁�佹椂闀�", required = true, example = "1")
+        @NotNull(message = "缁�佹椂闀夸笉鑳戒负绌�")
+        private String continueTime;
+    }
 }
diff --git a/server/services/src/main/java/com/doumee/dao/dto/MemberListQueryDTO.java b/server/services/src/main/java/com/doumee/dao/dto/MemberListQueryDTO.java
new file mode 100644
index 0000000..8d6197e
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/MemberListQueryDTO.java
@@ -0,0 +1,33 @@
+package com.doumee.dao.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 浼氬憳鍒楄〃鏌ヨ鏉′欢
+ * @author rk
+ * @date 2026/04/13
+ */
+@Data
+@ApiModel("浼氬憳鍒楄〃鏌ヨ鏉′欢")
+public class MemberListQueryDTO {
+
+    @ApiModelProperty(value = "浼氬憳濮撳悕/鎵嬫満鍙�")
+    private String keyword;
+
+    @ApiModelProperty(value = "鐘舵�� 0=姝e父锛�1=鍋滅敤锛�2=宸叉敞閿�")
+    private Integer status;
+
+    @ApiModelProperty(value = "鍒涘缓寮�濮嬫椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date startTime;
+
+    @ApiModelProperty(value = "鍒涘缓缁撴潫鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date endTime;
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/MyOrderDTO.java b/server/services/src/main/java/com/doumee/dao/dto/MyOrderDTO.java
new file mode 100644
index 0000000..ecca5c8
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/MyOrderDTO.java
@@ -0,0 +1,24 @@
+package com.doumee.dao.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 灏忕▼搴忕-鎴戠殑璁㈠崟鏌ヨ璇锋眰
+ * @author rk
+ * @date 2026/04/15
+ */
+@Data
+@ApiModel("浼氬憳璁㈠崟鏌ヨ璇锋眰")
+public class MyOrderDTO implements Serializable {
+
+    @ApiModelProperty(value = "璁㈠崟鐘舵�侊紙鍙�夛紝涓嶄紶鏌ュ叏閮級", example = "0")
+    private Integer status;
+
+    @ApiModelProperty(value = "鍚堝苟鐘舵�侊紙鍙�夛紝涓嶄紶鏌ュ叏閮級: 0=寰呮敮浠� 1=寰呮牳楠� 2=寰呴厤閫� 3=寰呮敹璐� 4=宸插畬鎴� 5=閫�娆�", example = "0")
+    private Integer combinedStatus;
+
+}
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
new file mode 100644
index 0000000..ac949d3
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/OperationConfigDTO.java
@@ -0,0 +1,40 @@
+package com.doumee.dao.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 杩愯惀閰嶇疆DTO
+ * @author rk
+ * @date 2026/04/13
+ */
+@Data
+@ApiModel("杩愯惀閰嶇疆")
+public class OperationConfigDTO {
+
+    @ApiModelProperty(value = "鍙告満姣忔棩鍙栨秷娆℃暟", required = true)
+    private String driverDailyCancelLimit;
+
+    @ApiModelProperty(value = "鏈彇浠堕�炬湡鎶樻墸", required = true)
+    private String unpickedDiscount;
+
+    @ApiModelProperty(value = "璁㈠崟缁撶畻鏃ユ湡", required = true)
+    private String settlementDate;
+
+    @ApiModelProperty(value = "鍔犳�ョ郴鏁�", required = true)
+    private String urgentCoefficient;
+
+    @ApiModelProperty(value = "瓒呮椂鏈敮浠樿嚜鍔ㄥ彇娑堟椂闂�(鍒嗛挓)", required = true)
+    private String autoCancelTime;
+
+    @ApiModelProperty(value = "淇濊垂姣旂巼", required = true)
+    private String insuranceRate;
+
+    @ApiModelProperty(value = "鎺ュ崟鏁伴噺", required = true)
+    private String orderAcceptLimit;
+
+    @ApiModelProperty(value = "鑷姩纭鏀惰揣(澶�)", required = true)
+    private String autoConfirmReceipt;
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/OrderItemDTO.java b/server/services/src/main/java/com/doumee/dao/dto/OrderItemDTO.java
new file mode 100644
index 0000000..b40c8a3
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/OrderItemDTO.java
@@ -0,0 +1,26 @@
+package com.doumee.dao.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 璁㈠崟鐗╁搧椤笵TO
+ *
+ * @Author : Rk
+ * @create 2026/4/14
+ */
+@Data
+@ApiModel("璁㈠崟鐗╁搧椤�")
+public class OrderItemDTO {
+
+    @ApiModelProperty(value = "鐗╁搧绫诲瀷/灏哄ID", required = true)
+    @NotNull(message = "鐗╁搧绫诲瀷涓嶈兘涓虹┖")
+    private Integer categoryId;
+
+    @ApiModelProperty(value = "鏁伴噺", required = true)
+    @NotNull(message = "鏁伴噺涓嶈兘涓虹┖")
+    private Integer quantity;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/ShopDetailQueryDTO.java b/server/services/src/main/java/com/doumee/dao/dto/ShopDetailQueryDTO.java
new file mode 100644
index 0000000..e189c32
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/ShopDetailQueryDTO.java
@@ -0,0 +1,28 @@
+package com.doumee.dao.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * 闂ㄥ簵璇︽儏鏌ヨ璇锋眰
+ * @author rk
+ * @date 2026/04/14
+ */
+@Data
+@ApiModel("闂ㄥ簵璇︽儏鏌ヨ璇锋眰")
+public class ShopDetailQueryDTO implements Serializable {
+
+    @ApiModelProperty(value = "闂ㄥ簵涓婚敭", required = true, example = "1")
+    @NotNull(message = "闂ㄥ簵涓婚敭涓嶈兘涓虹┖")
+    private Integer id;
+
+    @ApiModelProperty(value = "缁忓害锛堥潪蹇呭~锛屾湁鍊兼椂杩斿洖璺濈锛�", example = "116.404")
+    private Double longitude;
+
+    @ApiModelProperty(value = "绾害锛堥潪蹇呭~锛屾湁鍊兼椂杩斿洖璺濈锛�", example = "39.915")
+    private Double latitude;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/ShopInfoMaintainDTO.java b/server/services/src/main/java/com/doumee/dao/dto/ShopInfoMaintainDTO.java
new file mode 100644
index 0000000..f2f72a4
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/ShopInfoMaintainDTO.java
@@ -0,0 +1,40 @@
+package com.doumee.dao.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 闂ㄥ簵淇℃伅缁存姢璇锋眰锛堟敮浠樻娂閲戝悗锛�
+ * @author rk
+ * @date 2026/04/14
+ */
+@Data
+@ApiModel("闂ㄥ簵淇℃伅缁存姢璇锋眰")
+public class ShopInfoMaintainDTO implements Serializable {
+
+    @ApiModelProperty(value = "闂ㄥ簵澶村儚")
+    private String coverImg;
+
+    @ApiModelProperty(value = "闂ㄥ簵浠嬬粛")
+    private String content;
+
+    @ApiModelProperty(value = "瀵勫瓨绫诲瀷")
+    private String depositTypes;
+
+    @ApiModelProperty(value = "鏀惰垂鏍囧噯")
+    private String feeStandard;
+
+    @ApiModelProperty(value = "閰嶉�佽寖鍥�(km)")
+    private BigDecimal deliveryArea;
+
+    @ApiModelProperty(value = "闂ㄥ簵钀ヤ笟鏃堕棿")
+    private String shopHours;
+
+    @ApiModelProperty(value = "闂ㄥ簵钀ヤ笟绫诲瀷锛�0=闈炲叏澶╋紱1=鍏ㄥぉ", example = "0")
+    private Integer businessType;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/ShopLoginDTO.java b/server/services/src/main/java/com/doumee/dao/dto/ShopLoginDTO.java
new file mode 100644
index 0000000..0692f05
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/ShopLoginDTO.java
@@ -0,0 +1,20 @@
+package com.doumee.dao.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("闂ㄥ簵鐧诲綍璇锋眰瀵硅薄")
+public class ShopLoginDTO {
+
+    @ApiModelProperty(value = "openid")
+    private String openid;
+
+    @ApiModelProperty(value = "鐧诲綍鎵嬫満鍙�")
+    private String telephone;
+
+    @ApiModelProperty(value = "瀵嗙爜")
+    private String password;
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/ShopNearbyDTO.java b/server/services/src/main/java/com/doumee/dao/dto/ShopNearbyDTO.java
new file mode 100644
index 0000000..b322330
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/ShopNearbyDTO.java
@@ -0,0 +1,39 @@
+package com.doumee.dao.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * 闄勮繎闂ㄥ簵鏌ヨ璇锋眰
+ * @author rk
+ * @date 2026/04/14
+ */
+@Data
+@ApiModel("闄勮繎闂ㄥ簵鏌ヨ璇锋眰")
+public class ShopNearbyDTO implements Serializable {
+
+    @ApiModelProperty(value = "缁忓害", required = true, example = "116.404")
+    @NotNull(message = "缁忓害涓嶈兘涓虹┖")
+    private Double longitude;
+
+    @ApiModelProperty(value = "绾害", required = true, example = "39.915")
+    @NotNull(message = "绾害涓嶈兘涓虹┖")
+    private Double latitude;
+
+    @ApiModelProperty(value = "鎺掑簭绫诲瀷锛�1=璺濈鐢辫繎鍒拌繙锛�2=鎸夎瘎鍒嗘帓搴�", example = "1")
+    private Integer sortType;
+
+    @ApiModelProperty(value = "璺濈绛涢�夎寖鍥达紙鍗曚綅锛氱背锛�", example = "3000")
+    private Integer distance;
+
+    @ApiModelProperty(value = "闂ㄥ簵钀ヤ笟绫诲瀷绛涢�夛細0=闈炲叏澶╋紱1=鍏ㄥぉ", example = "1")
+    private Integer businessType;
+
+    @ApiModelProperty(value = "闂ㄥ簵鍚嶇О锛堟ā绯婃煡璇級", example = "XX闂ㄥ簵")
+    private String name;
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/ShopVerifyDTO.java b/server/services/src/main/java/com/doumee/dao/dto/ShopVerifyDTO.java
new file mode 100644
index 0000000..a082b09
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/ShopVerifyDTO.java
@@ -0,0 +1,31 @@
+package com.doumee.dao.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+import java.util.List;
+
+/**
+ * 闂ㄥ簵鏍搁攢璇锋眰
+ *
+ * @author rk
+ * @date 2026/04/15
+ */
+@Data
+@ApiModel("闂ㄥ簵鏍搁攢璇锋眰")
+public class ShopVerifyDTO {
+
+    @NotBlank(message = "鏍搁攢鐮佷笉鑳戒负绌�")
+    @ApiModelProperty(value = "浼氬憳鏍搁攢鐮�", required = true)
+    private String verifyCode;
+
+    @Size(max = 3, message = "鏈�澶氫笂浼�3寮犲浘鐗�")
+    @ApiModelProperty(value = "鍥剧墖鍦板潃鍒楄〃锛屾渶澶�3寮�")
+    private List<String> images;
+
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/UpdMobileRequest.java b/server/services/src/main/java/com/doumee/dao/dto/UpdMobileRequest.java
new file mode 100644
index 0000000..996b77b
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/UpdMobileRequest.java
@@ -0,0 +1,26 @@
+package com.doumee.dao.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2023/3/23 9:50
+ */
+@Data
+@ApiModel("鎵嬫満鎹㈢粦璇锋眰绫�")
+public class UpdMobileRequest {
+
+    @ApiModelProperty(value = "楠岃瘉鐮�",example = "0")
+    private String code;
+
+    @ApiModelProperty(value = "鎵嬫満鍙�")
+    private String phone;
+
+    @ApiModelProperty(value = "鐢ㄦ埛涓婚敭",hidden = true)
+    private Integer memberId;
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/WithdrawalApproveDTO.java b/server/services/src/main/java/com/doumee/dao/dto/WithdrawalApproveDTO.java
new file mode 100644
index 0000000..12bbcf9
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/WithdrawalApproveDTO.java
@@ -0,0 +1,24 @@
+package com.doumee.dao.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 鎻愮幇瀹℃壒DTO
+ * @author rk
+ * @date 2026/04/13
+ */
+@Data
+@ApiModel("鎻愮幇瀹℃壒")
+public class WithdrawalApproveDTO {
+
+    @ApiModelProperty(value = "鎻愮幇鐢宠涓婚敭", required = true)
+    private Integer id;
+
+    @ApiModelProperty(value = "瀹℃壒缁撴灉锛�1=閫氳繃锛�2=鎷掔粷", required = true, example = "1")
+    private Integer status;
+
+    @ApiModelProperty(value = "瀹℃壒澶囨敞")
+    private String approveRemark;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/vo/AccountResponse.java b/server/services/src/main/java/com/doumee/dao/vo/AccountResponse.java
index 27c4b96..5bd0298 100644
--- a/server/services/src/main/java/com/doumee/dao/vo/AccountResponse.java
+++ b/server/services/src/main/java/com/doumee/dao/vo/AccountResponse.java
@@ -27,4 +27,16 @@
     @ApiModelProperty(value = "鐢ㄦ埛淇℃伅")
     private Member member;
 
+    @ApiModelProperty(value = "鎴戞敞鍐岀殑闂ㄥ簵涓婚敭锛堥棬搴楃敤鎴锋椂杩斿洖锛�")
+    private Integer shopId;
+
+    @ApiModelProperty(value = "鎴戞敞鍐岀殑闂ㄥ簵瀹℃牳鐘舵�侊紙闂ㄥ簵鐢ㄦ埛鏃惰繑鍥烇級: 0=寰呭鏍� 1=宸查�氳繃 2=宸查┏鍥� 3=宸茬即绾充繚璇侀噾")
+    private Integer shopAuditStatus;
+
+    @ApiModelProperty(value = "闂ㄥ簵token")
+    private String loginShopToken;
+
+
+
+
 }
diff --git a/server/services/src/main/java/com/doumee/dao/vo/EstimatedDeliveryVO.java b/server/services/src/main/java/com/doumee/dao/vo/EstimatedDeliveryVO.java
index 7ee4a69..17c5a21 100644
--- a/server/services/src/main/java/com/doumee/dao/vo/EstimatedDeliveryVO.java
+++ b/server/services/src/main/java/com/doumee/dao/vo/EstimatedDeliveryVO.java
@@ -21,6 +21,9 @@
     @ApiModelProperty(value = "鍩庡競涓婚敭")
     private Integer cityId;
 
+    @ApiModelProperty(value = "绫诲瀷锛�1=鏍囬�熻揪锛�2=鏋侀�熻揪")
+    private Integer fieldA;
+
     @ApiModelProperty(value = "璧烽�侀噷绋�(鍏噷)")
     private String startDistance;
 
diff --git a/server/services/src/main/java/com/doumee/dao/vo/ItemPriceVO.java b/server/services/src/main/java/com/doumee/dao/vo/ItemPriceVO.java
new file mode 100644
index 0000000..d697940
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/vo/ItemPriceVO.java
@@ -0,0 +1,53 @@
+package com.doumee.dao.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 鍗曢」鐗╁搧璁′环VO
+ *
+ * @Author : Rk
+ * @create 2026/4/14
+ */
+@Data
+@ApiModel("鍗曢」鐗╁搧璁′环")
+public class ItemPriceVO {
+
+    @ApiModelProperty("鐗╁搧绫诲瀷ID")
+    private Integer categoryId;
+
+    @ApiModelProperty("鐗╁搧绫诲瀷鍚嶇О")
+    private String categoryName;
+
+    @ApiModelProperty("鐗╁搧绫诲瀷璇︽儏(瀵勫瓨璇存槑)")
+    private String detail;
+
+    @ApiModelProperty("鏁伴噺")
+    private Integer quantity;
+
+    @ApiModelProperty("鍗曚环(鍒�)")
+    private Long unitPrice;
+
+    @ApiModelProperty("灏忚(鍒�)")
+    private Long subtotal;
+
+    // ========== 寮傚湴瀛樺彇棰濆瀛楁 ==========
+
+    @ApiModelProperty("璧锋璺濈(km)")
+    private BigDecimal startDistance;
+
+    @ApiModelProperty("璧锋浠�(鍒�)")
+    private Long startPrice;
+
+    @ApiModelProperty("瓒呭嚭璺濈鍗曚綅(km)")
+    private BigDecimal extraDistance;
+
+    @ApiModelProperty("瓒呭嚭璺濈鍗曚环(鍒�)")
+    private Long extraPrice;
+
+    @ApiModelProperty("灏卞湴瀛樺彇鍗曚环(鍒�/澶�)")
+    private Long locallyPrice;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/vo/MemberDetailVO.java b/server/services/src/main/java/com/doumee/dao/vo/MemberDetailVO.java
new file mode 100644
index 0000000..526f1e5
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/vo/MemberDetailVO.java
@@ -0,0 +1,88 @@
+package com.doumee.dao.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 浼氬憳璇︽儏VO
+ * @author rk
+ * @date 2026/04/13
+ */
+@Data
+@ApiModel("浼氬憳璇︽儏淇℃伅")
+public class MemberDetailVO {
+
+    @ApiModelProperty(value = "涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鐢ㄦ埛鏄电О")
+    private String nickName;
+
+    @ApiModelProperty(value = "浼氬憳濮撳悕")
+    private String name;
+
+    @ApiModelProperty(value = "openid")
+    private String openid;
+
+    @ApiModelProperty(value = "鎺堟潈鎵嬫満鍙�")
+    private String telephone;
+
+    @ApiModelProperty(value = "澶村儚鍏ㄨ矾寰�")
+    private String fullCoverImage;
+
+    @ApiModelProperty(value = "褰撳墠浣欓(鍗曚綅:鍒�)")
+    private Long amount;
+
+    @ApiModelProperty(value = "鍘嗗彶鎬婚噾棰�(鍗曚綅:鍒�)")
+    private Long totalAmount;
+
+    @ApiModelProperty(value = "鐘舵�� 0=姝e父锛�1=鍋滅敤锛�2=宸叉敞閿�")
+    private Integer status;
+
+    @ApiModelProperty(value = "褰撳墠浣跨敤韬唤:0=鐢ㄥ伐鍙戝竷鏂�;1=鐢ㄥ伐鎺ュ崟鏂�")
+    private Integer useIdentity;
+
+    @ApiModelProperty(value = "鐢ㄦ埛绫诲瀷锛�0=浼氬憳鐢ㄦ埛锛�1=鍙告満锛�2=搴楅摵浜哄憳")
+    private Integer userType;
+
+    @ApiModelProperty(value = "涓氬姟鐘舵�侊細0=鏈璇侊紱1=璁よ瘉閫氳繃锛�2=璁よ瘉鏈�氳繃锛�3=宸叉敮浠樻娂閲�")
+    private Integer businessStatus;
+
+    @ApiModelProperty(value = "璇勫垎")
+    private BigDecimal score;
+
+    @ApiModelProperty(value = "鎬绘帴鍗曢噺")
+    private Long receiveNum;
+
+    @ApiModelProperty(value = "鎬诲彂鍗曢噺")
+    private Long publishNum;
+
+    @ApiModelProperty(value = "娉ㄥ唽鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @ApiModelProperty(value = "鏈�鍚庣櫥褰曟椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date loginTime;
+
+    @ApiModelProperty(value = "鎬荤櫥褰曟鏁�")
+    private Long loginTimes;
+
+    @ApiModelProperty(value = "鐪佷唤")
+    private String province;
+
+    @ApiModelProperty(value = "鍩庡競")
+    private String city;
+
+    @ApiModelProperty(value = "鍖哄幙")
+    private String area;
+
+    @ApiModelProperty(value = "鏄惁鎺ュ彈鑷姩娲惧崟:0=鍚︼紱1=鏄�")
+    private Integer autoReceiveStatus;
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/vo/MemberListVO.java b/server/services/src/main/java/com/doumee/dao/vo/MemberListVO.java
new file mode 100644
index 0000000..0ce0c19
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/vo/MemberListVO.java
@@ -0,0 +1,44 @@
+package com.doumee.dao.vo;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 浼氬憳鍒楄〃VO锛堝垪琛ㄥ睍绀� + 瀵煎嚭锛�
+ * @author rk
+ * @date 2026/04/13
+ */
+@Data
+@ApiModel("浼氬憳鍒楄〃淇℃伅")
+public class MemberListVO {
+
+    @ApiModelProperty(value = "涓婚敭")
+    private Integer id;
+
+    @ExcelColumn(name = "鐢ㄦ埛鏄电О", index = 1, width = 12)
+    @ApiModelProperty(value = "鐢ㄦ埛鏄电О")
+    private String nickName;
+
+    @ExcelColumn(name = "浼氬憳濮撳悕", index = 2, width = 10)
+    @ApiModelProperty(value = "浼氬憳濮撳悕")
+    private String name;
+
+    @ExcelColumn(name = "鎺堟潈鎵嬫満鍙�", index = 3, width = 14)
+    @ApiModelProperty(value = "鎺堟潈鎵嬫満鍙�")
+    private String telephone;
+
+    @ExcelColumn(name = "娉ㄥ唽鏃堕棿", index = 4, width = 18, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @ExcelColumn(name = "鐘舵��", index = 5, width = 10, valueMapping = "0=姝e父;1=鍋滅敤;2=宸叉敞閿�;")
+    @ApiModelProperty(value = "鐘舵�� 0=姝e父锛�1=鍋滅敤锛�2=宸叉敞閿�")
+    private Integer status;
+
+}
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
new file mode 100644
index 0000000..9ba8fb7
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/vo/MyOrderDetailVO.java
@@ -0,0 +1,154 @@
+package com.doumee.dao.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 浼氬憳绔�-璁㈠崟璇︽儏
+ *
+ * @author rk
+ * @date 2026/04/15
+ */
+@Data
+@ApiModel("浼氬憳绔鍗曡鎯�")
+public class MyOrderDetailVO {
+
+    @ApiModelProperty(value = "璁㈠崟涓婚敭")
+    private Integer id;
+
+    // ---- 鐘舵�� ----
+
+    @ApiModelProperty(value = "璁㈠崟鐘舵��")
+    private Integer status;
+
+    @ApiModelProperty(value = "璁㈠崟鐘舵�佹弿杩�")
+    private String statusDesc;
+
+    @ApiModelProperty(value = "鏀粯鍊掕鏃舵绉掞紙浠呭緟鏀粯鐘舵�佽繑鍥烇紝-1琛ㄧず宸茶秴鏃讹級")
+    private Long payCountdownMs;
+
+    @ApiModelProperty(value = "浼氬憳鏍搁攢鐮侊紙寰呭瘎瀛�/寰呭彇浠剁姸鎬佽繑鍥烇級")
+    private String memberVerifyCode;
+
+    // ---- 鍩虹淇℃伅 ----
+
+    @ApiModelProperty(value = "璁㈠崟绫诲瀷: 0=灏卞湴瀵勫瓨 1=寮傚湴瀵勫瓨")
+    private Integer type;
+
+    @ApiModelProperty(value = "璁㈠崟缂栧彿")
+    private String code;
+
+    @ApiModelProperty(value = "涓夋柟璁㈠崟鍙�")
+    private String outTradeNo;
+
+    @ApiModelProperty(value = "璁㈠崟澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @ApiModelProperty(value = "鏀粯鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date payTime;
+
+    // ---- 鏃堕棿淇℃伅 ----
+
+    @ApiModelProperty(value = "棰勮鍒板簵瀛樹欢鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date expectedDepositTime;
+
+    @ApiModelProperty(value = "棰勮鍙栦欢鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date expectedTakeTime;
+
+    @ApiModelProperty(value = "琛屾潕杞Щ鍒板簵鏃堕棿锛堝紓鍦板瘎瀛橈級")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date arriveTime;
+
+    // ---- 瀛樹欢闂ㄥ簵 ----
+
+    @ApiModelProperty(value = "瀛樹欢闂ㄥ簵鍚嶇О")
+    private String depositShopName;
+
+    @ApiModelProperty(value = "瀛樹欢闂ㄥ簵鍦板潃")
+    private String depositShopAddress;
+
+    @ApiModelProperty(value = "瀛樹欢闂ㄥ簵鑱旂郴浜�")
+    private String depositShopLinkName;
+
+    @ApiModelProperty(value = "瀛樹欢闂ㄥ簵鑱旂郴鐢佃瘽")
+    private String depositShopPhone;
+
+    // ---- 鍙栦欢淇℃伅 ----
+
+    @ApiModelProperty(value = "鍙栦欢闂ㄥ簵鍚嶇О锛堟湁鍙栦欢闂ㄥ簵鏃惰繑鍥烇級")
+    private String takeShopName;
+
+    @ApiModelProperty(value = "鍙栦欢闂ㄥ簵鍦板潃锛堟湁鍙栦欢闂ㄥ簵鏃惰繑鍥烇級")
+    private String takeShopAddress;
+
+    @ApiModelProperty(value = "鍙栦欢鍦扮偣锛堟棤鍙栦欢闂ㄥ簵鏃惰繑鍥烇紝鐢ㄦ埛鑷�夛級")
+    private String takeLocation;
+
+    @ApiModelProperty(value = "鍙栦欢鍦扮偣璇︾粏鍦板潃锛堟棤鍙栦欢闂ㄥ簵鏃惰繑鍥烇級")
+    private String takeLocationRemark;
+
+    @ApiModelProperty(value = "鍙栦欢浜哄悕绉�")
+    private String takeUser;
+
+    @ApiModelProperty(value = "鍙栦欢浜烘墜鏈哄彿")
+    private String takePhone;
+
+    // ---- 璐圭敤锛堝垎锛� ----
+
+    @ApiModelProperty(value = "鍩虹瀵勫瓨璐圭敤锛堝垎锛�")
+    private Long basicAmount;
+
+    @ApiModelProperty(value = "淇濅环閲戦锛堝垎锛�")
+    private Long declaredAmount;
+
+    @ApiModelProperty(value = "淇濅环淇濊垂锛堝垎锛�")
+    private Long declaredFee;
+
+    @ApiModelProperty(value = "鍔犳�ヨ垂鐢紙鍒嗭級")
+    private Long urgentAmount;
+
+    @ApiModelProperty(value = "瀹為檯鏀粯璐圭敤锛堝垎锛�")
+    private Long actualPayAmount;
+
+    // ---- 閫炬湡 ----
+
+    @ApiModelProperty(value = "鏄惁閫炬湡")
+    private Boolean overdue;
+
+    @ApiModelProperty(value = "閫炬湡澶╂暟")
+    private Integer overdueDays;
+
+    @ApiModelProperty(value = "閫炬湡璐圭敤锛堝垎锛�")
+    private Long overdueFee;
+
+    // ---- 鏍囪 ----
+
+    @ApiModelProperty(value = "鏄惁寮傚父: 0=鍚� 1=鏄�")
+    private Integer exceptionStatus;
+
+    @ApiModelProperty(value = "鏄惁瓒呭嚭鍙栦欢鏃堕棿")
+    private Boolean pastTakeTime;
+
+    // ---- 鐗╁搧淇℃伅 ----
+
+    @ApiModelProperty(value = "鐗╁搧绫诲瀷鍚嶇О")
+    private String goodTypeName;
+
+    @ApiModelProperty(value = "涓嬪崟鐓х墖")
+    private List<String> orderImages;
+
+    @ApiModelProperty(value = "鐗╁搧鏄庣粏鍒楄〃")
+    private List<OrderItemVO> detailList;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/vo/MyOrderVO.java b/server/services/src/main/java/com/doumee/dao/vo/MyOrderVO.java
new file mode 100644
index 0000000..90d05ca
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/vo/MyOrderVO.java
@@ -0,0 +1,94 @@
+package com.doumee.dao.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 灏忕▼搴忕-鎴戠殑璁㈠崟鍒楄〃椤�
+ * @author rk
+ * @date 2026/04/15
+ */
+@Data
+@ApiModel("鎴戠殑璁㈠崟鍒楄〃椤�")
+public class MyOrderVO {
+
+    @ApiModelProperty(value = "璁㈠崟涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "璁㈠崟缂栧彿")
+    private String code;
+
+    @ApiModelProperty(value = "瀵勫瓨鏂瑰紡:0=灏卞湴瀛樺彇锛�1=寮傚湴瀛樺彇")
+    private Integer type;
+
+    @ApiModelProperty(value = "璁㈠崟鐘舵��")
+    private Integer status;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @ApiModelProperty(value = "棰勮鍙栦欢鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date expectedTakeTime;
+
+    // ---- 瀛樹欢闂ㄥ簵 ----
+
+    @ApiModelProperty(value = "瀛樹欢闂ㄥ簵鍚嶇О")
+    private String depositShopName;
+
+    @ApiModelProperty(value = "瀛樹欢闂ㄥ簵鑱旂郴浜�")
+    private String depositShopLinkName;
+
+    @ApiModelProperty(value = "瀛樹欢闂ㄥ簵鑱旂郴鐢佃瘽")
+    private String depositShopPhone;
+
+    // ---- 鍙栦欢淇℃伅 ----
+
+    @ApiModelProperty(value = "鍙栦欢闂ㄥ簵鍚嶇О锛堟湁鍙栦欢闂ㄥ簵鏃惰繑鍥烇級")
+    private String takeShopName;
+
+    @ApiModelProperty(value = "鍙栦欢闂ㄥ簵鍦板潃锛堟湁鍙栦欢闂ㄥ簵鏃惰繑鍥烇級")
+    private String takeShopAddress;
+
+    @ApiModelProperty(value = "鍙栦欢鍦扮偣锛堟棤鍙栦欢闂ㄥ簵鏃惰繑鍥烇紝鐢ㄦ埛鑷�夛級")
+    private String takeLocation;
+
+    @ApiModelProperty(value = "鍙栦欢鍦扮偣璇︾粏鍦板潃锛堟棤鍙栦欢闂ㄥ簵鏃惰繑鍥烇級")
+    private String takeLocationRemark;
+
+    @ApiModelProperty(value = "鍙栦欢浜哄悕绉�")
+    private String takeUser;
+
+    @ApiModelProperty(value = "鍙栦欢浜烘墜鏈哄彿")
+    private String takePhone;
+
+    // ---- 璐圭敤 ----
+
+    @ApiModelProperty(value = "鎶ヤ环淇濊垂锛堝垎锛�")
+    private Long declaredFee;
+
+    @ApiModelProperty(value = "棰勪及璐圭敤锛堝垎锛�")
+    private Long estimatedAmount;
+
+    // ---- 閫炬湡 ----
+
+    @ApiModelProperty(value = "鏄惁閫炬湡")
+    private Boolean overdue;
+
+    @ApiModelProperty(value = "閫炬湡澶╂暟")
+    private Integer overdueDays;
+
+    @ApiModelProperty(value = "閫炬湡璐圭敤锛堝垎锛�")
+    private Long overdueFee;
+
+    // ---- 鐗╁搧鏄庣粏 ----
+
+    @ApiModelProperty(value = "鐗╁搧鏄庣粏鍒楄〃")
+    private List<OrderItemVO> detailList;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/vo/OrderDetailVO.java b/server/services/src/main/java/com/doumee/dao/vo/OrderDetailVO.java
new file mode 100644
index 0000000..ee69c46
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/vo/OrderDetailVO.java
@@ -0,0 +1,76 @@
+package com.doumee.dao.vo;
+
+import com.doumee.dao.business.model.Orders;
+import com.doumee.dao.business.model.OrdersRefund;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 璁㈠崟璇︽儏VO
+ * @author rk
+ * @date 2026/04/13
+ */
+@Data
+@ApiModel("璁㈠崟璇︽儏")
+public class OrderDetailVO {
+
+    @ApiModelProperty(value = "璁㈠崟鍩虹淇℃伅")
+    private Orders order;
+
+    @ApiModelProperty(value = "涓嬪崟鍥剧墖鍒楄〃")
+    private List<String> orderFiles;
+
+    @ApiModelProperty(value = "浼氬憳濮撳悕")
+    private String memberName;
+
+    @ApiModelProperty(value = "浼氬憳鑱旂郴鐢佃瘽")
+    private String memberPhone;
+
+    @ApiModelProperty(value = "瀵勫瓨闂ㄥ簵鍚嶇О")
+    private String depositShopName;
+
+    @ApiModelProperty(value = "瀵勫瓨闂ㄥ簵鑱旂郴鐢佃瘽")
+    private String depositShopPhone;
+
+    @ApiModelProperty(value = "鍙栦欢闂ㄥ簵鍚嶇О")
+    private String takeShopName;
+
+    @ApiModelProperty(value = "鍙栦欢闂ㄥ簵鍦板潃")
+    private String takeShopAddress;
+
+    @ApiModelProperty(value = "鍙栦欢闂ㄥ簵鑱旂郴鐢佃瘽")
+    private String takeShopPhone;
+
+    @ApiModelProperty(value = "璁㈠崟瀵勫瓨鍥剧墖")
+    private List<String> depositImages;
+
+    @ApiModelProperty(value = "鍙告満鍙栦欢鍥剧墖")
+    private List<String> driverTakeImages;
+
+    @ApiModelProperty(value = "鍙告満瀹屾垚鍥剧墖")
+    private List<String> driverDoneImages;
+
+    @ApiModelProperty(value = "闂ㄥ簵鍏ュ簱鍥剧墖")
+    private List<String> storeInImages;
+
+    @ApiModelProperty(value = "闂ㄥ簵鍑哄簱鍥剧墖")
+    private List<String> storeOutImages;
+
+    @ApiModelProperty(value = "鐗╁搧鏄庣粏鍒楄〃")
+    private List<OrderItemVO> detailList;
+
+    @ApiModelProperty(value = "閫�娆捐褰曪紙璁㈠崟鐘舵�佷负鍙栨秷/閫�娆炬椂杩斿洖锛�")
+    private OrdersRefund ordersRefund;
+
+    @ApiModelProperty(value = "閫�娆惧彇浠跺浘鐗囷紙宸插瓨浠剁敵璇峰彇娑堟椂杩斿洖锛�")
+    private List<String> refundTakeImages;
+
+    @ApiModelProperty(value = "骞冲彴鎿嶄綔浜哄悕绉帮紙骞冲彴鐩存帴鍙栨秷鏃惰繑鍥烇級")
+    private String platformUserName;
+
+    @ApiModelProperty(value = "鎺ュ崟鍙告満濮撳悕")
+    private String driverName;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/vo/OrderDispatchVO.java b/server/services/src/main/java/com/doumee/dao/vo/OrderDispatchVO.java
new file mode 100644
index 0000000..f4f32c8
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/vo/OrderDispatchVO.java
@@ -0,0 +1,32 @@
+package com.doumee.dao.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 鎵嬪姩娲惧崟淇℃伅VO
+ * @author rk
+ * @date 2026/04/13
+ */
+@Data
+@ApiModel("鎵嬪姩娲惧崟淇℃伅")
+public class OrderDispatchVO {
+
+    @ApiModelProperty(value = "璁㈠崟缂栧彿")
+    private String code;
+
+    @ApiModelProperty(value = "瀹炰粯閲戦锛堝厓锛�")
+    private Double payAmountYuan;
+
+    @ApiModelProperty(value = "閰嶉�佹柟寮�:0=灏卞湴瀛樺彇锛�1=寮傚湴瀛樺彇")
+    private Integer type;
+
+    @ApiModelProperty(value = "閰嶉�佹柟寮忔弿杩�")
+    private String typeDesc;
+
+    @ApiModelProperty(value = "璁㈠崟鐗╁搧璇︽儏")
+    private List<OrderItemVO> detailList;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/vo/OrderItemVO.java b/server/services/src/main/java/com/doumee/dao/vo/OrderItemVO.java
new file mode 100644
index 0000000..f55f79e
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/vo/OrderItemVO.java
@@ -0,0 +1,33 @@
+package com.doumee.dao.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 璁㈠崟鐗╁搧鏄庣粏椤�
+ * @author rk
+ * @date 2026/04/13
+ */
+@Data
+@ApiModel("璁㈠崟鐗╁搧鏄庣粏椤�")
+public class OrderItemVO {
+
+    @ApiModelProperty(value = "鍒嗙被鍚嶇О")
+    private String typeName;
+
+    @ApiModelProperty(value = "灏哄鍚嶇О")
+    private String luggageName;
+
+    @ApiModelProperty(value = "灏哄璇︽儏")
+    private String luggageDetail;
+
+    @ApiModelProperty(value = "鏁伴噺")
+    private Integer num;
+
+    @ApiModelProperty(value = "鍗曚环锛堝厓锛�")
+    private Double unitPriceYuan;
+
+    @ApiModelProperty(value = "灏忚璐圭敤锛堝厓锛�")
+    private Double subtotal;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/vo/OrderSummaryVO.java b/server/services/src/main/java/com/doumee/dao/vo/OrderSummaryVO.java
new file mode 100644
index 0000000..16cb9fc
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/vo/OrderSummaryVO.java
@@ -0,0 +1,28 @@
+package com.doumee.dao.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 璁㈠崟姹囨�荤粺璁�
+ * @author rk
+ * @date 2026/04/14
+ */
+@Data
+@ApiModel("璁㈠崟姹囨�荤粺璁�")
+public class OrderSummaryVO {
+
+    @ApiModelProperty(value = "璁㈠崟鎬昏垂鐢紙鍒嗭級")
+    private Long totalAmountSum;
+
+    @ApiModelProperty(value = "宸茬粨绠楁�昏垂鐢紙鍒嗭級")
+    private Long settledTotalAmountSum;
+
+    @ApiModelProperty(value = "鍙告満璐圭敤鎬昏锛堝垎锛�")
+    private Long driverFeeSum;
+
+    @ApiModelProperty(value = "鍙告満宸茬粨绠楄垂鐢紙鍒嗭級")
+    private Long settledDriverFeeSum;
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/vo/OverdueFeeVO.java b/server/services/src/main/java/com/doumee/dao/vo/OverdueFeeVO.java
new file mode 100644
index 0000000..48474c4
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/vo/OverdueFeeVO.java
@@ -0,0 +1,31 @@
+package com.doumee.dao.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 瓒呮椂/閫炬湡璐圭敤璁$畻缁撴灉VO
+ *
+ * @Author : Rk
+ * @create 2026/4/15
+ */
+@Data
+@ApiModel("瓒呮椂璐圭敤璁$畻缁撴灉")
+public class OverdueFeeVO {
+
+    @ApiModelProperty("鏄惁閫炬湡")
+    private Boolean overdue;
+
+    @ApiModelProperty("閫炬湡澶╂暟")
+    private Integer overdueDays;
+
+    @ApiModelProperty("閫炬湡璐圭敤(鍒�)")
+    private Long overdueFee;
+
+    @ApiModelProperty("鐗╁搧鍩虹鏃ヨ垂鐢ㄥ悎璁�(鍒�) 鈥� 鍗曚环脳鏁伴噺涔嬪拰")
+    private Long dailyBaseFee;
+
+    @ApiModelProperty("鎶樻墸姣旂巼锛堜粎寮傚湴瀵勫瓨锛�")
+    private String discountRate;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/vo/PayResponse.java b/server/services/src/main/java/com/doumee/dao/vo/PayResponse.java
new file mode 100644
index 0000000..34186d4
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/vo/PayResponse.java
@@ -0,0 +1,28 @@
+package com.doumee.dao.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2023/3/23 9:50
+ */
+@Data
+@ApiModel("鏀粯鐩稿簲绫�")
+public class PayResponse implements Serializable {
+
+    @ApiModelProperty(value = "鏀粯璁㈠崟涓婚敭")
+    private Integer orderId;
+
+    @ApiModelProperty(value = "寰俊璋冭捣涓氬姟")
+    private Object response;
+
+    @ApiModelProperty(value = "閿佸畾缂栧彿",hidden = true)
+    private String lockKey;
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/vo/PriceCalculateVO.java b/server/services/src/main/java/com/doumee/dao/vo/PriceCalculateVO.java
new file mode 100644
index 0000000..a42b9f2
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/vo/PriceCalculateVO.java
@@ -0,0 +1,40 @@
+package com.doumee.dao.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 浠锋牸璁$畻缁撴灉VO
+ *
+ * @Author : Rk
+ * @create 2026/4/14
+ */
+@Data
+@ApiModel("浠锋牸璁$畻缁撴灉")
+public class PriceCalculateVO {
+
+    @ApiModelProperty("鐗╁搧璁′环璇︽儏鍒楄〃")
+    private List<ItemPriceVO> itemList;
+
+    @ApiModelProperty("鎬讳环鏍�(鍒�)")
+    private Long totalPrice;
+
+    @ApiModelProperty("鎬讳繚浠疯垂鐢�(鍒�)")
+    private Long insuranceFee;
+
+    @ApiModelProperty("鐗╁搧浠锋牸鍚堣(鍒�)")
+    private Long itemPrice;
+
+    @ApiModelProperty("鍔犳�ヨ垂鐢�(鍒�)")
+    private Long urgentFee;
+
+    @ApiModelProperty("璺濈(km)")
+    private BigDecimal distance;
+
+    @ApiModelProperty("澶╂暟")
+    private Integer days;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/vo/ShopDetailVO.java b/server/services/src/main/java/com/doumee/dao/vo/ShopDetailVO.java
index 7530b9c..c2f9d54 100644
--- a/server/services/src/main/java/com/doumee/dao/vo/ShopDetailVO.java
+++ b/server/services/src/main/java/com/doumee/dao/vo/ShopDetailVO.java
@@ -78,11 +78,20 @@
     @ApiModelProperty(value = "韬唤璇佹闈㈢収")
     private String idcardImg;
 
+    @ApiModelProperty(value = "韬唤璇佹闈㈢収(鍏ㄨ矾寰�)")
+    private String idcardImgUrl;
+
     @ApiModelProperty(value = "韬唤璇佸弽闈㈢収")
     private String idcardImgBack;
 
+    @ApiModelProperty(value = "韬唤璇佸弽闈㈢収(鍏ㄨ矾寰�)")
+    private String idcardImgBackUrl;
+
     @ApiModelProperty(value = "钀ヤ笟鎵х収")
     private String businessImg;
+
+    @ApiModelProperty(value = "钀ヤ笟鎵х収(鍏ㄨ矾寰�)")
+    private String businessImgUrl;
 
     @ApiModelProperty(value = "瀹℃壒鐘舵�侊細0=寰呭鎵癸紱1=瀹℃壒閫氳繃锛�2=瀹℃壒鏈�氳繃锛�3=宸叉敮浠樻娂閲�")
     private Integer auditStatus;
@@ -95,6 +104,10 @@
 
     @ApiModelProperty(value = "瀹℃壒澶囨敞")
     private String auditRemark;
+
+    @ApiModelProperty(value = "瀹℃壒浜哄悕绉�")
+    private String auditName;
+
 
     @ApiModelProperty(value = "OPENID")
     private String openid;
@@ -110,7 +123,7 @@
 
     @ApiModelProperty(value = "閰嶉�佽寖鍥�(km)")
     private BigDecimal deliveryArea;
-    // 闄勪欢鍒楄〃
+    // 闄勪欢鍒楄〃锛堝崐璺緞锛�
     @ApiModelProperty(value = "闂ㄥ簵闂ㄥご鐓�")
     private List<String> storeFrontImgs;
 
@@ -126,6 +139,22 @@
     @ApiModelProperty(value = "绀句繚缂寸撼璇佹槑")
     private List<String> socialSecurityImgs;
 
+    // 闄勪欢鍒楄〃锛堝叏璺緞锛�
+    @ApiModelProperty(value = "闂ㄥ簵闂ㄥご鐓�(鍏ㄨ矾寰�)")
+    private List<String> storeFrontImgUrls;
+
+    @ApiModelProperty(value = "闂ㄥ簵鍐呴儴鐓�(鍏ㄨ矾寰�)")
+    private List<String> storeInteriorImgUrls;
+
+    @ApiModelProperty(value = "鍏朵粬鏉愭枡(鍏ㄨ矾寰�)")
+    private List<String> otherMaterialImgUrls;
+
+    @ApiModelProperty(value = "鏈夋晥鍔冲姩鍚堝悓(鍏ㄨ矾寰�)")
+    private List<String> laborContractImgUrls;
+
+    @ApiModelProperty(value = "绀句繚缂寸撼璇佹槑(鍏ㄨ矾寰�)")
+    private List<String> socialSecurityImgUrls;
+
     @ApiModelProperty(value = "鍥剧墖鍓嶇紑鍦板潃")
     private String imgPrefix;
 
diff --git a/server/services/src/main/java/com/doumee/dao/vo/ShopLoginVO.java b/server/services/src/main/java/com/doumee/dao/vo/ShopLoginVO.java
new file mode 100644
index 0000000..18946fc
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/vo/ShopLoginVO.java
@@ -0,0 +1,33 @@
+package com.doumee.dao.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 闂ㄥ簵鐧诲綍鍝嶅簲
+ *
+ * @author rk
+ * @date 2026/04/15
+ */
+@Data
+@ApiModel("闂ㄥ簵鐧诲綍鍝嶅簲")
+public class ShopLoginVO implements Serializable {
+
+    @ApiModelProperty(value = "闂ㄥ簵token")
+    private String token;
+
+    @ApiModelProperty(value = "闂ㄥ簵涓婚敭")
+    private Integer shopId;
+
+    @ApiModelProperty(value = "闂ㄥ簵鍚嶇О")
+    private String shopName;
+
+    @ApiModelProperty(value = "闂ㄥ簵绫诲瀷: 0=涓汉 1=浼佷笟")
+    private Integer companyType;
+
+    @ApiModelProperty(value = "鎵�灞炲煄甯傚悕绉�")
+    private String cityName;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/vo/ShopNearbyVO.java b/server/services/src/main/java/com/doumee/dao/vo/ShopNearbyVO.java
new file mode 100644
index 0000000..753a3c3
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/vo/ShopNearbyVO.java
@@ -0,0 +1,39 @@
+package com.doumee.dao.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 闄勮繎闂ㄥ簵鍒楄〃椤�
+ * @author rk
+ * @date 2026/04/14
+ */
+@Data
+@ApiModel("闄勮繎闂ㄥ簵鍒楄〃椤�")
+public class ShopNearbyVO implements Serializable {
+
+    @ApiModelProperty(value = "闂ㄥ簵涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "闂ㄥ簵鍚嶇О")
+    private String name;
+
+    @ApiModelProperty(value = "闂ㄥ簵钀ヤ笟鏃堕棿")
+    private String shopHours;
+
+    @ApiModelProperty(value = "闂ㄥ簵浣嶇疆锛堣缁嗗湴鍧�锛�")
+    private String address;
+
+    @ApiModelProperty(value = "闂ㄥご鐓х涓�寮狅紙鍏ㄨ矾寰勶級")
+    private String coverImg;
+
+    @ApiModelProperty(value = "璺濈锛堝 500m銆�1.2km锛�")
+    private String distanceText;
+
+    @ApiModelProperty(value = "闂ㄥ簵璇勫垎")
+    private BigDecimal score;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/vo/ShopWebDetailVO.java b/server/services/src/main/java/com/doumee/dao/vo/ShopWebDetailVO.java
new file mode 100644
index 0000000..6da15a3
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/vo/ShopWebDetailVO.java
@@ -0,0 +1,36 @@
+package com.doumee.dao.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 闂ㄥ簵璇︽儏锛堝皬绋嬪簭绔級
+ * @author rk
+ * @date 2026/04/14
+ */
+@Data
+@ApiModel("闂ㄥ簵璇︽儏锛堝皬绋嬪簭绔級")
+public class ShopWebDetailVO implements Serializable {
+
+    @ApiModelProperty(value = "闂ㄥ簵涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "闂ㄥ簵鍚嶇О")
+    private String name;
+
+    @ApiModelProperty(value = "闂ㄥ簵璇︾粏鍦板潃")
+    private String address;
+
+    @ApiModelProperty(value = "闂ㄥ簵璇存槑")
+    private String content;
+
+    @ApiModelProperty(value = "闂ㄥ簵鐓х墖锛堥棬澶寸収+鍐呴儴鐓э紝鍏ㄨ矾寰勯泦鍚堬級")
+    private List<String> images;
+
+    @ApiModelProperty(value = "璺濈锛堝 500m銆�1.2km锛夛紝鏃犵粡绾害鍏ュ弬鏃朵负绌�")
+    private String distanceText;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/vo/UserCenterVO.java b/server/services/src/main/java/com/doumee/dao/vo/UserCenterVO.java
index d01f317..31296a0 100644
--- a/server/services/src/main/java/com/doumee/dao/vo/UserCenterVO.java
+++ b/server/services/src/main/java/com/doumee/dao/vo/UserCenterVO.java
@@ -37,9 +37,6 @@
     @ApiModelProperty(value = "鏈嶅姟浠嬬粛")
     private String serverIntroduce;
 
-    @ApiModelProperty(value = "鏀惰垂鏍囧噯")
-    private String feeStandards;
-
     @ApiModelProperty(value = "鍏充簬鎴戜滑")
     private String aboutUs;
 
diff --git a/server/services/src/main/java/com/doumee/service/business/AddrService.java b/server/services/src/main/java/com/doumee/service/business/AddrService.java
new file mode 100644
index 0000000..5668ada
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/service/business/AddrService.java
@@ -0,0 +1,59 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.Addr;
+
+import java.util.List;
+
+/**
+ * 鍦板潃绨縎ervice
+ * @author rk
+ * @date 2026/04/15
+ */
+public interface AddrService {
+
+    Integer create(Addr addr);
+
+    void deleteById(Integer id);
+
+    void delete(Addr addr);
+
+    void deleteByIdInBatch(List<Integer> ids);
+
+    void updateById(Addr addr);
+
+    void updateByIdInBatch(List<Addr> addrs);
+
+    void updateStatus(Addr addr);
+
+    Addr findById(Integer id);
+
+    Addr findOne(Addr addr);
+
+    List<Addr> findList(Addr addr);
+
+    PageData<Addr> findPage(PageWrap<Addr> pageWrap);
+
+    long count(Addr addr);
+
+    /**
+     * 鏌ヨ浼氬憳鍦板潃鍒楄〃锛堝惈鐪佸競鍖轰俊鎭級
+     */
+    List<Addr> findListWithArea(Integer memberId);
+
+    /**
+     * 鏍规嵁ID鏌ヨ鍦板潃锛堝惈鐪佸競鍖轰俊鎭級
+     */
+    Addr findByIdWithArea(Integer id);
+
+    /**
+     * 灏忕▼搴忕鏂板鍦板潃
+     */
+    Integer createByMember(Addr addr, Integer memberId);
+
+    /**
+     * 灏忕▼搴忕淇敼鍦板潃
+     */
+    void updateByMember(Addr addr, Integer memberId);
+}
diff --git a/server/services/src/main/java/com/doumee/service/business/AreasService.java b/server/services/src/main/java/com/doumee/service/business/AreasService.java
index 6880174..6bd137a 100644
--- a/server/services/src/main/java/com/doumee/service/business/AreasService.java
+++ b/server/services/src/main/java/com/doumee/service/business/AreasService.java
@@ -133,4 +133,11 @@
 
     List<Areas> getCityList(Areas areas);
 
+    /**
+     * 鏌ヨ宸插紑鏀剧殑鍩庡競鍒楄〃锛坰tatus=1锛宼ype=1锛夛紝闄勫甫棣栧瓧姣嶅苟鎸夐瀛楁瘝鎺掑簭
+     *
+     * @return 鍩庡競鍒楄〃
+     */
+    List<Areas> getOpenCityList();
+
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/BannerService.java b/server/services/src/main/java/com/doumee/service/business/BannerService.java
index b3bf4d9..a37e4e7 100644
--- a/server/services/src/main/java/com/doumee/service/business/BannerService.java
+++ b/server/services/src/main/java/com/doumee/service/business/BannerService.java
@@ -33,5 +33,13 @@
 
     PageData<Banner> findPage(PageWrap<Banner> pageWrap);
 
+    void updateStatus(Banner banner);
+
     long count(Banner banner);
+
+    /**
+     * 鏍规嵁浣嶇疆鑾峰彇杞挱鍥惧垪琛紙鍚浘鐗囧叏璺緞锛�
+     * @param position 浣嶇疆
+     */
+    List<Banner> findListByPosition(Integer position);
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/CategoryService.java b/server/services/src/main/java/com/doumee/service/business/CategoryService.java
index a48a0d1..6225401 100644
--- a/server/services/src/main/java/com/doumee/service/business/CategoryService.java
+++ b/server/services/src/main/java/com/doumee/service/business/CategoryService.java
@@ -97,4 +97,12 @@
 
 
     List<Category> getCategoryList(Integer type);
+
+    /**
+     * 鏍规嵁鍩庡競涓婚敭鏌ヨ宸插紑閫氱殑鐗╁搧灏哄锛坈ategory type=4锛�
+     * 閫氳繃 pricing_rule type=1 city_id 鍏宠仈 category.id = pricing_rule.fieldA
+     * @param cityId 鍩庡競涓婚敭
+     * @return 鐗╁搧灏哄鍒楄〃
+     */
+    List<Category> getCitySizeList(Integer cityId);
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/DriverInfoService.java b/server/services/src/main/java/com/doumee/service/business/DriverInfoService.java
index ba4fe34..d931cad 100644
--- a/server/services/src/main/java/com/doumee/service/business/DriverInfoService.java
+++ b/server/services/src/main/java/com/doumee/service/business/DriverInfoService.java
@@ -146,4 +146,19 @@
      */
     void auditVerify(com.doumee.dao.dto.AuditDTO auditDTO);
 
+    /**
+     * 绠$悊绔煡璇㈠徃鏈鸿鎯咃紙鍚檮浠跺浘鐗囥�佽溅杈嗙被鍨嬪悕绉帮級
+     *
+     * @param id 鍙告満涓婚敭
+     * @return DriverInfo
+     */
+    DriverInfo getDetail(Integer id);
+
+    /**
+     * 淇敼鍙告満鐘舵�侊紙鍚敤/绂佺敤锛�
+     *
+     * @param dto 淇敼鐘舵�佽姹�
+     */
+    void changeStatus(com.doumee.dao.dto.ChangeStatusDTO dto);
+
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/MemberService.java b/server/services/src/main/java/com/doumee/service/business/MemberService.java
index a8f8af6..897e4dc 100644
--- a/server/services/src/main/java/com/doumee/service/business/MemberService.java
+++ b/server/services/src/main/java/com/doumee/service/business/MemberService.java
@@ -10,8 +10,12 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.Member;
+import com.doumee.dao.dto.MemberListQueryDTO;
+import com.doumee.dao.dto.UpdMobileRequest;
 import com.doumee.dao.dto.WxPhoneRequest;
 import com.doumee.dao.vo.AccountResponse;
+import com.doumee.dao.vo.MemberDetailVO;
+import com.doumee.dao.vo.MemberListVO;
 import com.doumee.dao.vo.UserCenterVO;
 import me.chanjar.weixin.common.error.WxErrorException;
 import org.apache.commons.lang3.StringUtils;
@@ -135,12 +139,6 @@
      */
     void editMemberInfo(Member member);
 
-//    /**
-//     * 鍒囨崲鐢ㄥ伐韬唤
-//     * @param member
-//     */
-//    void editUseIdentity(Member member);
-
     /**
      * 涓汉淇℃伅
      * @param memberId
@@ -153,4 +151,36 @@
     void logOut(String token,Integer memberId);
 
     void logOff(String token,Integer memberId);
+
+
+    /**
+     * 楠岃瘉鎵嬫満鍙�
+     * @param request
+     */
+    void verifyUserPhone(UpdMobileRequest request);
+
+    /**
+     * 鎹㈢粦鎵嬫満鍙�
+     * @param request
+     */
+    void updateUserPhone(UpdMobileRequest request);
+
+
+    /***************绠$悊绔細鍛樺垪琛ㄦ帴鍙�*************/
+
+    /**
+     * 浼氬憳鍒楄〃鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄锛坢odel涓篗emberListQueryDTO锛�
+     * @return PageData<MemberListVO>
+     */
+    PageData<MemberListVO> findMemberListPage(PageWrap<MemberListQueryDTO> pageWrap);
+
+    /**
+     * 鏌ヨ浼氬憳璇︽儏
+     *
+     * @param id 浼氬憳ID
+     * @return MemberDetailVO
+     */
+    MemberDetailVO findMemberDetail(Integer id);
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/OrderLogService.java b/server/services/src/main/java/com/doumee/service/business/OrderLogService.java
new file mode 100644
index 0000000..9740aa0
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/service/business/OrderLogService.java
@@ -0,0 +1,37 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.OrderLog;
+
+import java.util.List;
+
+/**
+ * 璁㈠崟鎿嶄綔鏃ュ織Service瀹氫箟
+ * @author rk
+ * @date 2026/04/13
+ */
+public interface OrderLogService {
+
+    Integer create(OrderLog orderLog);
+
+    void deleteById(Integer id);
+
+    void delete(OrderLog orderLog);
+
+    void deleteByIdInBatch(List<Integer> ids);
+
+    void updateById(OrderLog orderLog);
+
+    void updateByIdInBatch(List<OrderLog> orderLogs);
+
+    OrderLog findById(Integer id);
+
+    OrderLog findOne(OrderLog orderLog);
+
+    List<OrderLog> findList(OrderLog orderLog);
+
+    PageData<OrderLog> findPage(PageWrap<OrderLog> pageWrap);
+
+    long count(OrderLog orderLog);
+}
diff --git a/server/services/src/main/java/com/doumee/service/business/OrdersRefundService.java b/server/services/src/main/java/com/doumee/service/business/OrdersRefundService.java
new file mode 100644
index 0000000..a989dd1
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/service/business/OrdersRefundService.java
@@ -0,0 +1,98 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.OrdersRefund;
+
+import java.util.List;
+
+/**
+ * 璁㈠崟閫�娆捐褰昐ervice瀹氫箟
+ * @author rk
+ * @date 2026/04/13
+ */
+public interface OrdersRefundService {
+
+    /**
+     * 鍒涘缓
+     *
+     * @param ordersRefund 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(OrdersRefund ordersRefund);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param ordersRefund 瀹炰綋瀵硅薄
+     */
+    void delete(OrdersRefund ordersRefund);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param ordersRefund 瀹炰綋瀵硅薄
+     */
+    void updateById(OrdersRefund ordersRefund);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param ordersRefunds 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<OrdersRefund> ordersRefunds);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return OrdersRefund
+     */
+    OrdersRefund findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param ordersRefund 瀹炰綋瀵硅薄
+     * @return OrdersRefund
+     */
+    OrdersRefund findOne(OrdersRefund ordersRefund);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param ordersRefund 瀹炰綋瀵硅薄
+     * @return List<OrdersRefund>
+     */
+    List<OrdersRefund> findList(OrdersRefund ordersRefund);
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<OrdersRefund>
+     */
+    PageData<OrdersRefund> findPage(PageWrap<OrdersRefund> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param ordersRefund 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(OrdersRefund ordersRefund);
+}
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 c33fe57..cb9f676 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
@@ -3,7 +3,21 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.Orders;
+import com.doumee.dao.dto.CalculateLocalPriceDTO;
+import com.doumee.dao.dto.CalculateRemotePriceDTO;
+import com.doumee.dao.dto.CreateOrderDTO;
+import com.doumee.dao.dto.DispatchDTO;
+import com.doumee.dao.dto.MyOrderDTO;
+import com.doumee.dao.vo.MyOrderDetailVO;
+import com.doumee.dao.vo.MyOrderVO;
+import com.doumee.dao.vo.OrderDetailVO;
+import com.doumee.dao.vo.OrderDispatchVO;
+import com.doumee.dao.vo.OrderSummaryVO;
+import com.doumee.dao.vo.OverdueFeeVO;
+import com.doumee.dao.vo.PayResponse;
+import com.doumee.dao.vo.PriceCalculateVO;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -96,4 +110,154 @@
      */
     long count(Orders orders);
 
+    /**
+     * 鏌ヨ璁㈠崟璇︽儏
+     *
+     * @param id 涓婚敭
+     * @return OrderDetailVO
+     */
+    OrderDetailVO findDetail(Integer id);
+
+    /**
+     * 浼氬憳绔鍗曡鎯�
+     *
+     * @param id       璁㈠崟涓婚敭
+     * @param memberId 浼氬憳涓婚敭
+     * @return MyOrderDetailVO
+     */
+    MyOrderDetailVO findMyOrderDetail(Integer id, Integer memberId);
+
+    /**
+     * 浼氬憳鍙栨秷璁㈠崟锛堜粎寮傚湴瀵勫瓨锛�
+     *
+     * @param orderId   璁㈠崟涓婚敭
+     * @param memberId  浼氬憳涓婚敭
+     * @param reason    鍙栨秷鍘熷洜
+     */
+    void cancelOrder(Integer orderId, Integer memberId, String reason);
+
+    /**
+     * 瀵勫瓨璁㈠崟鏀粯鍥炶皟澶勭悊
+     *
+     * @param outTradeNo 鍟嗘埛璁㈠崟鍙�
+     * @param wxTradeNo  寰俊璁㈠崟鍙�
+     */
+    void handleStorageOrderPayNotify(String outTradeNo, String wxTradeNo);
+
+    /**
+     * 闂ㄥ簵鏍搁攢鏀朵欢
+     *
+     * @param verifyCode 鏍搁攢鐮�
+     * @param shopId     闂ㄥ簵涓婚敭
+     * @param images     鍥剧墖鍦板潃鍒楄〃锛堟渶澶�3寮狅級
+     * @param remark     澶囨敞
+     */
+    void shopVerifyOrder(String verifyCode, Integer shopId, List<String> images, String remark);
+
+    /**
+     * 闂ㄥ簵绔煡璇㈣鍗曡鎯�
+     * 鏀寔鎸夎鍗曚富閿垨鏍搁攢鐮佹煡璇紝澶嶇敤浼氬憳绔鎯呴�昏緫
+     *
+     * @param orderId    璁㈠崟涓婚敭锛堜笌verifyCode浜岄�変竴锛�
+     * @param verifyCode 鏍搁攢鐮侊紙涓巓rderId浜岄�変竴锛�
+     * @return 璁㈠崟璇︽儏
+     */
+    MyOrderDetailVO findShopOrderDetail(Integer orderId, String verifyCode);
+
+    /**
+     * 鏌ヨ鎵嬪姩娲惧崟淇℃伅
+     *
+     * @param id 璁㈠崟涓婚敭
+     * @return OrderDispatchVO
+     */
+    OrderDispatchVO findDispatchInfo(Integer id);
+
+    /**
+     * 璁㈠崟娲惧崟
+     *
+     * @param dto 娲惧崟鍙傛暟
+     */
+    void dispatch(DispatchDTO dto);
+
+    /**
+     * 鏍规嵁鍒嗛〉鏌ヨ鏉′欢缁熻璁㈠崟姹囨��
+     *
+     * @param pageWrap 鍒嗛〉鏌ヨ鏉′欢
+     * @return OrderSummaryVO
+     */
+    OrderSummaryVO findSummary(PageWrap<Orders> pageWrap);
+
+    /**
+     * 璁$畻淇濅环璐圭敤
+     * @param declaredValue 鎶ヤ环閲戦
+     * @return 淇濅环璐圭敤
+     */
+    BigDecimal calculateInsuranceFee(BigDecimal declaredValue);
+
+    /**
+     * 璁$畻灏卞湴瀛樺彇棰勪及璐圭敤
+     * @param dto 灏卞湴瀛樺彇璁′环璇锋眰鍙傛暟
+     * @return 浠锋牸璁$畻缁撴灉
+     */
+    PriceCalculateVO calculateLocalPrice(CalculateLocalPriceDTO dto);
+
+    /**
+     * 璁$畻寮傚湴瀛樺彇棰勪及璐圭敤
+     * @param dto 寮傚湴瀛樺彇璁′环璇锋眰鍙傛暟
+     * @return 浠锋牸璁$畻缁撴灉
+     */
+    PriceCalculateVO calculateRemotePrice(CalculateRemotePriceDTO dto);
+
+    /**
+     * 鍒涘缓璁㈠崟骞跺敜璧峰井淇℃敮浠�
+     * @param dto 鍒涘缓璁㈠崟璇锋眰鍙傛暟
+     * @param memberId 褰撳墠鐧诲綍浼氬憳ID
+     * @return 鏀粯鍝嶅簲
+     */
+    PayResponse createOrder(CreateOrderDTO dto, Integer memberId);
+
+    /**
+     * 缁х画鏀粯锛堝緟鏀粯璁㈠崟閲嶆柊鍞よ捣寰俊鏀粯锛�
+     * @param orderId 璁㈠崟涓婚敭
+     * @param memberId 褰撳墠鐧诲綍浼氬憳ID
+     * @return 鏀粯鍝嶅簲
+     */
+    PayResponse continuePay(Integer orderId, Integer memberId);
+
+    /**
+     * 灏忕▼搴忕-鏌ヨ鎴戠殑璁㈠崟鍒嗛〉
+     * @param pageWrap 鍒嗛〉鏌ヨ鍙傛暟锛坢odel鍚玸tatus锛�
+     * @param memberId 浼氬憳涓婚敭
+     * @return 鍒嗛〉缁撴灉
+     */
+    PageData<MyOrderVO> findMyOrderPage(PageWrap<MyOrderDTO> pageWrap, Integer memberId);
+
+    /**
+     * 鏌ヨ璁㈠崟瓒呮椂璐圭敤
+     * @param orderId 璁㈠崟涓婚敭
+     * @return 瓒呮椂璐圭敤璁$畻缁撴灉
+     */
+    OverdueFeeVO calculateOverdueFee(Integer orderId);
+
+    /**
+     * 鍙告満鏍搁攢锛堝紓鍦板瘎瀛樹笖鏈夊彇浠堕棬搴楋級
+     * 娲鹃�佷腑(4) 鈫� 宸插埌搴�(5)锛屾牎楠屽徃鏈烘牳閿�鐮�
+     *
+     * @param verifyCode 鍙告満鏍搁攢鐮�
+     * @param images     鍥剧墖鍦板潃鍒楄〃锛堟渶澶�3寮狅級
+     * @param remark     澶囨敞
+     * @param driverId   鍙告満锛堜細鍛橈級涓婚敭
+     */
+    void driverVerifyOrder(String verifyCode, List<String> images, String remark, Integer driverId);
+
+    /**
+     * 纭椤惧宸插埌搴�
+     * 灏卞湴瀵勫瓨/寮傚湴瀵勫瓨锛屼笖瀛樺湪鍙栦欢闂ㄥ簵锛岀姸鎬佷负寰呭彇浠�(5)
+     * 妫�鏌ラ�炬湡鐘舵�侊細閫炬湡鍒欐爣璁伴�炬湡锛屾湭閫炬湡鍒欏畬鎴愯鍗�
+     *
+     * @param orderId 璁㈠崟涓婚敭
+     * @param shopId  褰撳墠鎿嶄綔闂ㄥ簵涓婚敭
+     */
+    void confirmCustomerArrived(Integer orderId, Integer shopId);
+
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/PricingRuleService.java b/server/services/src/main/java/com/doumee/service/business/PricingRuleService.java
index 59a8bf7..d4d6419 100644
--- a/server/services/src/main/java/com/doumee/service/business/PricingRuleService.java
+++ b/server/services/src/main/java/com/doumee/service/business/PricingRuleService.java
@@ -14,6 +14,7 @@
 import com.doumee.dao.vo.StoreDepositVO;
 import com.doumee.dao.vo.RevenueShareVO;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -133,17 +134,26 @@
     List<RemoteDeliveryPricingVO> listRemoteDeliveryPricing(Integer cityId);
 
     /**
-     * 淇濆瓨棰勮鏃舵晥閰嶇疆(鏈夊垯鏇存柊锛屾棤鍒欐柊澧�)
+     * 淇濆瓨棰勮鏃舵晥閰嶇疆(鏍囬�熻揪fieldA=1 + 鏋侀�熻揪fieldA=2锛屾湁鍒欐洿鏂版棤鍒欐柊澧�)
      * @param request 淇濆瓨璇锋眰
      */
     void saveEstimatedDelivery(EstimatedDeliverySaveDTO request);
 
     /**
-     * 鏌ヨ棰勮鏃舵晥閰嶇疆(鏈変笖鍙湁涓�鏉★紝鏃犳暟鎹繑鍥炵┖瀵硅薄)
+     * 鏌ヨ棰勮鏃舵晥閰嶇疆鍒楄〃(鏍囬�熻揪fieldA=1 + 鏋侀�熻揪fieldA=2)
      * @param cityId 鍩庡競涓婚敭
-     * @return 棰勮鏃舵晥閰嶇疆
+     * @return 棰勮鏃舵晥閰嶇疆鍒楄〃
      */
-    EstimatedDeliveryVO getEstimatedDelivery(Integer cityId);
+    List<EstimatedDeliveryVO> getEstimatedDelivery(Integer cityId);
+
+    /**
+     * 鏍规嵁鍩庡競銆佺被鍨嬨�佽窛绂昏绠楅璁℃椂鏁堟椂闀�
+     * @param cityId 鍩庡競涓婚敭
+     * @param fieldA 绫诲瀷锛�1=鏍囬�熻揪锛�2=鏋侀�熻揪
+     * @param distance 璺濈锛堝叕閲岋級
+     * @return 棰勮鏃堕暱锛堝皬鏃讹級锛屾湭鎵惧埌閰嶇疆杩斿洖null
+     */
+    BigDecimal calculateEstimatedTime(Integer cityId, Integer fieldA, BigDecimal distance);
 
     /**
      * 鎵归噺淇濆瓨闂ㄥ簵娉ㄥ唽鎶奸噾
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 d7b24e0..4bcdd40 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
@@ -4,13 +4,13 @@
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.ShopInfo;
 import com.doumee.dao.business.model.Member;
-import com.doumee.dao.dto.AuditDTO;
-import com.doumee.dao.dto.ChangeStatusDTO;
-import com.doumee.dao.dto.ResetPasswordDTO;
-import com.doumee.dao.dto.ShopApplyDTO;
-import com.doumee.dao.dto.ShopUpdateDTO;
+import com.doumee.dao.dto.*;
+import com.doumee.dao.vo.ShopLoginVO;
 import com.doumee.dao.vo.ShopDetailVO;
+import com.doumee.dao.vo.ShopNearbyVO;
+import com.doumee.dao.vo.ShopWebDetailVO;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -148,4 +148,47 @@
      */
     void updateShop(ShopUpdateDTO dto);
 
+    /**
+     * 鏍规嵁缁忕含搴︽煡璇㈤檮杩戦棬搴楀垎椤靛垪琛紙鍚敤+宸蹭氦浠樻娂閲戯紝鎸夎窛绂诲崌搴忥級
+     * @param dto 鏌ヨ璇锋眰
+     * @return 闄勮繎闂ㄥ簵鍒嗛〉鍒楄〃
+     */
+    PageData<ShopNearbyVO> findNearbyShops(PageWrap<ShopNearbyDTO> pageWrap);
+
+    /**
+     * 鏌ヨ闂ㄥ簵璇︽儏锛堝皬绋嬪簭绔紝鍚収鐗囬泦鍚堝拰鍙�夎窛绂伙級
+     * @param dto 鏌ヨ璇锋眰
+     * @return 闂ㄥ簵璇︽儏
+     */
+    ShopWebDetailVO getShopWebDetail(ShopDetailQueryDTO dto);
+
+    /**
+     * 缁存姢闂ㄥ簵淇℃伅锛堟敮浠樻娂閲戝悗鍙搷浣滐級
+     * @param memberId 浼氬憳涓婚敭
+     * @param dto 缁存姢璇锋眰
+     */
+    void maintainShopInfo(Integer memberId, ShopInfoMaintainDTO dto);
+
+    /**
+     * 鏌ヨ闂ㄥ簵缁存姢淇℃伅锛堝皬绋嬪簭绔級
+     * @param memberId 浼氬憳涓婚敭
+     * @return 闂ㄥ簵淇℃伅锛屾棤鍒欒繑鍥瀗ull
+     */
+    ShopInfoMaintainDTO getShopMaintainInfo(Integer memberId);
+
+
+    /**
+     * 闂ㄥ簵瀵嗙爜鐧诲綍
+     * @param dto 鐧诲綍璇锋眰
+     * @return 鐧诲綍缁撴灉
+     */
+    ShopLoginVO shopPasswordLogin(ShopLoginDTO dto);
+
+    /**
+     * 闂ㄥ簵闈欓粯鐧诲綍锛堟牴鎹畂penid锛�
+     * @param openid
+     * @return 鐧诲綍缁撴灉
+     */
+    ShopLoginVO shopSilentLogin(String openid);
+
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/SmsrecordService.java b/server/services/src/main/java/com/doumee/service/business/SmsrecordService.java
index 8de2019..9af6046 100644
--- a/server/services/src/main/java/com/doumee/service/business/SmsrecordService.java
+++ b/server/services/src/main/java/com/doumee/service/business/SmsrecordService.java
@@ -96,4 +96,10 @@
      */
     long count(Smsrecord smsrecord);
 
+
+    void sendSms(Integer memberId,String phone);
+
+
+    void verifyCode(Integer memberId,String phone,String code);
+
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/WithdrawalOrdersService.java b/server/services/src/main/java/com/doumee/service/business/WithdrawalOrdersService.java
index f3a6ed2..e8a5c6f 100644
--- a/server/services/src/main/java/com/doumee/service/business/WithdrawalOrdersService.java
+++ b/server/services/src/main/java/com/doumee/service/business/WithdrawalOrdersService.java
@@ -3,6 +3,7 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.WithdrawalOrders;
+import com.doumee.dao.dto.WithdrawalApproveDTO;
 
 import java.util.List;
 
@@ -96,4 +97,19 @@
      */
     long count(WithdrawalOrders withdrawalOrders);
 
+    /**
+     * 宸叉彁鐜扮粺璁¢噾棰濓紙status=0/1锛夛紝浣跨敤涓庡垎椤垫煡璇㈢浉鍚岀殑鏉′欢
+     *
+     * @param pageWrap 鍒嗛〉鏌ヨ鏉′欢
+     * @return 宸叉彁鐜版�婚噾棰濓紙鍗曚綅:鍒嗭級
+     */
+    Long totalAmount(PageWrap<WithdrawalOrders> pageWrap);
+
+    /**
+     * 鎻愮幇瀹℃壒
+     *
+     * @param dto 瀹℃壒鍙傛暟
+     */
+    void approve(WithdrawalApproveDTO dto);
+
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/AddrServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/AddrServiceImpl.java
new file mode 100644
index 0000000..ef347b1
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/service/business/impl/AddrServiceImpl.java
@@ -0,0 +1,287 @@
+package com.doumee.service.business.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.doumee.core.constants.Constants;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.AddrMapper;
+import com.doumee.dao.business.model.Addr;
+import com.doumee.service.business.AddrService;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.SecurityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 鍦板潃绨縎ervice瀹炵幇
+ * @author rk
+ * @date 2026/04/15
+ */
+@Service
+public class AddrServiceImpl implements AddrService {
+
+    @Autowired
+    private AddrMapper addrMapper;
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
+    public Integer create(Addr addr) {
+        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+        addr.setDeleted(Constants.ZERO);
+        addr.setCreateTime(new Date());
+        addr.setCreateUser(loginUserInfo.getId());
+        addr.setUpdateTime(new Date());
+        addr.setUpdateUser(loginUserInfo.getId());
+        addrMapper.insert(addr);
+        return addr.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        addrMapper.update(new UpdateWrapper<Addr>().lambda()
+                .set(Addr::getDeleted, Constants.ONE)
+                .eq(Addr::getId, id));
+    }
+
+    @Override
+    public void delete(Addr addr) {
+        UpdateWrapper<Addr> deleteWrapper = new UpdateWrapper<>(addr);
+        addrMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        for (Integer id : ids) {
+            this.deleteById(id);
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
+    public void updateById(Addr addr) {
+        if (Objects.isNull(addr) || Objects.isNull(addr.getId())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+        addr.setUpdateTime(new Date());
+        addr.setUpdateUser(loginUserInfo.getId());
+        addrMapper.updateById(addr);
+    }
+
+    @Override
+    public void updateStatus(Addr addr) {
+        if (Objects.isNull(addr) || Objects.isNull(addr.getId())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+        addr.setUpdateTime(new Date());
+        addr.setUpdateUser(loginUserInfo.getId());
+        addrMapper.updateById(addr);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<Addr> addrs) {
+        if (CollectionUtils.isEmpty(addrs)) {
+            return;
+        }
+        for (Addr addr : addrs) {
+            this.updateById(addr);
+        }
+    }
+
+    @Override
+    public Addr findById(Integer id) {
+        Addr addr = addrMapper.selectById(id);
+        if (Objects.isNull(addr)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        return addr;
+    }
+
+    @Override
+    public Addr findOne(Addr addr) {
+        QueryWrapper<Addr> wrapper = new QueryWrapper<>(addr);
+        return addrMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<Addr> findList(Addr addr) {
+        QueryWrapper<Addr> wrapper = new QueryWrapper<>(addr);
+        return addrMapper.selectList(wrapper);
+    }
+
+    @Override
+    public PageData<Addr> findPage(PageWrap<Addr> pageWrap) {
+        IPage<Addr> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<Addr> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        pageWrap.getModel().setDeleted(Constants.ZERO);
+        if (pageWrap.getModel().getDeleted() != null) {
+            queryWrapper.lambda().eq(Addr::getDeleted, pageWrap.getModel().getDeleted());
+        }
+        if (pageWrap.getModel().getMemberId() != null) {
+            queryWrapper.lambda().eq(Addr::getMemberId, pageWrap.getModel().getMemberId());
+        }
+        if (pageWrap.getModel().getIsDefault() != null) {
+            queryWrapper.lambda().eq(Addr::getIsDefault, pageWrap.getModel().getIsDefault());
+        }
+        if (StringUtils.isNotBlank(pageWrap.getModel().getName())) {
+            queryWrapper.lambda().like(Addr::getName, pageWrap.getModel().getName());
+        }
+        if (StringUtils.isNotBlank(pageWrap.getModel().getPhone())) {
+            queryWrapper.lambda().like(Addr::getPhone, pageWrap.getModel().getPhone());
+        }
+        if (StringUtils.isNotBlank(pageWrap.getModel().getAddr())) {
+            queryWrapper.lambda().like(Addr::getAddr, pageWrap.getModel().getAddr());
+        }
+        if (pageWrap.getModel().getAreaId() != null) {
+            queryWrapper.lambda().eq(Addr::getAreaId, pageWrap.getModel().getAreaId());
+        }
+        for (PageWrap.SortData sortData : pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(addrMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(Addr addr) {
+        QueryWrapper<Addr> wrapper = new QueryWrapper<>(addr);
+        return addrMapper.selectCount(wrapper);
+    }
+
+    @Override
+    public List<Addr> findListWithArea(Integer memberId) {
+        MPJLambdaWrapper<Addr> wrapper = new MPJLambdaWrapper<Addr>()
+                .selectAll(Addr.class)
+                .select("a3.name", Addr::getDistrictName)
+                .select("a3.code", Addr::getDistrictCode)
+                .select("a2.id", Addr::getCityId)
+                .select("a2.name", Addr::getCityName)
+                .select("a2.code", Addr::getCityCode)
+                .select("a1.id", Addr::getProvinceId)
+                .select("a1.name", Addr::getProvinceName)
+                .select("a1.code", Addr::getProvinceCode)
+                .leftJoin("areas a3 on a3.id = t.AREA_ID")
+                .leftJoin("areas a2 on a2.id = a3.PARENT_ID")
+                .leftJoin("areas a1 on a1.id = a2.PARENT_ID")
+                .eq(Addr::getDeleted, Constants.ZERO)
+                .eq(Addr::getMemberId, memberId)
+                .orderByDesc(Addr::getIsDefault)
+                .orderByDesc(Addr::getCreateTime);
+        return addrMapper.selectJoinList(Addr.class, wrapper);
+    }
+
+    @Override
+    public Addr findByIdWithArea(Integer id) {
+        MPJLambdaWrapper<Addr> wrapper = new MPJLambdaWrapper<Addr>()
+                .selectAll(Addr.class)
+                .select("a3.name", Addr::getDistrictName)
+                .select("a3.code", Addr::getDistrictCode)
+                .select("a2.id", Addr::getCityId)
+                .select("a2.name", Addr::getCityName)
+                .select("a2.code", Addr::getCityCode)
+                .select("a1.id", Addr::getProvinceId)
+                .select("a1.name", Addr::getProvinceName)
+                .select("a1.code", Addr::getProvinceCode)
+                .leftJoin("areas a3 on a3.id = t.AREA_ID")
+                .leftJoin("areas a2 on a2.id = a3.PARENT_ID")
+                .leftJoin("areas a1 on a1.id = a2.PARENT_ID")
+                .eq(Addr::getId, id);
+        Addr addr = addrMapper.selectJoinOne(Addr.class, wrapper);
+        if (Objects.isNull(addr)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        return addr;
+    }
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
+    public Integer createByMember(Addr addr, Integer memberId) {
+        validateAddr(addr);
+        // 璁句负榛樿鏃讹紝鍏堟竻闄よ鐢ㄦ埛鍘熸湁鐨勯粯璁ゅ湴鍧�
+        if (Constants.equalsInteger(addr.getIsDefault(), Constants.ONE)) {
+            clearDefault(memberId);
+        }
+        addr.setMemberId(memberId);
+        addr.setDeleted(Constants.ZERO);
+        addr.setCreateTime(new Date());
+        addr.setCreateUser(memberId);
+        addr.setUpdateTime(new Date());
+        addr.setUpdateUser(memberId);
+        addrMapper.insert(addr);
+        return addr.getId();
+    }
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
+    public void updateByMember(Addr addr, Integer memberId) {
+        if (Objects.isNull(addr) || Objects.isNull(addr.getId())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        validateAddr(addr);
+        // 璁句负榛樿鏃讹紝鍏堟竻闄よ鐢ㄦ埛鍘熸湁鐨勯粯璁ゅ湴鍧�
+        if (Constants.equalsInteger(addr.getIsDefault(), Constants.ONE)) {
+            clearDefault(memberId);
+        }
+        addr.setMemberId(memberId);
+        addr.setUpdateTime(new Date());
+        addr.setUpdateUser(memberId);
+        addrMapper.updateById(addr);
+    }
+
+    private void validateAddr(Addr addr) {
+        if (Objects.isNull(addr.getAreaId())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鍖哄煙涓嶈兘涓虹┖");
+        }
+        if (StringUtils.isBlank(addr.getAddr())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇︾粏鍦板潃涓嶈兘涓虹┖");
+        }
+        if (Objects.isNull(addr.getIsDefault())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏄惁榛樿涓嶈兘涓虹┖");
+        }
+        if (StringUtils.isBlank(addr.getName())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "濮撳悕涓嶈兘涓虹┖");
+        }
+        if (StringUtils.isBlank(addr.getPhone())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鐢佃瘽涓嶈兘涓虹┖");
+        }
+        if (Objects.isNull(addr.getLongitude())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "缁忓害涓嶈兘涓虹┖");
+        }
+        if (Objects.isNull(addr.getLatitude())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "绾害涓嶈兘涓虹┖");
+        }
+    }
+
+    /**
+     * 娓呴櫎璇ョ敤鎴锋墍鏈夊湴鍧�鐨勯粯璁ゆ爣璁�
+     */
+    private void clearDefault(Integer memberId) {
+        addrMapper.update(new UpdateWrapper<Addr>().lambda()
+                .set(Addr::getIsDefault, Constants.ZERO)
+                .eq(Addr::getMemberId, memberId)
+                .eq(Addr::getDeleted, Constants.ZERO)
+                .eq(Addr::getIsDefault, Constants.ONE));
+    }
+}
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/AreasServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/AreasServiceImpl.java
index 93c32f3..c147960 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/AreasServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/AreasServiceImpl.java
@@ -518,4 +518,23 @@
         return dataList;
     }
 
+    @Override
+    public List<Areas> getOpenCityList() {
+        QueryWrapper<Areas> qw = new QueryWrapper<>();
+        qw.lambda()
+                .eq(Areas::getType, Constants.ONE)
+                .eq(Areas::getStatus, Constants.ONE)
+                .eq(Areas::getIsdeleted, Constants.ZERO)
+                .orderByAsc(Areas::getSortnum);
+        List<Areas> list = areasMapper.selectList(qw);
+        if (list != null) {
+            for (Areas c : list) {
+                c.setFullspell(PinYinUtil.getFullSpell(c.getName()));
+                c.setFirstSpell(PinYinUtil.getFirstFirstSpell(c.getName()));
+            }
+            Collections.sort(list);
+        }
+        return list;
+    }
+
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/BannerServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/BannerServiceImpl.java
index 53f9009..fa3a3e6 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/BannerServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/BannerServiceImpl.java
@@ -4,19 +4,25 @@
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.core.constants.Constants;
 import com.doumee.core.constants.ResponseStatus;
 import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.LoginUserInfo;
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.business.BannerMapper;
 import com.doumee.dao.business.model.Banner;
 import com.doumee.service.business.BannerService;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.SecurityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Objects;
 
@@ -31,15 +37,28 @@
     @Autowired
     private BannerMapper bannerMapper;
 
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+
     @Override
+    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
     public Integer create(Banner banner) {
+        validateBanner(banner, false);
+        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+        banner.setDeleted(Constants.ZERO);
+        banner.setCreateTime(new Date());
+        banner.setCreateUser(loginUserInfo.getId());
+        banner.setUpdateTime(new Date());
+        banner.setUpdateUser(loginUserInfo.getId());
         bannerMapper.insert(banner);
         return banner.getId();
     }
 
     @Override
     public void deleteById(Integer id) {
-        bannerMapper.deleteById(id);
+        bannerMapper.update(new UpdateWrapper<Banner>().lambda()
+                .set(Banner::getDeleted, Constants.ONE)
+                .eq(Banner::getId, id));
     }
 
     @Override
@@ -53,11 +72,29 @@
         if (CollectionUtils.isEmpty(ids)) {
             return;
         }
-        bannerMapper.deleteBatchIds(ids);
+        for (Integer id : ids) {
+            this.deleteById(id);
+        }
     }
 
     @Override
+    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
     public void updateById(Banner banner) {
+        validateBanner(banner, true);
+        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+        banner.setUpdateTime(new Date());
+        banner.setUpdateUser(loginUserInfo.getId());
+        bannerMapper.updateById(banner);
+    }
+
+    @Override
+    public void updateStatus(Banner banner) {
+        if (Objects.isNull(banner) || Objects.isNull(banner.getId()) || Objects.isNull(banner.getStatus())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+        banner.setUpdateTime(new Date());
+        banner.setUpdateUser(loginUserInfo.getId());
         bannerMapper.updateById(banner);
     }
 
@@ -76,6 +113,10 @@
         Banner banner = bannerMapper.selectById(id);
         if (Objects.isNull(banner)) {
             throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        if (StringUtils.isNotBlank(banner.getImgurl())) {
+            String path = getBannerPath();
+            banner.setImgurlFull(path + banner.getImgurl());
         }
         return banner;
     }
@@ -98,37 +139,20 @@
         QueryWrapper<Banner> queryWrapper = new QueryWrapper<>();
         Utils.MP.blankToNull(pageWrap.getModel());
         pageWrap.getModel().setDeleted(Constants.ZERO);
-        if (pageWrap.getModel().getId() != null) {
-            queryWrapper.lambda().eq(Banner::getId, pageWrap.getModel().getId());
-        }
         if (pageWrap.getModel().getDeleted() != null) {
             queryWrapper.lambda().eq(Banner::getDeleted, pageWrap.getModel().getDeleted());
-        }
-        if (pageWrap.getModel().getCreateUser() != null) {
-            queryWrapper.lambda().eq(Banner::getCreateUser, pageWrap.getModel().getCreateUser());
-        }
-        if (pageWrap.getModel().getCreateTime() != null) {
-            queryWrapper.lambda().ge(Banner::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateTime()));
-            queryWrapper.lambda().le(Banner::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateTime()));
-        }
-        if (pageWrap.getModel().getUpdateUser() != null) {
-            queryWrapper.lambda().eq(Banner::getUpdateUser, pageWrap.getModel().getUpdateUser());
-        }
-        if (pageWrap.getModel().getUpdateTime() != null) {
-            queryWrapper.lambda().ge(Banner::getUpdateTime, Utils.Date.getStart(pageWrap.getModel().getUpdateTime()));
-            queryWrapper.lambda().le(Banner::getUpdateTime, Utils.Date.getEnd(pageWrap.getModel().getUpdateTime()));
         }
         if (pageWrap.getModel().getStatus() != null) {
             queryWrapper.lambda().eq(Banner::getStatus, pageWrap.getModel().getStatus());
         }
-        if (pageWrap.getModel().getType() != null) {
-            queryWrapper.lambda().eq(Banner::getType, pageWrap.getModel().getType());
-        }
         if (pageWrap.getModel().getPosition() != null) {
             queryWrapper.lambda().eq(Banner::getPosition, pageWrap.getModel().getPosition());
         }
-        if (pageWrap.getModel().getShopId() != null) {
-            queryWrapper.lambda().eq(Banner::getShopId, pageWrap.getModel().getShopId());
+        if (StringUtils.isNotBlank(pageWrap.getModel().getTitle())) {
+            queryWrapper.lambda().like(Banner::getTitle, pageWrap.getModel().getTitle());
+        }
+        if (pageWrap.getModel().getType() != null) {
+            queryWrapper.lambda().eq(Banner::getType, pageWrap.getModel().getType());
         }
         for (PageWrap.SortData sortData : pageWrap.getSorts()) {
             if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
@@ -137,7 +161,16 @@
                 queryWrapper.orderByAsc(sortData.getProperty());
             }
         }
-        return PageData.from(bannerMapper.selectPage(page, queryWrapper));
+        PageData<Banner> result = PageData.from(bannerMapper.selectPage(page, queryWrapper));
+        if (result != null && result.getRecords() != null) {
+            String path = getBannerPath();
+            for (Banner b : result.getRecords()) {
+                if (StringUtils.isNotBlank(b.getImgurl())) {
+                    b.setImgurlFull(path + b.getImgurl());
+                }
+            }
+        }
+        return result;
     }
 
     @Override
@@ -145,4 +178,57 @@
         QueryWrapper<Banner> wrapper = new QueryWrapper<>(banner);
         return bannerMapper.selectCount(wrapper);
     }
+
+    @Override
+    public List<Banner> findListByPosition(Integer position) {
+        QueryWrapper<Banner> wrapper = new QueryWrapper<>();
+        wrapper.lambda()
+                .eq(Banner::getDeleted, Constants.ZERO)
+                .eq(Banner::getStatus, Constants.ZERO)
+                .eq(Banner::getPosition, position)
+                .orderByAsc(Banner::getSortnum);
+        List<Banner> list = bannerMapper.selectList(wrapper);
+        if (list != null && !list.isEmpty()) {
+            String path = getBannerPath();
+            for (Banner b : list) {
+                if (StringUtils.isNotBlank(b.getImgurl())) {
+                    b.setImgurlFull(path + b.getImgurl());
+                }
+            }
+        }
+        return list;
+    }
+
+    private void validateBanner(Banner banner, boolean requireId) {
+        if (Objects.isNull(banner)) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        if (requireId && Objects.isNull(banner.getId())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        if (StringUtils.isBlank(banner.getTitle())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏍囬涓嶈兘涓虹┖");
+        }
+        if (StringUtils.isBlank(banner.getImgurl())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鍥剧墖涓嶈兘涓虹┖");
+        }
+        if (Objects.isNull(banner.getStatus())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鐘舵�佷笉鑳戒负绌�");
+        }
+        if (Objects.isNull(banner.getPosition())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏄剧ず浣嶇疆涓嶈兘涓虹┖");
+        }
+        if (Objects.isNull(banner.getType())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璺宠浆绫诲瀷涓嶈兘涓虹┖");
+        }
+        // 璺宠浆绫诲瀷涓�1(瀵屾枃鏈�)鎴�2(澶栭摼)鏃讹紝鍐呭蹇呭~
+        if (!Constants.equalsInteger(banner.getType(), Constants.ZERO) && StringUtils.isBlank(banner.getContent())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鍐呭涓嶈兘涓虹┖");
+        }
+    }
+
+    private String getBannerPath() {
+        return systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.RESOURCE_PATH).getCode()
+                + systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.BANNER_FILES).getCode();
+    }
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
index 5fb7a02..7208a38 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
@@ -11,7 +11,9 @@
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.business.CategoryMapper;
+import com.doumee.dao.business.PricingRuleMapper;
 import com.doumee.dao.business.model.Category;
+import com.doumee.dao.business.model.PricingRule;
 import com.doumee.dao.system.model.SystemUser;
 import com.doumee.service.business.CategoryService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -42,6 +44,9 @@
 
     @Autowired
     private CategoryMapper categoryMapper;
+
+    @Autowired
+    private PricingRuleMapper pricingRuleMapper;
 
     @Autowired
     private SystemDictDataBiz systemDictDataBiz;
@@ -242,6 +247,45 @@
         return categoryList;
     }
 
+    @Override
+    public List<Category> getCitySizeList(Integer cityId) {
+        // 1. 鏌ヨ璇ュ煄甯傚凡閰嶇疆鐨勫紓鍦板瘎閫佽鍒�(pricing_rule type=1)锛岃幏鍙杅ieldA(鐗╁搧灏哄涓婚敭)
+        List<PricingRule> rules = pricingRuleMapper.selectList(new QueryWrapper<PricingRule>().lambda()
+                .eq(PricingRule::getDeleted, Constants.ZERO)
+                .eq(PricingRule::getType, Constants.ONE)
+                .eq(PricingRule::getCityId, cityId));
+        if (CollectionUtils.isEmpty(rules)) {
+            return java.util.Collections.emptyList();
+        }
+        List<Integer> sizeIds = new java.util.ArrayList<>();
+        for (PricingRule rule : rules) {
+            if (StringUtils.isNotBlank(rule.getFieldA())) {
+                sizeIds.add(Integer.parseInt(rule.getFieldA()));
+            }
+        }
+        if (sizeIds.isEmpty()) {
+            return java.util.Collections.emptyList();
+        }
+        // 2. 鏌ヨ瀵瑰簲鐨勭墿鍝佸昂瀵�(category type=4)
+        List<Category> sizeList = categoryMapper.selectList(new QueryWrapper<Category>().lambda()
+                .eq(Category::getDeleted, Constants.ZERO)
+                .eq(Category::getStatus, Constants.ZERO)
+                .eq(Category::getType, Constants.FOUR)
+                .in(Category::getId, sizeIds)
+                .orderByAsc(Category::getSortnum));
+        // 3. 鎷兼帴鍥炬爣鍏ㄨ矾寰�
+        if (!CollectionUtils.isEmpty(sizeList)) {
+            String path = systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.RESOURCE_PATH).getCode()
+                    + systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.CATEGORY_FILES).getCode();
+            for (Category cate : sizeList) {
+                if (StringUtils.isNotBlank(cate.getIcon())) {
+                    cate.setIconFull(path + cate.getIcon());
+                }
+            }
+        }
+        return sizeList;
+    }
+
     private void validateByType(Category category) {
         if (Constants.equalsInteger(category.getType(), Constants.ONE)) {
             if (StringUtils.isBlank(category.getOtherField())) {
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 e67a9b0..796cf5e 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java
@@ -17,6 +17,7 @@
 import com.doumee.dao.business.MultifileMapper;
 import com.doumee.dao.business.SmsrecordMapper;
 import com.doumee.dao.business.CategoryMapper;
+import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.dao.business.model.Category;
 import com.doumee.dao.business.model.DriverInfo;
 import com.doumee.dao.business.model.Member;
@@ -24,12 +25,14 @@
 import com.doumee.dao.business.model.Smsrecord;
 import com.doumee.dao.vo.AccountResponse;
 import com.doumee.dao.dto.AuditDTO;
+import com.doumee.dao.dto.ChangeStatusDTO;
 import com.doumee.dao.dto.DriverLoginRequest;
 import com.doumee.dao.dto.DriverRegisterRequest;
 import com.doumee.dao.dto.DriverVerifyRequest;
 import com.doumee.service.business.AliSmsService;
 import com.doumee.service.business.DriverInfoService;
 import com.alibaba.fastjson.JSONObject;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -74,6 +77,9 @@
 
     @Autowired
     private CategoryMapper categoryMapper;
+
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
 
     @Override
     public Integer create(DriverInfo driverInfo) {
@@ -139,71 +145,41 @@
     @Override
     public PageData<DriverInfo> findPage(PageWrap<DriverInfo> pageWrap) {
         IPage<DriverInfo> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
-        QueryWrapper<DriverInfo> queryWrapper = new QueryWrapper<>();
+        MPJLambdaWrapper<DriverInfo> queryWrapper = new MPJLambdaWrapper<>();
         Utils.MP.blankToNull(pageWrap.getModel());
         pageWrap.getModel().setDeleted(Constants.ZERO);
-        if (pageWrap.getModel().getId() != null) {
-            queryWrapper.lambda().eq(DriverInfo::getId, pageWrap.getModel().getId());
+
+        // 鍙告満濮撳悕/鎵嬫満鍙凤紙鍏抽敭瀛楁ā绯婃煡璇級
+        if (StringUtils.isNotBlank(pageWrap.getModel().getKeyword())) {
+            queryWrapper.and(w -> w
+                    .like(DriverInfo::getName, pageWrap.getModel().getKeyword())
+                    .or()
+                    .like(DriverInfo::getTelephone, pageWrap.getModel().getKeyword()));
         }
-        if (pageWrap.getModel().getDeleted() != null) {
-            queryWrapper.lambda().eq(DriverInfo::getDeleted, pageWrap.getModel().getDeleted());
+        // 杞︾墝鍙�
+        if (StringUtils.isNotBlank(pageWrap.getModel().getCarCode())) {
+            queryWrapper.like(DriverInfo::getCarCode, pageWrap.getModel().getCarCode());
         }
-        if (pageWrap.getModel().getCreateUser() != null) {
-            queryWrapper.lambda().eq(DriverInfo::getCreateUser, pageWrap.getModel().getCreateUser());
-        }
-        if (pageWrap.getModel().getCreateTime() != null) {
-            queryWrapper.lambda().ge(DriverInfo::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateTime()));
-            queryWrapper.lambda().le(DriverInfo::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateTime()));
-        }
-        if (pageWrap.getModel().getUpdateUser() != null) {
-            queryWrapper.lambda().eq(DriverInfo::getUpdateUser, pageWrap.getModel().getUpdateUser());
-        }
-        if (pageWrap.getModel().getUpdateTime() != null) {
-            queryWrapper.lambda().ge(DriverInfo::getUpdateTime, Utils.Date.getStart(pageWrap.getModel().getUpdateTime()));
-            queryWrapper.lambda().le(DriverInfo::getUpdateTime, Utils.Date.getEnd(pageWrap.getModel().getUpdateTime()));
-        }
-        if (pageWrap.getModel().getRemark() != null) {
-            queryWrapper.lambda().eq(DriverInfo::getRemark, pageWrap.getModel().getRemark());
-        }
-        if (pageWrap.getModel().getName() != null) {
-            queryWrapper.lambda().like(DriverInfo::getName, pageWrap.getModel().getName());
-        }
-        if (pageWrap.getModel().getTelephone() != null) {
-            queryWrapper.lambda().like(DriverInfo::getTelephone, pageWrap.getModel().getTelephone());
-        }
-        if (pageWrap.getModel().getIdcard() != null) {
-            queryWrapper.lambda().eq(DriverInfo::getIdcard, pageWrap.getModel().getIdcard());
-        }
-        if (pageWrap.getModel().getMaritalStatus() != null) {
-            queryWrapper.lambda().eq(DriverInfo::getMaritalStatus, pageWrap.getModel().getMaritalStatus());
-        }
-        if (pageWrap.getModel().getCarType() != null) {
-            queryWrapper.lambda().eq(DriverInfo::getCarType, pageWrap.getModel().getCarType());
-        }
-        if (pageWrap.getModel().getCarCode() != null) {
-            queryWrapper.lambda().like(DriverInfo::getCarCode, pageWrap.getModel().getCarCode());
-        }
-        if (pageWrap.getModel().getCardStartDate() != null) {
-            queryWrapper.lambda().ge(DriverInfo::getCardStartDate, Utils.Date.getStart(pageWrap.getModel().getCardStartDate()));
-            queryWrapper.lambda().le(DriverInfo::getCardStartDate, Utils.Date.getEnd(pageWrap.getModel().getCardStartDate()));
-        }
-        if (pageWrap.getModel().getCardEndDate() != null) {
-            queryWrapper.lambda().ge(DriverInfo::getCardEndDate, Utils.Date.getStart(pageWrap.getModel().getCardEndDate()));
-            queryWrapper.lambda().le(DriverInfo::getCardEndDate, Utils.Date.getEnd(pageWrap.getModel().getCardEndDate()));
-        }
+        // 鐘舵��
         if (pageWrap.getModel().getStatus() != null) {
-            queryWrapper.lambda().eq(DriverInfo::getStatus, pageWrap.getModel().getStatus());
+            queryWrapper.eq(DriverInfo::getStatus, pageWrap.getModel().getStatus());
         }
-        if (pageWrap.getModel().getAuditTime() != null) {
-            queryWrapper.lambda().ge(DriverInfo::getAuditTime, Utils.Date.getStart(pageWrap.getModel().getAuditTime()));
-            queryWrapper.lambda().le(DriverInfo::getAuditTime, Utils.Date.getEnd(pageWrap.getModel().getAuditTime()));
+        // 瀹℃壒鐘舵��
+        if (pageWrap.getModel().getAuditStatus() != null) {
+            queryWrapper.eq(DriverInfo::getAuditStatus, pageWrap.getModel().getAuditStatus());
         }
-        if (pageWrap.getModel().getAuditUser() != null) {
-            queryWrapper.lambda().eq(DriverInfo::getAuditUser, pageWrap.getModel().getAuditUser());
+        // 鍒涘缓鏃ユ湡鑼冨洿
+        if (pageWrap.getModel().getCreateTimeStart() != null) {
+            queryWrapper.ge(DriverInfo::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateTimeStart()));
         }
-        if (pageWrap.getModel().getMemberId() != null) {
-            queryWrapper.lambda().eq(DriverInfo::getMemberId, pageWrap.getModel().getMemberId());
+        if (pageWrap.getModel().getCreateTimeEnd() != null) {
+            queryWrapper.le(DriverInfo::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateTimeEnd()));
         }
+        // 瀛愭煡璇細浣欓
+        queryWrapper.selectAll(DriverInfo.class)
+                .select(" ( select ifnull(sum(r.OPT_TYPE * r.AMOUNT),0) from revenue r where r.MEMBER_TYPE = 1 and r.MEMBER_ID= t.id and r.VAILD_STATUS = 1 ) as memberAmount ")
+                .selectAs(Category::getName,DriverInfo::getCarTypeName)
+                .leftJoin(Category.class, Category::getId,DriverInfo::getCarType);
         for (PageWrap.SortData sortData : pageWrap.getSorts()) {
             if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                 queryWrapper.orderByDesc(sortData.getProperty());
@@ -211,7 +187,11 @@
                 queryWrapper.orderByAsc(sortData.getProperty());
             }
         }
-        return PageData.from(driverInfoMapper.selectPage(page, queryWrapper));
+        PageData<DriverInfo> pageData = PageData.from(driverInfoMapper.selectPage(page, queryWrapper));
+        for (DriverInfo d : pageData.getRecords()) {
+            d.setGender(Constants.getGenderByIdCard(d.getIdcard()));
+        }
+        return pageData;
     }
 
     @Override
@@ -315,9 +295,6 @@
             member.setBusinessStatus(Constants.ZERO);
             member.setPassword(secure.encryptPassword(defaultPassword, salt));
             member.setSalt(salt);
-            member.setWorkerIdentity(Constants.ZERO);
-            member.setDriverIdentity(Constants.ZERO);
-            member.setChefIdentity(Constants.ZERO);
             member.setAmount(Constants.ZERO.longValue());
             member.setTotalAmount(Constants.ZERO.longValue());
             member.setStatus(Constants.ZERO);
@@ -329,7 +306,7 @@
             member.setUseIdentity(Constants.ZERO);
             memberMapper.insert(member);
 
-            // 鍒涘缓鍙告満鍩虹淇℃伅锛坰tatus=0锛屾敞鍐岀姸鎬侊級
+            // 鍒涘缓鍙告満鍩虹淇℃伅
             DriverInfo driverInfo = new DriverInfo();
             driverInfo.setDeleted(Constants.ZERO);
             driverInfo.setCreateTime(now);
@@ -337,6 +314,7 @@
             driverInfo.setTelephone(telephone);
             driverInfo.setMemberId(member.getId());
             driverInfo.setStatus(Constants.ZERO);
+            driverInfo.setAuditStatus(null);
             driverInfoMapper.insert(driverInfo);
         }
 
@@ -408,10 +386,9 @@
         if (Objects.isNull(driverInfo)) {
             throw new BusinessException(ResponseStatus.DATA_EMPTY);
         }
-        // 鐘舵�佹牎楠岋細status=0(娉ㄥ唽)鎴杝tatus=3(瀹℃壒椹冲洖)鍙彁浜よ璇�
-        if (driverInfo.getStatus() != null
-                && !Constants.equalsInteger(driverInfo.getStatus(), Constants.ZERO)
-                && !Constants.equalsInteger(driverInfo.getStatus(), Constants.THREE)) {
+        // 鐘舵�佹牎楠岋細auditStatus=null(鏈彁浜�)鎴朼uditStatus=2(瀹℃壒椹冲洖)鍙彁浜よ璇�
+        if (driverInfo.getAuditStatus() != null
+                && !Constants.equalsInteger(driverInfo.getAuditStatus(), Constants.TWO)) {
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "褰撳墠鐘舵�佷笉鍏佽鎻愪氦璁よ瘉");
         }
         // 鏍规嵁杞﹁締绫诲瀷鍒ゆ柇鏄惁闇�瑕侀┚椹惰瘉
@@ -458,7 +435,7 @@
                 .set(DriverInfo::getCardEndDate, request.getCardEndDate())
                 .set(DriverInfo::getIdcardImg, request.getIdcardImg())
                 .set(DriverInfo::getIdcardImgBack, request.getIdcardImgBack())
-                .set(DriverInfo::getStatus, Constants.ONE)
+                .set(DriverInfo::getAuditStatus, Constants.ZERO)
                 .set(DriverInfo::getUpdateTime, now)
                 .set(DriverInfo::getAuditRemark, null)
                 .set(DriverInfo::getAuditTime, null)
@@ -533,37 +510,108 @@
         if (Objects.isNull(driverInfo)) {
             throw new BusinessException(ResponseStatus.DATA_EMPTY);
         }
-        // 鍙湁鐘舵�佷负1(寰呭鎵�)涓斿凡濉啓璁よ瘉淇℃伅鎵嶈兘瀹℃壒
-        if (!Constants.equalsInteger(driverInfo.getStatus(), Constants.ONE)
+        // 鍙湁瀹℃壒鐘舵�佷负0(寰呭鎵�)涓斿凡濉啓璁よ瘉淇℃伅鎵嶈兘瀹℃壒
+        if (!Constants.equalsInteger(driverInfo.getAuditStatus(), Constants.ZERO)
                 || StringUtils.isBlank(driverInfo.getIdcard())) {
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "褰撳墠鐘舵�佷笉鍏佽瀹℃壒");
         }
         Date now = new Date();
-        // 瀹℃壒缁撴灉锛歛uditDTO.auditStatus 0=閫氳繃鈫抎riverInfo.status=2锛�1=鎷掔粷鈫抎riverInfo.status=3
-        Integer newStatus;
+        // 瀹℃壒缁撴灉锛歛uditDTO.auditStatus 0=閫氳繃鈫抋uditStatus=1锛�1=鎷掔粷鈫抋uditStatus=2
+        Integer newAuditStatus;
         if (Constants.equalsInteger(auditDTO.getAuditStatus(), Constants.ZERO)) {
-            newStatus = Constants.TWO;  // 瀹℃壒閫氳繃
+            newAuditStatus = Constants.ONE;  // 瀹℃壒閫氳繃
+            // 瀹℃壒閫氳繃鏃跺徃鏈哄畾绾т负蹇呭~
+            if (auditDTO.getDriverLevel() == null || auditDTO.getDriverLevel() < 1 || auditDTO.getDriverLevel() > 5) {
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "瀹℃壒閫氳繃鏃跺繀椤诲~鍐欏徃鏈哄畾绾�");
+            }
         } else if (Constants.equalsInteger(auditDTO.getAuditStatus(), Constants.ONE)) {
-            newStatus = Constants.THREE;  // 瀹℃壒椹冲洖
+            newAuditStatus = Constants.TWO;  // 瀹℃壒椹冲洖
         } else {
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "瀹℃壒鐘舵�佸弬鏁伴敊璇�");
         }
-        // 鏇存柊鍙告満鐘舵��
+        // 鏇存柊鍙告満瀹℃壒鐘舵��
         driverInfoMapper.update(new UpdateWrapper<DriverInfo>().lambda()
-                .set(DriverInfo::getStatus, newStatus)
+                .set(DriverInfo::getAuditStatus, newAuditStatus)
                 .set(DriverInfo::getAuditTime, now)
                 .set(DriverInfo::getAuditRemark, auditDTO.getAuditRemark())
                 .set(DriverInfo::getAuditUser, auditDTO.getAuditUser())
+                .set(auditDTO.getDriverLevel() != null, DriverInfo::getDriverLevel, auditDTO.getDriverLevel())
                 .set(DriverInfo::getUpdateTime, now)
                 .eq(DriverInfo::getId, auditDTO.getId()));
         // 鏇存柊浼氬憳鍙告満璁よ瘉鐘舵�侊細閫氳繃=2锛岄┏鍥�=3
-        Integer driverStatus = Constants.equalsInteger(newStatus, Constants.TWO) ? Constants.TWO : Constants.THREE;
+        Integer driverStatus = Constants.equalsInteger(newAuditStatus, Constants.ONE) ? Constants.TWO : Constants.THREE;
         memberMapper.update(new UpdateWrapper<Member>().lambda()
                 .set(Member::getBusinessStatus, driverStatus)
                 .set(Member::getUpdateTime, now)
                 .eq(Member::getId, driverInfo.getMemberId()));
     }
 
+    @Override
+    public DriverInfo getDetail(Integer id) {
+        DriverInfo driverInfo = driverInfoMapper.selectById(id);
+        if (Objects.isNull(driverInfo) || Constants.equalsInteger(driverInfo.getDeleted(), Constants.ONE)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        // 鎷兼帴鍥剧墖鍓嶇紑
+        String imgPrefix = "";
+        try {
+            imgPrefix = systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.RESOURCE_PATH).getCode()
+                    + systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.DRIVER_FILES).getCode();
+        } catch (Exception e) {
+            // 鏈厤缃椂蹇界暐
+        }
+        driverInfo.setImgPrefix(imgPrefix);
+        driverInfo.setGender(Constants.getGenderByIdCard(driverInfo.getIdcard()));
+        // 鏌ヨ杞﹁締绫诲瀷鍚嶇О鍜屾槸鍚﹂渶瑕侀┚椹惰瘉
+        if (driverInfo.getCarType() != null) {
+            Category category = categoryMapper.selectById(driverInfo.getCarType());
+            if (Objects.nonNull(category)) {
+                driverInfo.setCarTypeName(category.getName());
+                driverInfo.setNeedLicense(Constants.equalsInteger(Integer.valueOf(category.getOtherField()), Constants.ONE) ? Constants.ONE : Constants.ZERO);
+            }
+        }
+        // 鏌ヨ鐓х墖鍒楄〃锛歰bjType=6杞﹁締鐓х墖銆�7椹鹃┒璇佺収鐗囥��8鍏朵粬璧勬枡鐓х墖
+        List<Multifile> multifileList = multifileMapper.selectList(new QueryWrapper<Multifile>().lambda()
+                .eq(Multifile::getObjId, driverInfo.getId())
+                .in(Multifile::getObjType, 6, 7, 8)
+                .orderByAsc(Multifile::getSortnum));
+        if (!CollectionUtils.isEmpty(multifileList)) {
+            for (Multifile mf : multifileList) {
+                mf.setFileurlFull(imgPrefix + mf.getFileurl());
+                if (Constants.equalsInteger(mf.getObjType(), 6)) {
+                    driverInfo.getCarImgList().add(mf);
+                } else if (Constants.equalsInteger(mf.getObjType(), 7)) {
+                    driverInfo.getLicenseImgList().add(mf);
+                } else if (Constants.equalsInteger(mf.getObjType(), 8)) {
+                    driverInfo.getOtherImgList().add(mf);
+                }
+            }
+        }
+        return driverInfo;
+    }
+
+    @Override
+    public void changeStatus(ChangeStatusDTO dto) {
+        if (dto.getId() == null) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "涓婚敭涓嶈兘涓虹┖");
+        }
+        if (dto.getStatus() == null || (dto.getStatus() != 0 && dto.getStatus() != 1)) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鐘舵�佸弬鏁伴敊璇紝0=鍚敤锛�1=绂佺敤");
+        }
+        DriverInfo driverInfo = driverInfoMapper.selectById(dto.getId());
+        if (Objects.isNull(driverInfo) || Constants.equalsInteger(driverInfo.getDeleted(), Constants.ONE)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        driverInfo.setStatus(dto.getStatus());
+        driverInfo.setUpdateTime(new Date());
+        driverInfoMapper.updateById(driverInfo);
+        // 鑱斿姩淇敼浼氬憳鐘舵�侊紙member涓婚敭涓巇river_info涓婚敭涓�鑷达級
+        memberMapper.update(new UpdateWrapper<Member>().lambda()
+                .set(Member::getStatus, dto.getStatus())
+                .set(Member::getUpdateTime, new Date())
+                .eq(Member::getId, driverInfo.getId()));
+    }
+
     /**
      * 鎵归噺淇濆瓨闄勪欢璁板綍
      */
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/IdentityInfoServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/IdentityInfoServiceImpl.java
index 93068ad..4aea0ff 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/IdentityInfoServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/IdentityInfoServiceImpl.java
@@ -104,11 +104,6 @@
             identityInfo.setAuditStatus(Constants.ONE);
             identityInfoMapper.insert(identityInfo);
 
-            memberMapper.update(new UpdateWrapper<Member>().lambda()
-                    .set(Constants.equalsInteger(identityInfo.getType(),Constants.ZERO),Member::getWorkerIdentity,Constants.ONE)
-                    .set(Constants.equalsInteger(identityInfo.getType(),Constants.ONE),Member::getDriverIdentity,Constants.ONE)
-                    .set(Constants.equalsInteger(identityInfo.getType(),Constants.TWO),Member::getChefIdentity,Constants.ONE)
-                    .eq(Member::getId,identityInfo.getMemberId()));
         return identityInfo.getId();
     }
 
@@ -166,11 +161,6 @@
         identityInfo.setUpdateTime(new Date());
         identityInfo.setAuditStatus(Constants.ONE);
         identityInfoMapper.updateById(identityInfo);
-        memberMapper.update(new UpdateWrapper<Member>().lambda()
-                .set(Constants.equalsInteger(identityInfo.getType(),Constants.ZERO),Member::getWorkerIdentity,Constants.ONE)
-                .set(Constants.equalsInteger(identityInfo.getType(),Constants.ONE),Member::getDriverIdentity,Constants.ONE)
-                .set(Constants.equalsInteger(identityInfo.getType(),Constants.TWO),Member::getChefIdentity,Constants.ONE)
-                .eq(Member::getId,identityInfo.getMemberId()));
     }
 
 
@@ -289,15 +279,9 @@
         String path  = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RESOURCE_PATH).getCode()
                 +systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.INENTITY_FILES).getCode();
         //绫诲瀷:0=鐢ㄥ伐韬唤锛�1=璐ц繍韬唤锛�2=渚涢韬唤锛�
-        if(!Constants.equalsInteger(member.getWorkerIdentity(),Constants.ZERO)){//鐢ㄥ伐韬唤
-            addMemberModelByType(member.getId(),Constants.ZERO,list,path);
-        }
-        if(!Constants.equalsInteger(member.getDriverIdentity(),Constants.ZERO)){//璐ц繍韬唤
-            addMemberModelByType(member.getId(),Constants.ONE,list,path);
-        }
-        if(!Constants.equalsInteger(member.getChefIdentity(),Constants.ZERO)){//渚涢寰堢矇
-            addMemberModelByType(member.getId(),Constants.TWO,list,path);
-        }
+        addMemberModelByType(member.getId(),Constants.ZERO,list,path);
+        addMemberModelByType(member.getId(),Constants.ONE,list,path);
+        addMemberModelByType(member.getId(),Constants.TWO,list,path);
 
         return list;
     }
@@ -474,10 +458,6 @@
         memberMapper.update(new UpdateWrapper<Member>().lambda()
                 .set(Member::getUpdateUser,user.getId())
                 .set(Member::getUpdateTime,date)
-                .set(Constants.equalsInteger(auditDTO.getAuditStatus(),Constants.ZERO),Member::getAutoReceiveStatus,Constants.ONE)
-                .set(Constants.equalsInteger(identityInfo.getType(),Constants.ZERO),Member::getWorkerIdentity, auditDTO.getAuditStatus() )
-                .set(Constants.equalsInteger(identityInfo.getType(),Constants.ONE),Member::getDriverIdentity , auditDTO.getAuditStatus() )
-                .set(Constants.equalsInteger(identityInfo.getType(),Constants.TWO),Member::getChefIdentity , auditDTO.getAuditStatus() )
                 .eq(Member::getId,identityInfo.getMemberId())
         );
 
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
index fffe79b..29ef2ca 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -14,11 +14,19 @@
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.business.IdentityInfoMapper;
 import com.doumee.dao.business.MemberMapper;
+import com.doumee.dao.business.ShopInfoMapper;
+import com.doumee.dao.business.SmsrecordMapper;
 import com.doumee.dao.business.model.IdentityInfo;
 import com.doumee.dao.business.model.Member;
+import com.doumee.dao.business.model.ShopInfo;
 import com.doumee.dao.business.model.MemberRevenue;
+import com.doumee.dao.business.model.Smsrecord;
+import com.doumee.dao.dto.MemberListQueryDTO;
+import com.doumee.dao.dto.UpdMobileRequest;
 import com.doumee.dao.dto.WxPhoneRequest;
 import com.doumee.dao.vo.AccountResponse;
+import com.doumee.dao.vo.MemberDetailVO;
+import com.doumee.dao.vo.MemberListVO;
 import com.doumee.dao.vo.UserCenterVO;
 import com.doumee.service.business.MemberService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -59,6 +67,9 @@
     private IdentityInfoMapper identityInfoMapper;
 
     @Autowired
+    private SmsrecordMapper smsrecordMapper;
+
+    @Autowired
     private JwtTokenUtil jwtTokenUtil;
 
     @Autowired
@@ -66,6 +77,9 @@
 
     @Autowired
     private RedisTemplate<String,Object> redisTemplate;
+
+    @Autowired
+    private ShopInfoMapper shopInfoMapper;
 
 
     @Override
@@ -178,15 +192,6 @@
         if (pageWrap.getModel().getName() != null) {
             queryWrapper.lambda().like(Member::getName, pageWrap.getModel().getName());
         }
-        if (pageWrap.getModel().getWorkerIdentity() != null) {
-            queryWrapper.lambda().eq(Member::getWorkerIdentity, pageWrap.getModel().getWorkerIdentity());
-        }
-        if (pageWrap.getModel().getDriverIdentity() != null) {
-            queryWrapper.lambda().eq(Member::getDriverIdentity, pageWrap.getModel().getDriverIdentity());
-        }
-        if (pageWrap.getModel().getChefIdentity() != null) {
-            queryWrapper.lambda().eq(Member::getChefIdentity, pageWrap.getModel().getChefIdentity());
-        }
         if (pageWrap.getModel().getAmount() != null) {
             queryWrapper.lambda().eq(Member::getAmount, pageWrap.getModel().getAmount());
         }
@@ -224,12 +229,6 @@
         if (pageWrap.getModel().getArea() != null) {
             queryWrapper.lambda().eq(Member::getArea, pageWrap.getModel().getArea());
         }
-        //濡傛灉鏌ヨ鎺ュ崟鏂�
-        queryWrapper.lambda().and(Constants.equalsInteger(pageWrap.getModel().getType(),Constants.ONE ),w1->{
-            w1.eq(Member::getWorkerIdentity,Constants.TWO )
-                    .or().eq(Member::getChefIdentity,Constants.TWO )
-                    .or().eq(Member::getDriverIdentity,Constants.TWO );
-        });
         queryWrapper.lambda().ge(pageWrap.getModel().getStartTime()!=null, Member::getCreateTime,pageWrap.getModel().getStartTime());
         queryWrapper.lambda().le(pageWrap.getModel().getEndTime()!=null,Member::getCreateTime,pageWrap.getModel().getEndTime());
 
@@ -270,8 +269,10 @@
             if (StringUtils.isBlank(openId)) {
                 throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "鑾峰彇openid澶辫触锛佽鑱旂郴绠$悊鍛�");
             }
-            Member member = memberMapper.selectOne(new QueryWrapper<Member>().lambda().eq(Member::getOpenid, openId).eq(Member::getUserType,Constants.ZERO)
-                    .eq(Member::getDeleted, Constants.ZERO).ne(Member::getStatus, Constants.TWO).last("limit 1"));
+            Member member = memberMapper.selectOne(new QueryWrapper<Member>().lambda().eq(Member::getOpenid, openId)
+                    .ne(Member::getUserType,Constants.ONE)
+                    .eq(Member::getDeleted, Constants.ZERO)
+                    .ne(Member::getStatus, Constants.TWO).last("limit 1"));
             AccountResponse accountResponse = new AccountResponse();
             accountResponse.setOpenid(openId);
             if(Objects.isNull(member)){
@@ -283,13 +284,13 @@
             String token = JwtTokenUtil.generateTokenForRedis(member.getId(), Constants.ZERO, JSONObject.toJSONString(member), redisTemplate);
             accountResponse.setToken(token);
             accountResponse.setMember(member);
+            // 闂ㄥ簵鐢ㄦ埛韬唤鏃讹紝杩斿洖鐢宠鐨勯棬搴楃姸鎬�
+            fillShopInfo(accountResponse, member);
             return accountResponse;
         } catch (WxErrorException e) {
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "寰俊鐧诲綍寮傚父锛佽鑱旂郴绠$悊鍛�");
         }
     }
-
-
 
 
     @Override
@@ -305,7 +306,9 @@
             if(Objects.isNull(mobile)){
                 throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鏈幏鍙栧埌鎵嬫満鍙�");
             }
-            Member member =  memberMapper.selectOne(new QueryWrapper<Member>().lambda().eq(Member::getTelephone,mobile).eq(Member::getUserType,Constants.ZERO)
+            Member member =  memberMapper.selectOne(new QueryWrapper<Member>().lambda()
+                    .eq(Member::getTelephone,mobile)
+                    .ne(Member::getUserType,Constants.ONE)
                     .ne(Member::getStatus, Constants.TWO).last("limit 1"));
             if(Objects.nonNull(member)){
                 if(!Constants.equalsInteger(member.getStatus(),Constants.ZERO)){
@@ -322,9 +325,6 @@
                 member.setTelephone(mobile);
                 member.setNickName(mobile);
 //                member.setCoverImage("1.png");
-                member.setWorkerIdentity(Constants.ZERO);
-                member.setDriverIdentity(Constants.ZERO);
-                member.setChefIdentity(Constants.ZERO);
                 member.setAmount(Constants.ZERO.longValue());
                 member.setTotalAmount(Constants.ZERO.longValue());
                 member.setStatus(Constants.ZERO);
@@ -340,6 +340,8 @@
             AccountResponse accountResponse = new AccountResponse();
             accountResponse.setToken(token);
             accountResponse.setMember(member);
+            // 闂ㄥ簵鐢ㄦ埛韬唤鏃讹紝杩斿洖鐢宠鐨勯棬搴楃姸鎬�
+            fillShopInfo(accountResponse, member);
             return accountResponse;
         } catch (Exception e) {
             e.printStackTrace();
@@ -347,6 +349,21 @@
         }
     }
 
+    /**
+     * 闂ㄥ簵鐢ㄦ埛韬唤鏃讹紝濉厖闂ㄥ簵瀹℃牳鐘舵��
+     */
+    private void fillShopInfo(AccountResponse response, Member member) {
+        if (Constants.TWO.equals(member.getUserType())) {
+            ShopInfo shopInfo = shopInfoMapper.selectOne(new QueryWrapper<ShopInfo>().lambda()
+                    .eq(ShopInfo::getRegionMemberId, member.getId())
+                    .eq(ShopInfo::getDeleted, Constants.ZERO)
+                    .last("limit 1"));
+            if (shopInfo != null) {
+                response.setShopId(shopInfo.getId());
+                response.setShopAuditStatus(shopInfo.getAuditStatus());
+            }
+        }
+    }
 
 
     @Override
@@ -435,10 +452,7 @@
         userCenterVO.setAboutUs(StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.ABOUT_US).getCode()));
         userCenterVO.setUserAgreement(StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.USER_AGREEMENT).getCode()));
         userCenterVO.setPrivacyAgreement(StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PRIVACY_AGREEMENT).getCode()));
-
-//        userCenterVO.setFeeStandards(StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.FEE_STANDARDS).getCode()));
-//        userCenterVO.setServerIntroduce(StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.SERVER_INTRODUCE).getCode()));
-//        userCenterVO.setServerPhone(StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.SERVER_PHONE).getCode()));
+        userCenterVO.setServerIntroduce(StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.SERVER_INTRODUCE).getCode()));
         return userCenterVO;
     }
 
@@ -462,4 +476,156 @@
         redisTemplate.delete(token);
     }
 
+
+    /***************绠$悊绔細鍛樺垪琛ㄦ帴鍙�*************/
+
+    @Override
+    public PageData<MemberListVO> findMemberListPage(PageWrap<MemberListQueryDTO> pageWrap) {
+        IPage<Member> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        MemberListQueryDTO query = pageWrap.getModel();
+        QueryWrapper<Member> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(Member::getDeleted, Constants.ZERO);
+        queryWrapper.lambda().eq(Member::getUserType, Constants.ZERO);
+        if (query != null) {
+            if (StringUtils.isNotBlank(query.getKeyword())) {
+                queryWrapper.lambda().and(w -> w
+                        .like(Member::getName, query.getKeyword())
+                        .or().like(Member::getTelephone, query.getKeyword()));
+            }
+            if (query.getStatus() != null) {
+                queryWrapper.lambda().eq(Member::getStatus, query.getStatus());
+            }
+            if (query.getStartTime() != null) {
+                queryWrapper.lambda().ge(Member::getCreateTime, query.getStartTime());
+            }
+            if (query.getEndTime() != null) {
+                queryWrapper.lambda().le(Member::getCreateTime, Utils.Date.getEnd(query.getEndTime()));
+            }
+        }
+        for (PageWrap.SortData sortData : pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        IPage<Member> memberPage = memberMapper.selectPage(page, queryWrapper);
+        IPage<MemberListVO> voPage = memberPage.convert(this::toListVO);
+        return PageData.from(voPage);
+    }
+
+    @Override
+    public MemberDetailVO findMemberDetail(Integer id) {
+        Member member = memberMapper.selectById(id);
+        if (Objects.isNull(member) || Constants.equalsInteger(member.getDeleted(), Constants.ONE)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        MemberDetailVO detail = new MemberDetailVO();
+        detail.setId(member.getId());
+        detail.setNickName(member.getNickName());
+        detail.setName(member.getName());
+        detail.setTelephone(member.getTelephone());
+        detail.setAmount(member.getAmount());
+        detail.setTotalAmount(member.getTotalAmount());
+        detail.setStatus(member.getStatus());
+        detail.setUseIdentity(member.getUseIdentity());
+        detail.setOpenid(member.getOpenid());
+        detail.setUserType(member.getUserType());
+        detail.setBusinessStatus(member.getBusinessStatus());
+        detail.setScore(member.getScore());
+        detail.setReceiveNum(member.getReceiveNum());
+        detail.setPublishNum(member.getPublishNum());
+        detail.setCreateTime(member.getCreateTime());
+        detail.setLoginTime(member.getLoginTime());
+        detail.setLoginTimes(member.getLoginTimes());
+        detail.setProvince(member.getProvince());
+        detail.setCity(member.getCity());
+        detail.setArea(member.getArea());
+        detail.setAutoReceiveStatus(member.getAutoReceiveStatus());
+        if (StringUtils.isNotBlank(member.getCoverImage())) {
+            String path = systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.RESOURCE_PATH).getCode()
+                    + systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.MEMBER_FILES).getCode();
+            detail.setFullCoverImage(path + member.getCoverImage());
+        }
+        return detail;
+    }
+
+    private MemberListVO toListVO(Member member) {
+        MemberListVO vo = new MemberListVO();
+        vo.setId(member.getId());
+        vo.setNickName(member.getNickName());
+        vo.setName(member.getName());
+        vo.setTelephone(member.getTelephone());
+        vo.setCreateTime(member.getCreateTime());
+        vo.setStatus(member.getStatus());
+        return vo;
+    }
+
+
+
+
+    @Override
+    public void verifyUserPhone(UpdMobileRequest request){
+        if(Objects.isNull(request)
+                || Objects.isNull(request.getMemberId())
+                || StringUtils.isBlank(request.getPhone())
+                || StringUtils.isBlank(request.getCode())
+        ){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        Member member = memberMapper.selectById(request.getMemberId());
+        if(StringUtils.isNotBlank(member.getTelephone())&&!member.getTelephone().equals(request.getPhone())){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鎵嬫満鍙烽敊璇�");
+        }
+        this.verifyPhoneCode(request.getCode(),request.getPhone());
+    }
+
+    public void verifyPhoneCode(String code,String phone){
+        //楠岃瘉鐮�
+        Smsrecord smsrecord = smsrecordMapper.selectOne(new QueryWrapper<Smsrecord>().lambda()
+                .eq(Smsrecord::getDeleted,Constants.ZERO)
+                .eq(Smsrecord::getCode,code)
+                .eq(Smsrecord::getPhone,phone)
+                .last(" limit 1")
+        );
+        if(Objects.isNull(smsrecord)){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"楠岃瘉鐮侀敊璇紒");
+        }
+        if(!Constants.equalsInteger(smsrecord.getStatus(),Constants.ZERO)){
+            if(Constants.equalsInteger(smsrecord.getStatus(),Constants.ONE)){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"楠岃瘉鐮佸凡浣跨敤");
+            }else{
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"楠岃瘉鐮佸凡杩囨湡");
+            }
+        }
+        smsrecordMapper.update(new UpdateWrapper<Smsrecord>().lambda()
+                .set(Smsrecord::getStatus,Constants.ONE)
+                .eq(Smsrecord::getId,smsrecord.getId())
+        );
+    }
+
+    @Override
+    public void updateUserPhone(UpdMobileRequest request){
+        if(Objects.isNull(request)
+                || Objects.isNull(request.getMemberId())
+                || StringUtils.isBlank(request.getPhone())
+                || StringUtils.isBlank(request.getCode())
+        ){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        //鍒ゆ柇鏂版墜鏈哄彿鏄惁宸茶浣跨敤
+        if(memberMapper.selectCount(new QueryWrapper<Member>().lambda().eq(Member::getTelephone,request.getPhone()))>Constants.ZERO){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀵逛笉璧�,鏂版墜鏈哄彿宸茶缁戝畾,鏃犳硶杩涜鎹㈢粦锛�");
+        }
+        Member member = memberMapper.selectById(request.getMemberId());
+        if(StringUtils.isNotBlank(member.getTelephone())&&member.getTelephone().equals(request.getPhone())){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鏃犳硶鏇存崲鐩稿悓鎵嬫満鍙�");
+        }
+        this.verifyPhoneCode(request.getCode(),request.getPhone());
+        memberMapper.update(new UpdateWrapper<Member>().lambda()
+                .set(Member::getTelephone,request.getPhone())
+                .eq(Member::getId,request.getMemberId())
+        );
+    }
+
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/OrderLogServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/OrderLogServiceImpl.java
new file mode 100644
index 0000000..6d8492a
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/service/business/impl/OrderLogServiceImpl.java
@@ -0,0 +1,139 @@
+package com.doumee.service.business.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.doumee.core.constants.Constants;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.OrderLogMapper;
+import com.doumee.dao.business.model.OrderLog;
+import com.doumee.service.business.OrderLogService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 璁㈠崟鎿嶄綔鏃ュ織Service瀹炵幇
+ * @author rk
+ * @date 2026/04/13
+ */
+@Service
+public class OrderLogServiceImpl implements OrderLogService {
+
+    @Autowired
+    private OrderLogMapper orderLogMapper;
+
+    @Override
+    public Integer create(OrderLog orderLog) {
+        orderLogMapper.insert(orderLog);
+        return orderLog.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        orderLogMapper.update(new UpdateWrapper<OrderLog>().lambda()
+                .set(OrderLog::getDeleted, Constants.ONE)
+                .eq(OrderLog::getId, id));
+    }
+
+    @Override
+    public void delete(OrderLog orderLog) {
+        UpdateWrapper<OrderLog> deleteWrapper = new UpdateWrapper<>(orderLog);
+        orderLogMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (ids == null || ids.isEmpty()) {
+            return;
+        }
+        for (Integer id : ids) {
+            this.deleteById(id);
+        }
+    }
+
+    @Override
+    public void updateById(OrderLog orderLog) {
+        orderLogMapper.updateById(orderLog);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<OrderLog> orderLogs) {
+        if (orderLogs == null || orderLogs.isEmpty()) {
+            return;
+        }
+        for (OrderLog orderLog : orderLogs) {
+            this.updateById(orderLog);
+        }
+    }
+
+    @Override
+    public OrderLog findById(Integer id) {
+        OrderLog orderLog = orderLogMapper.selectById(id);
+        if (Objects.isNull(orderLog)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        return orderLog;
+    }
+
+    @Override
+    public OrderLog findOne(OrderLog orderLog) {
+        QueryWrapper<OrderLog> wrapper = new QueryWrapper<>(orderLog);
+        return orderLogMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<OrderLog> findList(OrderLog orderLog) {
+        QueryWrapper<OrderLog> wrapper = new QueryWrapper<>(orderLog);
+        return orderLogMapper.selectList(wrapper);
+    }
+
+    @Override
+    public PageData<OrderLog> findPage(PageWrap<OrderLog> pageWrap) {
+        IPage<OrderLog> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<OrderLog> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        pageWrap.getModel().setDeleted(Constants.ZERO);
+        queryWrapper.lambda().eq(OrderLog::getDeleted, pageWrap.getModel().getDeleted());
+        if (pageWrap.getModel().getOrderId() != null) {
+            queryWrapper.lambda().eq(OrderLog::getOrderId, pageWrap.getModel().getOrderId());
+        }
+        if (StringUtils.isNotBlank(pageWrap.getModel().getTitle())) {
+            queryWrapper.lambda().like(OrderLog::getTitle, pageWrap.getModel().getTitle());
+        }
+        if (pageWrap.getModel().getOrderStatus() != null) {
+            queryWrapper.lambda().eq(OrderLog::getOrderStatus, pageWrap.getModel().getOrderStatus());
+        }
+        if (pageWrap.getModel().getObjType() != null) {
+            queryWrapper.lambda().eq(OrderLog::getObjType, pageWrap.getModel().getObjType());
+        }
+        if (pageWrap.getModel().getOptUserType() != null) {
+            queryWrapper.lambda().eq(OrderLog::getOptUserType, pageWrap.getModel().getOptUserType());
+        }
+        if (pageWrap.getModel().getOptUserId() != null) {
+            queryWrapper.lambda().eq(OrderLog::getOptUserId, pageWrap.getModel().getOptUserId());
+        }
+        for (PageWrap.SortData sortData : pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(orderLogMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(OrderLog orderLog) {
+        QueryWrapper<OrderLog> wrapper = new QueryWrapper<>(orderLog);
+        return orderLogMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/OrdersRefundServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/OrdersRefundServiceImpl.java
new file mode 100644
index 0000000..f05f6b0
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/service/business/impl/OrdersRefundServiceImpl.java
@@ -0,0 +1,113 @@
+package com.doumee.service.business.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.OrdersRefundMapper;
+import com.doumee.dao.business.model.OrdersRefund;
+import com.doumee.service.business.OrdersRefundService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 璁㈠崟閫�娆捐褰昐ervice瀹炵幇
+ * @author rk
+ * @date 2026/04/13
+ */
+@Service
+public class OrdersRefundServiceImpl implements OrdersRefundService {
+
+    @Autowired
+    private OrdersRefundMapper ordersRefundMapper;
+
+    @Override
+    public Integer create(OrdersRefund ordersRefund) {
+        ordersRefundMapper.insert(ordersRefund);
+        return ordersRefund.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        ordersRefundMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(OrdersRefund ordersRefund) {
+        QueryWrapper<OrdersRefund> deleteWrapper = new QueryWrapper<>(ordersRefund);
+        ordersRefundMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        ordersRefundMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(OrdersRefund ordersRefund) {
+        ordersRefundMapper.updateById(ordersRefund);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<OrdersRefund> ordersRefunds) {
+        if (CollectionUtils.isEmpty(ordersRefunds)) {
+            return;
+        }
+        for (OrdersRefund ordersRefund : ordersRefunds) {
+            this.updateById(ordersRefund);
+        }
+    }
+
+    @Override
+    public OrdersRefund findById(Integer id) {
+        return ordersRefundMapper.selectById(id);
+    }
+
+    @Override
+    public OrdersRefund findOne(OrdersRefund ordersRefund) {
+        QueryWrapper<OrdersRefund> wrapper = new QueryWrapper<>(ordersRefund);
+        return ordersRefundMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<OrdersRefund> findList(OrdersRefund ordersRefund) {
+        QueryWrapper<OrdersRefund> wrapper = new QueryWrapper<>(ordersRefund);
+        return ordersRefundMapper.selectList(wrapper);
+    }
+
+    @Override
+    public PageData<OrdersRefund> findPage(PageWrap<OrdersRefund> pageWrap) {
+        IPage<OrdersRefund> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<OrdersRefund> queryWrapper = new QueryWrapper<>();
+        OrdersRefund model = pageWrap.getModel();
+        if (model != null) {
+            if (model.getOrderId() != null) {
+                queryWrapper.lambda().eq(OrdersRefund::getOrderId, model.getOrderId());
+            }
+            if (model.getType() != null) {
+                queryWrapper.lambda().eq(OrdersRefund::getType, model.getType());
+            }
+        }
+        for (PageWrap.SortData sortData : pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(ordersRefundMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(OrdersRefund ordersRefund) {
+        QueryWrapper<OrdersRefund> wrapper = new QueryWrapper<>(ordersRefund);
+        return ordersRefundMapper.selectCount(wrapper);
+    }
+}
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 414e48e..566ad1d 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
@@ -4,23 +4,54 @@
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.doumee.biz.system.AreasBiz;
+import com.doumee.biz.system.OperationConfigBiz;
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.config.wx.WxMiniConfig;
+import com.doumee.config.wx.WxMiniUtilService;
 import com.doumee.core.constants.Constants;
 import com.doumee.core.constants.ResponseStatus;
 import com.doumee.core.exception.BusinessException;
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.DateUtil;
+import com.doumee.core.utils.Tencent.MapUtil;
 import com.doumee.core.utils.Utils;
-import com.doumee.dao.business.OrdersMapper;
-import com.doumee.dao.business.model.Category;
-import com.doumee.dao.business.model.Orders;
+import com.doumee.dao.business.*;
+import com.doumee.dao.business.model.*;
+import com.doumee.dao.system.SystemUserMapper;
+import com.doumee.dao.system.model.SystemUser;
+import com.doumee.dao.dto.CalculateLocalPriceDTO;
+import com.doumee.dao.dto.CalculateRemotePriceDTO;
+import com.doumee.dao.dto.CreateOrderDTO;
+import com.doumee.dao.dto.DispatchDTO;
+import com.doumee.dao.dto.MyOrderDTO;
+import com.doumee.dao.dto.OrderItemDTO;
+import com.doumee.dao.vo.*;
+import com.doumee.service.business.OrderLogService;
 import com.doumee.service.business.OrdersService;
+import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.alibaba.fastjson.JSONObject;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
 
-import java.util.List;
-import java.util.Objects;
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 /**
  * 瀵勫瓨璁㈠崟淇℃伅Service瀹炵幇
@@ -32,6 +63,50 @@
 
     @Autowired
     private OrdersMapper ordersMapper;
+
+    @Autowired
+    private MemberMapper memberMapper;
+
+    @Autowired
+    private ShopInfoMapper shopInfoMapper;
+
+    @Autowired
+    private DriverInfoMapper driverInfoMapper;
+
+    @Autowired
+    private CategoryMapper categoryMapper;
+
+    @Autowired
+    private MultifileMapper multifileMapper;
+
+    @Autowired
+    private OrdersDetailMapper ordersDetailMapper;
+
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+
+    @Autowired
+    private OrderLogService orderLogService;
+
+    @Autowired
+    private OrdersRefundMapper ordersRefundMapper;
+
+    @Autowired
+    private WxMiniUtilService wxMiniUtilService;
+
+    @Autowired
+    private SystemUserMapper systemUserMapper;
+
+    @Autowired
+    private PricingRuleMapper pricingRuleMapper;
+    @Autowired
+    private RedisTemplate<String, Object> redisTemplate;
+
+    @Autowired
+    private AreasBiz areasBiz;
+
+    @Autowired
+    private OperationConfigBiz operationConfigBiz;
 
     @Override
     public Integer create(Orders orders) {
@@ -102,11 +177,18 @@
         MPJLambdaWrapper<Orders> queryWrapper = new MPJLambdaWrapper<Orders>()
                 .selectAll(Orders.class)
                 .selectAs(Category::getDetail, Orders::getOrderLevel)
-                .leftJoin(Category.class, Category::getId, Orders::getGoodType);
+                .select("s1.name", Orders::getDepositShopName)
+                .leftJoin(Category.class, Category::getId, Orders::getGoodType)
+                .leftJoin(DriverInfo.class, DriverInfo::getId, Orders::getAcceptDriver)
+                .leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID")
+                .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID");
+                ;
         Utils.MP.blankToNull(pageWrap.getModel());
         pageWrap.getModel().setDeleted(Constants.ZERO);
         queryWrapper.eq(pageWrap.getModel().getDeleted() != null, Orders::getDeleted, pageWrap.getModel().getDeleted());
         queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getCode()), Orders::getCode, pageWrap.getModel().getCode());
+        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getDepositShopName()), "s1.name", pageWrap.getModel().getDepositShopName());
+        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getTakeShopName()),  "s2.name",  pageWrap.getModel().getTakeShopName());
         queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getGoodsInfo()), Orders::getGoodsInfo, pageWrap.getModel().getGoodsInfo());
         queryWrapper.ge(pageWrap.getModel().getCreateStartTime() != null, Orders::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateStartTime()));
         queryWrapper.le(pageWrap.getModel().getCreateEndTime() != null, Orders::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateEndTime()));
@@ -114,6 +196,8 @@
         queryWrapper.eq(pageWrap.getModel().getType() != null, Orders::getType, pageWrap.getModel().getType());
         queryWrapper.eq(pageWrap.getModel().getStatus() != null, Orders::getStatus, pageWrap.getModel().getStatus());
         queryWrapper.eq(pageWrap.getModel().getTakeShopId() != null, Orders::getTakeShopId, pageWrap.getModel().getTakeShopId());
+        queryWrapper.and(pageWrap.getModel().getDriverKeyword() != null, i->i.like(DriverInfo::getName, pageWrap.getModel().getDriverKeyword())
+                .or().like(DriverInfo::getTelephone, pageWrap.getModel().getDriverKeyword()));
         for (PageWrap.SortData sortData : pageWrap.getSorts()) {
             if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                 queryWrapper.orderByDesc(sortData.getProperty());
@@ -125,9 +209,1847 @@
     }
 
     @Override
+    public OrderSummaryVO findSummary(PageWrap<Orders> pageWrap) {
+        // 鏋勫缓涓巉indPage鐩稿悓鐨勬煡璇㈡潯浠�
+        MPJLambdaWrapper<Orders> queryWrapper = new MPJLambdaWrapper<Orders>()
+                .leftJoin(Category.class, Category::getId, Orders::getGoodType)
+                .leftJoin(DriverInfo.class, DriverInfo::getId, Orders::getAcceptDriver)
+                .leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID")
+                .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID");
+        Utils.MP.blankToNull(pageWrap.getModel());
+        pageWrap.getModel().setDeleted(Constants.ZERO);
+        queryWrapper.eq(pageWrap.getModel().getDeleted() != null, Orders::getDeleted, pageWrap.getModel().getDeleted());
+        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getCode()), Orders::getCode, pageWrap.getModel().getCode());
+        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getDepositShopName()), "s1.name", pageWrap.getModel().getDepositShopName());
+        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getTakeShopName()),  "s2.name",  pageWrap.getModel().getTakeShopName());
+        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getGoodsInfo()), Orders::getGoodsInfo, pageWrap.getModel().getGoodsInfo());
+        queryWrapper.ge(pageWrap.getModel().getCreateStartTime() != null, Orders::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateStartTime()));
+        queryWrapper.le(pageWrap.getModel().getCreateEndTime() != null, Orders::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateEndTime()));
+        queryWrapper.eq(pageWrap.getModel().getDepositShopId() != null, Orders::getDepositShopId, pageWrap.getModel().getDepositShopId());
+        queryWrapper.eq(pageWrap.getModel().getType() != null, Orders::getType, pageWrap.getModel().getType());
+        queryWrapper.eq(pageWrap.getModel().getStatus() != null, Orders::getStatus, pageWrap.getModel().getStatus());
+        queryWrapper.eq(pageWrap.getModel().getTakeShopId() != null, Orders::getTakeShopId, pageWrap.getModel().getTakeShopId());
+        queryWrapper.and(pageWrap.getModel().getDriverKeyword() != null, i->i.like(DriverInfo::getName, pageWrap.getModel().getDriverKeyword())
+                .or().like(DriverInfo::getTelephone, pageWrap.getModel().getDriverKeyword()));
+
+        queryWrapper.select(
+                "IFNULL(SUM(t.total_amount), 0) as total_amount_sum",
+                "IFNULL(SUM(CASE WHEN t.settlement_status = 1 THEN t.total_amount ELSE 0 END), 0) as settled_total_amount_sum",
+                "IFNULL(SUM(t.driver_fee), 0) as driver_fee_sum",
+                "IFNULL(SUM(CASE WHEN t.settlement_status = 1 THEN t.driver_fee ELSE 0 END), 0) as settled_driver_fee_sum"
+        );
+        queryWrapper.groupBy("1=1");
+
+        List<Map<String, Object>> result = ordersMapper.selectJoinMaps(queryWrapper);
+        OrderSummaryVO vo = new OrderSummaryVO();
+        if (result != null && !result.isEmpty()) {
+            Map<String, Object> row = result.get(0);
+            vo.setTotalAmountSum(toLong(row.get("total_amount_sum")));
+            vo.setSettledTotalAmountSum(toLong(row.get("settled_total_amount_sum")));
+            vo.setDriverFeeSum(toLong(row.get("driver_fee_sum")));
+            vo.setSettledDriverFeeSum(toLong(row.get("settled_driver_fee_sum")));
+        } else {
+            vo.setTotalAmountSum(0L);
+            vo.setSettledTotalAmountSum(0L);
+            vo.setDriverFeeSum(0L);
+            vo.setSettledDriverFeeSum(0L);
+        }
+        return vo;
+    }
+
+    private Long toLong(Object val) {
+        if (val == null) return 0L;
+        if (val instanceof Number) return ((Number) val).longValue();
+        return Long.parseLong(val.toString());
+    }
+
+    @Override
+    public BigDecimal calculateInsuranceFee(BigDecimal declaredValue) {
+        if (declaredValue == null || declaredValue.compareTo(BigDecimal.ZERO) <= 0) {
+            return BigDecimal.ZERO;
+        }
+        String rateStr = systemDictDataBiz.queryByCode(Constants.OPERATION_CONFIG, Constants.OP_INSURANCE_RATE).getCode();
+        BigDecimal rate = new BigDecimal(rateStr);
+        return declaredValue.multiply(rate).setScale(2, BigDecimal.ROUND_HALF_UP);
+    }
+
+    /**
+     * 璁$畻灏卞湴瀛樺彇棰勪及璐圭敤
+     *
+     * 璁$畻瑙勫垯锛�
+     * 1. 鏍规嵁鍩庡競+鐗╁搧绫诲瀷 鏌ヨ pricing_rule(type=0)锛宖ieldA=categoryId, fieldB=鍗曚环(鍒�/澶�)
+     * 2. 姣忛」灏忚 = 鍗曚环 脳 鏁伴噺 脳 澶╂暟
+     * 3. 鐗╁搧浠锋牸 = 鍚勯」灏忚涔嬪拰
+     * 4. 淇濅环璐圭敤 = 鎶ヤ环閲戦 脳 淇濅环璐圭巼锛堝瓧鍏� INSURANCE_RATE锛夛紝鍏冭浆鍒�
+     * 5. 鎬讳环鏍� = 鐗╁搧浠锋牸 + 淇濅环璐圭敤
+     *
+     * @param dto 灏卞湴瀛樺彇璁′环璇锋眰鍙傛暟
+     * @return 浠锋牸璁$畻缁撴灉
+     */
+    @Override
+    public PriceCalculateVO calculateLocalPrice(CalculateLocalPriceDTO dto) {
+        // 澶╂暟鏍¢獙锛屾渶灏�1澶�
+        int days = dto.getEstimatedDepositDays() != null && dto.getEstimatedDepositDays() > 0
+                ? dto.getEstimatedDepositDays() : 1;
+
+        // 鏀堕泦鎵�鏈夌墿鍝佺被鍨婭D
+        List<Integer> categoryIds = new ArrayList<>();
+        for (OrderItemDTO item : dto.getItems()) {
+            categoryIds.add(item.getCategoryId());
+        }
+
+        // 鎵归噺鏌ヨ璁′环瑙勫垯 pricing_rule type=0锛歠ieldA=categoryId, fieldB=鍗曚环(鍒�/澶�)
+        List<String> fieldAList = new ArrayList<>();
+        for (Integer cid : categoryIds) {
+            fieldAList.add(String.valueOf(cid));
+        }
+        List<PricingRule> rules = pricingRuleMapper.selectList(new QueryWrapper<PricingRule>().lambda()
+                .eq(PricingRule::getDeleted, Constants.ZERO)
+                .eq(PricingRule::getType, Constants.ZERO)
+                .eq(PricingRule::getCityId, dto.getCityId())
+                .in(PricingRule::getFieldA, fieldAList));
+        Map<String, PricingRule> ruleMap = new HashMap<>();
+        for (PricingRule r : rules) {
+            ruleMap.put(r.getFieldA(), r);
+        }
+
+        // 鎵归噺鏌ヨ鐗╁搧绫诲瀷鍚嶇О
+        List<Category> categories = categoryMapper.selectBatchIds(categoryIds);
+        Map<Integer, String> categoryNameMap = new HashMap<>();
+        Map<Integer, String> categoryDetailMap = new HashMap<>();
+        for (Category c : categories) {
+            categoryNameMap.put(c.getId(), c.getName());
+            categoryDetailMap.put(c.getId(), c.getDetail());
+        }
+
+        // 璁$畻姣忛」鐗╁搧璐圭敤锛氬皬璁� = 鍗曚环 脳 鏁伴噺 脳 澶╂暟
+        List<ItemPriceVO> itemList = new ArrayList<>();
+        long itemPriceTotal = 0L;
+
+        for (OrderItemDTO item : dto.getItems()) {
+            PricingRule rule = ruleMap.get(String.valueOf(item.getCategoryId()));
+            if (rule == null) {
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),
+                        "鏈壘鍒拌鍩庡競鐗╁搧绫诲瀷鐨勮浠疯鍒�");
+            }
+
+            long unitPrice = Long.parseLong(rule.getFieldB());
+            long subtotal = unitPrice * item.getQuantity() * days;
+
+            ItemPriceVO vo = new ItemPriceVO();
+            vo.setCategoryId(item.getCategoryId());
+            vo.setCategoryName(categoryNameMap.getOrDefault(item.getCategoryId(), ""));
+            vo.setDetail(categoryDetailMap.get(item.getCategoryId()));
+            vo.setQuantity(item.getQuantity());
+            vo.setUnitPrice(unitPrice);
+            vo.setLocallyPrice(unitPrice);
+            vo.setSubtotal(subtotal);
+            itemList.add(vo);
+
+            itemPriceTotal += subtotal;
+        }
+
+        // 淇濅环璐圭敤锛氭姤浠烽噾棰� 脳 淇濅环璐圭巼(瀛楀吀 INSURANCE_RATE)锛屽厓鈫掑垎
+        long insuranceFeeFen = 0L;
+        if (Boolean.TRUE.equals(dto.getInsured()) && dto.getDeclaredAmount() != null) {
+            BigDecimal insuranceFeeYuan = calculateInsuranceFee(dto.getDeclaredAmount());
+            insuranceFeeFen = insuranceFeeYuan.multiply(new BigDecimal(100)).longValue();
+        }
+
+        // 鎬讳环鏍� = 鐗╁搧浠锋牸 + 淇濅环璐圭敤
+        long totalPrice = itemPriceTotal + insuranceFeeFen;
+
+        PriceCalculateVO result = new PriceCalculateVO();
+        result.setItemList(itemList);
+        result.setItemPrice(itemPriceTotal);
+        result.setInsuranceFee(insuranceFeeFen);
+        result.setTotalPrice(totalPrice);
+        result.setDays(days);
+        result.setUrgentFee(0L);
+        return result;
+    }
+
+    /**
+     * 璁$畻寮傚湴瀛樺彇棰勪及璐圭敤
+     *
+     * 璁$畻瑙勫垯锛�
+     * 1. 璋冪敤鑵捐鍦板浘API璁$畻瀵勪欢鐐逛笌鍙栦欢鐐圭殑椹捐溅璺濈(绫斥啋鍏噷)
+     * 2. 鏍规嵁鍩庡競+鐗╁搧绫诲瀷 鏌ヨ pricing_rule(type=1)锛�
+     *    fieldB=璧锋璺濈(km), fieldC=璧锋浠�(鍒�), fieldD=瓒呭嚭璺濈鍗曚綅(km), fieldE=瓒呭嚭璺濈鍗曚环(鍒�)
+     * 3. 姣忛」杩愯垂鍗曚环锛�
+     *    - 璺濈 鈮� 璧锋璺濈 鈫� 鍗曚环 = 璧锋浠�
+     *    - 璺濈 > 璧锋璺濈 鈫� 鍗曚环 = 璧锋浠� + ceil((璺濈-璧锋璺濈)/瓒呭嚭璺濈鍗曚綅) 脳 瓒呭嚭璺濈鍗曚环
+     * 4. 灏忚 = 杩愯垂鍗曚环 脳 鏁伴噺
+     * 5. 鐗╁搧浠锋牸 = 鍚勯」灏忚涔嬪拰
+     * 6. 淇濅环璐圭敤 = 鎶ヤ环閲戦 脳 淇濅环璐圭巼锛堝瓧鍏� INSURANCE_RATE锛夛紝鍏冭浆鍒�
+     * 7. 鍔犳�ヨ垂鐢� = 鐗╁搧浠锋牸 脳 鍔犳�ョ郴鏁帮紙瀛楀吀 URGENT_COEFFICIENT锛�
+     * 8. 鎬讳环鏍� = 鐗╁搧浠锋牸 + 淇濅环璐圭敤 + 鍔犳�ヨ垂鐢�
+     *
+     * @param dto 寮傚湴瀛樺彇璁′环璇锋眰鍙傛暟
+     * @return 浠锋牸璁$畻缁撴灉
+     */
+    @Override
+    public PriceCalculateVO calculateRemotePrice(CalculateRemotePriceDTO dto) {
+        // 1. 璋冪敤鑵捐鍦板浘璺濈鐭╅樀API璁$畻椹捐溅璺濈
+        String from = dto.getFromLat() + "," + dto.getFromLgt();
+        String to = dto.getToLat() + "," + dto.getToLgt();
+        JSONObject distanceResult = MapUtil.distanceSingle("driving", from, to);
+        BigDecimal distance = distanceResult.getBigDecimal("distance");
+        // distance 鍗曚綅涓虹背锛岃浆涓哄叕閲�
+        BigDecimal distanceKm = distance.divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP);
+
+        // 鏀堕泦鎵�鏈夌墿鍝佺被鍨婭D
+        List<Integer> categoryIds = new ArrayList<>();
+        for (OrderItemDTO item : dto.getItems()) {
+            categoryIds.add(item.getCategoryId());
+        }
+
+        // 2. 鎵归噺鏌ヨ閰嶉�佽浠疯鍒� pricing_rule type=1
+        List<String> fieldAList = new ArrayList<>();
+        for (Integer cid : categoryIds) {
+            fieldAList.add(String.valueOf(cid));
+        }
+        List<PricingRule> rules = pricingRuleMapper.selectList(new QueryWrapper<PricingRule>().lambda()
+                .eq(PricingRule::getDeleted, Constants.ZERO)
+                .eq(PricingRule::getType, Constants.ONE)
+                .eq(PricingRule::getCityId, dto.getCityId())
+                .in(PricingRule::getFieldA, fieldAList));
+        Map<String, PricingRule> ruleMap = new HashMap<>();
+        for (PricingRule r : rules) {
+            ruleMap.put(r.getFieldA(), r);
+        }
+
+        // 鏌ヨ灏卞湴瀛樺彇璁′环瑙勫垯 pricing_rule type=0锛岀敤浜庤幏鍙� locallyPrice
+        List<PricingRule> localRules = pricingRuleMapper.selectList(new QueryWrapper<PricingRule>().lambda()
+                .eq(PricingRule::getDeleted, Constants.ZERO)
+                .eq(PricingRule::getType, Constants.ZERO)
+                .eq(PricingRule::getCityId, dto.getCityId())
+                .in(PricingRule::getFieldA, fieldAList));
+        Map<String, PricingRule> localRuleMap = new HashMap<>();
+        for (PricingRule r : localRules) {
+            localRuleMap.put(r.getFieldA(), r);
+        }
+
+        // 鎵归噺鏌ヨ鐗╁搧绫诲瀷鍚嶇О
+        List<Category> categories = categoryMapper.selectBatchIds(categoryIds);
+        Map<Integer, String> categoryNameMap = new HashMap<>();
+        Map<Integer, String> categoryDetailMap = new HashMap<>();
+        for (Category c : categories) {
+            categoryNameMap.put(c.getId(), c.getName());
+            categoryDetailMap.put(c.getId(), c.getDetail());
+        }
+
+        // 3. 閫愰」璁$畻杩愯垂锛氳捣姝ヤ环 + 瓒呭嚭閮ㄥ垎闃舵浠�
+        List<ItemPriceVO> itemList = new ArrayList<>();
+        long itemPriceTotal = 0L;
+
+        for (OrderItemDTO item : dto.getItems()) {
+            PricingRule rule = ruleMap.get(String.valueOf(item.getCategoryId()));
+            if (rule == null) {
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),
+                        "鏈壘鍒拌鍩庡競鐗╁搧绫诲瀷鐨勯厤閫佽浠疯鍒�");
+            }
+
+            // fieldB=璧锋璺濈(km), fieldC=璧锋浠�(鍒�), fieldD=瓒呭嚭璺濈鍗曚綅(km), fieldE=瓒呭嚭璺濈鍗曚环(鍒�)
+            BigDecimal startDistance = new BigDecimal(rule.getFieldB());
+            long startPrice = Long.parseLong(rule.getFieldC());
+            BigDecimal extraDistanceUnit = new BigDecimal(rule.getFieldD());
+            long extraPricePerUnit = Long.parseLong(rule.getFieldE());
+
+            // 闃舵璁′环锛氳窛绂� 鈮� 璧锋璺濈鍙栬捣姝ヤ环锛岃秴鍑烘寜 ceil(瓒呭嚭璺濈/鍗曚綅) 脳 鍗曚环绱姞
+            long unitPrice;
+            if (distanceKm.compareTo(startDistance) <= 0) {
+                unitPrice = startPrice;
+            } else {
+                BigDecimal extraKm = distanceKm.subtract(startDistance);
+                BigDecimal extraCount = extraKm.divide(extraDistanceUnit, 0, RoundingMode.CEILING);
+                unitPrice = startPrice + extraCount.longValue() * extraPricePerUnit;
+            }
+
+            long subtotal = unitPrice * item.getQuantity();
+
+            // 灏卞湴瀛樺彇鍗曚环
+            PricingRule localRule = localRuleMap.get(String.valueOf(item.getCategoryId()));
+            Long locallyPrice = localRule != null ? Long.parseLong(localRule.getFieldB()) : null;
+
+            ItemPriceVO vo = new ItemPriceVO();
+            vo.setCategoryId(item.getCategoryId());
+            vo.setCategoryName(categoryNameMap.getOrDefault(item.getCategoryId(), ""));
+            vo.setDetail(categoryDetailMap.get(item.getCategoryId()));
+            vo.setQuantity(item.getQuantity());
+            vo.setUnitPrice(unitPrice);
+            vo.setLocallyPrice(locallyPrice);
+            vo.setSubtotal(subtotal);
+            vo.setStartDistance(startDistance);
+            vo.setStartPrice(startPrice);
+            vo.setExtraDistance(extraDistanceUnit);
+            vo.setExtraPrice(extraPricePerUnit);
+            itemList.add(vo);
+
+            itemPriceTotal += subtotal;
+        }
+
+        // 4. 淇濅环璐圭敤锛氭姤浠烽噾棰� 脳 淇濅环璐圭巼(瀛楀吀 INSURANCE_RATE)锛屽厓鈫掑垎
+        long insuranceFeeFen = 0L;
+        if (Boolean.TRUE.equals(dto.getInsured()) && dto.getDeclaredAmount() != null) {
+            BigDecimal insuranceFeeYuan = calculateInsuranceFee(dto.getDeclaredAmount());
+            insuranceFeeFen = insuranceFeeYuan.multiply(new BigDecimal(100)).longValue();
+        }
+
+        // 5. 鍔犳�ヨ垂鐢細鐗╁搧浠锋牸 脳 鍔犳�ョ郴鏁�(瀛楀吀 URGENT_COEFFICIENT)
+        long urgentFeeFen = 0L;
+        if (Boolean.TRUE.equals(dto.getUrgent())) {
+            String urgentRateStr = systemDictDataBiz.queryByCode(
+                    Constants.OPERATION_CONFIG, Constants.OP_URGENT_COEFFICIENT).getCode();
+            BigDecimal urgentRate = new BigDecimal(urgentRateStr);
+            urgentFeeFen = new BigDecimal(itemPriceTotal).multiply(urgentRate)
+                    .setScale(0, RoundingMode.HALF_UP).longValue();
+        }
+
+        // 6. 鎬讳环鏍� = 鐗╁搧浠锋牸 + 淇濅环璐圭敤 + 鍔犳�ヨ垂鐢�
+        long totalPrice = itemPriceTotal + insuranceFeeFen + urgentFeeFen;
+
+        PriceCalculateVO result = new PriceCalculateVO();
+        result.setItemList(itemList);
+        result.setItemPrice(itemPriceTotal);
+        result.setInsuranceFee(insuranceFeeFen);
+        result.setUrgentFee(urgentFeeFen);
+        result.setTotalPrice(totalPrice);
+        result.setDistance(distanceKm);
+        return result;
+    }
+
+    @Override
     public long count(Orders orders) {
         QueryWrapper<Orders> wrapper = new QueryWrapper<>(orders);
         return ordersMapper.selectCount(wrapper);
     }
 
+    /**
+     * 鍒涘缓璁㈠崟
+     *
+     * 涓氬姟娴佺▼锛�
+     * 1. 鍙傛暟鏍¢獙锛氬繀濉瓧娈点�佹椂闂撮『搴忋�佺墿鍝佷笉閲嶅銆佸紓鍦板繀濉湇鍔℃椂鏁�
+     * 2. 鏌ヨ瀵勪欢搴楅摵淇℃伅锛堣幏鍙栫粡绾害銆佸湴鍧�锛�
+     * 3. 璋冪敤璁′环鎺ュ彛璁$畻璐圭敤锛坈alculateLocalPrice / calculateRemotePrice锛�
+     * 4. 鐢熸垚璁㈠崟缂栧彿锛欽C + yyyyMMddHHmmss + 4浣嶉殢鏈烘暟
+     * 5. 鍒涘缓璁㈠崟涓昏〃 Orders锛堢姸鎬�=寰呮敮浠橈級
+     * 6. 鍒涘缓璁㈠崟鏄庣粏琛� OrdersDetail锛堟瘡椤圭墿鍝佸昂瀵革級
+     * 7. 鍒涘缓闄勪欢璁板綍 Multifile锛堢墿鍝佸浘鐗� objType=12锛�
+     *
+     * @param dto      鍒涘缓璁㈠崟璇锋眰鍙傛暟
+     * @param memberId 褰撳墠鐧诲綍浼氬憳ID
+     * @return 璁㈠崟ID
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public PayResponse createOrder(CreateOrderDTO dto, Integer memberId) {
+        String lockKey  = Constants.GOODS_ORDER_CREATE_LOCK + memberId;
+        //鍒ゆ柇鍓嶇鏄惁鍦ㄥ悓涓�椤甸潰鍒涘缓浜嗕袱娆¤鍗�
+        if (redisTemplate.hasKey(lockKey)) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"姝e湪鍒涘缓璁㈠崟锛岃鍕块噸澶嶈皟鐢紒");
+        } else {
+            redisTemplate.opsForValue().set(lockKey, "", 5, TimeUnit.SECONDS);
+        }
+        Date now = new Date();
+        // ========== 1. 鍙傛暟鏍¢獙 ==========
+        // 棰勮鍒板簵瀛樹欢鏃堕棿蹇呴』灏忎簬棰勮鍒板簵鍙栦欢鏃堕棿
+        java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm");
+        Date depositTime;
+        Date takeTime;
+        try {
+            depositTime = sdf.parse(dto.getExpectedDepositTime());
+            takeTime = sdf.parse(dto.getExpectedTakeTime());
+        } catch (java.text.ParseException e) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏃堕棿鏍煎紡閿欒锛屾纭牸寮忥細yyyy-MM-dd HH:mm");
+        }
+        if (!depositTime.before(takeTime)) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "棰勮鍒板簵瀛樹欢鏃堕棿蹇呴』灏忎簬棰勮鍒板簵鍙栦欢鏃堕棿");
+        }
+
+        // 鐗╁搧灏哄涓嶈兘閲嶅
+        List<Integer> categoryIds = new ArrayList<>();
+        for (OrderItemDTO item : dto.getItems()) {
+            if (categoryIds.contains(item.getCategoryId())) {
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鐗╁搧灏哄涓嶈兘閲嶅");
+            }
+            categoryIds.add(item.getCategoryId());
+        }
+
+        // 鐗╁搧鍥剧墖鏈�澶�3寮�
+        if (dto.getGoodsImages() != null && dto.getGoodsImages().size() > 3) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鐗╁搧鍥剧墖鏈�澶�3寮�");
+        }
+
+        // ========== 2. 鏍¢獙鐗╁搧绫诲瀷 ==========
+        Category goodTypeCategory = categoryMapper.selectById(dto.getGoodType());
+        if (goodTypeCategory == null || Constants.equalsInteger(goodTypeCategory.getDeleted(), Constants.ONE)) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鐗╁搧绫诲瀷涓嶅瓨鍦�");
+        }
+        if (!Constants.equalsInteger(goodTypeCategory.getType(), Constants.TWO)) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鐗╁搧绫诲瀷鍙傛暟閿欒");
+        }
+
+        // ========== 3. 鏌ヨ瀵勪欢搴楅摵淇℃伅 ==========
+        ShopInfo depositShop = shopInfoMapper.selectById(dto.getDepositShopId());
+        if (depositShop == null) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵勪欢搴楅摵涓嶅瓨鍦�");
+        }
+
+        // ========== 4. 璁$畻璐圭敤 ==========
+
+        // 寮傚湴瀵勫瓨锛氭牎楠屽彇浠剁偣
+        BigDecimal takeLat = null;
+        BigDecimal takeLgt = null;
+        String takeLocationValue = null;
+        ShopInfo takeShop = null;
+        if (Constants.ONE.equals(dto.getType())) {
+            // 寮傚湴蹇呭~鏈嶅姟鏃舵晥
+            if (dto.getIsUrgent() == null) {
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "寮傚湴瀵勫瓨鏈嶅姟鏃舵晥涓嶈兘涓虹┖");
+            }
+            // 鍙栦欢鐐癸細搴楅摵 or 鑷�夌偣锛岃嚦灏戞彁渚涗竴缁�
+            if (dto.getTakeShopId() != null) {
+                takeShop = shopInfoMapper.selectById(dto.getTakeShopId());
+                if (takeShop == null) {
+                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鍙栦欢搴楅摵涓嶅瓨鍦�");
+                }
+                takeLat = BigDecimal.valueOf(takeShop.getLatitude());
+                takeLgt = BigDecimal.valueOf(takeShop.getLongitude());
+                takeLocationValue = takeShop.getAddress();
+            } else if (dto.getTakeLat() != null && dto.getTakeLgt() != null && StringUtils.isNotBlank(dto.getTakeLocation())) {
+                takeLat = dto.getTakeLat();
+                takeLgt = dto.getTakeLgt();
+                takeLocationValue = dto.getTakeLocation();
+            } else {
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇烽�夋嫨鍙栦欢搴楅摵鎴栬緭鍏ヨ嚜閫夊彇浠跺湴鍧�");
+            }
+        } else {
+            // 灏卞湴瀛樺彇锛氬彇浠堕棬搴楀悓瀵勪欢闂ㄥ簵
+            takeShop = depositShop;
+        }
+
+        // ========== 3. 璁$畻璐圭敤 ==========
+        PriceCalculateVO priceResult;
+        if (Constants.ZERO.equals(dto.getType())) {
+            // 灏卞湴瀵勫瓨锛氳绠楀ぉ鏁�
+            long diffMs = takeTime.getTime() - depositTime.getTime();
+            int days = (int) Math.max(1, (diffMs / (1000 * 60 * 60 * 24)) + 1);
+
+            CalculateLocalPriceDTO priceDTO = new CalculateLocalPriceDTO();
+            priceDTO.setCityId(dto.getCityId());
+            priceDTO.setEstimatedDepositDays(days);
+            priceDTO.setItems(dto.getItems());
+            priceDTO.setInsured(dto.getDeclaredAmount() != null && dto.getDeclaredAmount().compareTo(BigDecimal.ZERO) > 0);
+            priceDTO.setDeclaredAmount(dto.getDeclaredAmount());
+            priceResult = calculateLocalPrice(priceDTO);
+        } else {
+            // 寮傚湴瀵勫瓨
+            CalculateRemotePriceDTO priceDTO = new CalculateRemotePriceDTO();
+            priceDTO.setCityId(dto.getCityId());
+            priceDTO.setFromLat(BigDecimal.valueOf(depositShop.getLatitude()));
+            priceDTO.setFromLgt(BigDecimal.valueOf(depositShop.getLongitude()));
+            priceDTO.setToLat(takeLat);
+            priceDTO.setToLgt(takeLgt);
+            priceDTO.setItems(dto.getItems());
+            priceDTO.setInsured(dto.getDeclaredAmount() != null && dto.getDeclaredAmount().compareTo(BigDecimal.ZERO) > 0);
+            priceDTO.setDeclaredAmount(dto.getDeclaredAmount());
+            priceDTO.setUrgent(Constants.ONE.equals(dto.getIsUrgent()));
+            priceResult = calculateRemotePrice(priceDTO);
+        }
+
+        // ========== 5. 鐢熸垚璁㈠崟缂栧彿 ==========
+        String orderCode = "JC" + new java.text.SimpleDateFormat("yyyyMMddHHmmss").format(now)
+                + String.format("%04d", new java.util.Random().nextInt(10000));
+        // 鐢熸垚32浣嶅敮涓�绗笁鏂硅鍗曠紪鍙�
+        String orderTradeNo = generateOrderTradeNo();
+
+        // ========== 6. 鍒涘缓璁㈠崟涓昏〃 ==========
+        Orders orders = new Orders();
+        orders.setCode(orderCode);
+        orders.setOutTradeNo(orderTradeNo);
+        orders.setMemberId(memberId);
+        orders.setType(dto.getType());
+        orders.setCityId(String.valueOf(dto.getCityId()));
+        orders.setStatus(Constants.ZERO); // 寰呮敮浠�
+        orders.setPayStatus(Constants.ZERO); // 鏈敮浠�
+        orders.setCommentStatus(Constants.ZERO); // 鏈瘎浠�
+        orders.setSettlementStatus(Constants.ZERO); // 鏈粨绠�
+        orders.setDeleted(Constants.ZERO);
+        orders.setCreateTime(now);
+        orders.setUpdateTime(now);
+
+        // 瀵勪欢淇℃伅
+        orders.setDepositShopId(dto.getDepositShopId());
+        // 瀛樹欢鍦扮偣锛氱渷甯傚尯鍏ㄨ矾寰� + 鍦板潃鎻忚堪
+        String depositLocationRemark = depositShop.getAddress();
+        if (depositShop.getAreaId() != null) {
+            Areas depositArea = areasBiz.resolveArea(depositShop.getAreaId());
+            if (depositArea != null) {
+                depositLocationRemark = depositArea.getProvinceName() + depositArea.getCityName() + depositArea.getName() + depositShop.getAddress();
+            }
+        }
+        orders.setDepositLocation(depositLocationRemark);
+        orders.setDepositLocationRemark(depositShop.getAddress());
+        orders.setDepositLat(BigDecimal.valueOf(depositShop.getLatitude()));
+        orders.setDepositLgt(BigDecimal.valueOf(depositShop.getLongitude()));
+
+        // 鍙栦欢淇℃伅
+        orders.setTakeUser(dto.getTakeUser());
+        orders.setTakePhone(dto.getTakePhone());
+        orders.setExpectedDepositTime(depositTime);
+        orders.setExpectedTakeTime(takeTime);
+        // 璁$畻棰勮瀛樻斁澶╂暟
+        long dayDiff = (takeTime.getTime() - depositTime.getTime()) / (1000 * 60 * 60 * 24);
+        orders.setEstimatedDepositDays((int) Math.max(1, dayDiff + 1));
+
+        if (Constants.ONE.equals(dto.getType())) {
+            // 寮傚湴锛氬彇浠剁偣淇℃伅
+            orders.setTakeShopId(dto.getTakeShopId());
+            orders.setTakeLocation(takeLocationValue);
+            orders.setTakeLat(takeLat);
+            orders.setTakeLgt(takeLgt);
+            orders.setIsUrgent(dto.getIsUrgent());
+        } else {
+            // 灏卞湴锛氬彇浠剁偣鍚屽瘎浠跺簵閾�
+            orders.setTakeShopId(dto.getDepositShopId());
+            orders.setTakeLocation(depositShop.getAddress());
+            orders.setTakeLat(BigDecimal.valueOf(depositShop.getLatitude()));
+            orders.setTakeLgt(BigDecimal.valueOf(depositShop.getLongitude()));
+            orders.setIsUrgent(Constants.ZERO);
+        }
+
+        // 鐗╁搧淇℃伅
+        orders.setGoodType(dto.getGoodType());
+        // 鎷兼帴鐗╁搧淇℃伅锛氱墿鍝佺被鍨嬪悕绉般�佸昂瀵稿悕绉�*鏁伴噺锛堟暟缁勫瓧绗︿覆锛�
+        List<String> goodsParts = new ArrayList<>();
+        for (ItemPriceVO itemVO : priceResult.getItemList()) {
+            goodsParts.add(itemVO.getCategoryName() + "*" + itemVO.getQuantity());
+        }
+        orders.setGoodsInfo(goodTypeCategory.getName() + "銆�" + String.join("锛�", goodsParts));
+        orders.setRemark(dto.getRemark());
+        orders.setSelfTake(Constants.ZERO);
+
+        // 璐圭敤淇℃伅(鍒�)
+        orders.setBasicAmount(priceResult.getItemPrice());
+        orders.setEstimatedAmount(priceResult.getTotalPrice());
+        orders.setTotalAmount(priceResult.getTotalPrice());
+        orders.setUrgentAmount(priceResult.getUrgentFee());
+        if (dto.getDeclaredAmount() != null && dto.getDeclaredAmount().compareTo(BigDecimal.ZERO) > 0) {
+            orders.setDeclaredAmount(dto.getDeclaredAmount().multiply(new BigDecimal(100)).longValue());
+        } else {
+            orders.setDeclaredAmount(0L);
+        }
+        orders.setDeclaredFee(priceResult.getInsuranceFee());
+        orders.setPrice(priceResult.getItemPrice());
+
+        // 钖叕璁$畻涓庡崰姣斿瓨鍌�
+        calculateAndSetFeeAllocation(orders, depositShop, takeShop);
+
+        ordersMapper.insert(orders);
+        Integer orderId = orders.getId();
+
+        // ========== 7. 鍒涘缓璁㈠崟鏄庣粏 ==========
+        for (ItemPriceVO itemVO : priceResult.getItemList()) {
+            OrdersDetail detail = new OrdersDetail();
+            detail.setOrderId(orderId);
+            detail.setLuggageId(itemVO.getCategoryId());
+            detail.setLuggageName(itemVO.getCategoryName());
+            detail.setLuggageDetail(itemVO.getDetail());
+            detail.setNum(itemVO.getQuantity());
+            detail.setUnitPrice(itemVO.getUnitPrice());
+            detail.setStartDistance(itemVO.getStartDistance());
+            detail.setStartPrice(itemVO.getStartPrice());
+            detail.setExtraDistance(itemVO.getExtraDistance());
+            detail.setExtraPrice(itemVO.getExtraPrice());
+            detail.setLocallyPrice(itemVO.getLocallyPrice());
+            detail.setDeleted(Constants.ZERO);
+            detail.setCreateTime(now);
+            ordersDetailMapper.insert(detail);
+        }
+        // ========== 8. 淇濆瓨鐗╁搧鍥剧墖闄勪欢 ==========
+        if (dto.getGoodsImages() != null && !dto.getGoodsImages().isEmpty()) {
+            int sortNum = 1;
+            for (String imgUrl : dto.getGoodsImages()) {
+                Multifile multifile = new Multifile();
+                multifile.setObjId(orderId);
+                multifile.setObjType(Constants.FileType.ORDER_FILE.getKey());
+                multifile.setType(Constants.ZERO);
+                multifile.setFileurl(imgUrl);
+                multifile.setIsdeleted(Constants.ZERO);
+                multifile.setCreateDate(now);
+                multifile.setSortnum(sortNum++);
+                multifileMapper.insert(multifile);
+            }
+        }
+        // ========== 9. 鍞よ捣寰俊鏀粯 ==========
+        Member member = memberMapper.selectById(memberId);
+        if (member == null || StringUtils.isBlank(member.getOpenid())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鐢ㄦ埛淇℃伅寮傚父锛屾棤娉曞彂璧锋敮浠�");
+        }
+        PayResponse payResponse = wxPay(orders, member.getOpenid(), Constants.OrdersAttach.STORAGE_ORDER);
+        payResponse.setLockKey(lockKey);
+        return payResponse;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public PayResponse continuePay(Integer orderId, Integer memberId) {
+        // 1. 鏌ヨ璁㈠崟
+        Orders orders = ordersMapper.selectById(orderId);
+        if (Objects.isNull(orders) || Constants.equalsInteger(orders.getDeleted(), Constants.ONE)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        // 2. 鏍¢獙璁㈠崟褰掑睘
+        if (!Constants.equalsInteger(orders.getMemberId(), memberId)) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "鏃犳潈鎿嶄綔璇ヨ鍗�");
+        }
+        // 3. 鏍¢獙璁㈠崟鐘舵�侊細浠呭緟鏀粯鍙户缁敮浠�
+        if (!Constants.equalsInteger(orders.getStatus(), Constants.ZERO)) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "褰撳墠璁㈠崟鐘舵�佷笉鏀寔缁х画鏀粯");
+        }
+        // 4. 鏍¢獙鏀粯閲戦
+        if (orders.getTotalAmount() == null || orders.getTotalAmount() <= 0) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璁㈠崟閲戦寮傚父锛屾棤娉曞彂璧锋敮浠�");
+        }
+        // 5. 閲嶆柊鐢熸垚绗笁鏂硅鍗曠紪鍙凤紙閬垮厤閲嶅锛�
+        String orderTradeNo = generateOrderTradeNo();
+        orders.setOutTradeNo(orderTradeNo);
+        orders.setUpdateTime(new Date());
+        ordersMapper.updateById(orders);
+        // 6. 鍞よ捣寰俊鏀粯
+        Member member = memberMapper.selectById(memberId);
+        if (member == null || StringUtils.isBlank(member.getOpenid())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鐢ㄦ埛淇℃伅寮傚父锛屾棤娉曞彂璧锋敮浠�");
+        }
+        return wxPay(orders, member.getOpenid(), Constants.OrdersAttach.STORAGE_ORDER);
+    }
+
+    /**
+     * 鍞よ捣寰俊灏忕▼搴忔敮浠�
+     *
+     * @param orders       璁㈠崟瀹炰綋锛堥渶瑕� code銆乼otalAmount锛�
+     * @param openid       鐢ㄦ埛寰俊openid
+     * @param ordersAttach 璁㈠崟鏀粯绫诲瀷
+     * @return PayResponse 鍖呭惈寰俊璋冭捣鍙傛暟鍜岃鍗曚富閿�
+     */
+    private PayResponse wxPay(Orders orders, String openid, Constants.OrdersAttach ordersAttach) {
+        try {
+            WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest();
+            request.setBody(ordersAttach.getName());
+            request.setAttach(ordersAttach.getKey());
+            request.setOutTradeNo(orders.getOutTradeNo());
+            // totalAmount 鍗曚綅涓哄垎锛學eChat Pay setTotalFee 涔熸槸鍒嗭紝鐩存帴杞琲nt
+            long totalFee = orders.getTotalAmount() != null ? orders.getTotalAmount() : 0L;
+            request.setTotalFee((int) totalFee);
+            request.setTimeStart(DateUtil.DateToString(new Date(), "yyyyMMddHHmmss"));
+            request.setSpbillCreateIp(Constants.getIpAddr());
+            request.setOpenid(openid);
+
+            Object response = WxMiniConfig.wxPayService.createOrder(request);
+
+            PayResponse payResponse = new PayResponse();
+            payResponse.setResponse(response);
+            payResponse.setOrderId(orders.getId());
+            return payResponse;
+        } catch (WxPayException e) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏀粯璋冭捣澶辫触锛�" + e.getMessage());
+        }
+    }
+
+
+
+
+
+    @Override
+    public OrderDetailVO findDetail(Integer id) {
+        Orders order = ordersMapper.selectById(id);
+        if (Objects.isNull(order)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+
+        OrderDetailVO vo = new OrderDetailVO();
+        vo.setOrder(order);
+
+        // 鍥剧墖璺緞鍓嶇紑
+        String imgPrefix = getOrdersPrefix();
+
+        // 涓嬪崟鍥剧墖 (type=12)
+        vo.setOrderFiles(getFileUrls(id, Constants.FileType.ORDER_FILE.getKey(), imgPrefix));
+
+        // 浼氬憳淇℃伅
+        if (order.getMemberId() != null) {
+            Member member = memberMapper.selectById(order.getMemberId());
+            if (member != null) {
+                vo.setMemberName(member.getName());
+                vo.setMemberPhone(member.getTelephone());
+            }
+        }
+
+        // 瀵勫瓨闂ㄥ簵淇℃伅
+        if (order.getDepositShopId() != null) {
+            ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId());
+            if (depositShop != null) {
+                vo.setDepositShopName(depositShop.getName());
+                vo.setDepositShopPhone(depositShop.getLinkPhone());
+            }
+        }
+
+        // 鍙栦欢闂ㄥ簵淇℃伅
+        if (order.getTakeShopId() != null) {
+            ShopInfo takeShop = shopInfoMapper.selectById(order.getTakeShopId());
+            if (takeShop != null) {
+                vo.setTakeShopName(takeShop.getName());
+                vo.setTakeShopAddress(takeShop.getAddress());
+                vo.setTakeShopPhone(takeShop.getLinkPhone());
+            }
+        }
+
+        // 鎺ュ崟鍙告満淇℃伅
+        if (order.getAcceptDriver() != null) {
+            DriverInfo driverInfo = driverInfoMapper.selectById(order.getAcceptDriver());
+            if (driverInfo != null) {
+                vo.setDriverName(driverInfo.getName());
+            }
+        }
+
+        // 閰嶉�侀檮浠跺浘鐗�
+        vo.setDepositImages(getFileUrls(id, Constants.FileType.ORDER_DEPOSIT.getKey(), imgPrefix));
+        vo.setStoreInImages(getFileUrls(id, Constants.FileType.ORDER_TAKE.getKey(), imgPrefix));
+        vo.setDriverTakeImages(getFileUrls(id, Constants.FileType.DRIVER_TAKE.getKey(), imgPrefix));
+        vo.setDriverDoneImages(getFileUrls(id, Constants.FileType.DRIVER_DONE.getKey(), imgPrefix));
+        vo.setStoreOutImages(getFileUrls(id, Constants.FileType.STORE_OUT.getKey(), imgPrefix));
+        // 鐗╁搧鏄庣粏
+        vo.setDetailList(buildDetailList(id));
+        Category category = categoryMapper.selectById(order.getGoodType());
+        if(CollectionUtils.isNotEmpty(vo.getDetailList())&&Objects.nonNull(category)){
+            for (OrderItemVO v:vo.getDetailList()) {
+                v.setTypeName(category.getName());
+            }
+        }
+
+        // 鍙栨秷/閫�娆剧姸鎬佹椂鏌ヨ閫�娆捐褰�
+        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()
+                            .eq(OrdersRefund::getOrderId, id)
+                            .eq(OrdersRefund::getDeleted, Constants.ZERO)
+                            .orderByDesc(OrdersRefund::getCreateTime)
+                            .last("limit 1"));
+            if (ordersRefund != null) {
+                vo.setOrdersRefund(ordersRefund);
+                // 閫�娆炬柟寮忥細1=骞冲彴鐩存帴鍙栨秷 鈫� 杩斿洖骞冲彴鎿嶄綔浜哄悕绉�
+                if (Constants.equalsInteger(ordersRefund.getType(), Constants.ONE) && ordersRefund.getUserId() != null) {
+                    // userId 鍏宠仈 system_user 琛紝鏌ヨ鎿嶄綔浜哄悕绉�
+                    vo.setPlatformUserName(getPlatformUserName(ordersRefund.getUserId()));
+                }
+                // 閫�娆炬柟寮忥細2=宸插瓨浠剁敵璇峰彇娑� 鈫� 杩斿洖閫�娆惧彇浠跺浘鐗� (multifile objType=14)
+                if (Constants.equalsInteger(ordersRefund.getType(), Constants.TWO)) {
+                    vo.setRefundTakeImages(getFileUrls(id, Constants.FileType.REFUND_TAKE.getKey(), imgPrefix));
+                }
+            }
+        }
+
+        return vo;
+    }
+
+    @Override
+    public OrderDispatchVO findDispatchInfo(Integer id) {
+        Orders order = ordersMapper.selectById(id);
+        if (Objects.isNull(order)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+
+        OrderDispatchVO vo = new OrderDispatchVO();
+        vo.setCode(order.getCode());
+        vo.setPayAmountYuan(order.getPayAmount() != null ? Constants.getFormatMoney(order.getPayAmount()) : 0);
+        vo.setType(order.getType());
+        vo.setTypeDesc(order.getType() != null && order.getType() == Constants.ONE ? "寮傚湴瀛樺彇" : "灏卞湴瀛樺彇");
+        vo.setDetailList(buildDetailList(id));
+
+        return vo;
+    }
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
+    public void dispatch(DispatchDTO dto) {
+        // 鍙傛暟鏍¢獙
+        if (dto == null || dto.getOrderId() == null || dto.getUrgentFee() == null) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璁㈠崟涓婚敭鍜屽姞鎬ヨ垂鐢ㄤ笉鑳戒负绌�");
+        }
+
+        Orders order = ordersMapper.selectById(dto.getOrderId());
+        if (Objects.isNull(order)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+
+        // 鍓嶇疆鏉′欢鏍¢獙锛氬紓鍦板瓨鍙� + 宸插瘎瀛�
+        if (!Constants.ONE.equals(order.getType())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "浠呮敮鎸佸紓鍦板瓨鍙栬鍗曟淳鍗�");
+        }
+        if (!Integer.valueOf(Constants.OrderStatus.deposited.getStatus()).equals(order.getStatus())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "浠呭凡瀵勫瓨鐘舵�佽鍗曞彲娲惧崟");
+        }
+
+        String optUserName = getCurrentUserName();
+
+        // 鍔犳�ヨ垂鏃ュ織锛堟瘡娆″崟鐙褰曟湰娆″姞鎬ヨ垂锛�
+        Constants.OrderLogType urgentLogType = Constants.OrderLogType.urgent;
+        OrderLog feeLog = new OrderLog();
+        feeLog.setOrderId(order.getId());
+        feeLog.setTitle(urgentLogType.getTitle());
+        feeLog.setLogInfo(urgentLogType.getStatusInfo().replace("{param}", dto.getUrgentFee().toPlainString()));
+        feeLog.setObjType(urgentLogType.getStatus());
+        feeLog.setOrderStatus(order.getStatus());
+        feeLog.setOptUserType(3);
+        feeLog.setOptUserName(optUserName);
+        feeLog.setCreateTime(new Date());
+        feeLog.setDeleted(Constants.ZERO);
+        orderLogService.create(feeLog);
+
+        // 鍔犳�ヨ垂鐢� 鍏冣啋鍒�
+        long urgentFeeFen = dto.getUrgentFee().multiply(new BigDecimal(100)).longValue();
+
+        // 浣跨敤 UpdateWrapper 绮剧‘鏇存柊锛屼笉褰卞搷鍏朵粬瀛楁
+        com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper<Orders> updateWrapper =
+                new UpdateWrapper<Orders>().lambda()
+                .eq(Orders::getId, order.getId())
+                .set(Orders::getIsUrgent, Constants.ONE)
+                .set(Orders::getPlatformRewardAmount, urgentFeeFen)
+                .set(Orders::getUpdateTime, new Date());
+
+        // 寮傚湴瀵勫瓨涓旀湁鍙栦欢闂ㄥ簵鏃讹紝鐢熸垚鍙告満鏍搁攢鐮�
+        if (order.getTakeShopId() != null) {
+            String driverVerifyCode = generateVerifyCode();
+            updateWrapper.set(Orders::getDriverVerifyCode, driverVerifyCode);
+        }
+
+        // 澶囨敞
+        if (StringUtils.isNotBlank(dto.getRemark())) {
+            updateWrapper.set(Orders::getRemark, dto.getRemark());
+        }
+
+        // 鎸囨淳鍙告満锛堥潪蹇呭~锛�
+        if (dto.getDriverId() != null) {
+            updateWrapper.set(Orders::getAssignDriverId, dto.getDriverId());
+
+            Member driver = memberMapper.selectById(dto.getDriverId());
+            String driverName = driver != null ? driver.getName() : String.valueOf(dto.getDriverId());
+
+            Constants.OrderLogType dispatchLogType = Constants.OrderLogType.dispatch;
+            OrderLog driverLog = new OrderLog();
+            driverLog.setOrderId(order.getId());
+            driverLog.setTitle(dispatchLogType.getTitle());
+            driverLog.setLogInfo(dispatchLogType.getStatusInfo().replace("{param}", driverName));
+            driverLog.setObjType(dispatchLogType.getStatus());
+            driverLog.setOrderStatus(order.getStatus());
+            driverLog.setOptUserType(3);
+            driverLog.setOptUserName(optUserName);
+            driverLog.setCreateTime(new Date());
+            driverLog.setDeleted(Constants.ZERO);
+            orderLogService.create(driverLog);
+        }
+
+        ordersMapper.update(updateWrapper);
+    }
+
+    private String getCurrentUserName() {
+        try {
+            com.doumee.core.model.LoginUserInfo user =
+                    (com.doumee.core.model.LoginUserInfo) org.apache.shiro.SecurityUtils.getSubject().getPrincipal();
+            return user != null ? user.getUsername() : "绯荤粺";
+        } catch (Exception e) {
+            return "绯荤粺";
+        }
+    }
+
+    /**
+     * 鏋勫缓璁㈠崟鐗╁搧鏄庣粏鍒楄〃
+     */
+    private List<OrderItemVO> buildDetailList(Integer orderId) {
+        List<OrdersDetail> details = ordersDetailMapper.selectList(
+                new QueryWrapper<OrdersDetail>().lambda()
+                        .eq(OrdersDetail::getOrderId, orderId)
+                        .eq(OrdersDetail::getDeleted, Constants.ZERO));
+        return buildDetailList(details);
+    }
+
+    /**
+     * 鏍规嵁宸叉煡璇㈢殑鏄庣粏鏋勫缓鐗╁搧鍒楄〃锛堥伩鍏嶉噸澶嶆煡璇級
+     */
+    private List<OrderItemVO> buildDetailList(List<OrdersDetail> details) {
+        List<OrderItemVO> items = new ArrayList<>();
+        if (details != null) {
+            for (OrdersDetail d : details) {
+                OrderItemVO item = new OrderItemVO();
+                item.setLuggageName(d.getLuggageName());
+                item.setLuggageDetail(d.getLuggageDetail());
+                item.setNum(d.getNum());
+                double unitPriceYuan = d.getUnitPrice() != null ? Constants.getFormatMoney(d.getUnitPrice()) : 0;
+                item.setUnitPriceYuan(unitPriceYuan);
+                item.setSubtotal(unitPriceYuan * (d.getNum() != null ? d.getNum() : 0));
+                items.add(item);
+            }
+        }
+        return items;
+    }
+
+    /**
+     * 鐢熸垚32浣嶅敮涓�绗笁鏂硅鍗曠紪鍙凤紙鏃堕棿鎴�17浣� + 闅忔満鏁�15浣嶏級
+     */
+    private String generateOrderTradeNo() {
+        return new java.text.SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date())
+                + String.format("%015d", Math.abs(new java.util.Random().nextLong() % 1000000000000000L));
+    }
+
+    /**
+     * 鐢熸垚6浣嶆暟瀛楁牳閿�鐮侊紙Redis楠岄噸锛�
+     * 浣跨敤 SETNX 鎶㈠崰锛屼繚璇佸敮涓�锛涗娇鐢ㄥ畬姣曞悗璋冪敤 releaseVerifyCode 浠� Redis 绉婚櫎
+     */
+    private String generateVerifyCode() {
+        Random random = new Random();
+        String redisKey = Constants.REDIS_VERIFY_CODE_KEY;
+        for (int i = 0; i < 200; i++) {
+            String code = String.format("%06d", random.nextInt(1000000));
+            Boolean success = redisTemplate.opsForValue().setIfAbsent(redisKey + code, "1", 24, TimeUnit.HOURS);
+            if (success != null && success) {
+                return code;
+            }
+        }
+        throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏍搁攢鐮佺敓鎴愬け璐ワ紝璇烽噸璇�");
+    }
+
+    /**
+     * 閲婃斁鏍搁攢鐮佸崰浣嶏紙鏍搁攢瀹屾垚鍚庤皟鐢紝绉婚櫎 Redis 涓殑 key锛�
+     */
+    public void releaseVerifyCode(String code) {
+        if (StringUtils.isNotBlank(code)) {
+            redisTemplate.delete(Constants.REDIS_VERIFY_CODE_KEY + code);
+        }
+    }
+
+    private String getOrdersPrefix() {
+        try {
+            return systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.RESOURCE_PATH).getCode()
+                    + systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.ORDERS_FILES).getCode();
+        } catch (Exception e) {
+            return "";
+        }
+    }
+
+    private String getPlatformUserName(Integer userId) {
+        SystemUser user = systemUserMapper.selectById(userId);
+        return user != null ? user.getRealname() : null;
+    }
+
+    private List<String> getFileUrls(Integer orderId, int objType, String prefix) {
+        List<Multifile> files = multifileMapper.selectList(
+                new QueryWrapper<Multifile>().lambda()
+                        .eq(Multifile::getObjId, orderId)
+                        .eq(Multifile::getObjType, objType)
+                        .eq(Multifile::getIsdeleted, Constants.ZERO)
+                        .orderByAsc(Multifile::getSortnum));
+        List<String> urls = new ArrayList<>();
+        if (files != null) {
+            for (Multifile f : files) {
+                if (StringUtils.isNotBlank(f.getFileurl())) {
+                    urls.add(prefix + f.getFileurl());
+                }
+            }
+        }
+        return urls;
+    }
+
+    /**
+     * 璁$畻骞惰缃鍗曡柂閰垎閰嶏紙鍙告満銆佸瓨浠堕棬搴椼�佸彇浠堕棬搴楋級
+     * 浠� pricing_rule (type=4) 璇诲彇鍒嗘垚姣斾緥锛屾牴鎹棬搴椾紒涓�/涓汉绫诲瀷鍖哄垎
+     *
+     * @param orders        璁㈠崟瀹炰綋锛堥渶瑕� totalAmount銆乧ityId 宸茶缃級
+     * @param depositShop   瀵勪欢闂ㄥ簵锛堥渶瑕� companyType锛�
+     * @param takeShop      鍙栦欢闂ㄥ簵锛堥渶瑕� companyType锛屽氨鍦板瓨鍙栨椂涓� depositShop 鐩稿悓锛�
+     */
+    private void calculateAndSetFeeAllocation(Orders orders, ShopInfo depositShop, ShopInfo takeShop) {
+        Long totalAmount = orders.getTotalAmount() != null ? orders.getTotalAmount() : 0L;
+        if (totalAmount <= 0) {
+            orders.setDriverFee(0L);
+            orders.setDepositShopFee(0L);
+            orders.setTakeShopFee(0L);
+            orders.setDriverFeeRata(BigDecimal.ZERO);
+            orders.setDepositShopFeeRata(BigDecimal.ZERO);
+            orders.setTakeShopFeeRata(BigDecimal.ZERO);
+            return;
+        }
+        Integer cityId = Integer.valueOf(orders.getCityId());
+
+        // 鍙告満鍗犳瘮锛歠ieldA=4锛堥厤閫佸憳锛�
+        BigDecimal driverRata = getRevenueShareRata(cityId, Constants.FOUR);
+        // 瀵勪欢闂ㄥ簵鍗犳瘮锛歠ieldA=0(浼佷笟瀵�)/1(涓汉瀵�)
+        int depositFieldA = Constants.equalsInteger(depositShop.getCompanyType(), Constants.ONE) ? Constants.ZERO : Constants.ONE;
+        BigDecimal depositShopRata = getRevenueShareRata(cityId, depositFieldA);
+        // 鍙栦欢闂ㄥ簵鍗犳瘮锛歠ieldA=2(浼佷笟鍙�)/3(涓汉鍙�)
+        int takeFieldA = Constants.equalsInteger(takeShop.getCompanyType(), Constants.ONE) ? Constants.TWO : Constants.THREE;
+        BigDecimal takeShopRata = getRevenueShareRata(cityId, takeFieldA);
+
+        // 璁$畻钖叕锛堝垎锛夛細totalAmount 涓哄垎锛宺ata 涓烘瘮渚嬪�硷紙濡� 0.15 琛ㄧず 15%锛�
+        long driverFee = new BigDecimal(totalAmount).multiply(driverRata).longValue();
+        long depositShopFee = new BigDecimal(totalAmount).multiply(depositShopRata).longValue();
+        long takeShopFee = totalAmount - driverFee - depositShopFee;
+
+        orders.setDriverFee(driverFee);
+        orders.setDepositShopFee(depositShopFee);
+        orders.setTakeShopFee(takeShopFee);
+        orders.setDriverFeeRata(driverRata);
+        orders.setDepositShopFeeRata(depositShopRata);
+        orders.setTakeShopFeeRata(takeShopRata);
+    }
+
+    /**
+     * 浠� pricing_rule 琛ㄨ幏鍙栧垎鎴愭瘮渚嬶紙type=4锛�
+     *
+     * @param cityId   鍩庡競涓婚敭
+     * @param fieldA   绫诲瀷锛�0=浼佷笟瀵�, 1=涓汉瀵�, 2=浼佷笟鍙�, 3=涓汉鍙�, 4=閰嶉�佸憳
+     * @return 鍒嗘垚姣斾緥锛堝 0.15 琛ㄧず 15%锛�
+     */
+    private BigDecimal getRevenueShareRata(Integer cityId, int fieldA) {
+        PricingRule rule = pricingRuleMapper.selectOne(new QueryWrapper<PricingRule>().lambda()
+                .eq(PricingRule::getDeleted, Constants.ZERO)
+                .eq(PricingRule::getType, Constants.FOUR)
+                .eq(PricingRule::getCityId, cityId)
+                .eq(PricingRule::getFieldA, String.valueOf(fieldA))
+                .last("limit 1"));
+        if (rule != null && StringUtils.isNotBlank(rule.getFieldC())) {
+            return new BigDecimal(rule.getFieldC());
+        }
+        return BigDecimal.ZERO;
+    }
+
+    @Override
+    public PageData<MyOrderVO> findMyOrderPage(PageWrap<MyOrderDTO> pageWrap, Integer memberId) {
+        MyOrderDTO model = pageWrap.getModel();
+        Integer status = model != null ? model.getStatus() : null;
+        Integer combinedStatus = model != null ? model.getCombinedStatus() : null;
+
+        // 瑙f瀽鍚堝苟鐘舵�佷负鍏蜂綋鐘舵�佸垪琛�
+        List<Integer> statusList = null;
+        if (combinedStatus != null) {
+            Constants.OrderCombinedStatus combined = Constants.OrderCombinedStatus.getByKey(combinedStatus);
+            if (combined != null) {
+                statusList = new ArrayList<>();
+                for (int s : combined.getStatuses()) {
+                    statusList.add(s);
+                }
+            }
+        }
+
+        IPage<Orders> p = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        MPJLambdaWrapper<Orders> wrapper = new MPJLambdaWrapper<Orders>()
+                .selectAll(Orders.class)
+                .select("s1.name", Orders::getDepositShopName)
+                .select("s1.link_name", Orders::getDepositShopLinkName)
+                .select("s1.link_phone", Orders::getDepositShopLinkPhone)
+                .select("s2.name", Orders::getTakeShopName)
+                .select("s2.address", Orders::getTakeShopAddress)
+                .leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID")
+                .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID")
+                .eq(Orders::getDeleted, Constants.ZERO)
+                .eq(Orders::getMemberId, memberId)
+                .eq(status != null, Orders::getStatus, status)
+                .in(statusList != null, Orders::getStatus, statusList)
+                .orderByDesc(Orders::getCreateTime);
+
+        IPage<Orders> orderPage = ordersMapper.selectJoinPage(p, Orders.class, wrapper);
+        List<MyOrderVO> voList = new ArrayList<>();
+        if (orderPage != null && orderPage.getRecords() != null) {
+
+            for (Orders o : orderPage.getRecords()) {
+                MyOrderVO vo = new MyOrderVO();
+                vo.setId(o.getId());
+                vo.setCode(o.getCode());
+                vo.setType(o.getType());
+                vo.setStatus(o.getStatus());
+                vo.setCreateTime(o.getCreateTime());
+                vo.setExpectedTakeTime(o.getExpectedTakeTime());
+
+                // 瀛樹欢闂ㄥ簵锛堝叧鑱旀煡璇㈢洿鎺ュ彇鍊硷級
+                vo.setDepositShopName(o.getDepositShopName());
+                vo.setDepositShopLinkName(o.getDepositShopLinkName());
+                vo.setDepositShopPhone(o.getDepositShopLinkPhone());
+
+                // 鍙栦欢淇℃伅锛氭湁鍙栦欢闂ㄥ簵鍙栭棬搴楋紝鏃犲垯鍙栫敤鎴疯嚜閫夊彇浠剁偣
+                if (o.getTakeShopId() != null) {
+                    vo.setTakeShopName(o.getTakeShopName());
+                    vo.setTakeShopAddress(o.getTakeShopAddress());
+                } else {
+                    vo.setTakeLocation(o.getTakeLocation());
+                    vo.setTakeLocationRemark(o.getTakeLocationRemark());
+                }
+
+                // 鍙栦欢鑱旂郴浜�
+                vo.setTakeUser(o.getTakeUser());
+                vo.setTakePhone(o.getTakePhone());
+
+                // 璐圭敤锛堝垎锛�
+                vo.setDeclaredFee(o.getDeclaredFee());
+                vo.setEstimatedAmount(o.getEstimatedAmount());
+
+                // 鏌ヨ鐗╁搧鏄庣粏锛堜竴娆℃煡璇紝鍚屾椂鐢ㄤ簬鐗╁搧鍒楄〃鍜岄�炬湡璁$畻锛�
+                List<OrdersDetail> details = ordersDetailMapper.selectList(
+                        new QueryWrapper<OrdersDetail>().lambda()
+                                .eq(OrdersDetail::getOrderId, o.getId())
+                                .eq(OrdersDetail::getDeleted, Constants.ZERO));
+
+                // 鐗╁搧鏄庣粏
+                vo.setDetailList(buildDetailList(details));
+
+                // 閫炬湡淇℃伅锛堜粎寰呭彇浠剁姸鎬佽绠楋級
+                if (Integer.valueOf(Constants.OrderStatus.arrived.getStatus()).equals(o.getStatus())) {
+                    OverdueFeeVO overdueInfo = calculateOverdueFeeInternal(o, details);
+                    vo.setOverdue(overdueInfo.getOverdue());
+                    vo.setOverdueDays(overdueInfo.getOverdueDays());
+                    vo.setOverdueFee(overdueInfo.getOverdueFee());
+                }
+                voList.add(vo);
+            }
+        }
+
+        IPage<MyOrderVO> vPage = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        PageData<MyOrderVO> pageData = PageData.from(vPage);
+        pageData.setRecords(voList);
+        pageData.setTotal(orderPage.getTotal());
+        pageData.setPage(orderPage.getCurrent());
+        pageData.setCapacity(orderPage.getSize());
+        return pageData;
+    }
+
+    @Override
+    public MyOrderDetailVO findMyOrderDetail(Integer id, Integer memberId) {
+        Orders order = ordersMapper.selectOne(new QueryWrapper<Orders>().lambda()
+                .eq(Orders::getId, id)
+                .eq(Orders::getMemberId, memberId)
+                .eq(Orders::getDeleted, Constants.ZERO));
+        if (order == null) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        return buildOrderDetailVO(order, true);
+    }
+
+    @Override
+    public MyOrderDetailVO findShopOrderDetail(Integer orderId, String verifyCode) {
+        Orders order = null;
+        if (orderId != null) {
+            order = ordersMapper.selectOne(new QueryWrapper<Orders>().lambda()
+                    .eq(Orders::getId, orderId)
+                    .eq(Orders::getDeleted, Constants.ZERO));
+        } else if (StringUtils.isNotBlank(verifyCode)) {
+            order = ordersMapper.selectOne(new QueryWrapper<Orders>().lambda()
+                    .eq(Orders::getMemberVerifyCode, verifyCode)
+                    .eq(Orders::getDeleted, Constants.ZERO)
+                    .last("limit 1"));
+            if (order == null) {
+                order = ordersMapper.selectOne(new QueryWrapper<Orders>().lambda()
+                        .eq(Orders::getDriverVerifyCode, verifyCode)
+                        .eq(Orders::getDeleted, Constants.ZERO)
+                        .last("limit 1"));
+            }
+        }
+        if (order == null) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "璁㈠崟涓嶅瓨鍦�");
+        }
+        return buildOrderDetailVO(order, false);
+    }
+
+    /**
+     * 鏋勫缓璁㈠崟璇︽儏VO锛堜細鍛樼/闂ㄥ簵绔鐢級
+     *
+     * @param order          璁㈠崟瀹炰綋
+     * @param memberViewMode true=浼氬憳绔紙鎸夋潯浠惰繑鍥炴牳閿�鐮侊級锛宖alse=闂ㄥ簵绔紙濮嬬粓杩斿洖鏍搁攢鐮侊級
+     */
+    private MyOrderDetailVO buildOrderDetailVO(Orders order, boolean memberViewMode) {
+        MyOrderDetailVO vo = new MyOrderDetailVO();
+        vo.setId(order.getId());
+        vo.setStatus(order.getStatus());
+        vo.setType(order.getType());
+        vo.setCode(order.getCode());
+        vo.setOutTradeNo(order.getOutTradeNo());
+        vo.setRemark(order.getRemark());
+        vo.setCreateTime(order.getCreateTime());
+        vo.setPayTime(order.getPayTime());
+        vo.setExpectedDepositTime(order.getExpectedDepositTime());
+        vo.setExpectedTakeTime(order.getExpectedTakeTime());
+        vo.setArriveTime(order.getArriveTime());
+
+        // 璐圭敤锛堝垎锛�
+        vo.setBasicAmount(order.getBasicAmount());
+        vo.setDeclaredAmount(order.getDeclaredAmount());
+        vo.setDeclaredFee(order.getDeclaredFee());
+        vo.setUrgentAmount(order.getUrgentAmount());
+        vo.setActualPayAmount(order.getPayAmount());
+
+        // 鏍囪
+        vo.setExceptionStatus(order.getExceptionStatus());
+
+        // 鏄惁瓒呭嚭鍙栦欢鏃堕棿
+        vo.setPastTakeTime(order.getExpectedTakeTime() != null && new Date().after(order.getExpectedTakeTime()));
+
+        // 璁㈠崟鐘舵�佹弿杩� + 鍊掕鏃�
+        vo.setStatusDesc(buildStatusDesc(order));
+        if (Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.waitPay.getStatus())) {
+            vo.setPayCountdownMs(calcPayCountdownMs(order));
+        }
+
+        // 瀛樹欢闂ㄥ簵
+        if (order.getDepositShopId() != null) {
+            ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId());
+            if (depositShop != null) {
+                vo.setDepositShopName(depositShop.getName());
+                vo.setDepositShopLinkName(depositShop.getLinkName());
+                vo.setDepositShopPhone(depositShop.getLinkPhone());
+                vo.setDepositShopAddress(depositShop.getAddress());
+            }
+        }
+
+        // 鍙栦欢淇℃伅
+        if (order.getTakeShopId() != null) {
+            ShopInfo takeShop = shopInfoMapper.selectById(order.getTakeShopId());
+            if (takeShop != null) {
+                vo.setTakeShopName(takeShop.getName());
+                vo.setTakeShopAddress(takeShop.getAddress());
+            }
+        } else {
+            vo.setTakeLocation(order.getTakeLocation());
+            vo.setTakeLocationRemark(order.getTakeLocationRemark());
+        }
+
+        // 鍙栦欢鑱旂郴浜�
+        vo.setTakeUser(order.getTakeUser());
+        vo.setTakePhone(order.getTakePhone());
+
+        // 鐗╁搧绫诲瀷鍚嶇О
+        if (order.getGoodType() != null) {
+            Category category = categoryMapper.selectById(order.getGoodType());
+            if (category != null) {
+                vo.setGoodTypeName(category.getName());
+            }
+        }
+
+        // 涓嬪崟鐓х墖
+        String imgPrefix = getOrdersPrefix();
+        vo.setOrderImages(getFileUrls(order.getId(), Constants.FileType.ORDER_FILE.getKey(), imgPrefix));
+
+        // 鐗╁搧鏄庣粏
+        List<OrdersDetail> details = ordersDetailMapper.selectList(
+                new QueryWrapper<OrdersDetail>().lambda()
+                        .eq(OrdersDetail::getOrderId, order.getId())
+                        .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 status = order.getStatus();
+        if (memberViewMode) {
+            // 浼氬憳绔細寰呭瘎瀛�(1)杩斿洖锛涘緟鍙栦欢(5)鏃讹紝灏卞湴瀵勫瓨鏃犲彇浠堕棬搴椾笉杩斿洖
+            boolean returnCode = false;
+            if (Constants.equalsInteger(status, Constants.OrderStatus.waitDeposit.getStatus())) {
+                returnCode = true;
+            } else if (Constants.equalsInteger(status, Constants.OrderStatus.arrived.getStatus())) {
+                if (!(Constants.equalsInteger(order.getType(), Constants.ZERO) && order.getTakeShopId() == null)) {
+                    returnCode = true;
+                }
+            }
+            if (returnCode) {
+                vo.setMemberVerifyCode(order.getMemberVerifyCode());
+            }
+        } else {
+            // 闂ㄥ簵绔細濮嬬粓杩斿洖浼氬憳鏍搁攢鐮�
+            vo.setMemberVerifyCode(order.getMemberVerifyCode());
+        }
+
+        return vo;
+    }
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
+    public void cancelOrder(Integer orderId, Integer memberId, String reason) {
+        Orders order = ordersMapper.selectOne(new QueryWrapper<Orders>().lambda()
+                .eq(Orders::getId, orderId)
+                .eq(Orders::getMemberId, memberId)
+                .eq(Orders::getDeleted, Constants.ZERO));
+        if (order == null) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+
+        // 浠呭紓鍦板瘎瀛樺彲鍙栨秷
+        if (!Constants.equalsInteger(order.getType(), Constants.ONE)) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "浠呭紓鍦板瘎瀛樿鍗曞彲鍙栨秷");
+        }
+
+        Integer status = order.getStatus();
+        if (status == null) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璁㈠崟鐘舵�佸紓甯�");
+        }
+
+        Date now = new Date();
+
+        // 寰呮敮浠橈細鐩存帴鍙栨秷
+        if (Constants.equalsInteger(status, Constants.OrderStatus.waitPay.getStatus())) {
+            order.setStatus(Constants.OrderStatus.cancelled.getStatus());
+            order.setCancelTime(now);
+            ordersMapper.updateById(order);
+            saveCancelLog(order, "浼氬憳鍙栨秷璁㈠崟锛堝緟鏀粯锛�", reason, memberId);
+            return;
+        }
+
+        // 寰呭瘎瀛橈細鐩存帴鍙栨秷锛屽叏棰濋��娆�
+        if (Constants.equalsInteger(status, Constants.OrderStatus.waitDeposit.getStatus())) {
+            // 璁板綍閫�娆句俊鎭�
+            OrdersRefund refund = new OrdersRefund();
+            refund.setOrderId(orderId);
+            refund.setType(0); // 鏈瘎瀛樼洿鎺ュ彇娑�
+            refund.setCancelInfo(reason);
+            refund.setCreateTime(now);
+            refund.setDeleted(Constants.ZERO);
+
+            // 璋冪敤寰俊閫�娆撅紝鍏ㄩ閫�娆�
+            String refundCode = wxMiniUtilService.wxRefund(order.getOutTradeNo(), order.getPayAmount(), order.getPayAmount());
+            refund.setRefundCode(refundCode);
+            refund.setRefundTime(new Date());
+            ordersRefundMapper.insert(refund);
+
+            order.setStatus(Constants.OrderStatus.cancelled.getStatus());
+            order.setCancelTime(now);
+            order.setRefundAmount(order.getPayAmount());
+            ordersMapper.updateById(order);
+
+            saveCancelLog(order, "浼氬憳鍙栨秷璁㈠崟锛堝緟瀵勫瓨锛屽叏棰濋��娆撅級", reason, memberId);
+            return;
+        }
+
+        // 宸插瘎瀛�/宸叉帴鍗曪細杩涘叆鍙栨秷涓姸鎬�
+        if (Constants.equalsInteger(status, Constants.OrderStatus.deposited.getStatus())
+                || Constants.equalsInteger(status, Constants.OrderStatus.accepted.getStatus())) {
+            order.setStatus(Constants.OrderStatus.cancelling.getStatus());
+            order.setCancelTime(now);
+            ordersMapper.updateById(order);
+            saveCancelLog(order, "浼氬憳鐢宠鍙栨秷璁㈠崟锛堝凡瀵勫瓨/宸叉帴鍗曪級", reason, memberId);
+            return;
+        }
+
+        throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "褰撳墠璁㈠崟鐘舵�佷笉鍏佽鍙栨秷");
+    }
+
+    /**
+     * 淇濆瓨鍙栨秷璁㈠崟鎿嶄綔鏃ュ織
+     */
+    private void saveCancelLog(Orders order, String title, String reason, Integer memberId) {
+        OrderLog log = new OrderLog();
+        log.setOrderId(order.getId());
+        log.setTitle(title);
+        log.setLogInfo(reason);
+        log.setObjType(Constants.ORDER_LOG_CANCEL);
+        log.setOrderStatus(order.getStatus());
+        log.setOptUserId(memberId);
+        log.setOptUserType(0); // 0=鐢ㄦ埛
+        log.setCreateTime(new Date());
+        log.setDeleted(Constants.ZERO);
+        orderLogService.create(log);
+    }
+
+    /**
+     * 淇濆瓨闂ㄥ簵鏍搁攢鏃ュ織
+     */
+    private void saveShopVerifyLog(Orders order, String title, String logInfo, String remark, Integer shopId) {
+        OrderLog log = new OrderLog();
+        log.setOrderId(order.getId());
+        log.setTitle(title);
+        log.setLogInfo(logInfo);
+        log.setRemark(remark);
+        log.setOrderStatus(order.getStatus());
+        log.setOptUserId(shopId);
+        log.setOptUserType(2); // 2=闂ㄥ簵
+        log.setCreateTime(new Date());
+        log.setDeleted(Constants.ZERO);
+        orderLogService.create(log);
+    }
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
+    public void handleStorageOrderPayNotify(String outTradeNo, String wxTradeNo) {
+        Orders order = ordersMapper.selectOne(new QueryWrapper<Orders>().lambda()
+                .eq(Orders::getOutTradeNo, outTradeNo)
+                .eq(Orders::getDeleted, Constants.ZERO)
+                .last("limit 1"));
+        if (order == null) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "璁㈠崟涓嶅瓨鍦�: " + outTradeNo);
+        }
+        // 骞傜瓑锛氬凡鏀粯鍒欒烦杩�
+        if (Constants.equalsInteger(order.getPayStatus(), Constants.ONE)) {
+            return;
+        }
+        Date now = new Date();
+        order.setStatus(Constants.OrderStatus.waitDeposit.getStatus()); // 寰呭瘎瀛�
+        order.setPayStatus(Constants.ONE); // 宸叉敮浠�
+        order.setPayTime(now);
+        order.setWxExternalNo(wxTradeNo);
+        order.setUpdateTime(now);
+        // 鐢熸垚浼氬憳鏍搁攢鐮�
+        order.setMemberVerifyCode(generateVerifyCode());
+        ordersMapper.updateById(order);
+    }
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
+    public void shopVerifyOrder(String verifyCode, Integer shopId, List<String> images, String remark) {
+        if (StringUtils.isBlank(verifyCode)) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏍搁攢鐮佷笉鑳戒负绌�");
+        }
+        // 鏍规嵁鏍搁攢鐮佹煡鎵捐鍗曪紙浼氬憳鏍搁攢鐮侊級
+        Orders order = ordersMapper.selectOne(new QueryWrapper<Orders>().lambda()
+                .eq(Orders::getMemberVerifyCode, verifyCode)
+                .eq(Orders::getDeleted, Constants.ZERO)
+                .last("limit 1"));
+        if (order == null) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "鏍搁攢鐮佹棤鏁�");
+        }
+
+        // 鏌ヨ闂ㄥ簵鍚嶇О鐢ㄤ簬鏃ュ織
+        String shopName = "";
+        ShopInfo shopInfo = shopInfoMapper.selectById(shopId);
+        if (shopInfo != null) {
+            shopName = shopInfo.getName() != null ? shopInfo.getName() : "";
+        }
+
+        Integer status = order.getStatus();
+        Date now = new Date();
+        if (Constants.equalsInteger(status, Constants.OrderStatus.waitDeposit.getStatus())) {
+            // 寰呭瘎瀛�(1) 鈫� 宸插瘎瀛�(2)锛屼袱绉嶇被鍨嬮�氱敤
+            // 鏍¢獙褰撳墠闂ㄥ簵鏄惁涓鸿鍗曠殑瀛樹欢闂ㄥ簵
+            if (!shopId.equals(order.getDepositShopId())) {
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曚笉灞炰簬褰撳墠闂ㄥ簵锛屾棤娉曟牳閿�");
+            }
+            order.setStatus(Constants.OrderStatus.deposited.getStatus());
+            order.setDepositTime(now);
+            // 閲婃斁褰撳墠鏍搁攢鐮侊紝鐢熸垚鏂扮殑鏍搁攢鐮佷緵鍙栦欢鏃朵娇鐢�
+            releaseVerifyCode(verifyCode);
+            order.setMemberVerifyCode(generateVerifyCode());
+            ordersMapper.updateById(order);
+            // 淇濆瓨瀵勫瓨鍥剧墖锛坥bj_type=2 璁㈠崟瀵勫瓨鍥剧墖锛屾渶澶�3寮狅級
+            saveVerifyImages(order.getId(), images, Constants.FileType.ORDER_DEPOSIT.getKey(), shopId);
+            // 璁板綍璁㈠崟鏃ュ織
+            saveShopVerifyLog(order, "闂ㄥ簵纭瀵勫瓨", "闂ㄥ簵銆�" + shopName + "銆戠‘璁ゅ瘎瀛�", remark, shopId);
+        } else if (Constants.equalsInteger(status, Constants.OrderStatus.arrived.getStatus())) {
+            // 寮傚湴瀵勫瓨 + 鏃犲彇浠堕棬搴� 鈫� 鏃犳硶鏍搁攢锛堝鎴疯嚜鍙栵紝鏃犻棬搴楁搷浣滐級
+            if (Constants.equalsInteger(order.getType(), Constants.ONE) && order.getTakeShopId() == null) {
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曟棤鍙栦欢闂ㄥ簵锛屾棤娉曟牳閿�");
+            }
+            // 鏍¢獙鍙栦欢闂ㄥ簵涓庡綋鍓嶇櫥褰曢棬搴椾竴鑷�
+            if (!shopId.equals(order.getTakeShopId())) {
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曚笉灞炰簬褰撳墠闂ㄥ簵锛屾棤娉曟牳閿�");
+            }
+            // 寰呭彇浠�(5) 鈫� 宸插畬鎴�(7)
+            order.setStatus(Constants.OrderStatus.finished.getStatus());
+            order.setConfirmArriveTime(now);
+            ordersMapper.updateById(order);
+            // 璁㈠崟瀹屾垚锛岄噴鏀炬牳閿�鐮�
+            releaseVerifyCode(verifyCode);
+            // 淇濆瓨鍑哄簱鍥剧墖锛坥bj_type=13 闂ㄥ簵鍑哄簱鍥剧墖锛屾渶澶�3寮狅級
+            saveVerifyImages(order.getId(), images, Constants.FileType.STORE_OUT.getKey(), shopId);
+            // 璁板綍璁㈠崟鏃ュ織
+            saveShopVerifyLog(order, "闂ㄥ簵纭鍙栦欢", "闂ㄥ簵銆�" + shopName + "銆戠‘璁ゅ彇浠讹紝璁㈠崟瀹屾垚", remark, shopId);
+        } else {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "褰撳墠璁㈠崟鐘舵�佷笉鍏佽鏍搁攢");
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
+    public void driverVerifyOrder(String verifyCode, List<String> images, String remark, Integer driverId) {
+        if (StringUtils.isBlank(verifyCode)) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏍搁攢鐮佷笉鑳戒负绌�");
+        }
+        // 鏍规嵁鍙告満鏍搁攢鐮佹煡鎵捐鍗�
+        Orders order = ordersMapper.selectOne(new QueryWrapper<Orders>().lambda()
+                .eq(Orders::getDriverVerifyCode, verifyCode)
+                .eq(Orders::getDeleted, Constants.ZERO)
+                .last("limit 1"));
+        if (order == null) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "鏍搁攢鐮佹棤鏁�");
+        }
+
+        // 浠呭紓鍦板瘎瀛� + 鏈夊彇浠堕棬搴� + 娲鹃�佷腑(4) 鍙牳閿�
+        if (!Constants.equalsInteger(order.getType(), Constants.ONE)) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "浠呭紓鍦板瘎瀛樿鍗曟敮鎸佸徃鏈烘牳閿�");
+        }
+        if (order.getTakeShopId() == null) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曟棤鍙栦欢闂ㄥ簵锛屾棤闇�鍙告満鏍搁攢");
+        }
+        if (!Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.delivering.getStatus())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "褰撳墠璁㈠崟鐘舵�佷笉鍏佽鏍搁攢");
+        }
+
+        // 娲鹃�佷腑(4) 鈫� 宸插埌搴�(5)
+        order.setStatus(Constants.OrderStatus.arrived.getStatus());
+        order.setArriveTime(new Date());
+        if (StringUtils.isNotBlank(remark)) {
+            order.setRemark(remark);
+        }
+        ordersMapper.updateById(order);
+
+        // 閲婃斁鍙告満鏍搁攢鐮�
+        releaseVerifyCode(verifyCode);
+
+        // 淇濆瓨闄勪欢锛坥bj_type=3 闂ㄥ簵鍏ュ簱鍥剧墖锛屾渶澶�3寮狅級
+        saveVerifyImages(order.getId(), images, Constants.FileType.ORDER_TAKE.getKey(), driverId);
+    }
+
+    /**
+     * 淇濆瓨鏍搁攢闄勪欢鍒� multifile 琛�
+     *
+     * @param orderId  璁㈠崟涓婚敭
+     * @param images   鍥剧墖鍦板潃鍒楄〃锛堟渶澶�3寮狅級
+     * @param objType  闄勪欢绫诲瀷
+     * @param creator  鍒涘缓浜虹紪鐮�
+     */
+    private void saveVerifyImages(Integer orderId, List<String> images, int objType, Integer creator) {
+        if (images == null || images.isEmpty()) return;
+        List<String> saveImages = images.size() > 3 ? images.subList(0, 3) : images;
+        Date now = new Date();
+        int sortNum = 1;
+        for (String imgUrl : saveImages) {
+            if (StringUtils.isBlank(imgUrl)) continue;
+            Multifile multifile = new Multifile();
+            multifile.setObjId(orderId);
+            multifile.setObjType(objType);
+            multifile.setFileurl(imgUrl);
+            multifile.setType(Constants.ZERO);
+            multifile.setCreator(creator);
+            multifile.setCreateDate(now);
+            multifile.setIsdeleted(Constants.ZERO);
+            multifile.setSortnum(sortNum++);
+            multifileMapper.insert(multifile);
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
+    public void confirmCustomerArrived(Integer orderId, Integer shopId) {
+        // 1. 鏌ヨ璁㈠崟
+        Orders order = ordersMapper.selectById(orderId);
+        if (order == null || Constants.equalsInteger(order.getDeleted(), Constants.ONE)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "璁㈠崟涓嶅瓨鍦�");
+        }
+
+        // 2. 鏍¢獙璁㈠崟鐘舵�侊細寰呭彇浠�(5)
+        if (!Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.arrived.getStatus())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "褰撳墠璁㈠崟鐘舵�佷笉鍏佽璇ユ搷浣�");
+        }
+
+        // 3. 鏍¢獙闂ㄥ簵涓庤鍗曞叧绯�
+        if (Constants.equalsInteger(order.getType(), Constants.ONE) && order.getTakeShopId() != null) {
+            // 寮傚湴瀵勫瓨鏈夊彇浠堕棬搴楋細鏍¢獙鍙栦欢闂ㄥ簵
+            if (!shopId.equals(order.getTakeShopId())) {
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曚笉灞炰簬褰撳墠闂ㄥ簵");
+            }
+        } else if (Constants.equalsInteger(order.getType(), Constants.ZERO)) {
+            // 灏卞湴瀵勫瓨锛氭牎楠屽瓨浠堕棬搴楋紙鍙栦欢闂ㄥ簵鍚屽瓨浠堕棬搴楋級
+            if (!shopId.equals(order.getDepositShopId())) {
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曚笉灞炰簬褰撳墠闂ㄥ簵");
+            }
+        } else {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曟棤鍙栦欢闂ㄥ簵锛屾棤娉曠‘璁ゅ埌搴�");
+        }
+
+        // 4. 鏌ヨ闂ㄥ簵鍚嶇О锛堢敤浜庢棩蹇楋級
+        String shopName = "";
+        ShopInfo shopInfo = shopInfoMapper.selectById(shopId);
+        if (shopInfo != null) {
+            shopName = shopInfo.getName() != null ? shopInfo.getName() : "";
+        }
+
+        // 5. 璁$畻閫炬湡璐圭敤
+        List<OrdersDetail> details = ordersDetailMapper.selectList(
+                new QueryWrapper<OrdersDetail>().lambda()
+                        .eq(OrdersDetail::getOrderId, orderId)
+                        .eq(OrdersDetail::getDeleted, Constants.ZERO));
+        OverdueFeeVO overdueInfo = calculateOverdueFeeInternal(order, details);
+
+        Date now = new Date();
+
+        if (overdueInfo.getOverdue() && overdueInfo.getOverdueDays() > 0) {
+            // 瀛樺湪閫炬湡锛氭爣璁伴�炬湡鐘舵�侊紝璁㈠崟淇濇寔褰撳墠鐘舵��
+            order.setConfirmArriveTime(now);
+            order.setOverdueStatus(Constants.ONE);
+            order.setOverdueDays(overdueInfo.getOverdueDays());
+            order.setOverdueAmount(overdueInfo.getOverdueFee());
+            order.setUpdateTime(now);
+            ordersMapper.updateById(order);
+
+            // 璁板綍璁㈠崟鏃ュ織
+            saveShopVerifyLog(order, "纭椤惧鍒板簵锛堥�炬湡锛�",
+                    "闂ㄥ簵銆�" + shopName + "銆戠‘璁ら【瀹㈠埌搴楋紝閫炬湡" + overdueInfo.getOverdueDays()
+                            + "澶╋紝閫炬湡璐圭敤" + Constants.getFormatMoney(overdueInfo.getOverdueFee()) + "鍏�",
+                    null, shopId);
+        } else {
+            // 鏈�炬湡锛氬畬鎴愯鍗�
+            order.setStatus(Constants.OrderStatus.finished.getStatus());
+            order.setConfirmArriveTime(now);
+            order.setFinishTime(now);
+            order.setOverdueStatus(Constants.ZERO);
+            order.setUpdateTime(now);
+            ordersMapper.updateById(order);
+
+            // 閲婃斁鏍搁攢鐮�
+            if (StringUtils.isNotBlank(order.getMemberVerifyCode())) {
+                releaseVerifyCode(order.getMemberVerifyCode());
+            }
+
+            // 璁板綍璁㈠崟鏃ュ織
+            saveShopVerifyLog(order, "纭椤惧鍒板簵",
+                    "闂ㄥ簵銆�" + shopName + "銆戠‘璁ら【瀹㈠埌搴楋紝璁㈠崟瀹屾垚",
+                    null, shopId);
+        }
+    }
+
+    /**
+     * 鏋勫缓璁㈠崟鐘舵�佹弿杩�
+     */
+    private String buildStatusDesc(Orders order) {
+        boolean isLocal = Constants.equalsInteger(order.getType(), Constants.ZERO);
+        Integer status = order.getStatus();
+        if (status == null) return "";
+
+        if (Constants.equalsInteger(status, Constants.OrderStatus.waitPay.getStatus())) {
+            String minutes = "";
+            try {
+                minutes = operationConfigBiz.getConfig().getAutoCancelTime();
+            } catch (Exception ignored) {}
+            return "璇峰湪" + (StringUtils.isNotBlank(minutes) ? minutes : "") + "鍒嗛挓鍐呭畬鎴愭敮浠橈紝瓒呮椂璁㈠崟灏嗚嚜鍔ㄥ彇娑�";
+        }
+        if (Constants.equalsInteger(status, Constants.OrderStatus.waitDeposit.getStatus())) {
+            return isLocal ? "璁㈠崟宸叉敮浠橈紝璇风瓑寰呴棬搴楃‘璁ゆ帴鍗�" : "璁㈠崟宸叉敮浠橈紝璇风瓑寰呴棬搴楃‘璁ゆ帴鍗�";
+        }
+        if (Constants.equalsInteger(status, Constants.OrderStatus.deposited.getStatus())) {
+            return isLocal ? "琛屾潕宸插瘎瀛橈紝璇峰嚟鍙栦欢鐮佸墠寰�鎸囧畾闂ㄥ簵鍙栦欢" : "闂ㄥ簵宸叉帴鍗曪紝姝e湪涓烘偍瀹夋帓鍙栦欢鍙告満";
+        }
+        if (Constants.equalsInteger(status, Constants.OrderStatus.accepted.getStatus())) {
+            return isLocal ? "琛屾潕宸插瘎瀛橈紝璇峰嚟鍙栦欢鐮佸墠寰�鎸囧畾闂ㄥ簵鍙栦欢" : "宸叉湁鍙告満鎶㈠崟锛屾鍓嶅線鍙栦欢鍦扮偣";
+        }
+        if (Constants.equalsInteger(status, Constants.OrderStatus.delivering.getStatus())) {
+            return "鍙告満宸插彇浠讹紝姝h繍寰�鐩殑鍦�";
+        }
+        if (Constants.equalsInteger(status, Constants.OrderStatus.arrived.getStatus())) {
+            return "琛屾潕宸查�佽揪鏈嶅姟鐐癸紝璇峰強鏃跺墠寰�鍙栦欢";
+        }
+        if (Constants.equalsInteger(status, Constants.OrderStatus.finished.getStatus())) {
+            if (Constants.equalsInteger(order.getCommentStatus(), Constants.ONE)) {
+                return "鎰熻阿鎮ㄧ殑鐢ㄥ績璇勪环锛岀鎮ㄥ嚭琛岄『鍒╋紝鏃呴�旀剦蹇紒";
+            }
+            return "璁㈠崟宸插畬鎴愶紝鎰熻阿鎮ㄧ殑鏀寔锛岃瀵规湰娆℃湇鍔″仛鍑鸿瘎浠�";
+        }
+        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 "";
+    }
+
+    /**
+     * 璁$畻鏀粯鍊掕鏃舵绉�
+     */
+    private Long calcPayCountdownMs(Orders order) {
+        try {
+            String minutesStr = operationConfigBiz.getConfig().getAutoCancelTime();
+            if (StringUtils.isBlank(minutesStr)) return -1L;
+            int minutes = Integer.parseInt(minutesStr);
+            long deadline = order.getCreateTime().getTime() + minutes * 60 * 1000L;
+            long remaining = deadline - System.currentTimeMillis();
+            return remaining > 0 ? remaining : -1L;
+        } catch (Exception e) {
+            return -1L;
+        }
+    }
+    public OverdueFeeVO calculateOverdueFee(Integer orderId) {
+        Orders order = ordersMapper.selectById(orderId);
+        if (order == null || Constants.equalsInteger(order.getDeleted(), Constants.ONE)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+
+        // 鏌ヨ璁㈠崟鏄庣粏
+        List<OrdersDetail> details = ordersDetailMapper.selectList(
+                new QueryWrapper<OrdersDetail>().lambda()
+                        .eq(OrdersDetail::getOrderId, orderId)
+                        .eq(OrdersDetail::getDeleted, Constants.ZERO));
+
+        return calculateOverdueFeeInternal(order, details);
+    }
+
+    /**
+     * 閫炬湡璐圭敤鍐呴儴璁$畻锛堜笉鏌ュ簱锛屾帴鍙楅鏌ヨ鐨勬暟鎹級
+     * 渚涘垎椤电瓑宸叉煡璇㈡槑缁嗙殑涓氬姟鍦烘櫙澶嶇敤锛岄伩鍏嶉噸澶嶆煡璇�
+     */
+    private OverdueFeeVO calculateOverdueFeeInternal(Orders order, List<OrdersDetail> details) {
+        if (CollectionUtils.isEmpty(details)) {
+            OverdueFeeVO vo = new OverdueFeeVO();
+            vo.setOverdue(false);
+            vo.setOverdueDays(0);
+            vo.setOverdueFee(0L);
+            vo.setDailyBaseFee(0L);
+            return vo;
+        }
+
+        // 鐗╁搧鍩虹鏃ヨ垂鐢� = 危(鍗曚环 脳 鏁伴噺)
+        long dailyBaseFee = 0L;
+        for (OrdersDetail d : details) {
+            dailyBaseFee += (d.getUnitPrice() != null ? d.getUnitPrice() : 0L)
+                    * (d.getNum() != null ? d.getNum() : 0);
+        }
+
+        Date now = new Date();
+        int overdueDays;
+        long overdueFee;
+
+        if (Constants.equalsInteger(order.getType(), Constants.ZERO)) {
+            // ========== 灏卞湴瀵勫瓨 ==========
+            overdueDays = calcLocalOverdueDays(now, order.getExpectedTakeTime());
+            overdueFee = (long) overdueDays * dailyBaseFee;
+
+            OverdueFeeVO vo = new OverdueFeeVO();
+            vo.setOverdue(overdueDays > 0);
+            vo.setOverdueDays(overdueDays);
+            vo.setOverdueFee(overdueFee);
+            vo.setDailyBaseFee(dailyBaseFee);
+            return vo;
+
+        } else {
+            // ========== 寮傚湴瀵勫瓨 ==========
+            // 鏉′欢锛氬瓨鍦ㄥ彇浠堕棬搴� 涓� 璁㈠崟澶勪簬宸插埌搴楃姸鎬�(5)
+            if (order.getTakeShopId() == null
+                    || !Constants.equalsInteger(order.getStatus(), Constants.FIVE)) {
+                OverdueFeeVO vo = new OverdueFeeVO();
+                vo.setOverdue(false);
+                vo.setOverdueDays(0);
+                vo.setOverdueFee(0L);
+                vo.setDailyBaseFee(dailyBaseFee);
+                vo.setDiscountRate(null);
+                return vo;
+            }
+
+            overdueDays = calcRemoteOverdueDays(now, order.getArriveTime());
+
+            // 鎶樻墸姣旂巼
+            String discountStr = operationConfigBiz.getConfig().getUnpickedDiscount();
+            BigDecimal discountRate = StringUtils.isNotBlank(discountStr)
+                    ? new BigDecimal(discountStr) : BigDecimal.ONE;
+
+            overdueFee = new BigDecimal(overdueDays)
+                    .multiply(new BigDecimal(dailyBaseFee))
+                    .multiply(discountRate)
+                    .setScale(0, RoundingMode.HALF_UP)
+                    .longValue();
+
+            OverdueFeeVO vo = new OverdueFeeVO();
+            vo.setOverdue(overdueDays > 0);
+            vo.setOverdueDays(overdueDays);
+            vo.setOverdueFee(overdueFee);
+            vo.setDailyBaseFee(dailyBaseFee);
+            vo.setDiscountRate(discountStr);
+            return vo;
+        }
+    }
+
+    /**
+     * 灏卞湴瀵勫瓨閫炬湡澶╂暟璁$畻
+     * 杩囦簡棰勮鍙栦欢鏃堕棿褰撳ぉ鐨�12鐐瑰悗鎵嶇畻涓�澶�
+     */
+    private int calcLocalOverdueDays(Date now, Date expectedTakeTime) {
+        if (expectedTakeTime == null || !now.after(expectedTakeTime)) {
+            return 0;
+        }
+        // 鍩哄噯鏃堕棿 = 棰勮鍙栦欢鏃ユ湡鐨�12:00
+        Calendar baseCal = Calendar.getInstance();
+        baseCal.setTime(expectedTakeTime);
+        baseCal.set(Calendar.HOUR_OF_DAY, 12);
+        baseCal.set(Calendar.MINUTE, 0);
+        baseCal.set(Calendar.SECOND, 0);
+        baseCal.set(Calendar.MILLISECOND, 0);
+        Date baseTime = baseCal.getTime();
+
+        if (!now.after(baseTime)) {
+            return 0;
+        }
+        // 閫炬湡澶╂暟 = 褰撳墠鏃ユ湡 - 鍩哄噯鏃ユ湡锛堟寜澶╁彇宸級
+        Calendar nowCal = Calendar.getInstance();
+        nowCal.setTime(now);
+        nowCal.set(Calendar.HOUR_OF_DAY, 0);
+        nowCal.set(Calendar.MINUTE, 0);
+        nowCal.set(Calendar.SECOND, 0);
+        nowCal.set(Calendar.MILLISECOND, 0);
+
+        Calendar baseDateCal = Calendar.getInstance();
+        baseDateCal.setTime(baseTime);
+        baseDateCal.set(Calendar.HOUR_OF_DAY, 0);
+        baseDateCal.set(Calendar.MINUTE, 0);
+        baseDateCal.set(Calendar.SECOND, 0);
+        baseDateCal.set(Calendar.MILLISECOND, 0);
+
+        long diffMs = nowCal.getTimeInMillis() - baseDateCal.getTimeInMillis();
+        int days = (int) (diffMs / (1000 * 60 * 60 * 24));
+        return Math.max(days, 0);
+    }
+
+    /**
+     * 寮傚湴瀵勫瓨閫炬湡澶╂暟璁$畻
+     * 杩囦簡杞Щ鍒板簵鏃堕棿褰撳ぉ鐨勬櫄涓�12鐐癸紙24:00锛夊悗鎵嶇畻绗竴澶�
+     */
+    private int calcRemoteOverdueDays(Date now, Date arriveTime) {
+        if (arriveTime == null || !now.after(arriveTime)) {
+            return 0;
+        }
+        // 鍩哄噯鏃堕棿 = 杞Щ鍒板簵鏃ユ湡鐨勬鏃� 00:00锛堝嵆褰撳ぉ24:00锛�
+        Calendar baseCal = Calendar.getInstance();
+        baseCal.setTime(arriveTime);
+        baseCal.set(Calendar.HOUR_OF_DAY, 0);
+        baseCal.set(Calendar.MINUTE, 0);
+        baseCal.set(Calendar.SECOND, 0);
+        baseCal.set(Calendar.MILLISECOND, 0);
+        baseCal.add(Calendar.DAY_OF_MONTH, 1); // 娆℃棩00:00 = 褰撳ぉ24:00
+        Date baseTime = baseCal.getTime();
+
+        if (!now.after(baseTime)) {
+            return 0;
+        }
+        // 閫炬湡澶╂暟 = 褰撳墠鏃ユ湡 - 鍩哄噯鏃ユ湡
+        Calendar nowCal = Calendar.getInstance();
+        nowCal.setTime(now);
+        nowCal.set(Calendar.HOUR_OF_DAY, 0);
+        nowCal.set(Calendar.MINUTE, 0);
+        nowCal.set(Calendar.SECOND, 0);
+        nowCal.set(Calendar.MILLISECOND, 0);
+
+        Calendar baseDateCal = Calendar.getInstance();
+        baseDateCal.setTime(baseTime);
+        baseDateCal.set(Calendar.HOUR_OF_DAY, 0);
+        baseDateCal.set(Calendar.MINUTE, 0);
+        baseDateCal.set(Calendar.SECOND, 0);
+        baseDateCal.set(Calendar.MILLISECOND, 0);
+
+        long diffMs = nowCal.getTimeInMillis() - baseDateCal.getTimeInMillis();
+        int days = (int) (diffMs / (1000 * 60 * 60 * 24));
+        return Math.max(days, 0);
+    }
+
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/PricingRuleServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/PricingRuleServiceImpl.java
index 81bb4b4..189a914 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/PricingRuleServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/PricingRuleServiceImpl.java
@@ -34,6 +34,8 @@
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -381,63 +383,111 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void saveEstimatedDelivery(EstimatedDeliverySaveDTO request) {
-        // 鏌ヨ宸叉湁瑙勫垯 type=2, fieldA=1, cityId, deleted=0
-        QueryWrapper<PricingRule> qw = new QueryWrapper<>();
-        qw.lambda()
-                .eq(PricingRule::getType, Constants.TWO)
-                .eq(PricingRule::getFieldA, "1")
-                .eq(PricingRule::getCityId, request.getCityId())
-                .eq(PricingRule::getDeleted, Constants.ZERO)
-                .last("limit 1");
-        PricingRule existing = pricingRuleMapper.selectOne(qw);
-
+        if (request.getItems() == null || request.getItems().isEmpty()) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏃舵晥閰嶇疆鍒楄〃涓嶈兘涓虹┖");
+        }
         Date now = new Date();
-        if (existing != null) {
-            // 鏇存柊
-            existing.setFieldB(request.getStartDistance());
-            existing.setFieldC(request.getStartTime());
-            existing.setFieldD(request.getContinueDistance());
-            existing.setFieldE(request.getContinueTime());
-            existing.setUpdateTime(now);
-            pricingRuleMapper.updateById(existing);
-        } else {
-            // 鏂板
-            PricingRule rule = new PricingRule();
-            rule.setType(Constants.TWO);
-            rule.setFieldA("1");
-            rule.setFieldB(request.getStartDistance());
-            rule.setFieldC(request.getStartTime());
-            rule.setFieldD(request.getContinueDistance());
-            rule.setFieldE(request.getContinueTime());
-            rule.setCityId(request.getCityId());
-            rule.setDeleted(Constants.ZERO);
-            rule.setCreateTime(now);
-            rule.setUpdateTime(now);
-            pricingRuleMapper.insert(rule);
+        for (EstimatedDeliverySaveDTO.EstimatedDeliveryItem item : request.getItems()) {
+            // 鏌ヨ宸叉湁瑙勫垯 type=2, fieldA, cityId, deleted=0
+            QueryWrapper<PricingRule> qw = new QueryWrapper<>();
+            qw.lambda()
+                    .eq(PricingRule::getType, Constants.TWO)
+                    .eq(PricingRule::getFieldA, String.valueOf(item.getFieldA()))
+                    .eq(PricingRule::getCityId, request.getCityId())
+                    .eq(PricingRule::getDeleted, Constants.ZERO)
+                    .last("limit 1");
+            PricingRule existing = pricingRuleMapper.selectOne(qw);
+
+            if (existing != null) {
+                existing.setFieldB(item.getStartDistance());
+                existing.setFieldC(item.getStartTime());
+                existing.setFieldD(item.getContinueDistance());
+                existing.setFieldE(item.getContinueTime());
+                existing.setUpdateTime(now);
+                pricingRuleMapper.updateById(existing);
+            } else {
+                PricingRule rule = new PricingRule();
+                rule.setType(Constants.TWO);
+                rule.setFieldA(String.valueOf(item.getFieldA()));
+                rule.setFieldB(item.getStartDistance());
+                rule.setFieldC(item.getStartTime());
+                rule.setFieldD(item.getContinueDistance());
+                rule.setFieldE(item.getContinueTime());
+                rule.setCityId(request.getCityId());
+                rule.setDeleted(Constants.ZERO);
+                rule.setCreateTime(now);
+                rule.setUpdateTime(now);
+                pricingRuleMapper.insert(rule);
+            }
         }
     }
 
     @Override
-    public EstimatedDeliveryVO getEstimatedDelivery(Integer cityId) {
+    public List<EstimatedDeliveryVO> getEstimatedDelivery(Integer cityId) {
         QueryWrapper<PricingRule> qw = new QueryWrapper<>();
         qw.lambda()
                 .eq(PricingRule::getType, Constants.TWO)
-                .eq(PricingRule::getFieldA, "1")
+                .in(PricingRule::getFieldA, "1", "2")
+                .eq(PricingRule::getCityId, cityId)
+                .eq(PricingRule::getDeleted, Constants.ZERO)
+                .orderByAsc(PricingRule::getFieldA);
+        List<PricingRule> rules = pricingRuleMapper.selectList(qw);
+
+        // 灏嗗凡鏈夎鍒欐寜fieldA鍒嗙粍
+        Map<String, PricingRule> ruleMap = new HashMap<>();
+        for (PricingRule rule : rules) {
+            ruleMap.put(rule.getFieldA(), rule);
+        }
+
+        // 鍥哄畾杩斿洖2鏉★細fieldA=1(鏍囬�熻揪), fieldA=2(鏋侀�熻揪)锛屾棤鏁版嵁鏃惰繑鍥炵┖瀵硅薄
+        List<EstimatedDeliveryVO> voList = new ArrayList<>();
+        for (int fieldA = 1; fieldA <= 2; fieldA++) {
+            EstimatedDeliveryVO vo = new EstimatedDeliveryVO();
+            vo.setCityId(cityId);
+            vo.setFieldA(fieldA);
+            PricingRule rule = ruleMap.get(String.valueOf(fieldA));
+            if (rule != null) {
+                vo.setPricingRuleId(rule.getId());
+                vo.setStartDistance(rule.getFieldB());
+                vo.setStartTime(rule.getFieldC());
+                vo.setContinueDistance(rule.getFieldD());
+                vo.setContinueTime(rule.getFieldE());
+            }
+            voList.add(vo);
+        }
+        return voList;
+    }
+
+    @Override
+    public BigDecimal calculateEstimatedTime(Integer cityId, Integer fieldA, BigDecimal distance) {
+        if (cityId == null || fieldA == null || distance == null) {
+            return null;
+        }
+        QueryWrapper<PricingRule> qw = new QueryWrapper<>();
+        qw.lambda()
+                .eq(PricingRule::getType, Constants.TWO)
+                .eq(PricingRule::getFieldA, String.valueOf(fieldA))
                 .eq(PricingRule::getCityId, cityId)
                 .eq(PricingRule::getDeleted, Constants.ZERO)
                 .last("limit 1");
         PricingRule rule = pricingRuleMapper.selectOne(qw);
-
-        EstimatedDeliveryVO vo = new EstimatedDeliveryVO();
-        vo.setCityId(cityId);
-        if (rule != null) {
-            vo.setPricingRuleId(rule.getId());
-            vo.setStartDistance(rule.getFieldB());
-            vo.setStartTime(rule.getFieldC());
-            vo.setContinueDistance(rule.getFieldD());
-            vo.setContinueTime(rule.getFieldE());
+        if (rule == null) {
+            return null;
         }
-        return vo;
+        // fieldB=璧烽�侀噷绋�, fieldC=璧烽�佹椂闀�, fieldD=缁�侀噷绋�, fieldE=缁�佹椂闀�
+        BigDecimal startDistance = new BigDecimal(rule.getFieldB());
+        BigDecimal startTime = new BigDecimal(rule.getFieldC());
+        BigDecimal continueDistance = new BigDecimal(rule.getFieldD());
+        BigDecimal continueTime = new BigDecimal(rule.getFieldE());
+
+        // 璺濈 <= 璧烽�侀噷绋� 鈫� 鐩存帴杩斿洖璧烽�佹椂闀�
+        if (distance.compareTo(startDistance) <= 0) {
+            return startTime;
+        }
+        // 瓒呭嚭閮ㄥ垎锛氬悜涓婂彇鏁� * 缁�佹椂闀� + 璧烽�佹椂闀�
+        BigDecimal extraDistance = distance.subtract(startDistance);
+        BigDecimal extraCount = extraDistance.divide(continueDistance, 0, RoundingMode.CEILING);
+        return startTime.add(extraCount.multiply(continueTime));
     }
 
     @Override
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 97d1f7d..b46cb11 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
@@ -1,9 +1,11 @@
 package com.doumee.service.business.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.doumee.config.jwt.JwtTokenUtil;
 import com.doumee.core.constants.Constants;
 import com.doumee.core.constants.ResponseStatus;
 import com.doumee.core.exception.BusinessException;
@@ -19,17 +21,19 @@
 import com.doumee.dao.business.model.Member;
 import com.doumee.dao.business.model.Multifile;
 import com.doumee.dao.business.model.ShopInfo;
-import com.doumee.dao.dto.AuditDTO;
-import com.doumee.dao.dto.ChangeStatusDTO;
-import com.doumee.dao.dto.ResetPasswordDTO;
-import com.doumee.dao.dto.ShopApplyDTO;
-import com.doumee.dao.dto.ShopUpdateDTO;
+import com.doumee.dao.dto.*;
+import com.doumee.dao.system.SystemUserMapper;
+import com.doumee.dao.system.model.SystemUser;
 import com.doumee.dao.vo.ShopDetailVO;
+import com.doumee.dao.vo.ShopLoginVO;
+import com.doumee.dao.vo.ShopNearbyVO;
+import com.doumee.dao.vo.ShopWebDetailVO;
 import com.doumee.service.business.ShopInfoService;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -57,8 +61,13 @@
     private SystemDictDataBiz systemDictDataBiz;
 
     @Autowired
+    private SystemUserMapper systemUserMapper;
+
+    @Autowired
     private AreasBiz areasBiz;
 
+    @Autowired
+    private RedisTemplate<String,Object> redisTemplate;
     @Override
     public Integer create(ShopInfo shopInfo) {
         shopInfoMapper.insert(shopInfo);
@@ -175,6 +184,9 @@
         }
         if (pageWrap.getModel().getAuditStatus() != null) {
             queryWrapper.lambda().eq(ShopInfo::getAuditStatus, pageWrap.getModel().getAuditStatus());
+        }
+        if (pageWrap.getModel().getAuditStatusList() != null && !pageWrap.getModel().getAuditStatusList().isEmpty()) {
+            queryWrapper.lambda().in(ShopInfo::getAuditStatus, pageWrap.getModel().getAuditStatusList());
         }
         if (pageWrap.getModel().getStatus() != null) {
             queryWrapper.lambda().eq(ShopInfo::getStatus, pageWrap.getModel().getStatus());
@@ -586,6 +598,11 @@
         vo.setAuditStatus(shopInfo.getAuditStatus());
         vo.setStatus(shopInfo.getStatus());
         vo.setAuditTime(shopInfo.getAuditTime());
+        if(Objects.nonNull(shopInfo.getAuditUserId())){
+            SystemUser systemUser = systemUserMapper.selectById(shopInfo.getAuditUserId());
+            if (systemUser != null) vo.setAuditName(systemUser.getRealname());
+
+        }
         vo.setAuditRemark(shopInfo.getAuditRemark());
         vo.setOpenid(shopInfo.getOpenid());
         vo.setPayStatus(shopInfo.getPayStatus());
@@ -602,10 +619,13 @@
         }
         vo.setImgPrefix(imgPrefix);
 
-        // 鍗曞浘瀛楁杩斿洖鍗婅矾寰�
+        // 鍗曞浘瀛楁锛氬崐璺緞 + 鍏ㄨ矾寰�
         vo.setIdcardImg(shopInfo.getIdcardImg());
+        vo.setIdcardImgUrl(StringUtils.isNotBlank(shopInfo.getIdcardImg()) ? imgPrefix + shopInfo.getIdcardImg() : null);
         vo.setIdcardImgBack(shopInfo.getIdcardImgBack());
+        vo.setIdcardImgBackUrl(StringUtils.isNotBlank(shopInfo.getIdcardImgBack()) ? imgPrefix + shopInfo.getIdcardImgBack() : null);
         vo.setBusinessImg(shopInfo.getBusinessImg());
+        vo.setBusinessImgUrl(StringUtils.isNotBlank(shopInfo.getBusinessImg()) ? imgPrefix + shopInfo.getBusinessImg() : null);
 
         // 鏌ヨ闄勪欢
         QueryWrapper<Multifile> fileQw = new QueryWrapper<>();
@@ -621,10 +641,13 @@
                 .orderByAsc(Multifile::getObjType, Multifile::getSortnum);
         List<Multifile> files = multifileMapper.selectList(fileQw);
 
-        // 鎸� objType 鍒嗙粍锛岃繑鍥炲崐璺緞
+        // 鎸� objType 鍒嗙粍锛屽崐璺緞 + 鍏ㄨ矾寰�
         Map<Integer, List<String>> fileMap = new HashMap<>();
+        Map<Integer, List<String>> fileUrlMap = new HashMap<>();
         for (Multifile f : files) {
             fileMap.computeIfAbsent(f.getObjType(), k -> new ArrayList<>()).add(f.getFileurl());
+            String fullUrl = StringUtils.isNotBlank(f.getFileurl()) ? imgPrefix + f.getFileurl() : f.getFileurl();
+            fileUrlMap.computeIfAbsent(f.getObjType(), k -> new ArrayList<>()).add(fullUrl);
         }
 
         vo.setStoreFrontImgs(fileMap.getOrDefault(Constants.FileType.STORE_FRONT.getKey(), new ArrayList<>()));
@@ -633,17 +656,341 @@
         vo.setLaborContractImgs(fileMap.getOrDefault(Constants.FileType.LABOR_CONTRACT.getKey(), new ArrayList<>()));
         vo.setSocialSecurityImgs(fileMap.getOrDefault(Constants.FileType.SOCIAL_SECURITY.getKey(), new ArrayList<>()));
 
+        vo.setStoreFrontImgUrls(fileUrlMap.getOrDefault(Constants.FileType.STORE_FRONT.getKey(), new ArrayList<>()));
+        vo.setStoreInteriorImgUrls(fileUrlMap.getOrDefault(Constants.FileType.STORE_INTERIOR.getKey(), new ArrayList<>()));
+        vo.setOtherMaterialImgUrls(fileUrlMap.getOrDefault(Constants.FileType.OTHER_MATERIAL.getKey(), new ArrayList<>()));
+        vo.setLaborContractImgUrls(fileUrlMap.getOrDefault(Constants.FileType.LABOR_CONTRACT.getKey(), new ArrayList<>()));
+        vo.setSocialSecurityImgUrls(fileUrlMap.getOrDefault(Constants.FileType.SOCIAL_SECURITY.getKey(), new ArrayList<>()));
+
         // 鏌ヨ缁戝畾寮�鎴蜂細鍛樺ご鍍忥紙payMemberOpenId 鍏宠仈 member.openid锛�
         if (StringUtils.isNotBlank(shopInfo.getPayMemberOpenId())) {
             QueryWrapper<Member> memberQw = new QueryWrapper<>();
             memberQw.lambda().eq(Member::getOpenid, shopInfo.getPayMemberOpenId()).last("limit 1");
             Member payMember = memberMapper.selectOne(memberQw);
-            if (payMember != null) {
-                vo.setPayMemberCoverImage(payMember.getCoverImage());
+            if (payMember != null && StringUtils.isNotBlank(payMember.getCoverImage())) {
+                String memberPrefix = "";
+                try {
+                    memberPrefix = systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.RESOURCE_PATH).getCode()
+                            + systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.MEMBER_FILES).getCode();
+                } catch (Exception e) {
+                    // 鏈厤缃椂蹇界暐
+                }
+                vo.setPayMemberCoverImage(memberPrefix + payMember.getCoverImage());
             }
         }
 
         return vo;
     }
 
+    @Override
+    public PageData<ShopNearbyVO> findNearbyShops(PageWrap<ShopNearbyDTO> pageWrap) {
+        IPage<ShopInfo> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        ShopNearbyDTO dto = pageWrap.getModel();
+        Double longitude = dto.getLongitude();
+        Double latitude = dto.getLatitude();
+        Integer sortType = dto.getSortType();
+        Integer distanceMeter = dto.getDistance();
+
+        // Haversine璺濈鍏紡锛堝崟浣峩m锛�
+        String distanceFormula = "(6371 * acos(cos(radians(" + latitude + ")) * cos(radians(latitude)) " +
+                "* cos(radians(longitude) - radians(" + longitude + ")) " +
+                "+ sin(radians(" + latitude + ")) * sin(radians(latitude))))";
+
+        QueryWrapper<ShopInfo> qw = new QueryWrapper<>();
+        qw.lambda()
+                .eq(ShopInfo::getDeleted, Constants.ZERO)
+                .eq(ShopInfo::getStatus, Constants.ZERO)
+                .eq(ShopInfo::getAuditStatus, Constants.THREE);
+
+        // 闂ㄥ簵钀ヤ笟绫诲瀷绛涢��
+        if (dto.getBusinessType() != null) {
+            qw.lambda().eq(ShopInfo::getBusinessType, dto.getBusinessType());
+        }
+
+        // 闂ㄥ簵鍚嶇О妯$硦鏌ヨ
+        if (StringUtils.isNotBlank(dto.getName())) {
+            qw.lambda().like(ShopInfo::getName, dto.getName());
+        }
+
+        // 璺濈绛涢�夛紙鍗曚綅锛氱背 鈫� 杞崲涓簁m姣旇緝锛�
+        if (distanceMeter != null && distanceMeter > 0) {
+            double maxKm = distanceMeter / 1000.0;
+            qw.apply(distanceFormula + " <= {0}", maxKm);
+        }
+
+        // 鎺掑簭
+        if (longitude != null && latitude != null) {
+            if (sortType != null && sortType == 2) {
+                // 鎸夎瘎鍒嗛檷搴�
+                qw.last("ORDER BY score DESC");
+            } else {
+                // 榛樿锛氭寜璺濈鍗囧簭
+                qw.last("ORDER BY " + distanceFormula + " ASC");
+            }
+        } else {
+            qw.lambda().orderByDesc(ShopInfo::getCreateTime);
+        }
+
+        IPage<ShopInfo> result = shopInfoMapper.selectPage(page, qw);
+
+        // 鍥剧墖鍓嶇紑
+        String imgPrefix = getShopPrefix();
+
+        List<ShopNearbyVO> voList = new ArrayList<>();
+        for (ShopInfo shop : result.getRecords()) {
+            ShopNearbyVO vo = new ShopNearbyVO();
+            vo.setId(shop.getId());
+            vo.setName(shop.getName());
+            vo.setShopHours(shop.getShopHours());
+            vo.setAddress(shop.getAddress());
+            vo.setScore(shop.getScore());
+            // 闂ㄥご鐓х涓�寮�
+            vo.setCoverImg(getFirstImage(shop.getId(), Constants.FileType.STORE_FRONT.getKey(), imgPrefix));
+            // 璺濈
+            if (longitude != null && latitude != null && shop.getLongitude() != null && shop.getLatitude() != null) {
+                double distKm = haversine(latitude, longitude, shop.getLatitude(), shop.getLongitude());
+                vo.setDistanceText(formatDistance(distKm));
+            }
+            voList.add(vo);
+        }
+        IPage<ShopNearbyVO> vPage = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        PageData<ShopNearbyVO> pageData = PageData.from(vPage);
+        pageData.setRecords(voList);
+        pageData.setTotal(result.getTotal());
+        pageData.setPage(result.getCurrent());
+        pageData.setCapacity(result.getSize());
+        return pageData;
+    }
+
+    @Override
+    public ShopWebDetailVO getShopWebDetail(ShopDetailQueryDTO dto) {
+        ShopInfo shop = shopInfoMapper.selectById(dto.getId());
+        if (Objects.isNull(shop) || Constants.equalsInteger(shop.getDeleted(), Constants.ONE)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+
+        ShopWebDetailVO vo = new ShopWebDetailVO();
+        vo.setId(shop.getId());
+        vo.setName(shop.getName());
+        vo.setAddress(shop.getAddress());
+        vo.setContent(shop.getContent());
+
+        // 闂ㄥご鐓� + 鍐呴儴鐓� 鍏ㄨ矾寰勯泦鍚�
+        String imgPrefix = getShopPrefix();
+        List<String> images = new ArrayList<>();
+        images.addAll(getImageList(dto.getId(), Constants.FileType.STORE_FRONT.getKey(), imgPrefix));
+        images.addAll(getImageList(dto.getId(), Constants.FileType.STORE_INTERIOR.getKey(), imgPrefix));
+        vo.setImages(images);
+
+        // 璺濈
+        if (dto.getLongitude() != null && dto.getLatitude() != null && shop.getLongitude() != null && shop.getLatitude() != null) {
+            double distKm = haversine(dto.getLatitude(), dto.getLongitude(), shop.getLatitude(), shop.getLongitude());
+            vo.setDistanceText(formatDistance(distKm));
+        }
+        return vo;
+    }
+
+    @Override
+    public void maintainShopInfo(Integer memberId, ShopInfoMaintainDTO dto) {
+        // 闂ㄥ簵涓婚敭涓庝細鍛樹富閿竴鑷�
+        ShopInfo shop = shopInfoMapper.selectById(memberId);
+        if (Objects.isNull(shop) || Constants.equalsInteger(shop.getDeleted(), Constants.ONE)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        // 闇�瑕佹敮浠樺畬鎶奸噾鍚庢墠鍙淮鎶わ紙auditStatus >= 2锛�
+        if (shop.getAuditStatus() == null || shop.getAuditStatus() < Constants.TWO) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "璇峰厛瀹屾垚鎶奸噾鏀粯鍚庡啀缁存姢闂ㄥ簵淇℃伅");
+        }
+        UpdateWrapper<ShopInfo> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda()
+                .eq(ShopInfo::getId, shop.getId())
+                .set(ShopInfo::getUpdateTime, new Date())
+                .set(dto.getCoverImg() != null, ShopInfo::getCoverImg, dto.getCoverImg())
+                .set(dto.getContent() != null, ShopInfo::getContent, dto.getContent())
+                .set(dto.getDepositTypes() != null, ShopInfo::getDepositTypes, dto.getDepositTypes())
+                .set(dto.getFeeStandard() != null, ShopInfo::getFeeStandard, dto.getFeeStandard())
+                .set(dto.getDeliveryArea() != null, ShopInfo::getDeliveryArea, dto.getDeliveryArea())
+                .set(dto.getShopHours() != null, ShopInfo::getShopHours, dto.getShopHours())
+                .set(dto.getBusinessType() != null, ShopInfo::getBusinessType, dto.getBusinessType());
+        shopInfoMapper.update(updateWrapper);
+    }
+
+    @Override
+    public ShopInfoMaintainDTO getShopMaintainInfo(Integer memberId) {
+        ShopInfo shop = shopInfoMapper.selectById(memberId);
+        if (Objects.isNull(shop) || Constants.equalsInteger(shop.getDeleted(), Constants.ONE)) {
+            return null;
+        }
+        ShopInfoMaintainDTO dto = new ShopInfoMaintainDTO();
+        dto.setCoverImg(shop.getCoverImg());
+        dto.setContent(shop.getContent());
+        dto.setDepositTypes(shop.getDepositTypes());
+        dto.setFeeStandard(shop.getFeeStandard());
+        dto.setDeliveryArea(shop.getDeliveryArea());
+        dto.setShopHours(shop.getShopHours());
+        dto.setBusinessType(shop.getBusinessType());
+        return dto;
+    }
+
+    /**
+     * Haversine鍏紡璁$畻涓ょ偣闂磋窛绂伙紙km锛�
+     */
+    private double haversine(double lat1, double lng1, double lat2, double lng2) {
+        double R = 6371;
+        double dLat = Math.toRadians(lat2 - lat1);
+        double dLng = Math.toRadians(lng2 - lng1);
+        double a = Math.sin(dLat / 2) * Math.sin(dLat / 2)
+                + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2))
+                * Math.sin(dLng / 2) * Math.sin(dLng / 2);
+        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
+        return R * c;
+    }
+
+    /**
+     * 鏍煎紡鍖栬窛绂伙細灏忎簬1km鏄剧ず绫筹紝澶т簬绛変簬1km鏄剧ず鍗冪背锛堜繚鐣�1浣嶅皬鏁帮級
+     */
+    private String formatDistance(double km) {
+        if (km < 1) {
+            return Math.round(km * 1000) + "m";
+        }
+        return String.format("%.1fkm", km);
+    }
+
+    /**
+     * 鑾峰彇闂ㄥ簵鍥剧墖鍓嶇紑
+     */
+    private String getShopPrefix() {
+        try {
+            return systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.RESOURCE_PATH).getCode()
+                    + systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.SHOP_FILES).getCode();
+        } catch (Exception e) {
+            return "";
+        }
+    }
+
+    /**
+     * 鑾峰彇闂ㄥ簵鎸囧畾绫诲瀷鐨勭涓�寮犲浘鐗囧叏璺緞
+     */
+    private String getFirstImage(Integer shopId, int objType, String imgPrefix) {
+        QueryWrapper<Multifile> qw = new QueryWrapper<>();
+        qw.lambda()
+                .eq(Multifile::getObjId, shopId)
+                .eq(Multifile::getObjType, objType)
+                .eq(Multifile::getIsdeleted, Constants.ZERO)
+                .orderByAsc(Multifile::getSortnum)
+                .last("limit 1");
+        Multifile f = multifileMapper.selectOne(qw);
+        return f != null && StringUtils.isNotBlank(f.getFileurl()) ? imgPrefix + f.getFileurl() : null;
+    }
+
+    /**
+     * 鑾峰彇闂ㄥ簵鎸囧畾绫诲瀷鐨勬墍鏈夊浘鐗囧叏璺緞
+     */
+    private List<String> getImageList(Integer shopId, int objType, String imgPrefix) {
+        QueryWrapper<Multifile> qw = new QueryWrapper<>();
+        qw.lambda()
+                .eq(Multifile::getObjId, shopId)
+                .eq(Multifile::getObjType, objType)
+                .eq(Multifile::getIsdeleted, Constants.ZERO)
+                .orderByAsc(Multifile::getSortnum);
+        List<Multifile> files = multifileMapper.selectList(qw);
+        List<String> urls = new ArrayList<>();
+        for (Multifile f : files) {
+            if (StringUtils.isNotBlank(f.getFileurl())) {
+                urls.add(imgPrefix + f.getFileurl());
+            }
+        }
+        return urls;
+    }
+
+
+
+    /**
+     * 鍟嗘埛璐﹀彿瀵嗙爜鐧诲綍
+     * @param dto
+     * @return
+             */
+    @Override
+    public ShopLoginVO shopPasswordLogin(ShopLoginDTO dto){
+        if(StringUtils.isBlank(dto.getTelephone())
+                || StringUtils.isBlank(dto.getPassword())
+                || StringUtils.isBlank(dto.getOpenid())
+        ){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鐢ㄦ埛鍚嶆垨瀵嗙爜涓嶈兘涓虹┖");
+        }
+        ShopInfo shop = shopInfoMapper.selectOne(new QueryWrapper<ShopInfo>().lambda().eq(ShopInfo::getTelephone, dto.getTelephone())
+                .eq(ShopInfo::getDeleted,Constants.ZERO)
+                .last("limit 1")
+        );
+        if(shop==null){
+            throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
+        }
+        //鍔犲瘑瀵嗙爜
+        String pwd = Utils.Secure.encryptPassword( dto.getPassword(), shop.getSalt());
+        if(!pwd.equals(shop.getPassword())){
+            throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
+        }
+
+        // 鏇存柊褰撳墠鐧诲綍浼氬憳鐨刼penid鍒伴棬搴�
+        if(StringUtils.isNotBlank(dto.getOpenid())){
+            shopInfoMapper.update(null,new UpdateWrapper<ShopInfo>().lambda()
+                    .set(ShopInfo::getOpenid,dto.getOpenid())
+                    .eq(ShopInfo::getId,shop.getId())
+            );
+            // 娓呯┖鍏朵粬闂ㄥ簵鐨勫悓涓�openid锛屼繚璇佸敮涓�
+            shopInfoMapper.update(null,new UpdateWrapper<ShopInfo>().lambda()
+                    .set(ShopInfo::getOpenid,null)
+                    .eq(ShopInfo::getOpenid,dto.getOpenid())
+                    .ne(ShopInfo::getId,shop.getId())
+            );
+            shop.setOpenid(dto.getOpenid());
+        }
+
+        // 鍒涘缓token锛坓enerateTokenForRedis 宸茶嚜鍔ㄦ竻闄よ鐢ㄦ埛鏃oken锛屼繚璇佸敮涓�鏈夋晥锛�
+        String token = JwtTokenUtil.generateTokenForRedis(shop.getId(), Constants.TWO, JSONObject.toJSONString(shop), redisTemplate);
+
+        // 鏋勫缓鍝嶅簲
+        ShopLoginVO vo = new ShopLoginVO();
+        vo.setToken(token);
+        vo.setShopId(shop.getId());
+        vo.setShopName(shop.getName());
+        vo.setCompanyType(shop.getCompanyType());
+
+        // 鎵�灞炲煄甯傚悕绉�
+        Areas area = areasBiz.resolveArea(shop.getAreaId());
+        if (area != null) {
+            vo.setCityName(area.getCityName());
+        }
+        return vo;
+    }
+
+    @Override
+    public ShopLoginVO shopSilentLogin(String openid) {
+        if (StringUtils.isBlank(openid)) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "openid涓嶈兘涓虹┖");
+        }
+        ShopInfo shop = shopInfoMapper.selectOne(new QueryWrapper<ShopInfo>().lambda()
+                .eq(ShopInfo::getOpenid, openid)
+                .eq(ShopInfo::getDeleted, Constants.ZERO)
+                .last("limit 1"));
+        if (shop == null) {
+            return null;
+        }
+
+        // 鍒涘缓token锛坓enerateTokenForRedis 宸茶嚜鍔ㄦ竻闄よ鐢ㄦ埛鏃oken锛屼繚璇佸敮涓�鏈夋晥锛�
+        String token = JwtTokenUtil.generateTokenForRedis(shop.getId(), Constants.TWO, JSONObject.toJSONString(shop), redisTemplate);
+
+        ShopLoginVO vo = new ShopLoginVO();
+        vo.setToken(token);
+        vo.setShopId(shop.getId());
+        vo.setShopName(shop.getName());
+        vo.setCompanyType(shop.getCompanyType());
+
+        Areas area = areasBiz.resolveArea(shop.getAreaId());
+        if (area != null) {
+            vo.setCityName(area.getCityName());
+        }
+        return vo;
+    }
+
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/SmsrecordServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/SmsrecordServiceImpl.java
index 9aa71eb..b551c26 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/SmsrecordServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/SmsrecordServiceImpl.java
@@ -1,5 +1,7 @@
 package com.doumee.service.business.impl;
 
+import com.alibaba.fastjson.JSONObject;
+import com.aliyuncs.CommonResponse;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -9,7 +11,10 @@
 import com.doumee.core.exception.BusinessException;
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.DateUtil;
+import com.doumee.core.utils.Strings;
 import com.doumee.core.utils.Utils;
+import com.doumee.core.utils.aliyun.ALiYunSmSUtil;
 import com.doumee.dao.business.SmsrecordMapper;
 import com.doumee.dao.business.model.Smsrecord;
 import com.doumee.service.business.SmsrecordService;
@@ -17,8 +22,7 @@
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 
 /**
  * 鐭俊楠岃瘉鐮丼ervice瀹炵幇
@@ -156,4 +160,77 @@
         return smsrecordMapper.selectCount(wrapper);
     }
 
+
+    /****************************************绉诲姩绔帴鍙e紑濮�********************************************************************/
+
+
+    /**
+     * 鍙戦�佺煭淇�  鐩墠鍙湁鐭俊楠岃瘉鐮�
+     * @param memberId
+     * @param phone
+     */
+    @Override
+    public void sendSms(Integer memberId,String phone){
+        smsrecordMapper.update(null,
+                new UpdateWrapper<Smsrecord>()
+                        .set("STATUS",2)
+                        .eq("PHONE",phone)
+                        .eq("STATUS",0)
+        );
+        String digits = Strings.randomNumeric(4);
+        //鍙戦�侀獙璇佺爜
+        Map<String,Object> map = new HashMap<String,Object>();
+        map.put("code",digits);
+        CommonResponse response = ALiYunSmSUtil.sendMessage(phone,map);
+        if(response.getHttpResponse().isSuccess()){
+            JSONObject data = JSONObject.parseObject(response.getData());
+            String returnCode = data.getString("Code");
+            if(!returnCode.equals("OK")){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鐭俊鍙戦�佸け璐ワ細" + data.getString("Message"));
+            }
+        }
+        //瀛樺偍鐭俊楠岃瘉鐮�
+        Smsrecord smsrecord = new Smsrecord();
+        smsrecord.setCreateTime(new Date());
+        smsrecord.setMemberId(memberId);
+        smsrecord.setPhone(phone);
+        smsrecord.setContent("楠岃瘉鐮佺煭淇�");
+        smsrecord.setType(Constants.ZERO);
+        smsrecord.setValidDate(DateUtil.afterMinutesDate(3));
+        smsrecord.setCode(digits);
+        smsrecord.setStatus(Constants.ZERO);
+        smsrecord.setDeleted(Constants.ZERO);
+        smsrecordMapper.insert(smsrecord);
+    }
+
+
+    /**
+     * 楠岃瘉鐮侀獙璇�
+     * @param memberId
+     * @param phone
+     * @param code
+     */
+    @Override
+    public void verifyCode(Integer memberId,String phone,String code){
+        Smsrecord smsrecord = smsrecordMapper.selectOne(new QueryWrapper<Smsrecord>()
+                .eq("MEMBER_ID",memberId)
+                .eq("PHONE",phone)
+                .eq("CODE",code)
+                .eq("TYPE",Constants.ZERO)
+                .eq("STATUS",Constants.ZERO)
+                .last(" limit 1 ")
+        );
+        if(Objects.isNull(smsrecord)){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"楠岃瘉鐮佽緭鍏ラ敊璇垨宸茶繃鏈燂紒");
+        }
+        if(smsrecord.getValidDate().getTime()<System.currentTimeMillis()){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"楠岃瘉鐮佸凡杩囨湡璇烽噸鏂拌幏鍙栵紒");
+        }
+        smsrecord.setStatus(Constants.ONE);
+        smsrecord.setUpdateTime(new Date());
+        smsrecordMapper.updateById(smsrecord);
+    }
+
+
+
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java
index 68070ca..2602c77 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java
@@ -10,13 +10,23 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.DriverInfoMapper;
+import com.doumee.dao.business.ShopInfoMapper;
 import com.doumee.dao.business.WithdrawalOrdersMapper;
+import com.doumee.dao.business.model.DriverInfo;
+import com.doumee.dao.business.model.ShopInfo;
 import com.doumee.dao.business.model.WithdrawalOrders;
+import com.doumee.dao.dto.WithdrawalApproveDTO;
+import com.doumee.dao.system.SystemUserMapper;
+import com.doumee.dao.system.model.SystemUser;
 import com.doumee.service.business.WithdrawalOrdersService;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Arrays;
+import java.util.Date;
 import java.util.List;
 import java.util.Objects;
 
@@ -30,6 +40,15 @@
 
     @Autowired
     private WithdrawalOrdersMapper withdrawalOrdersMapper;
+
+    @Autowired
+    private SystemUserMapper systemUserMapper;
+
+    @Autowired
+    private ShopInfoMapper shopInfoMapper;
+
+    @Autowired
+    private DriverInfoMapper driverInfoMapper;
 
     @Override
     public Integer create(WithdrawalOrders withdrawalOrders) {
@@ -75,11 +94,19 @@
 
     @Override
     public WithdrawalOrders findById(Integer id) {
-        WithdrawalOrders withdrawalOrders = withdrawalOrdersMapper.selectById(id);
-        if (Objects.isNull(withdrawalOrders)) {
+        WithdrawalOrders order = withdrawalOrdersMapper.selectById(id);
+        if (Objects.isNull(order)) {
             throw new BusinessException(ResponseStatus.DATA_EMPTY);
         }
-        return withdrawalOrders;
+        // 鏌ヨ瀹℃壒浜哄悕绉�
+        fillUpdateUserName(order);
+        // 鏍规嵁鐢ㄦ埛绫诲瀷鏌ヨ鍏宠仈淇℃伅
+        if (Constants.ONE.equals(order.getMemberType())) {
+            fillMemberInfo(order);
+        } else {
+            fillShopInfo(order);
+        }
+        return order;
     }
 
     @Override
@@ -97,16 +124,52 @@
     @Override
     public PageData<WithdrawalOrders> findPage(PageWrap<WithdrawalOrders> pageWrap) {
         IPage<WithdrawalOrders> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
-        QueryWrapper<WithdrawalOrders> queryWrapper = new QueryWrapper<>();
+        MPJLambdaWrapper<WithdrawalOrders> queryWrapper = new MPJLambdaWrapper<>();
         Utils.MP.blankToNull(pageWrap.getModel());
         pageWrap.getModel().setDeleted(Constants.ZERO);
-        queryWrapper.lambda().eq(WithdrawalOrders::getDeleted, pageWrap.getModel().getDeleted());
-        queryWrapper.lambda().like(StringUtils.isNotBlank(pageWrap.getModel().getOutBillNo()), WithdrawalOrders::getOutBillNo, pageWrap.getModel().getOutBillNo());
-        queryWrapper.lambda().eq(pageWrap.getModel().getMemberId() != null, WithdrawalOrders::getMemberId, pageWrap.getModel().getMemberId());
-        queryWrapper.lambda().eq(pageWrap.getModel().getStatus() != null, WithdrawalOrders::getStatus, pageWrap.getModel().getStatus());
-        queryWrapper.lambda().eq(pageWrap.getModel().getType() != null, WithdrawalOrders::getType, pageWrap.getModel().getType());
-        queryWrapper.lambda().ge(pageWrap.getModel().getCreateStartTime() != null, WithdrawalOrders::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateStartTime()));
-        queryWrapper.lambda().le(pageWrap.getModel().getCreateEndTime() != null, WithdrawalOrders::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateEndTime()));
+
+        // 鍏叡锛氬鎵逛汉鍚嶇О
+        queryWrapper.selectAll(WithdrawalOrders.class)
+                .selectAs(SystemUser::getUsername, WithdrawalOrders::getUpdateUserName)
+                .leftJoin(SystemUser.class, SystemUser::getId, WithdrawalOrders::getUserId);
+
+        // 鏍规嵁鐢ㄦ埛绫诲瀷鍏宠仈涓嶅悓琛�
+        Integer memberType = pageWrap.getModel().getMemberType();
+        if (Constants.ONE.equals(memberType)) {
+            // 鍙告満绔細鍏宠仈 DriverInfo 琛�
+            queryWrapper.selectAs(DriverInfo::getName, WithdrawalOrders::getMemberName)
+                    .selectAs(DriverInfo::getTelephone, WithdrawalOrders::getMemberTelephone)
+                    .leftJoin(DriverInfo.class, DriverInfo::getMemberId, WithdrawalOrders::getMemberId);
+        } else {
+            // 搴楅摵绔� / 涓嶇瓫閫夛細鍏宠仈 ShopInfo 琛�
+            queryWrapper.selectAs(ShopInfo::getName, WithdrawalOrders::getShopName)
+                    .selectAs(ShopInfo::getLinkName, WithdrawalOrders::getLinkName)
+                    .leftJoin(ShopInfo.class, ShopInfo::getId, WithdrawalOrders::getMemberId,
+                            ext -> ext.eq(ShopInfo::getDeleted, Constants.ZERO));
+        }
+
+        queryWrapper.eq(WithdrawalOrders::getDeleted, pageWrap.getModel().getDeleted());
+        if (memberType != null) {
+            queryWrapper.eq(WithdrawalOrders::getMemberType, memberType);
+        }
+        if (StringUtils.isNotBlank(pageWrap.getModel().getOutBillNo())) {
+            queryWrapper.like(WithdrawalOrders::getOutBillNo, pageWrap.getModel().getOutBillNo());
+        }
+        if (pageWrap.getModel().getMemberId() != null) {
+            queryWrapper.eq(WithdrawalOrders::getMemberId, pageWrap.getModel().getMemberId());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.eq(WithdrawalOrders::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getType() != null) {
+            queryWrapper.eq(WithdrawalOrders::getType, pageWrap.getModel().getType());
+        }
+        if (pageWrap.getModel().getCreateStartTime() != null) {
+            queryWrapper.ge(WithdrawalOrders::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateStartTime()));
+        }
+        if (pageWrap.getModel().getCreateEndTime() != null) {
+            queryWrapper.le(WithdrawalOrders::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateEndTime()));
+        }
         for (PageWrap.SortData sortData : pageWrap.getSorts()) {
             if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                 queryWrapper.orderByDesc(sortData.getProperty());
@@ -114,8 +177,12 @@
                 queryWrapper.orderByAsc(sortData.getProperty());
             }
         }
-        return PageData.from(withdrawalOrdersMapper.selectPage(page, queryWrapper));
+        return PageData.from(withdrawalOrdersMapper.selectJoinPage(page, WithdrawalOrders.class, queryWrapper));
     }
+
+
+
+
 
     @Override
     public long count(WithdrawalOrders withdrawalOrders) {
@@ -123,4 +190,103 @@
         return withdrawalOrdersMapper.selectCount(wrapper);
     }
 
+    @Override
+    public Long totalAmount(PageWrap<WithdrawalOrders> pageWrap) {
+        QueryWrapper<WithdrawalOrders> queryWrapper = new QueryWrapper<>();
+        queryWrapper.select("IFNULL(SUM(amount), 0) as amount");
+        Utils.MP.blankToNull(pageWrap.getModel());
+        queryWrapper.lambda().eq(WithdrawalOrders::getDeleted, Constants.ZERO);
+        queryWrapper.lambda().in(WithdrawalOrders::getStatus, Arrays.asList(Constants.ZERO, Constants.ONE));
+        if (pageWrap.getModel().getOutBillNo() != null) {
+            queryWrapper.lambda().like(WithdrawalOrders::getOutBillNo, pageWrap.getModel().getOutBillNo());
+        }
+        if (pageWrap.getModel().getMemberId() != null) {
+            queryWrapper.lambda().eq(WithdrawalOrders::getMemberId, pageWrap.getModel().getMemberId());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(WithdrawalOrders::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getType() != null) {
+            queryWrapper.lambda().eq(WithdrawalOrders::getType, pageWrap.getModel().getType());
+        }
+        if (pageWrap.getModel().getCreateStartTime() != null) {
+            queryWrapper.lambda().ge(WithdrawalOrders::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateStartTime()));
+        }
+        if (pageWrap.getModel().getCreateEndTime() != null) {
+            queryWrapper.lambda().le(WithdrawalOrders::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateEndTime()));
+        }
+        WithdrawalOrders result = withdrawalOrdersMapper.selectOne(queryWrapper);
+        return result != null && result.getAmount() != null ? result.getAmount() : 0L;
+    }
+
+    @Override
+    public void approve(WithdrawalApproveDTO dto) {
+        if (dto == null || dto.getId() == null || dto.getStatus() == null) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀹℃壒鍙傛暟涓嶅畬鏁�");
+        }
+        if (!Constants.ONE.equals(dto.getStatus()) && !Constants.TWO.equals(dto.getStatus())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀹℃壒缁撴灉浠呮敮鎸侀�氳繃鎴栨嫆缁�");
+        }
+
+        WithdrawalOrders order = withdrawalOrdersMapper.selectById(dto.getId());
+        if (Objects.isNull(order)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        if (!Constants.ZERO.equals(order.getStatus())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "浠呯敵璇蜂腑鐨勬彁鐜拌鍗曞彲瀹℃壒");
+        }
+
+        // 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛
+        Integer currentUserId = getCurrentUserId();
+
+        WithdrawalOrders update = new WithdrawalOrders();
+        update.setId(dto.getId());
+        update.setStatus(dto.getStatus());
+        update.setUserId(currentUserId);
+        update.setApproveTime(new Date());
+        update.setApproveRemark(dto.getApproveRemark());
+        update.setUpdateTime(new Date());
+        withdrawalOrdersMapper.updateById(update);
+    }
+
+    private Integer getCurrentUserId() {
+        com.doumee.core.model.LoginUserInfo user =
+                (com.doumee.core.model.LoginUserInfo) org.apache.shiro.SecurityUtils.getSubject().getPrincipal();
+        return user != null ? user.getId() : null;
+    }
+
+    private void fillUpdateUserName(WithdrawalOrders order) {
+        if (order.getUserId() != null) {
+            SystemUser user = systemUserMapper.selectById(order.getUserId());
+            if (user != null) {
+                order.setUpdateUserName(user.getUsername());
+            }
+        }
+    }
+
+    private void fillShopInfo(WithdrawalOrders order) {
+        if (order.getMemberId() != null) {
+            ShopInfo shop = shopInfoMapper.selectById(order.getMemberId());
+            if (shop != null && !Constants.ONE.equals(shop.getDeleted())) {
+                order.setShopInfo(shop);
+                order.setShopName(shop.getName());
+                order.setLinkName(shop.getLinkName());
+            }
+        }
+    }
+
+    private void fillMemberInfo(WithdrawalOrders order) {
+        if (order.getMemberId() != null) {
+            DriverInfo driver = driverInfoMapper.selectOne(
+                    new QueryWrapper<DriverInfo>().lambda()
+                            .eq(DriverInfo::getMemberId, order.getMemberId())
+                            .eq(DriverInfo::getDeleted, Constants.ZERO)
+                            .last("limit 1"));
+            if (driver != null) {
+                order.setMemberName(driver.getName());
+                order.setMemberTelephone(driver.getTelephone());
+            }
+        }
+    }
+
 }
diff --git a/server/services/src/main/resources/application-dev.yml b/server/services/src/main/resources/application-dev.yml
index 2ce140d..90b1576 100644
--- a/server/services/src/main/resources/application-dev.yml
+++ b/server/services/src/main/resources/application-dev.yml
@@ -94,5 +94,8 @@
 upload:
   type: ftp
 
+# 鑵捐鍦板浘apikey
+tencent_key: WE3BZ-HN6WS-ONDOH-62QCV-MNL6F-5NFNE
+
 
 
diff --git a/server/services/src/main/resources/application-pro.yml b/server/services/src/main/resources/application-pro.yml
index 08d1c6c..e5a55e9 100644
--- a/server/services/src/main/resources/application-pro.yml
+++ b/server/services/src/main/resources/application-pro.yml
@@ -91,4 +91,9 @@
   type: blob
 
 qiwei:
-  serviceurl: https://wecom-qyapi.unilever-china.com/
\ No newline at end of file
+  serviceurl: https://wecom-qyapi.unilever-china.com/
+
+
+
+# 鑵捐鍦板浘apikey
+tencent_key: WE3BZ-HN6WS-ONDOH-62QCV-MNL6F-5NFNE
\ No newline at end of file
diff --git a/server/services/src/main/resources/application-test.yml b/server/services/src/main/resources/application-test.yml
index d9c588f..27f42d6 100644
--- a/server/services/src/main/resources/application-test.yml
+++ b/server/services/src/main/resources/application-test.yml
@@ -113,4 +113,8 @@
   type: blob
 
 qiwei:
-  serviceurl: https://qyapi.weixin.qq.com
\ No newline at end of file
+  serviceurl: https://qyapi.weixin.qq.com
+
+
+# 鑵捐鍦板浘apikey
+tencent_key: WE3BZ-HN6WS-ONDOH-62QCV-MNL6F-5NFNE
\ No newline at end of file
diff --git a/server/web/src/main/java/com/doumee/api/web/AccountApi.java b/server/web/src/main/java/com/doumee/api/web/AccountApi.java
index eccaa23..eb4aeaa 100644
--- a/server/web/src/main/java/com/doumee/api/web/AccountApi.java
+++ b/server/web/src/main/java/com/doumee/api/web/AccountApi.java
@@ -5,15 +5,19 @@
 import com.doumee.core.annotation.trace.Trace;
 import com.doumee.core.model.ApiResponse;
 import com.doumee.dao.business.model.Member;
+import com.doumee.dao.dto.ShopLoginDTO;
 import com.doumee.dao.dto.WxPhoneRequest;
 import com.doumee.dao.vo.AccountResponse;
+import com.doumee.dao.vo.ShopLoginVO;
 import com.doumee.service.business.MemberService;
+import com.doumee.service.business.ShopInfoService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 /**
@@ -33,9 +37,12 @@
     @Autowired
     private MemberService memberService;
 
+    @Autowired
+    private ShopInfoService shopInfoService;
+
 
     @Trace
-    @ApiOperation(value = "寰俊鎺堟潈", notes = "灏忕▼搴忕")
+    @ApiOperation(value = "浼氬憳寰俊鎺堟潈", notes = "灏忕▼搴忕")
     @GetMapping("/wxLogin")
     @ApiImplicitParams({
             @ApiImplicitParam(paramType = "query", dataType = "String", name = "code", value = "寰俊code", required = true)
@@ -45,7 +52,7 @@
     }
 
 
-    @ApiOperation(value = "鎺堟潈鎵嬫満鍙�", notes = "灏忕▼搴忕")
+    @ApiOperation(value = "浼氬憳鎺堟潈鎵嬫満鍙�", notes = "灏忕▼搴忕")
     @PostMapping("/wxAuthPhone")
     @ApiImplicitParams({
             @ApiImplicitParam(paramType = "query", dataType = "String", name = "code", value = "寰俊code", required = true)
@@ -54,20 +61,23 @@
         return  ApiResponse.success("鎿嶄綔鎴愬姛",memberService.wxAuthPhone(wxPhoneRequest));
     }
 
-    @LoginRequired
-    @ApiOperation(value = "閫�鍑虹櫥褰�", notes = "灏忕▼搴忕")
-    @GetMapping("/logOff")
+    @ApiOperation(value = "闂ㄥ簵璐﹀彿瀵嗙爜鐧诲綍", notes = "灏忕▼搴忕锛岄棬搴楃敤鎴烽�氳繃鎵嬫満鍙�+瀵嗙爜鐧诲綍")
+    @PostMapping("/shopLogin")
+    public ApiResponse<ShopLoginVO> shopLogin(@RequestBody @Validated ShopLoginDTO dto) {
+        return ApiResponse.success("鎿嶄綔鎴愬姛", shopInfoService.shopPasswordLogin(dto));
+    }
+
+    @ApiOperation(value = "闂ㄥ簵闈欓粯鐧诲綍", notes = "鏍规嵁openid鑷姩鐧诲綍闂ㄥ簵锛屾湭缁戝畾鍒欒繑鍥炵┖")
+    @GetMapping("/shopSilentLogin")
     @ApiImplicitParams({
-            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+            @ApiImplicitParam(paramType = "query", dataType = "String", name = "openid", value = "寰俊openid", required = true)
     })
-    public ApiResponse logOff() {
-        String token = this.getRequest().getHeader(JwtTokenUtil.HEADER_KEY);
-        memberService.logOut(token,getMemberId());
-        return  ApiResponse.success("鎿嶄綔鎴愬姛");
+    public ApiResponse<ShopLoginVO> shopSilentLogin(@RequestParam String openid) {
+        return ApiResponse.success("鎿嶄綔鎴愬姛", shopInfoService.shopSilentLogin(openid));
     }
 
     @LoginRequired
-    @ApiOperation(value = "鐢ㄦ埛娉ㄩ攢", notes = "灏忕▼搴忕")
+    @ApiOperation(value = "閫�鍑虹櫥褰�", notes = "灏忕▼搴忕")
     @GetMapping("/logOut")
     @ApiImplicitParams({
             @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
@@ -78,6 +88,18 @@
         return  ApiResponse.success("鎿嶄綔鎴愬姛");
     }
 
+    @LoginRequired
+    @ApiOperation(value = "鐢ㄦ埛娉ㄩ攢", notes = "灏忕▼搴忕")
+    @GetMapping("/logOff")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+    })
+    public ApiResponse logOff() {
+        String token = this.getRequest().getHeader(JwtTokenUtil.HEADER_KEY);
+        memberService.logOff(token,getMemberId());
+        return  ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
+
 
 
 
diff --git a/server/web/src/main/java/com/doumee/api/web/AddrApi.java b/server/web/src/main/java/com/doumee/api/web/AddrApi.java
new file mode 100644
index 0000000..9a047fd
--- /dev/null
+++ b/server/web/src/main/java/com/doumee/api/web/AddrApi.java
@@ -0,0 +1,95 @@
+package com.doumee.api.web;
+
+import com.doumee.core.annotation.LoginRequired;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.dao.business.model.Addr;
+import com.doumee.service.business.AddrService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 鍦板潃绨匡紙灏忕▼搴忕锛�
+ * @author rk
+ * @date 2026/04/15
+ */
+@Api(tags = "鍦板潃绨�")
+@RestController
+@RequestMapping("/web/addr")
+public class AddrApi extends ApiController {
+
+    @Autowired
+    private AddrService addrService;
+
+    @LoginRequired
+    @ApiOperation(value = "鏌ヨ鎴戠殑鍦板潃鍒楄〃", notes = "灏忕▼搴忕")
+    @GetMapping("/list")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+    })
+    public ApiResponse<List<Addr>> list() {
+        return ApiResponse.success("鏌ヨ鎴愬姛", addrService.findListWithArea(getMemberId()));
+    }
+
+    @LoginRequired
+    @ApiOperation(value = "鏍规嵁ID鏌ヨ鍦板潃", notes = "灏忕▼搴忕")
+    @GetMapping("/{id}")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+    })
+    public ApiResponse<Addr> findById(@PathVariable Integer id) {
+        return ApiResponse.success("鏌ヨ鎴愬姛", addrService.findByIdWithArea(id));
+    }
+
+    @LoginRequired
+    @ApiOperation(value = "鏂板鍦板潃", notes = "灏忕▼搴忕")
+    @PostMapping("/create")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+    })
+    public ApiResponse create(@RequestBody Addr addr) {
+        addrService.createByMember(addr, getMemberId());
+        return ApiResponse.success("鎿嶄綔鎴愬姛", addrService.findByIdWithArea(addr.getId()));
+    }
+
+    @LoginRequired
+    @ApiOperation(value = "淇敼鍦板潃", notes = "灏忕▼搴忕")
+    @PostMapping("/updateById")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+    })
+    public ApiResponse updateById(@RequestBody Addr addr) {
+        addrService.updateByMember(addr, getMemberId());
+        return ApiResponse.success("鎿嶄綔鎴愬姛", addrService.findByIdWithArea(addr.getId()));
+    }
+
+    @LoginRequired
+    @ApiOperation(value = "鍒犻櫎鍦板潃", notes = "灏忕▼搴忕")
+    @GetMapping("/delete/{id}")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+    })
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        addrService.deleteById(id);
+        return ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
+
+    @LoginRequired
+    @ApiOperation(value = "璁句负榛樿鍦板潃", notes = "灏忕▼搴忕")
+    @PostMapping("/setDefault/{id}")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+    })
+    public ApiResponse setDefault(@PathVariable Integer id) {
+        Addr addr = new Addr();
+        addr.setId(id);
+        addr.setIsDefault(1);
+        addrService.updateByMember(addr, getMemberId());
+        return ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
+}
diff --git a/server/web/src/main/java/com/doumee/api/web/ApiController.java b/server/web/src/main/java/com/doumee/api/web/ApiController.java
index 56227eb..897ce33 100644
--- a/server/web/src/main/java/com/doumee/api/web/ApiController.java
+++ b/server/web/src/main/java/com/doumee/api/web/ApiController.java
@@ -37,6 +37,11 @@
         return obj != null ? (Integer) obj : null;
     }
 
+    protected Integer getShopId() {
+        Object obj = this.getRequest().getAttribute(JwtTokenUtil.SHOP_ID);
+        return obj != null ? (Integer) obj : null;
+    }
+
     /**
      * 鑾峰彇鐧诲綍鐢ㄦ埛瀵硅薄淇℃伅
      * @return
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 f59c98f..46a157e 100644
--- a/server/web/src/main/java/com/doumee/api/web/ConfigApi.java
+++ b/server/web/src/main/java/com/doumee/api/web/ConfigApi.java
@@ -3,20 +3,26 @@
 import com.doumee.core.annotation.LoginRequired;
 import com.doumee.core.annotation.trace.Trace;
 import com.doumee.core.model.ApiResponse;
+import com.doumee.dao.business.model.Areas;
+import com.doumee.dao.business.model.Banner;
 import com.doumee.dao.business.model.Category;
+import com.doumee.dao.dto.CalculateLocalPriceDTO;
+import com.doumee.dao.dto.CalculateRemotePriceDTO;
 import com.doumee.dao.vo.AccountResponse;
-import com.doumee.service.business.CategoryService;
+import com.doumee.dao.vo.PriceCalculateVO;
+import com.doumee.dao.vo.UserCenterVO;
+import com.doumee.service.business.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.checkerframework.checker.units.qual.A;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
+import javax.validation.Valid;
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -28,21 +34,97 @@
 @Api(tags = "閰嶇疆绫绘帴鍙�")
 @Trace(exclude = true)
 @RestController
-@RequestMapping("/web/orders")
+@RequestMapping("/web/config")
 @Slf4j
 public class ConfigApi extends ApiController{
 
     @Autowired
     private CategoryService categoryService;
 
+    @Autowired
+    private AreasService areasService;
+
+    @Autowired
+    private BannerService bannerService;
+
+    @Autowired
+    private OrdersService ordersService;
+
+    @Autowired
+    private MemberService memberService;
+
     @ApiOperation(value = "鑾峰彇鍒嗙被鍒楄〃", notes = "灏忕▼搴忕")
     @GetMapping("/getCategoryList")
     @ApiImplicitParams({
-            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "type", value = "绫诲瀷:0=鍝佺閰嶇疆;1=杞﹁締绫诲瀷閰嶇疆;2=椁愭爣閰嶇疆;3=鎵嬬画璐归厤缃�;", required = true)
+            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "type", value = "绫诲瀷:1=杞﹁締绫诲瀷;2=鐗╁搧鍒嗙被;3=鐗╁搧绛夌骇;4=鐗╁搧灏哄;", required = true)
     })
     public ApiResponse<List<Category>> getCategoryList(@RequestParam Integer type) {
         return  ApiResponse.success("鎿嶄綔鎴愬姛",categoryService.getCategoryList(type));
     }
 
+    @ApiOperation(value = "鑾峰彇寮�鏀惧煄甯傚垪琛�", notes = "杩斿洖宸插紑鏀惧煄甯傦紝鍚瀛楁瘝锛屾寜棣栧瓧姣嶆帓搴�")
+    @GetMapping("/getOpenCityList")
+    public ApiResponse<List<Areas>> getOpenCityList() {
+        return ApiResponse.success("鎿嶄綔鎴愬姛", areasService.getOpenCityList());
+    }
+
+    @ApiOperation(value = "鑾峰彇杞挱鍥惧垪琛�", notes = "鏍规嵁浣嶇疆杩斿洖杞挱鍥撅紝鍚浘鐗囧叏璺緞")
+    @GetMapping("/getBannerList")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "position", value = "浣嶇疆:0=浼氬憳绔椤佃疆鎾�;1=鍙告満APP寮曞椤�;", required = true)
+    })
+    public ApiResponse<List<Banner>> getBannerList(@RequestParam Integer position) {
+        return ApiResponse.success("鎿嶄綔鎴愬姛", bannerService.findListByPosition(position));
+    }
+
+    @ApiOperation(value = "鑾峰彇鍩庡競宸插紑閫氱墿鍝佸昂瀵�", notes = "鏍规嵁鍩庡競涓婚敭鏌ヨ宸插紑閫氱殑鐗╁搧灏哄(category type=4)")
+    @GetMapping("/getCitySizeList")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "cityId", value = "鍩庡競涓婚敭", required = true)
+    })
+    public ApiResponse<List<Category>> getCitySizeList(@RequestParam Integer cityId) {
+        return ApiResponse.success("鎿嶄綔鎴愬姛", categoryService.getCitySizeList(cityId));
+    }
+
+
+    @ApiOperation(value = "鑾峰彇绯荤粺閰嶇疆", notes = "灏忕▼搴忕")
+    @GetMapping("/getPlatformAboutUs")
+    public ApiResponse<UserCenterVO> getPlatformAboutUs() {
+        return  ApiResponse.success("鏌ヨ鎴愬姛",memberService.getPlatformAboutUs());
+    }
+
+
+
+
+    @LoginRequired
+    @ApiOperation(value = "璁$畻淇濅环璐圭敤", notes = "鏍规嵁鎶ヤ环閲戦璁$畻淇濅环璐圭敤")
+    @GetMapping("/calculateInsuranceFee")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", dataType = "BigDecimal", name = "declaredValue", value = "鎶ヤ环閲戦", required = true),
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true)
+    })
+    public ApiResponse<BigDecimal> calculateInsuranceFee(@RequestParam BigDecimal declaredValue) {
+        return ApiResponse.success("鎿嶄綔鎴愬姛", ordersService.calculateInsuranceFee(declaredValue));
+    }
+
+    @LoginRequired
+    @ApiOperation(value = "璁$畻灏卞湴瀛樺彇棰勪及璐圭敤", notes = "鏍规嵁鍩庡競銆佸ぉ鏁般�佺墿鍝佺被鍨嬪拰鏁伴噺璁$畻灏卞湴瀛樺彇棰勪及璐圭敤")
+    @PostMapping("/calculateLocalPrice")
+    public ApiResponse<PriceCalculateVO> calculateLocalPrice(@RequestBody @Valid CalculateLocalPriceDTO dto) {
+        return ApiResponse.success("鎿嶄綔鎴愬姛", ordersService.calculateLocalPrice(dto));
+    }
+
+    @LoginRequired
+    @ApiOperation(value = "璁$畻寮傚湴瀛樺彇棰勪及璐圭敤", notes = "鏍规嵁璺濈銆佺墿鍝佺被鍨嬪拰鏁伴噺璁$畻寮傚湴瀛樺彇棰勪及璐圭敤")
+    @PostMapping("/calculateRemotePrice")
+    public ApiResponse<PriceCalculateVO> calculateRemotePrice(@RequestBody @Valid CalculateRemotePriceDTO dto) {
+        return ApiResponse.success("鎿嶄綔鎴愬姛", ordersService.calculateRemotePrice(dto));
+    }
+
+
+
+
+
+
 
 }
diff --git a/server/web/src/main/java/com/doumee/api/web/MemberApi.java b/server/web/src/main/java/com/doumee/api/web/MemberApi.java
new file mode 100644
index 0000000..ec9eb29
--- /dev/null
+++ b/server/web/src/main/java/com/doumee/api/web/MemberApi.java
@@ -0,0 +1,116 @@
+package com.doumee.api.web;
+
+import com.doumee.core.annotation.LoginRequired;
+import com.doumee.core.annotation.trace.Trace;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.dao.business.model.Member;
+import com.doumee.dao.dto.UpdMobileRequest;
+import com.doumee.dao.vo.UserCenterVO;
+import com.doumee.service.business.MemberService;
+import com.doumee.service.business.SmsrecordService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2025/7/10 9:29
+ */
+@Api(tags = "2銆佺敤鎴蜂俊鎭�")
+@Trace(exclude = true)
+@RestController
+@RequestMapping("/web/member")
+@Slf4j
+public class MemberApi extends  ApiController{
+
+
+    @Autowired
+    private MemberService memberService;
+
+    @Autowired
+    private SmsrecordService smsrecordService;
+
+    @LoginRequired
+    @ApiOperation(value = "鑾峰彇涓汉淇℃伅", notes = "灏忕▼搴忕")
+    @GetMapping("/getMemberInfo")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+    })
+    public ApiResponse<Member> getMemberInfo() {
+        return  ApiResponse.success("鏌ヨ鎴愬姛",memberService.getMemberInfo(getMemberId()));
+    }
+
+
+    @LoginRequired
+    @ApiOperation(value = "缂栬緫涓汉淇℃伅", notes = "灏忕▼搴忕")
+    @PostMapping("/editMemberInfo")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+    })
+    public ApiResponse editMemberInfo(@RequestBody Member member) {
+        member.setId(getMemberId());
+        memberService.editMemberInfo(member);
+        return  ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
+
+    @LoginRequired
+    @ApiOperation(value = "鍙戦�佺煭淇¢獙璇佺爜", notes = "灏忕▼搴忕")
+    @GetMapping("/sendSmsCode")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+            @ApiImplicitParam(paramType = "query", dataType = "String", name = "phone", value = "鎵嬫満鍙风爜", required = true)
+    })
+    public ApiResponse sendSmsCode(@RequestParam String phone) {
+        smsrecordService.sendSms(getMemberId(),phone);
+        return  ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
+
+
+    @LoginRequired
+    @ApiOperation(value = "楠岃瘉鐭俊楠岃瘉鐮�", notes = "灏忕▼搴忕")
+    @GetMapping("/verifyCode")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+            @ApiImplicitParam(paramType = "query", dataType = "String", name = "phone", value = "鎵嬫満鍙风爜", required = true),
+            @ApiImplicitParam(paramType = "query", dataType = "String", name = "code", value = "楠岃瘉鐮�", required = true)
+    })
+    public ApiResponse verifyCode(@RequestParam String phone,@RequestParam String code) {
+        smsrecordService.verifyCode(getMemberId(),phone,code);
+        return  ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
+
+
+    @LoginRequired
+    @ApiOperation("楠岃瘉鎵嬫満鍙�")
+    @PostMapping("/verifyUserPhone")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+    })
+    public ApiResponse verifyUserPhone(@RequestBody UpdMobileRequest request) {
+        request.setMemberId(getMemberId());
+        memberService.verifyUserPhone(request);
+        return ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
+
+
+    @LoginRequired
+    @ApiOperation("鏇存崲缁戝畾鎵嬫満鍙�")
+    @PostMapping("/updateUserPhone")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+    })
+    public ApiResponse updateUserPhone(@RequestBody UpdMobileRequest request) {
+        request.setMemberId(getMemberId());
+        memberService.updateUserPhone(request);
+        return ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
+
+
+
+}
diff --git a/server/web/src/main/java/com/doumee/api/web/OrdersApi.java b/server/web/src/main/java/com/doumee/api/web/OrdersApi.java
new file mode 100644
index 0000000..e2b9e33
--- /dev/null
+++ b/server/web/src/main/java/com/doumee/api/web/OrdersApi.java
@@ -0,0 +1,149 @@
+package com.doumee.api.web;
+
+import com.doumee.core.annotation.LoginRequired;
+import com.doumee.core.annotation.LoginShopRequired;
+import com.doumee.core.annotation.trace.Trace;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.dto.CancelOrderDTO;
+import com.doumee.dao.dto.CreateOrderDTO;
+import com.doumee.dao.dto.DriverVerifyDTO;
+import com.doumee.dao.dto.ShopVerifyDTO;
+import com.doumee.dao.dto.MyOrderDTO;
+import com.doumee.dao.vo.MyOrderDetailVO;
+import com.doumee.dao.vo.MyOrderVO;
+import com.doumee.dao.vo.OverdueFeeVO;
+import com.doumee.dao.vo.PayResponse;
+import com.doumee.service.business.OrdersService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.Objects;
+
+/**
+ * 璁㈠崟鎺ュ彛
+ *
+ * @Author : Rk
+ * @create 2025/7/15 15:49
+ */
+@Api(tags = "璁㈠崟鎺ュ彛")
+@Trace(exclude = true)
+@RestController
+@RequestMapping("/web/order")
+@Slf4j
+public class OrdersApi extends ApiController {
+
+    @Autowired
+    private OrdersService ordersService;
+
+    @Autowired
+    private RedisTemplate<String, Object> redisTemplate;
+
+    @LoginRequired
+    @ApiOperation(value = "鍒涘缓璁㈠崟", notes = "鍒涘缓灏卞湴/寮傚湴瀵勫瓨璁㈠崟锛岃繑鍥炲井淇℃敮浠樺弬鏁�")
+    @PostMapping("/create")
+    public ApiResponse<PayResponse> createOrder(@RequestBody @Valid CreateOrderDTO dto) {
+        PayResponse payResponse = ordersService.createOrder(dto, getMemberId());
+        if (Objects.nonNull(payResponse) && StringUtils.isNotBlank(payResponse.getLockKey())) {
+            redisTemplate.delete(payResponse.getLockKey());
+        }
+        return ApiResponse.success("鎿嶄綔鎴愬姛", payResponse);
+    }
+
+    @LoginRequired
+    @ApiOperation(value = "缁х画鏀粯", notes = "寰呮敮浠樿鍗曢噸鏂板敜璧峰井淇℃敮浠�")
+    @PostMapping("/continuePay/{orderId}")
+    public ApiResponse<PayResponse> continuePay(@PathVariable Integer orderId) {
+        return ApiResponse.success("鎿嶄綔鎴愬姛", ordersService.continuePay(orderId, getMemberId()));
+    }
+
+    @LoginRequired
+    @ApiOperation(value = "浼氬憳璁㈠崟鍒嗛〉", notes = "灏忕▼搴忕锛屾寜鐘舵�佺瓫閫�")
+    @PostMapping("/myPage")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+    })
+    public ApiResponse<PageData<MyOrderVO>> myPage(@RequestBody @Validated PageWrap<MyOrderDTO> pageWrap) {
+        return ApiResponse.success("鏌ヨ鎴愬姛", ordersService.findMyOrderPage(pageWrap, getMemberId()));
+    }
+
+    @LoginRequired
+    @ApiOperation(value = "浼氬憳璁㈠崟璇︽儏", notes = "灏忕▼搴忕锛屾煡璇㈠綋鍓嶄細鍛樼殑璁㈠崟璇︽儏")
+    @GetMapping("/detail/{orderId}")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "path", dataType = "Integer", name = "orderId", value = "璁㈠崟涓婚敭", required = true),
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true)
+    })
+    public ApiResponse<MyOrderDetailVO> detail(@PathVariable Integer orderId) {
+        return ApiResponse.success("鏌ヨ鎴愬姛", ordersService.findMyOrderDetail(orderId, getMemberId()));
+    }
+
+    @LoginRequired
+    @ApiOperation(value = "浼氬憳鍙栨秷璁㈠崟", notes = "浠呭紓鍦板瘎瀛樿鍗曞彲鍙栨秷")
+    @PostMapping("/cancel")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true)
+    })
+    public ApiResponse cancel(@RequestBody @Validated CancelOrderDTO dto) {
+        ordersService.cancelOrder(dto.getOrderId(), getMemberId(), dto.getCancelReason());
+        return ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
+
+    @LoginRequired
+    @ApiOperation(value = "鏌ヨ瓒呮椂璐圭敤", notes = "鏌ヨ璁㈠崟閫炬湡澶╂暟鍜岄�炬湡璐圭敤")
+    @GetMapping("/overdueFee/{orderId}")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "path", dataType = "Integer", name = "orderId", value = "璁㈠崟涓婚敭", required = true),
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true)
+    })
+    public ApiResponse<OverdueFeeVO> overdueFee(@PathVariable Integer orderId) {
+        return ApiResponse.success("鏌ヨ鎴愬姛", ordersService.calculateOverdueFee(orderId));
+    }
+
+    @LoginShopRequired
+    @ApiOperation(value = "闂ㄥ簵鏍搁攢鏀朵欢", notes = "闂ㄥ簵閫氳繃鏍搁攢鐮佺‘璁ゆ敹浠�/鍙栦欢")
+    @PostMapping("/shopVerify")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "闂ㄥ簵token鍊�", required = true)
+    })
+    public ApiResponse shopVerify(@RequestBody @Validated ShopVerifyDTO dto) {
+        ordersService.shopVerifyOrder(dto.getVerifyCode(), getShopId(), dto.getImages(), dto.getRemark());
+        return ApiResponse.success("鏍搁攢鎴愬姛");
+    }
+
+    @LoginShopRequired
+    @ApiOperation(value = "鏍搁攢鍙告満鐮�", notes = "寮傚湴瀵勫瓨涓旀湁鍙栦欢闂ㄥ簵鐨勮鍗曪紝閫氳繃鍙告満鏍搁攢鐮佺‘璁ゅ埌搴�")
+    @PostMapping("/driverVerify")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true)
+    })
+    public ApiResponse driverVerify(@RequestBody @Validated DriverVerifyDTO dto) {
+        ordersService.driverVerifyOrder(dto.getVerifyCode(), dto.getImages(), dto.getRemark(), getShopId());
+        return ApiResponse.success("鏍搁攢鎴愬姛");
+    }
+
+    @LoginShopRequired
+    @ApiOperation(value = "闂ㄥ簵璁㈠崟璇︽儏", notes = "闂ㄥ簵绔煡璇㈣鍗曡鎯咃紝鏀寔璁㈠崟涓婚敭鎴栨牳閿�鐮佹煡璇�")
+    @GetMapping("/shopDetail")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "闂ㄥ簵token鍊�", required = true),
+            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "orderId", value = "璁㈠崟涓婚敭"),
+            @ApiImplicitParam(paramType = "query", dataType = "String", name = "verifyCode", value = "鏍搁攢鐮�")
+    })
+    public ApiResponse<MyOrderDetailVO> shopDetail(@RequestParam(required = false) Integer orderId,
+                                                    @RequestParam(required = false) String verifyCode) {
+        return ApiResponse.success("鏌ヨ鎴愬姛", ordersService.findShopOrderDetail(orderId, verifyCode));
+    }
+
+
+}
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
new file mode 100644
index 0000000..f537df4
--- /dev/null
+++ b/server/web/src/main/java/com/doumee/api/web/PaymentCallback.java
@@ -0,0 +1,82 @@
+package com.doumee.api.web;
+
+import com.doumee.config.wx.WxMiniConfig;
+import com.doumee.core.constants.Constants;
+import com.doumee.core.utils.ID;
+import com.doumee.service.business.OrdersService;
+import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
+import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Date;
+import java.util.Objects;
+
+/**
+ * 鏀粯鍥炶皟
+ *
+ * @Author : Rk
+ * @create 2023/3/24 16:57
+ */
+@Slf4j
+@RestController
+@CrossOrigin
+public class PaymentCallback extends ApiController {
+
+    @Autowired
+    private OrdersService ordersService;
+
+
+    @PostMapping("/web/api/wxPayNotify")
+    public String wxPay_notify(@RequestBody String xmlResult) {
+        String wxId = ID.nextGUID();
+        log.info("鏀粯鍥炶皟淇℃伅("+wxId+") = > "  + xmlResult);
+        if (StringUtils.isEmpty(xmlResult)){
+            return null;
+        }
+        try {
+            WxPayOrderNotifyResult result = WxMiniConfig.wxPayService.parseOrderNotifyResult(xmlResult);
+            //鑷畾涔夎鍗曞彿
+            String outTradeNo = result.getOutTradeNo();
+            //寰俊璁㈠崟鍙�
+            String paymentNo = result.getTransactionId();
+
+
+
+            if (Constants.SUCCESS.equals(result.getReturnCode())) {
+                // 鏀粯鎴愬姛
+                switch (result.getAttach()) {
+                    //瀵勫瓨璁㈠崟
+                    case "storageOrder": {
+                        ordersService.handleStorageOrderPayNotify(outTradeNo, paymentNo);
+                        break;
+                    }
+                    //搴楅摵鎶奸噾璁㈠崟
+                    case "shopDeposit": {
+
+                        break;
+                    }
+                    //閫炬湡璐圭敤璁㈠崟
+                    case "overdueFee": {
+
+                        break;
+                    }
+                }
+                return WxPayNotifyResponse.success("澶勭悊鎴愬姛!");
+            }
+            return WxPayNotifyResponse.fail(result.getReturnMsg());
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("寰俊鍥炶皟缁撴灉寮傚父,寮傚父鍘熷洜{}", e.getLocalizedMessage());
+            return WxPayNotifyResponse.fail(e.getMessage());
+        }
+    }
+
+
+
+}
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 d128ca8..0f31c5a 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
@@ -1,10 +1,18 @@
 package com.doumee.api.web;
 
 import com.doumee.core.annotation.LoginRequired;
+import com.doumee.core.annotation.LoginShopRequired;
 import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.Member;
 import com.doumee.dao.dto.ShopApplyDTO;
+import com.doumee.dao.dto.ShopDetailQueryDTO;
+import com.doumee.dao.dto.ShopInfoMaintainDTO;
+import com.doumee.dao.dto.ShopNearbyDTO;
 import com.doumee.dao.vo.ShopDetailVO;
+import com.doumee.dao.vo.ShopNearbyVO;
+import com.doumee.dao.vo.ShopWebDetailVO;
 import com.doumee.service.business.ShopInfoService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -41,4 +49,31 @@
         return ApiResponse.success(shopInfoService.getMyShop(this.getMemberId()));
     }
 
+    @ApiOperation("闄勮繎闂ㄥ簵鍒嗛〉鍒楄〃")
+    @PostMapping("/nearby")
+    public ApiResponse<PageData<ShopNearbyVO>> nearby(@RequestBody @Validated PageWrap<ShopNearbyDTO> pageWrap) {
+        return ApiResponse.success(shopInfoService.findNearbyShops(pageWrap));
+    }
+
+    @ApiOperation("闂ㄥ簵璇︽儏")
+    @PostMapping("/detail")
+    public ApiResponse<ShopWebDetailVO> detail(@RequestBody @Validated ShopDetailQueryDTO dto) {
+        return ApiResponse.success(shopInfoService.getShopWebDetail(dto));
+    }
+
+    @LoginShopRequired
+    @ApiOperation("缁存姢闂ㄥ簵淇℃伅锛堟敮浠樻娂閲戝悗锛�")
+    @PostMapping("/maintain")
+    public ApiResponse maintain(@RequestBody ShopInfoMaintainDTO dto) {
+        shopInfoService.maintainShopInfo(this.getMemberId(), dto);
+        return ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
+
+    @LoginShopRequired
+    @ApiOperation("鏌ヨ闂ㄥ簵缁存姢淇℃伅")
+    @PostMapping("/maintainInfo")
+    public ApiResponse<ShopInfoMaintainDTO> maintainInfo() {
+        return ApiResponse.success(shopInfoService.getShopMaintainInfo(this.getMemberId()));
+    }
+
 }
diff --git a/server/web/src/main/java/com/doumee/api/web/UserApi.java b/server/web/src/main/java/com/doumee/api/web/UserApi.java
deleted file mode 100644
index 294fd91..0000000
--- a/server/web/src/main/java/com/doumee/api/web/UserApi.java
+++ /dev/null
@@ -1,162 +0,0 @@
-package com.doumee.api.web;
-
-import com.doumee.core.annotation.LoginRequired;
-import com.doumee.core.annotation.trace.Trace;
-import com.doumee.core.model.ApiResponse;
-import com.doumee.core.model.PageData;
-import com.doumee.core.model.PageWrap;
-import com.doumee.dao.business.model.IdentityInfo;
-import com.doumee.dao.business.model.Member;
-import com.doumee.dao.business.model.MemberRevenue;
-import com.doumee.dao.dto.WithdrawalDTO;
-import com.doumee.dao.dto.WxPhoneRequest;
-import com.doumee.dao.vo.AccountResponse;
-import com.doumee.dao.vo.UserCenterVO;
-import com.doumee.service.business.IdentityInfoService;
-import com.doumee.service.business.MemberService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.shiro.authz.annotation.RequiresPermissions;
-import org.checkerframework.checker.units.qual.A;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-
-/**
- * Created by IntelliJ IDEA.
- *
- * @Author : Rk
- * @create 2025/7/10 9:29
- */
-@Api(tags = "2銆佺敤鎴蜂俊鎭�")
-@Trace(exclude = true)
-@RestController
-@RequestMapping("/web/user")
-@Slf4j
-public class UserApi extends  ApiController{
-
-
-    @Autowired
-    private MemberService memberService;
-
-//    @Autowired
-//    private IdentityInfoService identityInfoService;
-
-//    @Autowired
-//    private MemberRevenueService memberRevenueService;
-//
-//    @Autowired
-//    private WithdrawalOrdersService withdrawalOrdersService;
-
-
-    @ApiOperation(value = "鑾峰彇绯荤粺閰嶇疆", notes = "灏忕▼搴忕")
-    @GetMapping("/getPlatformAboutUs")
-    public ApiResponse<UserCenterVO> getPlatformAboutUs() {
-        return  ApiResponse.success("鏌ヨ鎴愬姛",memberService.getPlatformAboutUs());
-    }
-
-
-    @LoginRequired
-    @ApiOperation(value = "鑾峰彇涓汉淇℃伅", notes = "灏忕▼搴忕")
-    @GetMapping("/getMemberInfo")
-    @ApiImplicitParams({
-            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
-    })
-    public ApiResponse<Member> getMemberInfo() {
-        return  ApiResponse.success("鏌ヨ鎴愬姛",memberService.getMemberInfo(getMemberId()));
-    }
-
-
-    @LoginRequired
-    @ApiOperation(value = "缂栬緫涓汉淇℃伅", notes = "灏忕▼搴忕")
-    @PostMapping("/editMemberInfo")
-    @ApiImplicitParams({
-            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
-    })
-    public ApiResponse editMemberInfo(@RequestBody Member member) {
-        member.setId(getMemberId());
-        memberService.editMemberInfo(member);
-        return  ApiResponse.success("鎿嶄綔鎴愬姛");
-    }
-
-//    @LoginRequired
-//    @ApiOperation(value = "鍒囨崲鐢ㄥ伐韬唤", notes = "灏忕▼搴忕")
-//    @PostMapping("/editUseIdentity")
-//    @ApiImplicitParams({
-//            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
-//    })
-//    public ApiResponse editUseIdentity(@RequestBody Member member) {
-//        member.setId(getMemberId());
-//        memberService.editUseIdentity(member);
-//        return  ApiResponse.success("鎿嶄綔鎴愬姛");
-//    }
-
-
-
-//    @LoginRequired
-//    @ApiOperation(value = "鑾峰彇韬唤璁よ瘉淇℃伅", notes = "灏忕▼搴忕")
-//    @GetMapping("/getIdentityInfo")
-//    @ApiImplicitParams({
-//            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
-//    })
-//    public ApiResponse<IdentityInfo> getIdentityInfo(@RequestParam Integer type) {
-//        return  ApiResponse.success("鏌ヨ鎴愬姛",identityInfoService.findByMemberType(type,getMemberId()));
-//    }
-
-
-//    @LoginRequired
-//    @ApiOperation(value = "鐢宠韬唤淇℃伅", notes = "灏忕▼搴忕")
-//    @PostMapping("/applyForIdentity")
-//    @ApiImplicitParams({
-//            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
-//    })
-//    public ApiResponse applyForIdentity(@RequestBody IdentityInfo identityInfo) {
-//        identityInfo.setMemberId(getMemberId());
-//        identityInfoService.create(identityInfo);
-//        return  ApiResponse.success("鎿嶄綔鎴愬姛");
-//    }
-
-
-
-//    @LoginRequired
-//    @ApiOperation(value = "淇敼韬唤淇℃伅锛堣璇佸け璐ュ悗浣跨敤锛�", notes = "灏忕▼搴忕")
-//    @PostMapping("/updateIdentity")
-//    @ApiImplicitParams({
-//            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
-//    })
-//    public ApiResponse updateIdentity(@RequestBody IdentityInfo identityInfo) {
-//        identityInfo.setMemberId(getMemberId());
-//        identityInfoService.updateById(identityInfo);
-//        return  ApiResponse.success("鎿嶄綔鎴愬姛");
-//    }
-
-
-//    @LoginRequired
-//    @ApiOperation(value = "淇敼韬唤淇℃伅浣嶇疆锛堣璇佹垚鍔熷悗浣跨敤锛�", notes = "灏忕▼搴忕")
-//    @PostMapping("/updateLocation")
-//    @ApiImplicitParams({
-//            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
-//    })
-//    public ApiResponse updateLocation(@RequestBody IdentityInfo identityInfo) {
-//        identityInfo.setMemberId(getMemberId());
-//        identityInfoService.updateLocation(identityInfo);
-//        return  ApiResponse.success("鎿嶄綔鎴愬姛");
-//    }
-
-//    @LoginRequired
-//    @ApiOperation("浣欓鏄庣粏")
-//    @PostMapping("/revenuePage")
-//    @ApiImplicitParams({
-//            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
-//    })
-//    public ApiResponse<PageData<MemberRevenue>> revenuePage (@RequestBody PageWrap<MemberRevenue> pageWrap) {
-//        pageWrap.getModel().setMemberId(this.getMemberId());
-//        return ApiResponse.success(memberRevenueService.findPage(pageWrap));
-//    }
-
-
-
-
-}

--
Gitblit v1.9.3