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

---
 server/services/src/main/java/com/doumee/dao/business/model/ShopInfo.java                  |  124 +
 server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java  |  585 +++++
 server/services/src/main/java/com/doumee/dao/business/ShopInfoMapper.java                  |   13 
 server/services/src/main/java/com/doumee/dao/business/SmsrecordMapper.java                 |   13 
 server/services/src/main/java/com/doumee/dao/business/model/Banner.java                    |   74 
 server/services/src/main/java/com/doumee/service/business/impl/SmsrecordServiceImpl.java   |  159 +
 server/services/src/main/java/com/doumee/service/business/ShopInfoService.java             |   99 
 server/services/src/main/java/com/doumee/core/utils/PinYinUtil.java                        |  137 +
 server/services/src/main/java/com/doumee/dao/dto/LocalStoragePricingItemDTO.java           |   26 
 server/services/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java                      |   32 
 server/admin/src/main/java/com/doumee/api/business/ShopInfoController.java                 |   93 
 server/services/src/main/java/com/doumee/service/business/impl/AreasServiceImpl.java       |  521 +++++
 server/services/src/main/java/com/doumee/dao/business/model/DriverInfo.java                |  145 +
 server/services/src/main/java/com/doumee/dao/dto/RevenueShareItemDTO.java                  |   26 
 server/services/src/main/java/com/doumee/service/business/MemberService.java               |   12 
 server/services/src/main/java/com/doumee/dao/vo/RevenueShareVO.java                        |   32 
 server/services/src/main/java/com/doumee/dao/dto/EstimatedDeliverySaveDTO.java             |   38 
 server/services/src/main/java/com/doumee/dao/business/model/Category.java                  |   23 
 server/services/src/main/java/com/doumee/service/business/impl/PricingRuleServiceImpl.java |  601 +++++
 server/services/src/main/java/com/doumee/dao/dto/AuditDTO.java                             |    3 
 server/services/src/main/java/com/doumee/dao/dto/DriverRegisterRequest.java                |   27 
 server/services/src/main/java/com/doumee/dao/dto/RemoteDeliveryPricingSaveDTO.java         |   30 
 server/web/src/main/java/com/doumee/api/web/AccountApi.java                                |   20 
 server/services/src/main/java/com/doumee/dao/dto/RemoteDeliveryPricingItemDTO.java         |   38 
 server/services/src/main/java/com/doumee/core/utils/aliyun/ALiYunUtil.java                 |  553 +++++
 server/services/src/main/java/com/doumee/dao/business/PricingRuleMapper.java               |   13 
 server/services/src/main/java/com/doumee/dao/business/model/Smsrecord.java                 |   71 
 server/services/src/main/java/com/doumee/service/business/PricingRuleService.java          |  174 +
 server/admin/src/main/java/com/doumee/api/business/BannerController.java                   |   92 
 server/services/src/main/java/com/doumee/dao/dto/StoreDepositItemDTO.java                  |   26 
 server/services/src/main/java/com/doumee/dao/business/model/PricingRule.java               |   70 
 server/web/src/main/java/com/doumee/api/web/UserApi.java                                   |  140 
 server/services/src/main/java/com/doumee/dao/dto/RevenueShareSaveDTO.java                  |   30 
 server/services/src/main/java/com/doumee/dao/dto/DriverVerifyRequest.java                  |   75 
 server/services/src/main/java/com/doumee/core/utils/FileDigest.java                        |   69 
 server/services/src/main/java/com/doumee/dao/business/AreasMapper.java                     |   12 
 server/services/src/main/java/com/doumee/dao/business/BannerMapper.java                    |   13 
 server/services/src/main/java/com/doumee/service/business/DriverInfoService.java           |  149 +
 server/services/src/main/java/com/doumee/dao/dto/StoreDepositSaveDTO.java                  |   30 
 server/admin/src/main/java/com/doumee/api/business/SmsrecordController.java                |   93 
 server/services/src/main/java/com/doumee/dao/dto/LocalStoragePricingSaveDTO.java           |   30 
 server/services/src/main/java/com/doumee/service/business/SmsrecordService.java            |   99 
 server/admin/src/main/java/com/doumee/api/business/DriverInfoController.java               |  103 +
 server/services/src/main/java/com/doumee/dao/vo/RemoteDeliveryPricingVO.java               |   41 
 server/services/src/main/java/com/doumee/service/business/BannerService.java               |   37 
 server/services/src/main/java/com/doumee/dao/vo/StoreDepositVO.java                        |   32 
 server/services/src/main/java/com/doumee/dao/vo/EstimatedDeliveryVO.java                   |   35 
 server/admin/src/main/java/com/doumee/api/business/PricingRuleController.java              |  184 +
 server/services/src/main/java/com/doumee/config/cache/RedisConfig.java                     |   36 
 server/services/src/main/java/com/doumee/dao/business/model/Areas.java                     |  134 +
 server/services/src/main/java/com/doumee/service/business/AreasService.java                |  136 +
 server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java    |  171 +
 server/services/src/main/java/com/doumee/dao/business/model/Multifile.java                 |    5 
 server/admin/src/main/java/com/doumee/api/business/AreasController.java                    |  107 +
 server/services/db/business.banner.permissions.sql                                         |    5 
 server/services/src/main/java/com/doumee/service/business/impl/BannerServiceImpl.java      |  148 +
 server/services/src/main/java/com/doumee/dao/dto/DriverLoginRequest.java                   |   27 
 server/web/src/main/java/com/doumee/api/web/DriverInfoApi.java                             |   82 
 server/pom.xml                                                                             |   22 
 server/services/src/main/java/com/doumee/dao/vo/LocalStoragePricingVO.java                 |   32 
 server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java      |  127 
 server/services/src/main/java/com/doumee/dao/business/DriverInfoMapper.java                |   13 
 server/services/src/main/java/com/doumee/dao/dto/AreasDto.java                             |   25 
 server/services/src/main/java/com/doumee/dao/business/model/Member.java                    |   21 
 64 files changed, 5,974 insertions(+), 159 deletions(-)

diff --git a/server/admin/src/main/java/com/doumee/api/business/AreasController.java b/server/admin/src/main/java/com/doumee/api/business/AreasController.java
new file mode 100644
index 0000000..df0d32e
--- /dev/null
+++ b/server/admin/src/main/java/com/doumee/api/business/AreasController.java
@@ -0,0 +1,107 @@
+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.Areas;
+import com.doumee.dao.dto.AreasDto;
+import com.doumee.service.business.AreasService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.BeanUtils;
+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 姹熻箘韫�
+ * @date 2023/02/15 08:55
+ */
+@Api(tags = "鐪佸競鍖轰俊鎭〃")
+@RestController
+@RequestMapping("/business/areas")
+public class AreasController extends BaseController {
+
+    @Autowired
+    private AreasService areasService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:areas:create")
+    public ApiResponse create(@RequestBody Areas areas) {
+
+        return ApiResponse.success(areasService.create(areas));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:areas:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        areasService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:areas: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));
+        }
+        areasService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:areas:update")
+    public ApiResponse updateById(@RequestBody Areas areas) {
+        areasService.updateById(areas);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+//    @RequiresPermissions("business:areas:query")
+    public ApiResponse<PageData<Areas>> findPage (@RequestBody PageWrap<Areas> pageWrap) {
+        return ApiResponse.success(areasService.findPage(pageWrap));
+    }
+
+    @ApiOperation("鍏ㄩ儴鏍戝舰鏌ヨ")
+    @PostMapping("/treeList")
+//    @RequiresPermissions("business:areas:query")
+    public ApiResponse<List<Areas>> treeList (@RequestBody AreasDto pageWrap) {
+        Areas a = new Areas();
+        BeanUtils.copyProperties(pageWrap,a);
+        return ApiResponse.success(areasService.findList(a));
+    }
+    @ApiOperation("鏍规嵁鐖惰妭鐐瑰拰绫诲瀷鏌ヨ")
+    @PostMapping("/listByParentId")
+//    @RequiresPermissions("business:areas:query")
+    public ApiResponse<List<Areas>> listByParentId (@RequestBody AreasDto pageWrap) {
+        return ApiResponse.success(areasService.findByParentId(pageWrap.getParentId(),pageWrap.getType(),pageWrap.getFlag()) );
+    }
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:areas:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<Areas> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(Areas.class).export(areasService.findPage(pageWrap).getRecords(), "鐪佸競鍖轰俊鎭〃", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:areas:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(areasService.findById(id));
+    }
+}
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
new file mode 100644
index 0000000..b3a59aa
--- /dev/null
+++ b/server/admin/src/main/java/com/doumee/api/business/BannerController.java
@@ -0,0 +1,92 @@
+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.Banner;
+import com.doumee.service.business.BannerService;
+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/08
+ */
+@Api(tags = "杞挱鍥�")
+@RestController
+@RequestMapping("/business/banner")
+public class BannerController extends BaseController {
+
+    @Autowired
+    private BannerService bannerService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:banner:create")
+    public ApiResponse create(@RequestBody Banner banner) {
+        return ApiResponse.success(bannerService.create(banner));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:banner:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        bannerService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:banner: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));
+        }
+        bannerService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:banner:update")
+    public ApiResponse updateById(@RequestBody Banner banner) {
+        bannerService.updateById(banner);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:banner:query")
+    public ApiResponse<PageData<Banner>> findPage(@RequestBody PageWrap<Banner> pageWrap) {
+        return ApiResponse.success(bannerService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:banner:exportExcel")
+    public void exportExcel(@RequestBody PageWrap<Banner> pageWrap, HttpServletResponse response) {
+        List<Banner> bannerList = bannerService.findPage(pageWrap).getRecords();
+        ExcelExporter.build(Banner.class).export(bannerList, "杞挱鍥�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:banner:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(bannerService.findById(id));
+    }
+}
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
new file mode 100644
index 0000000..65b80b1
--- /dev/null
+++ b/server/admin/src/main/java/com/doumee/api/business/DriverInfoController.java
@@ -0,0 +1,103 @@
+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.DriverInfo;
+import com.doumee.dao.dto.AuditDTO;
+import com.doumee.service.business.DriverInfoService;
+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/08
+ */
+@Api(tags = "鍙告満娉ㄥ唽淇℃伅")
+@RestController
+@RequestMapping("/business/driverInfo")
+public class DriverInfoController extends BaseController {
+
+    @Autowired
+    private DriverInfoService driverInfoService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:driverInfo:create")
+    public ApiResponse create(@RequestBody DriverInfo driverInfo) {
+        return ApiResponse.success(driverInfoService.create(driverInfo));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:driverInfo:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        driverInfoService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:driverInfo: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));
+        }
+        driverInfoService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:driverInfo:update")
+    public ApiResponse updateById(@RequestBody DriverInfo driverInfo) {
+        driverInfoService.updateById(driverInfo);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:driverInfo:query")
+    public ApiResponse<PageData<DriverInfo>> findPage(@RequestBody PageWrap<DriverInfo> pageWrap) {
+        return ApiResponse.success(driverInfoService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:driverInfo:exportExcel")
+    public void exportExcel(@RequestBody PageWrap<DriverInfo> pageWrap, HttpServletResponse response) {
+        List<DriverInfo> driverInfoList = driverInfoService.findPage(pageWrap).getRecords();
+        ExcelExporter.build(DriverInfo.class).export(driverInfoList, "鍙告満娉ㄥ唽淇℃伅", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:driverInfo:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(driverInfoService.findById(id));
+    }
+
+    @ApiOperation("瀹℃壒鍙告満瀹炲悕璁よ瘉")
+    @PostMapping("/audit")
+    @RequiresPermissions("business:driverInfo:audit")
+    public ApiResponse audit(@RequestBody AuditDTO auditDTO) {
+        auditDTO.setAuditUser(this.getLoginUser().getId());
+        driverInfoService.auditVerify(auditDTO);
+        return ApiResponse.success("瀹℃壒鎴愬姛");
+    }
+
+}
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
new file mode 100644
index 0000000..452168f
--- /dev/null
+++ b/server/admin/src/main/java/com/doumee/api/business/PricingRuleController.java
@@ -0,0 +1,184 @@
+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.PricingRule;
+import com.doumee.dao.dto.LocalStoragePricingSaveDTO;
+import com.doumee.dao.dto.RemoteDeliveryPricingSaveDTO;
+import com.doumee.dao.dto.EstimatedDeliverySaveDTO;
+import com.doumee.dao.dto.StoreDepositSaveDTO;
+import com.doumee.dao.dto.RevenueShareSaveDTO;
+import com.doumee.dao.vo.LocalStoragePricingVO;
+import com.doumee.dao.vo.RemoteDeliveryPricingVO;
+import com.doumee.dao.vo.EstimatedDeliveryVO;
+import com.doumee.dao.vo.StoreDepositVO;
+import com.doumee.dao.vo.RevenueShareVO;
+import com.doumee.service.business.PricingRuleService;
+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.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 璁′环瑙勫垯閰嶇疆
+ * @author rk
+ * @date 2026/04/08
+ */
+@Api(tags = "璁′环瑙勫垯閰嶇疆")
+@RestController
+@RequestMapping("/business/pricingRule")
+public class PricingRuleController extends BaseController {
+
+    @Autowired
+    private PricingRuleService pricingRuleService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:pricingRule:create")
+    public ApiResponse create(@RequestBody PricingRule pricingRule) {
+        return ApiResponse.success(pricingRuleService.create(pricingRule));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:pricingRule:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        pricingRuleService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:pricingRule: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));
+        }
+        pricingRuleService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:pricingRule:update")
+    public ApiResponse updateById(@RequestBody PricingRule pricingRule) {
+        pricingRuleService.updateById(pricingRule);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:pricingRule:query")
+    public ApiResponse<PageData<PricingRule>> findPage(@RequestBody PageWrap<PricingRule> pageWrap) {
+        return ApiResponse.success(pricingRuleService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:pricingRule:exportExcel")
+    public void exportExcel(@RequestBody PageWrap<PricingRule> pageWrap, HttpServletResponse response) {
+        List<PricingRule> pricingRuleList = pricingRuleService.findPage(pageWrap).getRecords();
+        ExcelExporter.build(PricingRule.class).export(pricingRuleList, "璁′环瑙勫垯閰嶇疆", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:pricingRule:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(pricingRuleService.findById(id));
+    }
+
+    @PreventRepeat
+    @ApiOperation("鎵归噺淇濆瓨灏卞湴瀛樺彇瑙勫垯")
+    @PostMapping("/localStorage/batchSave")
+    @RequiresPermissions("business:pricingRule:create")
+    public ApiResponse batchSaveLocalStoragePricing(@RequestBody @Validated LocalStoragePricingSaveDTO request) {
+        pricingRuleService.batchSaveLocalStoragePricing(request);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏌ヨ灏卞湴瀛樺彇瑙勫垯鍒楄〃")
+    @GetMapping("/localStorage/list")
+    @RequiresPermissions("business:pricingRule:query")
+    public ApiResponse<List<LocalStoragePricingVO>> listLocalStoragePricing(@RequestParam Integer cityId) {
+        return ApiResponse.success(pricingRuleService.listLocalStoragePricing(cityId));
+    }
+
+    @PreventRepeat
+    @ApiOperation("鎵归噺淇濆瓨寮傚湴瀵勯�佽鍒�")
+    @PostMapping("/remoteDelivery/batchSave")
+    @RequiresPermissions("business:pricingRule:create")
+    public ApiResponse batchSaveRemoteDeliveryPricing(@RequestBody @Validated RemoteDeliveryPricingSaveDTO request) {
+        pricingRuleService.batchSaveRemoteDeliveryPricing(request);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏌ヨ寮傚湴瀵勯�佽鍒欏垪琛�")
+    @GetMapping("/remoteDelivery/list")
+    @RequiresPermissions("business:pricingRule:query")
+    public ApiResponse<List<RemoteDeliveryPricingVO>> listRemoteDeliveryPricing(@RequestParam Integer cityId) {
+        return ApiResponse.success(pricingRuleService.listRemoteDeliveryPricing(cityId));
+    }
+
+    @PreventRepeat
+    @ApiOperation("淇濆瓨棰勮鏃舵晥閰嶇疆")
+    @PostMapping("/estimatedDelivery/save")
+    @RequiresPermissions("business:pricingRule:create")
+    public ApiResponse saveEstimatedDelivery(@RequestBody @Validated EstimatedDeliverySaveDTO request) {
+        pricingRuleService.saveEstimatedDelivery(request);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏌ヨ棰勮鏃舵晥閰嶇疆")
+    @GetMapping("/estimatedDelivery/list")
+    @RequiresPermissions("business:pricingRule:query")
+    public ApiResponse<EstimatedDeliveryVO> listEstimatedDelivery(@RequestParam Integer cityId) {
+        return ApiResponse.success(pricingRuleService.getEstimatedDelivery(cityId));
+    }
+
+    @PreventRepeat
+    @ApiOperation("鎵归噺淇濆瓨闂ㄥ簵娉ㄥ唽鎶奸噾")
+    @PostMapping("/storeDeposit/batchSave")
+    @RequiresPermissions("business:pricingRule:create")
+    public ApiResponse batchSaveStoreDeposit(@RequestBody @Validated StoreDepositSaveDTO request) {
+        pricingRuleService.batchSaveStoreDeposit(request);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏌ヨ闂ㄥ簵娉ㄥ唽鎶奸噾鍒楄〃")
+    @GetMapping("/storeDeposit/list")
+    @RequiresPermissions("business:pricingRule:query")
+    public ApiResponse<List<StoreDepositVO>> listStoreDeposit(@RequestParam Integer cityId) {
+        return ApiResponse.success(pricingRuleService.listStoreDeposit(cityId));
+    }
+
+    @PreventRepeat
+    @ApiOperation("鎵归噺淇濆瓨鍒嗘垚姣斾緥")
+    @PostMapping("/revenueShare/batchSave")
+    @RequiresPermissions("business:pricingRule:create")
+    public ApiResponse batchSaveRevenueShare(@RequestBody @Validated RevenueShareSaveDTO request) {
+        pricingRuleService.batchSaveRevenueShare(request);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏌ヨ鍒嗘垚姣斾緥鍒楄〃")
+    @GetMapping("/revenueShare/list")
+    @RequiresPermissions("business:pricingRule:query")
+    public ApiResponse<List<RevenueShareVO>> listRevenueShare(@RequestParam Integer cityId) {
+        return ApiResponse.success(pricingRuleService.listRevenueShare(cityId));
+    }
+
+}
diff --git a/server/admin/src/main/java/com/doumee/api/business/ShopInfoController.java b/server/admin/src/main/java/com/doumee/api/business/ShopInfoController.java
new file mode 100644
index 0000000..bf72c43
--- /dev/null
+++ b/server/admin/src/main/java/com/doumee/api/business/ShopInfoController.java
@@ -0,0 +1,93 @@
+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.ShopInfo;
+import com.doumee.service.business.ShopInfoService;
+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/08
+ */
+@Api(tags = "闂ㄥ簵淇℃伅")
+@RestController
+@RequestMapping("/business/shopInfo")
+public class ShopInfoController extends BaseController {
+
+    @Autowired
+    private ShopInfoService shopInfoService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:shopInfo:create")
+    public ApiResponse create(@RequestBody ShopInfo shopInfo) {
+        return ApiResponse.success(shopInfoService.create(shopInfo));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:shopInfo:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        shopInfoService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:shopInfo: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));
+        }
+        shopInfoService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:shopInfo:update")
+    public ApiResponse updateById(@RequestBody ShopInfo shopInfo) {
+        shopInfoService.updateById(shopInfo);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:shopInfo:query")
+    public ApiResponse<PageData<ShopInfo>> findPage(@RequestBody PageWrap<ShopInfo> pageWrap) {
+        return ApiResponse.success(shopInfoService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:shopInfo:exportExcel")
+    public void exportExcel(@RequestBody PageWrap<ShopInfo> pageWrap, HttpServletResponse response) {
+        List<ShopInfo> shopInfoList = shopInfoService.findPage(pageWrap).getRecords();
+        ExcelExporter.build(ShopInfo.class).export(shopInfoList, "闂ㄥ簵淇℃伅", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:shopInfo:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(shopInfoService.findById(id));
+    }
+
+}
diff --git a/server/admin/src/main/java/com/doumee/api/business/SmsrecordController.java b/server/admin/src/main/java/com/doumee/api/business/SmsrecordController.java
new file mode 100644
index 0000000..8e92079
--- /dev/null
+++ b/server/admin/src/main/java/com/doumee/api/business/SmsrecordController.java
@@ -0,0 +1,93 @@
+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.Smsrecord;
+import com.doumee.service.business.SmsrecordService;
+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/08
+ */
+@Api(tags = "鐭俊楠岃瘉鐮�")
+@RestController
+@RequestMapping("/business/smsrecord")
+public class SmsrecordController extends BaseController {
+
+    @Autowired
+    private SmsrecordService smsrecordService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:smsrecord:create")
+    public ApiResponse create(@RequestBody Smsrecord smsrecord) {
+        return ApiResponse.success(smsrecordService.create(smsrecord));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:smsrecord:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        smsrecordService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:smsrecord: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));
+        }
+        smsrecordService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:smsrecord:update")
+    public ApiResponse updateById(@RequestBody Smsrecord smsrecord) {
+        smsrecordService.updateById(smsrecord);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:smsrecord:query")
+    public ApiResponse<PageData<Smsrecord>> findPage(@RequestBody PageWrap<Smsrecord> pageWrap) {
+        return ApiResponse.success(smsrecordService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:smsrecord:exportExcel")
+    public void exportExcel(@RequestBody PageWrap<Smsrecord> pageWrap, HttpServletResponse response) {
+        List<Smsrecord> smsrecordList = smsrecordService.findPage(pageWrap).getRecords();
+        ExcelExporter.build(Smsrecord.class).export(smsrecordList, "鐭俊楠岃瘉鐮�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:smsrecord:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(smsrecordService.findById(id));
+    }
+
+}
diff --git a/server/pom.xml b/server/pom.xml
index 8f1190d..cfe91fc 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -35,6 +35,8 @@
     <poi.version>5.0.0</poi.version>
     <jjwt.version>0.9.1</jjwt.version>
     <weixin-java-pay.version>4.1.0</weixin-java-pay.version>
+    <!-- 闃块噷浜慜SS瀛樺偍 -->
+    <aliyun-oss.version>3.8.0</aliyun-oss.version>
   </properties>
   <dependencies>
     <!-- Spring Boot -->
@@ -238,10 +240,11 @@
       <version>0.2.15</version>
     </dependency>
 
+    <!--  闃块噷浜慜SS-->
     <dependency>
-      <groupId>com.aliyun</groupId>
-      <artifactId>aliyun-java-sdk-core</artifactId>
-      <version>3.5.0</version>
+      <groupId>com.aliyun.oss</groupId>
+      <artifactId>aliyun-sdk-oss</artifactId>
+      <version>${aliyun-oss.version}</version>
     </dependency>
 
     <dependency>
@@ -249,7 +252,18 @@
       <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
       <version>1.1.0</version>
     </dependency>
-
+    <!-- aliyun sms SDK -->
+    <dependency>
+      <groupId>com.aliyun</groupId>
+      <artifactId>aliyun-java-sdk-core</artifactId>
+      <version>4.5.3</version>
+    </dependency>
+  <!-- 鎷奸煶杞崲 -->
+    <dependency>
+      <groupId>com.belerweb</groupId>
+      <artifactId>pinyin4j</artifactId>
+      <version>2.5.1</version>
+    </dependency>
  <!--   <dependency>
       <groupId>com.azure.spring</groupId>
       <artifactId>spring-cloud-azure-starter-storage-blob</artifactId>
diff --git a/server/services/db/business.banner.permissions.sql b/server/services/db/business.banner.permissions.sql
new file mode 100644
index 0000000..b200283
--- /dev/null
+++ b/server/services/db/business.banner.permissions.sql
@@ -0,0 +1,5 @@
+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/src/main/java/com/doumee/config/cache/RedisConfig.java b/server/services/src/main/java/com/doumee/config/cache/RedisConfig.java
index de523ca..47353ea 100644
--- a/server/services/src/main/java/com/doumee/config/cache/RedisConfig.java
+++ b/server/services/src/main/java/com/doumee/config/cache/RedisConfig.java
@@ -1,9 +1,14 @@
 package com.doumee.config.cache;
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.data.redis.connection.RedisConnectionFactory;
 import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
 import org.springframework.data.redis.serializer.StringRedisSerializer;
 
 import java.io.Serializable;
@@ -17,16 +22,25 @@
 public class RedisConfig {
 
     @Bean
-    public RedisTemplate<Serializable, Serializable> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
-        RedisTemplate<Serializable, Serializable> redisTemplate = new RedisTemplate<>();
-        redisTemplate.setConnectionFactory(redisConnectionFactory);
-        // 榛樿搴忓垪鍖栨柟寮�
-        redisTemplate.setDefaultSerializer(new StringRedisSerializer());
-        // 鍊煎簭鍒楀寲鏂瑰紡
-        RedisValueDefaultSerializer<Object> serializer = new RedisValueDefaultSerializer<>(Object.class);
-        redisTemplate.setValueSerializer(serializer);
-        redisTemplate.setHashValueSerializer(serializer);
-        redisTemplate.afterPropertiesSet();
-        return redisTemplate;
+    @SuppressWarnings("all")
+    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
+        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
+        template.setConnectionFactory(factory);
+        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
+        ObjectMapper om = new ObjectMapper();
+        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+        om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
+        jackson2JsonRedisSerializer.setObjectMapper(om);
+        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
+        // key閲囩敤String鐨勫簭鍒楀寲鏂瑰紡
+        template.setKeySerializer(stringRedisSerializer);
+        // hash鐨刱ey涔熼噰鐢⊿tring鐨勫簭鍒楀寲鏂瑰紡
+        template.setHashKeySerializer(stringRedisSerializer);
+        // value搴忓垪鍖栨柟寮忛噰鐢╦ackson
+        template.setValueSerializer(jackson2JsonRedisSerializer);
+        // hash鐨剉alue搴忓垪鍖栨柟寮忛噰鐢╦ackson
+        template.setHashValueSerializer(jackson2JsonRedisSerializer);
+        template.afterPropertiesSet();
+        return template;
     }
 }
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 8e361d5..54bdf66 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
@@ -18,10 +18,7 @@
 
 import javax.annotation.Resource;
 import java.io.IOException;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 
 @Component
@@ -40,6 +37,8 @@
     @Resource
     private JwtProperties jwtProperties;
 
+    //redis杩囨湡鏃堕棿
+    private static final Integer redisExpire = 365;
     /**
      * 鐢熸垚token浠ょ墝
      *
@@ -67,6 +66,31 @@
     }
 
 
+
+    /**
+     * 鐢熸垚token淇℃伅锛堝悓涓�鐢ㄦ埛浠呬繚鐣欎竴涓湁鏁坱oken锛�
+     * @param userId
+     * @param userType 鐢ㄦ埛绫诲瀷 0=浼氬憳锛�1=鍙告満锛�2=搴楅摵
+     * @param userInfo
+     * @param redisTemplate
+     * @return
+     */
+    public static String generateTokenForRedis(Integer userId, Integer userType, String userInfo, RedisTemplate<String,Object> redisTemplate) {
+        // 鍒犻櫎璇ョ敤鎴蜂箣鍓嶇櫥褰曠殑token
+        String userTokenMappingKey = Constants.REDIS_TOKEN_KEY + "user_" + userType + "_" + userId;
+        String oldToken = (String) redisTemplate.opsForValue().get(userTokenMappingKey);
+        if (StringUtils.isNotBlank(oldToken)) {
+            redisTemplate.delete(Constants.REDIS_TOKEN_KEY + oldToken);
+        }
+        // 鐢熸垚鏂皌oken
+        String tokenKey = userType +""+ UUID.randomUUID() + "_" + userId;
+        redisTemplate.opsForValue().set(Constants.REDIS_TOKEN_KEY + tokenKey, userInfo, redisExpire, TimeUnit.DAYS);
+        // 璁板綍鐢ㄦ埛涓巘oken鐨勬槧灏勫叧绯�
+        redisTemplate.opsForValue().set(userTokenMappingKey, tokenKey, redisExpire, TimeUnit.DAYS);
+        return tokenKey;
+    }
+
+
     /**
      * 鍒锋柊浠ょ墝
      *
diff --git a/server/services/src/main/java/com/doumee/core/utils/FileDigest.java b/server/services/src/main/java/com/doumee/core/utils/FileDigest.java
new file mode 100644
index 0000000..de599da
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/core/utils/FileDigest.java
@@ -0,0 +1,69 @@
+package com.doumee.core.utils;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.math.BigInteger;
+import java.security.MessageDigest;
+import java.util.HashMap;
+import java.util.Map;
+
+public class FileDigest {
+	/**
+	 * 璁$畻鏂囦欢鐨凪D5鍊�
+	 * 
+	 * @param file
+	 * @return
+	 */
+	public static String getFileMD5(File file) {
+		if (!file.isFile()) {
+			return null;
+		}
+		MessageDigest digest = null;
+		FileInputStream in = null;
+		byte buffer[] = new byte[1024];
+		int len;
+		try {
+			digest = MessageDigest.getInstance("MD5");
+			in = new FileInputStream(file);
+			while ((len = in.read(buffer, 0, 1024)) != -1) {
+				digest.update(buffer, 0, len);
+			}
+			in.close();
+		} catch (Exception e) {
+			e.printStackTrace();
+			return null;
+		}
+		BigInteger bigInt = new BigInteger(1, digest.digest());
+		return bigInt.toString(16);
+	}
+
+	/**
+	 * 璁$畻鏂囦欢澶圭殑MD5鍊�
+	 * 
+	 * @param file
+	 * @param listChild
+	 * @return
+	 */
+	public static Map<String, String> getDirMD5(File file, boolean listChild) {
+		if (!file.isDirectory()) {
+			return null;
+		}
+		// <filepath,md5>
+		Map<String, String> map = new HashMap<String, String>();
+		String md5;
+		File files[] = file.listFiles();
+		for (int i = 0; i < files.length; i++) {
+			File f = files[i];
+			if (f.isDirectory() && listChild) {
+				map.putAll(getDirMD5(f, listChild));
+			} else {
+				md5 = getFileMD5(f);
+				if (md5 != null) {
+					map.put(f.getPath(), md5);
+				}
+			}
+		}
+		return map;
+	}
+
+}
diff --git a/server/services/src/main/java/com/doumee/core/utils/PinYinUtil.java b/server/services/src/main/java/com/doumee/core/utils/PinYinUtil.java
new file mode 100644
index 0000000..2e460a6
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/core/utils/PinYinUtil.java
@@ -0,0 +1,137 @@
+package com.doumee.core.utils;
+
+import net.sourceforge.pinyin4j.PinyinHelper;
+import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
+import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
+import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
+import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
+import org.apache.commons.lang3.StringUtils;
+
+import java.text.Collator;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * 姹夎鎷奸煶甯姪绫�
+ * 
+ * @author yanglong
+ * 
+ */
+public class PinYinUtil {
+
+	/**
+	 * 姣旇緝涓や釜姹夊瓧鐨勯瀛楁瘝 <br>
+	 * 
+	 * @param ch1
+	 * @param ch2
+	 * @return
+	 */
+	public static int comparatorWord(String ch1, String ch2) {
+		return getFirstSpell(ch2).compareTo(getFirstSpell(ch1));
+	}
+
+	public static void main(String[] args) {
+		Comparator<Object> com=Collator.getInstance(java.util.Locale.CHINA);  
+        String[] newArray={"涓北","姹曞ご","骞垮窞","瀹夊簡","闃虫睙","鍗椾含","姝︽眽","鍖椾含","瀹夐槼","鍖楁柟"};  
+        List<String> list = Arrays.asList(newArray);
+        Collections.sort(list, com); 
+        for(String i:list){  
+            System.out.print(i+"  ");  
+        }
+		//System.err.println(getFirstFirstSpell("寰堝悎閫傜殑绉垎寰堝皯鐪嬭"));
+	}
+	/**
+	 * 鑾峰彇姹夊瓧涓叉嫾闊抽瀛楁瘝锛岃嫳鏂囧瓧绗︿笉鍙�
+	 * 
+	 * @param chinese
+	 *            姹夊瓧涓�
+	 * @return 姹夎鎷奸煶棣栧瓧姣�
+	 */
+	public static String getFirstSpell(String chinese) {
+		StringBuffer pybf = new StringBuffer();
+		char[] arr = chinese.toCharArray();
+		HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
+		defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
+		defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
+		for (int i = 0; i < arr.length; i++) {
+			if (arr[i] > 128) {
+				try {
+					String[] temp = PinyinHelper.toHanyuPinyinStringArray(
+							arr[i], defaultFormat);
+					if (temp != null) {
+						pybf.append(temp[0].charAt(0));
+					}
+				} catch (BadHanyuPinyinOutputFormatCombination e) {
+					e.printStackTrace();
+				}
+			} else {
+				pybf.append(arr[i]);
+			}
+		}
+		return pybf.toString().replaceAll("\\W", "").trim();
+	}
+	/**
+	 * 鑾峰彇姹夊瓧涓叉嫾闊抽瀛楁瘝锛岃嫳鏂囧瓧绗︿笉鍙�
+	 * 
+	 * @param chinese
+	 *            姹夊瓧涓�
+	 * @return 姹夎鎷奸煶棣栧瓧姣�
+	 */
+	public static String getFirstFirstSpell(String chinese) {
+		if(StringUtils.isBlank(chinese)){
+			return null;
+		}
+		StringBuffer pybf = new StringBuffer();
+		chinese = chinese.substring(0,1);
+		char[] arr = chinese.toCharArray();
+		HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
+		defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
+		defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
+		for (int i = 0; i < arr.length; i++) {
+			if (arr[i] > 128) {
+				try {
+					String[] temp = PinyinHelper.toHanyuPinyinStringArray(
+							arr[i], defaultFormat);
+					if (temp != null) {
+						pybf.append(temp[0].charAt(0));
+					}
+				} catch (BadHanyuPinyinOutputFormatCombination e) {
+					e.printStackTrace();
+				}
+			} else {
+				pybf.append(arr[i]);
+			}
+		}
+		return pybf.toString().replaceAll("\\W", "").trim().toUpperCase();
+	}
+
+	/**
+	 * 鑾峰彇姹夊瓧涓叉嫾闊筹紝鑻辨枃瀛楃涓嶅彉
+	 * 
+	 * @param chinese
+	 *            姹夊瓧涓�
+	 * @return 姹夎鎷奸煶
+	 */
+	public static String getFullSpell(String chinese) {
+		StringBuffer pybf = new StringBuffer();
+		char[] arr = chinese.toCharArray();
+		HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
+		defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
+		defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
+		for (int i = 0; i < arr.length; i++) {
+			if (arr[i] > 128) {
+				try {
+					pybf.append(PinyinHelper.toHanyuPinyinStringArray(arr[i],
+							defaultFormat)[0]);
+				} catch (BadHanyuPinyinOutputFormatCombination e) {
+					e.printStackTrace();
+				}
+			} else {
+				pybf.append(arr[i]);
+			}
+		}
+		return pybf.toString();
+	}
+}
diff --git a/server/services/src/main/java/com/doumee/core/utils/aliyun/ALiYunUtil.java b/server/services/src/main/java/com/doumee/core/utils/aliyun/ALiYunUtil.java
new file mode 100644
index 0000000..4d3ebef
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/core/utils/aliyun/ALiYunUtil.java
@@ -0,0 +1,553 @@
+package com.doumee.core.utils.aliyun;
+
+import com.aliyun.oss.ClientException;
+import com.aliyun.oss.OSSClient;
+import com.aliyun.oss.OSSException;
+import com.aliyun.oss.model.*;
+import com.doumee.core.utils.FileDigest;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.*;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class ALiYunUtil {
+    private OSSClient client;
+
+    // public static final String ENDPOINT = "oss-cn-shanghai.aliyuncs.com";
+
+    public ALiYunUtil(String endpoint, String ACCESS_ID, String ACCESS_KEY) {
+        client = new OSSClient(endpoint, ACCESS_ID, ACCESS_KEY);
+    }
+
+    /**
+     * 涓婁紶鏂囦欢
+     *
+     * @param bucketName 浜戠瀛樻斁bucket鍚嶇О
+     * @param key        閲嶆柊鍛藉悕鐨勬枃浠跺悕
+     * @param filename   灏嗚涓婁紶鐨勬枃浠跺悕绉�
+     * @param mime       瓒呮枃鏈爣璁拌瑷�鏂囨湰 .html,.html text/html 鏅�氭枃鏈� .txt text/plain RTF鏂囨湰
+     *                   .rtf application/rtf GIF鍥惧舰 .gif image/gif JPEG鍥惧舰 .ipeg,.jpg
+     *                   image/jpeg au澹伴煶鏂囦欢 .au audio/basic MIDI闊充箰鏂囦欢 mid,.midi
+     *                   audio/midi,audio/x-midi RealAudio闊充箰鏂囦欢 .ra, .ram
+     *                   audio/x-pn-realaudio MPEG鏂囦欢 .mpg,.mpeg video/mpeg AVI鏂囦欢 .avi
+     *                   video/x-msvideo GZIP鏂囦欢 .gz application/x-gzip TAR鏂囦欢 .tar
+     *                   application/x-tar
+     * @throws OSSException
+     * @throws ClientException
+     * @throws FileNotFoundException
+     */
+
+    public void uploadObject(String bucketName, String key, String filename,
+                             String mime) throws OSSException, ClientException,
+            FileNotFoundException {
+        File file = new File(filename);
+        // 鍒ゆ柇鏄惁瀛樺湪锛屼笉瀛樺湪鍒涘缓
+        isExistBucket(bucketName);
+
+        ObjectMetadata objectMeta = new ObjectMetadata();
+        objectMeta.setContentLength(file.length());
+        // 鍙互鍦╩etadata涓爣璁版枃浠剁被鍨�
+        if (StringUtils.isNotBlank(mime)) {
+            objectMeta.setContentType(mime);
+        }
+
+        InputStream input = new FileInputStream(file);
+        client.putObject(bucketName, key, input, objectMeta);
+
+    }
+
+
+    /**
+     * 鍏抽棴
+     *
+     * @throws OSSException
+     * @throws ClientException
+     * @throws FileNotFoundException
+     */
+
+    public void shutDown()
+            throws OSSException, ClientException, FileNotFoundException {
+        if (client != null) {
+            // 鍏抽棴client
+            client.shutdown();
+        }
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎鏂囦欢
+     *
+     * @param bucketName
+     * @param keys
+     * @throws OSSException
+     * @throws ClientException
+     * @throws FileNotFoundException
+     */
+
+    public void deleteObjects(String bucketName, List<String> keys)
+            throws OSSException, ClientException, FileNotFoundException {
+        if (keys == null || keys.size() > 0) {
+            return;
+        }
+        DeleteObjectsResult deleteObjectsResult = client
+                .deleteObjects(new DeleteObjectsRequest(bucketName)
+                        .withKeys(keys));
+        List<String> deletedObjects = deleteObjectsResult.getDeletedObjects();
+        // 鍏抽棴client
+        client.shutdown();
+    }
+
+    /**
+     * 涓婁紶鏂囦欢
+     *
+     * @param bucketName 浜戠瀛樻斁bucket鍚嶇О
+     *                   灏嗚涓婁紶鐨勬枃浠跺悕绉�
+     * @param mime       瓒呮枃鏈爣璁拌瑷�鏂囨湰 .html,.html text/html 鏅�氭枃鏈� .txt text/plain RTF鏂囨湰
+     *                   .rtf application/rtf GIF鍥惧舰 .gif image/gif JPEG鍥惧舰 .ipeg,.jpg
+     *                   image/jpeg au澹伴煶鏂囦欢 .au audio/basic MIDI闊充箰鏂囦欢 mid,.midi
+     *                   audio/midi,audio/x-midi RealAudio闊充箰鏂囦欢 .ra, .ram
+     *                   audio/x-pn-realaudio MPEG鏂囦欢 .mpg,.mpeg video/mpeg AVI鏂囦欢 .avi
+     *                   video/x-msvideo GZIP鏂囦欢 .gz application/x-gzip TAR鏂囦欢 .tar
+     *                   application/x-tar
+     * @throws OSSException
+     * @throws ClientException
+     * @throws FileNotFoundException
+     */
+
+    public void uploadFiles(String bucketName, Map<String, File> ossFiles,
+                            String mime) throws OSSException, ClientException,
+            FileNotFoundException {
+        // 鍒ゆ柇鏄惁瀛樺湪锛屼笉瀛樺湪鍒涘缓
+        isExistBucket(bucketName);
+
+        // 鍙互鍦╩etadata涓爣璁版枃浠剁被鍨�
+        if (ossFiles != null && ossFiles.size() > 0) {
+            for (Map.Entry<String, File> entry : ossFiles.entrySet()) {
+                ObjectMetadata objectMeta = new ObjectMetadata();
+                objectMeta.setContentLength(entry.getValue().length());
+                if (StringUtils.isNotBlank(mime)) {
+                    objectMeta.setContentType(mime);
+                }
+                InputStream input = new FileInputStream(entry.getValue());
+                client.putObject(bucketName, entry.getKey(), input, objectMeta);
+                // 涓婁紶鍥剧墖
+            }
+        }
+
+        client.shutdown();
+    }
+
+    /**
+     * 涓婁紶鏂囦欢
+     *
+     * @param bucketName 浜戠瀛樻斁bucket鍚嶇О
+     * @param key        灏嗚涓婁紶鐨勬枃浠跺悕绉�
+     * @param mime       瓒呮枃鏈爣璁拌瑷�鏂囨湰 .html,.html text/html 鏅�氭枃鏈� .txt text/plain RTF鏂囨湰
+     *                   .rtf application/rtf GIF鍥惧舰 .gif image/gif JPEG鍥惧舰 .ipeg,.jpg
+     *                   image/jpeg au澹伴煶鏂囦欢 .au audio/basic MIDI闊充箰鏂囦欢 mid,.midi
+     *                   audio/midi,audio/x-midi RealAudio闊充箰鏂囦欢 .ra, .ram
+     *                   audio/x-pn-realaudio MPEG鏂囦欢 .mpg,.mpeg video/mpeg AVI鏂囦欢 .avi
+     *                   video/x-msvideo GZIP鏂囦欢 .gz application/x-gzip TAR鏂囦欢 .tar
+     *                   application/x-tar
+     * @throws OSSException
+     * @throws ClientException
+     * @throws FileNotFoundException
+     */
+
+    public void uploadFile(String bucketName, String key, File file, String mime)
+            throws OSSException, ClientException, FileNotFoundException {
+        // 鍒ゆ柇鏄惁瀛樺湪锛屼笉瀛樺湪鍒涘缓
+        isExistBucket(bucketName);
+
+        ObjectMetadata objectMeta = new ObjectMetadata();
+        objectMeta.setContentLength(file.length());
+        // 鍙互鍦╩etadata涓爣璁版枃浠剁被鍨�
+        if (StringUtils.isNotBlank(mime)) {
+            objectMeta.setContentType(mime);
+        }
+
+        InputStream input = new FileInputStream(file);
+        client.putObject(bucketName, key, input, objectMeta);
+
+    }
+
+    /**
+     * 涓婁紶鏂囦欢
+     *
+     * @param bucketName 浜戠瀛樻斁bucket鍚嶇О
+     * @param key        灏嗚涓婁紶鐨勬枃浠跺悕绉�
+     * @param mime       瓒呮枃鏈爣璁拌瑷�鏂囨湰 .html,.html text/html 鏅�氭枃鏈� .txt text/plain RTF鏂囨湰
+     *                   .rtf application/rtf GIF鍥惧舰 .gif image/gif JPEG鍥惧舰 .ipeg,.jpg
+     *                   image/jpeg au澹伴煶鏂囦欢 .au audio/basic MIDI闊充箰鏂囦欢 mid,.midi
+     *                   audio/midi,audio/x-midi RealAudio闊充箰鏂囦欢 .ra, .ram
+     *                   audio/x-pn-realaudio MPEG鏂囦欢 .mpg,.mpeg video/mpeg AVI鏂囦欢 .avi
+     *                   video/x-msvideo GZIP鏂囦欢 .gz application/x-gzip TAR鏂囦欢 .tar
+     *                   application/x-tar
+     * @throws OSSException
+     * @throws ClientException
+     * @throws IOException
+     */
+
+    public boolean uploadObject(MultipartFile file, String bucketName,
+                                String key, String mime) throws OSSException, ClientException,
+            IOException {
+        if (file != null) {
+            // 鍒ゆ柇鏄惁瀛樺湪锛屼笉瀛樺湪鍒涘缓
+            isExistBucket(bucketName);
+
+            ObjectMetadata objectMeta = new ObjectMetadata();
+            objectMeta.setContentLength(file.getSize());
+            // 鍙互鍦╩etadata涓爣璁版枃浠剁被鍨�
+            if (StringUtils.isNotBlank(mime)) {
+                objectMeta.setContentType(mime);
+            }
+            PutObjectRequest putObjectRequest = new PutObjectRequest(
+                    bucketName, key, file.getInputStream());
+            // 涓婁紶鍥炶皟鍙傛暟
+            /*
+             * Callback callback = new Callback();
+             * callback.setCallbackUrl("http://www.doumee.com");
+             * callback.setCallbackHost("oss-cn-hangzhou.aliyuncs.com");
+             * callback.setCallbackBody(
+             * "{\\\"mimeType\\\":${mimeType},\\\"size\\\":${size}}"); //
+             * callback.setCallbackBodyType(CallbackBodyType.JSON);
+             * callback.addCallbackVar("x:var1", "value1");
+             * callback.addCallbackVar("x:var2", "value2");
+             * putObjectRequest.setCallback(callback);
+             */
+            try {
+                PutObjectResult putObjectResult = client
+                        .putObject(putObjectRequest);
+                return true;
+            } catch (Exception e) {
+                // TODO: handle exception
+                System.err.println(e.getMessage());
+            }
+            /*
+             * // 璇诲彇涓婁紶鍥炶皟杩斿洖鐨勬秷鎭唴瀹� byte[] buffer = new byte[1024];
+             * putObjectResult.getCallbackResponseBody().read(buffer);
+             *
+             * // 涓�瀹氳close锛屽惁鍒欎細閫犳垚杩炴帴璧勬簮娉勬紡
+             * putObjectResult.getCallbackResponseBody().close();
+             */
+
+            file.getInputStream().close();
+            client.shutdown();
+
+        }
+
+        return false;
+
+    }
+
+    /**
+     * 鍒嗗潡涓婁紶鏂囦欢
+     *
+     * @param bucketName
+     * @param key
+     * @param filename
+     * @param mime
+     * @throws IOException
+     */
+    public String partUploadObject(String bucketName, String key,
+                                   String filename, String mime) throws IOException {
+        // 寮�濮婱ultipart Upload
+        InitiateMultipartUploadRequest initiateMultipartUploadRequest = new InitiateMultipartUploadRequest(
+                bucketName, key);
+        InitiateMultipartUploadResult initiateMultipartUploadResult = client
+                .initiateMultipartUpload(initiateMultipartUploadRequest);
+
+        // 璁剧疆姣忓潡涓� 5M
+        final int partSize = 1024 * 1024 * 5;
+
+        File partFile = new File(filename);
+
+        // 璁$畻鍒嗗潡鏁扮洰
+        int partCount = (int) (partFile.length() / partSize);
+        if (partFile.length() % partSize != 0) {
+            partCount++;
+        }
+
+        // 鏂板缓涓�涓狶ist淇濆瓨姣忎釜鍒嗗潡涓婁紶鍚庣殑ETag鍜孭artNumber
+        List<PartETag> partETags = new ArrayList<PartETag>();
+
+        for (int i = 0; i < partCount; i++) {
+            // 鑾峰彇鏂囦欢娴�
+            FileInputStream fis = new FileInputStream(partFile);
+
+            // 璺冲埌姣忎釜鍒嗗潡鐨勫紑澶�
+            long skipBytes = partSize * i;
+            fis.skip(skipBytes);
+
+            // 璁$畻姣忎釜鍒嗗潡鐨勫ぇ灏�
+            long size = partSize < partFile.length() - skipBytes ? partSize
+                    : partFile.length() - skipBytes;
+
+            // 鍒涘缓UploadPartRequest锛屼笂浼犲垎鍧�
+            UploadPartRequest uploadPartRequest = new UploadPartRequest();
+            uploadPartRequest.setBucketName(bucketName);
+            uploadPartRequest.setKey(key);
+            uploadPartRequest.setUploadId(initiateMultipartUploadResult
+                    .getUploadId());
+            uploadPartRequest.setInputStream(fis);
+            uploadPartRequest.setPartSize(size);
+            uploadPartRequest.setPartNumber(i + 1);
+            UploadPartResult uploadPartResult = client
+                    .uploadPart(uploadPartRequest);
+
+            // 灏嗚繑鍥炵殑PartETag淇濆瓨鍒癓ist涓��
+            partETags.add(uploadPartResult.getPartETag());
+
+            // 鍏抽棴鏂囦欢
+            fis.close();
+        }
+
+        CompleteMultipartUploadRequest completeMultipartUploadRequest = new CompleteMultipartUploadRequest(
+                bucketName, key, initiateMultipartUploadResult.getUploadId(),
+                partETags);
+
+        // 瀹屾垚鍒嗗潡涓婁紶
+        CompleteMultipartUploadResult completeMultipartUploadResult = client
+                .completeMultipartUpload(completeMultipartUploadRequest);
+
+        // 鏍¢獙MD5
+        if (StringUtils.equals(FileDigest.getFileMD5(new File(filename)),
+                completeMultipartUploadResult.getETag())) {
+            // 濡傛灉涓�鑷�
+            return "涓婁紶鎴愬姛";
+        }
+        return "涓婁紶澶辫触";
+
+    }
+
+    /**
+     * 鍒ゆ柇鏄惁瀛樺湪bucket锛屽鏋滀笉瀛樺湪鍒涘缓
+     */
+    @SuppressWarnings("deprecation")
+    public void isExistBucket(String bucketName) {
+        // 鑾峰彇Bucket鐨勫瓨鍦ㄤ俊鎭�
+        boolean exists = client.doesBucketExist(bucketName);
+        // 杈撳嚭缁撴灉
+        if (!exists) {
+            // 涓嶅瓨鍦ㄥ垱寤哄畠
+            client.createBucket(bucketName);
+            // 淇敼鏉冮檺
+            client.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
+        }
+
+        // 鍒椾妇bucket
+        // List<Bucket> buckets = client.listBuckets();
+        // for (Bucket bucket : buckets) {
+        // System.out.println(" - " + bucket.getName());
+        // }
+    }
+
+    /**
+     * 鍒犻櫎bucket
+     *
+     * @param bucketName
+     * @return
+     */
+    @SuppressWarnings("deprecation")
+    public boolean deleteBucket(String bucketName) {
+        // 鍒ゆ柇鏈夋病鏈�
+        if (client.doesBucketExist(bucketName)) {
+            // 鍒ゆ柇bucket鏄惁涓虹┖
+            ObjectListing listObjects = client.listObjects(bucketName);
+            // 閬嶅巻鎵�鏈塐bject
+            for (OSSObjectSummary objectSummary : listObjects
+                    .getObjectSummaries()) {
+                // 鍒犻櫎object
+                client.deleteObject(bucketName, objectSummary.getKey());
+            }
+            // 鍒犻櫎Bucket
+            client.deleteBucket(bucketName);
+        }
+        return true;
+    }
+
+    /**
+     * 閫掑綊鍒楀嚭鐩綍涓嬫墍鏈夋枃浠�
+     *
+     * @param bucketName
+     * @return
+     */
+    public long getAllBuckets(String bucketName, String prefix) {
+        long totalSize = 0;
+        // 鏋勯�燣istObjectsRequest璇锋眰
+
+        ListObjectsRequest listObjectsRequest = new ListObjectsRequest(
+                bucketName);
+        listObjectsRequest.setPrefix(prefix);
+        listObjectsRequest.withMaxKeys(1000);
+        // 閫掑綊鍒楀嚭fun鐩綍涓嬬殑鎵�鏈夋枃浠�
+        ObjectListing listing = null;
+        String nextMarker = null;
+        do {
+            listObjectsRequest.withMarker(nextMarker);
+            listing = client.listObjects(listObjectsRequest);
+
+            for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
+                totalSize += objectSummary.getSize();
+                System.out.println(objectSummary.getKey() + ":"
+                        + objectSummary.getSize());
+            }
+            nextMarker = listing.getNextMarker();
+        } while (listing.isTruncated());
+        // 閬嶅巻鎵�鏈塐bject
+        System.out.println("Objects:");
+
+        return totalSize;
+    }
+
+    /**
+     * 涓嬭浇鏂囦欢
+     *
+     * @param bucketName 浜戠瀛樻斁bucket鍚嶇О
+     * @param key        浜戠宸插瓨鍦ㄦ枃浠�
+     * @param filename   鏈湴寰呭啓鍏ユ枃浠�
+     * @throws OSSException
+     * @throws ClientException
+     * @throws IOException
+     */
+    public String downloadFile(String bucketName, String key, String filename)
+            throws OSSException, ClientException, IOException {
+
+        // 棣栧厛妫�鏌ユ槸鍚﹀瓨鍦ㄧ洰褰�
+        if (StringUtils.isBlank(filename)) {
+            // 寰呭啓鍏ユ枃浠朵负绌�
+            return "ERROR_FILENAME_IS_NULL";
+        }
+
+        File file = new File(filename);
+        if (!file.exists()) {
+            file.createNewFile();
+        }
+
+        client.getObject(new GetObjectRequest(bucketName, key), file);
+        return filename;
+    }
+
+    public static void main(String[] args) throws OSSException,
+            ClientException, IOException {
+        ALiYunUtil aLiYunUtil = new ALiYunUtil("", "uc4nnpsqep1i9fijqr37nokh",
+                "/rp41xCx/XdGEVCptdH6v7xpc9w=");
+        // aLiYunUtil.uploadObject("pongto", "work/li2.txt", "D://鍝�.txt",
+        // ".html,.html text/html");D://瑁呮満杞欢/鍔炲叕瀛︿範
+        // aLiYunUtil.partUploadObject("pongto", "work/ps.exe",
+        // "D://瑁呮満杞欢/鍔炲叕瀛︿範/Adobe_Illustrator_CS6_XiaZaiBa.exe",
+        // ".html,.html text/html");
+        // aLiYunUtil.deleteBucket("pongto");
+    }
+
+    /**
+     * 涓婁紶缃戠粶鏂囦欢
+     *
+     * @param bucketName 浜戠瀛樻斁bucket鍚嶇О
+     * @param key        閲嶆柊鍛藉悕鐨勬枃浠跺悕
+     *                   灏嗚涓婁紶鐨勬枃浠跺悕绉�
+     * @param mime       瓒呮枃鏈爣璁拌瑷�鏂囨湰 .html,.html text/html 鏅�氭枃鏈� .txt text/plain RTF鏂囨湰
+     *                   .rtf application/rtf GIF鍥惧舰 .gif image/gif JPEG鍥惧舰 .ipeg,.jpg
+     *                   image/jpeg au澹伴煶鏂囦欢 .au audio/basic MIDI闊充箰鏂囦欢 mid,.midi
+     *                   audio/midi,audio/x-midi RealAudio闊充箰鏂囦欢 .ra, .ram
+     *                   audio/x-pn-realaudio MPEG鏂囦欢 .mpg,.mpeg video/mpeg AVI鏂囦欢 .avi
+     *                   video/x-msvideo GZIP鏂囦欢 .gz application/x-gzip TAR鏂囦欢 .tar
+     *                   application/x-tar
+     * @throws OSSException
+     * @throws ClientException
+     * @throws IOException
+     */
+
+    public boolean uploadOnlineObject(String url, String bucketName, String key,
+                                      String mime) throws OSSException, ClientException, IOException {
+        InputStream inputStream = new URL(url).openStream();
+        if (inputStream != null) {
+            // 鍒ゆ柇鏄惁瀛樺湪锛屼笉瀛樺湪鍒涘缓
+            isExistBucket(bucketName);
+
+            ObjectMetadata objectMeta = new ObjectMetadata();
+            objectMeta.setContentLength(inputStream.available());
+            // 鍙互鍦╩etadata涓爣璁版枃浠剁被鍨�
+            if (StringUtils.isNotBlank(mime)) {
+                objectMeta.setContentType(mime);
+            }
+            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key,
+                    inputStream);
+            // 涓婁紶鍥炶皟鍙傛暟
+			/*	Callback callback = new Callback();
+			callback.setCallbackUrl("http://www.doumee.com");
+			callback.setCallbackHost("oss-cn-hangzhou.aliyuncs.com");
+			callback.setCallbackBody("{\\\"mimeType\\\":${mimeType},\\\"size\\\":${size}}");
+//			callback.setCallbackBodyType(CallbackBodyType.JSON);
+			callback.addCallbackVar("x:var1", "value1");
+			callback.addCallbackVar("x:var2", "value2");
+			putObjectRequest.setCallback(callback);*/
+            try {
+                PutObjectResult putObjectResult = client.putObject(putObjectRequest);
+                return true;
+            } catch (Exception e) {
+                // TODO: handle exception
+            }
+			/*// 璇诲彇涓婁紶鍥炶皟杩斿洖鐨勬秷鎭唴瀹�
+			byte[] buffer = new byte[1024];
+			putObjectResult.getCallbackResponseBody().read(buffer);
+			
+			// 涓�瀹氳close锛屽惁鍒欎細閫犳垚杩炴帴璧勬簮娉勬紡
+			putObjectResult.getCallbackResponseBody().close();*/
+
+            inputStream.close();
+            client.shutdown();
+
+        }
+
+        return false;
+
+    }
+
+    public boolean uploadOnlineObject(InputStream inputStream, String bucketName, String key,
+                                      String mime) throws OSSException, ClientException, IOException {
+        if (inputStream != null) {
+            // 鍒ゆ柇鏄惁瀛樺湪锛屼笉瀛樺湪鍒涘缓
+            isExistBucket(bucketName);
+
+            ObjectMetadata objectMeta = new ObjectMetadata();
+            objectMeta.setContentLength(inputStream.available());
+            // 鍙互鍦╩etadata涓爣璁版枃浠剁被鍨�
+            if (StringUtils.isNotBlank(mime)) {
+                objectMeta.setContentType(mime);
+            }
+            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key,
+                    inputStream);
+            // 涓婁紶鍥炶皟鍙傛暟
+			/*	Callback callback = new Callback();
+			callback.setCallbackUrl("http://www.doumee.com");
+			callback.setCallbackHost("oss-cn-hangzhou.aliyuncs.com");
+			callback.setCallbackBody("{\\\"mimeType\\\":${mimeType},\\\"size\\\":${size}}");
+//			callback.setCallbackBodyType(CallbackBodyType.JSON);
+			callback.addCallbackVar("x:var1", "value1");
+			callback.addCallbackVar("x:var2", "value2");
+			putObjectRequest.setCallback(callback);*/
+            try {
+                PutObjectResult putObjectResult = client.putObject(putObjectRequest);
+                return true;
+            } catch (Exception e) {
+                // TODO: handle exception
+            }
+			/*// 璇诲彇涓婁紶鍥炶皟杩斿洖鐨勬秷鎭唴瀹�
+			byte[] buffer = new byte[1024];
+			putObjectResult.getCallbackResponseBody().read(buffer);
+			
+			// 涓�瀹氳close锛屽惁鍒欎細閫犳垚杩炴帴璧勬簮娉勬紡
+			putObjectResult.getCallbackResponseBody().close();*/
+
+            inputStream.close();
+            client.shutdown();
+
+        }
+        return false;
+    }
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/business/AreasMapper.java b/server/services/src/main/java/com/doumee/dao/business/AreasMapper.java
new file mode 100644
index 0000000..d1b7e4a
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/business/AreasMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.doumee.dao.business.model.Areas;
+import com.github.yulichang.base.MPJBaseMapper;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/02/15 08:55
+ */
+public interface AreasMapper extends MPJBaseMapper<Areas> {
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/business/BannerMapper.java b/server/services/src/main/java/com/doumee/dao/business/BannerMapper.java
new file mode 100644
index 0000000..9205736
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/business/BannerMapper.java
@@ -0,0 +1,13 @@
+package com.doumee.dao.business;
+
+import com.doumee.dao.business.model.Banner;
+import com.github.yulichang.base.MPJBaseMapper;
+
+/**
+ * 杞挱鍥綧apper
+ * @author rk
+ * @date 2026/04/08
+ */
+public interface BannerMapper extends MPJBaseMapper<Banner> {
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/business/DriverInfoMapper.java b/server/services/src/main/java/com/doumee/dao/business/DriverInfoMapper.java
new file mode 100644
index 0000000..b35f4db
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/business/DriverInfoMapper.java
@@ -0,0 +1,13 @@
+package com.doumee.dao.business;
+
+import com.doumee.dao.business.model.DriverInfo;
+import com.github.yulichang.base.MPJBaseMapper;
+
+/**
+ * 鍙告満娉ㄥ唽淇℃伅Mapper
+ * @author rk
+ * @date 2026/04/08
+ */
+public interface DriverInfoMapper extends MPJBaseMapper<DriverInfo> {
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/business/PricingRuleMapper.java b/server/services/src/main/java/com/doumee/dao/business/PricingRuleMapper.java
new file mode 100644
index 0000000..0337d98
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/business/PricingRuleMapper.java
@@ -0,0 +1,13 @@
+package com.doumee.dao.business;
+
+import com.doumee.dao.business.model.PricingRule;
+import com.github.yulichang.base.MPJBaseMapper;
+
+/**
+ * 璁′环瑙勫垯閰嶇疆Mapper
+ * @author rk
+ * @date 2026/04/08
+ */
+public interface PricingRuleMapper extends MPJBaseMapper<PricingRule> {
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/business/ShopInfoMapper.java b/server/services/src/main/java/com/doumee/dao/business/ShopInfoMapper.java
new file mode 100644
index 0000000..cdcfd4f
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/business/ShopInfoMapper.java
@@ -0,0 +1,13 @@
+package com.doumee.dao.business;
+
+import com.doumee.dao.business.model.ShopInfo;
+import com.github.yulichang.base.MPJBaseMapper;
+
+/**
+ * 闂ㄥ簵淇℃伅Mapper
+ * @author rk
+ * @date 2026/04/08
+ */
+public interface ShopInfoMapper extends MPJBaseMapper<ShopInfo> {
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/business/SmsrecordMapper.java b/server/services/src/main/java/com/doumee/dao/business/SmsrecordMapper.java
new file mode 100644
index 0000000..ad064bc
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/business/SmsrecordMapper.java
@@ -0,0 +1,13 @@
+package com.doumee.dao.business;
+
+import com.doumee.dao.business.model.Smsrecord;
+import com.github.yulichang.base.MPJBaseMapper;
+
+/**
+ * 鐭俊楠岃瘉鐮丮apper
+ * @author rk
+ * @date 2026/04/08
+ */
+public interface SmsrecordMapper extends MPJBaseMapper<Smsrecord> {
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/Areas.java b/server/services/src/main/java/com/doumee/dao/business/model/Areas.java
new file mode 100644
index 0000000..70916f6
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/business/model/Areas.java
@@ -0,0 +1,134 @@
+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;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鐪佸競鍖轰俊鎭〃
+ * @author 姹熻箘韫�
+ * @date 2023/02/15 08:55
+ */
+@Data
+@ApiModel("鐪佸競鍖轰俊鎭〃")
+@TableName("`areas`")
+public class Areas implements Cloneable,Comparable<Object>{
+
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelColumn(name="涓婚敭")
+    @TableId(value = "id",type = IdType.AUTO)
+    private Integer id;
+
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name="鍒涘缓鏃堕棿")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "鍚嶇О")
+    @ExcelColumn(name="鍚嶇О")
+    private String name;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String info;
+
+    @ApiModelProperty(value = "琛屾斂鍖轰唬鐮�")
+    @ExcelColumn(name="琛屾斂鍖轰唬鐮�")
+    private String code;
+
+    @ApiModelProperty(value = "鐖剁骇缂栫爜锛堝叧鑱攁reas琛級", example = "1")
+    @ExcelColumn(name="鐖剁骇缂栫爜锛堝叧鑱攁reas琛級")
+    private Integer parentId;
+
+    @ApiModelProperty(value = "绫诲瀷 0鐪� 1甯� 2鍖哄幙", example = "1")
+    @ExcelColumn(name="绫诲瀷 0鐪� 1甯� 2鍖哄幙")
+    private Integer type;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+    @ApiModelProperty(value = "鏄惁寮�鍚娇鐢細0=鍚︼紱1=鏄紱", example = "1")
+    @ExcelColumn(name="鏄惁寮�鍚娇鐢細0=鍚︼紱1=鏄紱")
+    private Integer status;
+
+    @TableField(exist = false)
+    private List<Areas> childList;
+    @TableField(exist = false)
+    private Integer provinceId;
+    @TableField(exist = false)
+    private String provinceName;
+    @TableField(exist = false)
+    private Integer cityId;
+    @TableField(exist = false)
+    private String cityName;
+    @TableField(exist = false)
+ 	private String fullspell;//鍏ㄦ嫾闊�;
+    @TableField(exist = false)
+ 	private String firstSpell;//棣栧瓧姣�;
+    //瀹炵幇Cloneable鐨刢lone鏂规硶锛屽皢clone瀹氫箟涓簆ublic
+    public Areas clone()   {
+        try {
+            return (Areas) super.clone();
+        } catch (CloneNotSupportedException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+    @Override
+    public String toString() {
+        return "Areas{" +
+            "id=" + id +
+            ", creator=" + creator +
+            ", createDate=" + createDate +
+            ", editor=" + editor +
+            ", editDate=" + editDate +
+            ", isdeleted=" + isdeleted +
+            ", name='" + name + '\'' +
+            ", info='" + info + '\'' +
+            ", code='" + code + '\'' +
+            ", parentId=" + parentId +
+            ", type=" + type +
+            '}';
+    }
+
+    @Override
+    public int compareTo(Object o) {
+        if (this == o) {
+            return 0;
+        } else if (o != null && o instanceof Areas) {
+            Areas u = (Areas) o;
+            if (fullspell.compareTo(u.fullspell) < 0) {
+                return -1;
+            } else {
+                return 1;
+            }
+        } else {
+            return -1;
+        }
+    }
+}
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
new file mode 100644
index 0000000..27e85d7
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/business/model/Banner.java
@@ -0,0 +1,74 @@
+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.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;
+
+/**
+ * 杞挱鍥�
+ * @author rk
+ * @date 2026/04/08
+ */
+@Data
+@ApiModel("杞挱鍥�")
+@TableName("`banner`")
+public class Banner {
+
+    @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 = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name = "鍒涘缓鏃堕棿", index = 1, width = 16, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    private Integer updateUser;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "娲诲姩涓婚敭")
+    private Integer title;
+
+    @ApiModelProperty(value = "鎺掑簭鍙�")
+    private Integer sortnum;
+
+    @ApiModelProperty(value = "鐘舵�� 0姝e父 1鍋滅敤", example = "0")
+    @ExcelColumn(name = "鐘舵��", index = 2, width = 10, valueMapping = "0=姝e父;1=鍋滅敤;")
+    private Integer status;
+
+    @ApiModelProperty(value = "鍒楄〃鍥�")
+    private String imgurl;
+
+    @ApiModelProperty(value = "璺宠浆绫诲瀷 0瀵屾枃鏈� 1澶栭摼", example = "0")
+    @ExcelColumn(name = "璺宠浆绫诲瀷", index = 3, width = 10, valueMapping = "0=瀵屾枃鏈�;1=澶栭摼;")
+    private Integer type;
+
+    @ApiModelProperty(value = "浣嶇疆 0棣栭〉 1搴楅摵棣栭〉", example = "0")
+    @ExcelColumn(name = "浣嶇疆", index = 4, width = 10, valueMapping = "0=棣栭〉;1=搴楅摵棣栭〉;")
+    private Integer position;
+
+    @ApiModelProperty(value = "搴楅摵涓婚敭")
+    private Integer shopId;
+
+    @ApiModelProperty(value = "鍐呭")
+    private String content;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/Category.java b/server/services/src/main/java/com/doumee/dao/business/model/Category.java
index 06048b0..ffbc6d3 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/Category.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/Category.java
@@ -63,30 +63,39 @@
     @ExcelColumn(name="鍗曚綅鍚嶇О")
     private String name;
 
-    @ApiModelProperty(value = "绫诲瀷:0=鍝佺閰嶇疆锛�1=杞﹁締绫诲瀷閰嶇疆锛�2=椁愭爣閰嶇疆锛�3=鎵嬬画璐归厤缃紱", example = "1")
-    @ExcelColumn(name="绫诲瀷:0=鍝佺閰嶇疆锛�1=杞﹁締绫诲瀷閰嶇疆锛�2=椁愭爣閰嶇疆锛�3=鎵嬬画璐归厤缃紱")
+    @ApiModelProperty(value = "绫诲瀷:1=杞﹁締绫诲瀷;2=鐗╁搧鍒嗙被;3=鐗╁搧绛夌骇;4=鐗╁搧灏哄;", example = "1")
+    @ExcelColumn(name="绫诲瀷:1=杞﹁締绫诲瀷;2=鐗╁搧鍒嗙被;3=鐗╁搧绛夌骇;4=鐗╁搧灏哄;")
     private Integer type;
 
-    @ApiModelProperty(value = "鍐呭锛堣溅杈嗚鏍笺�侀鏍囥�佹墜缁垂姣斾緥锛�")
-    @ExcelColumn(name="鍐呭锛堣溅杈嗚鏍笺�侀鏍囥�佹墜缁垂姣斾緥锛�")
+    @ApiModelProperty(value = "鍐呭 锛坱ype=1锛氶�氳鏂瑰紡; type=2锛氬徃鏈鸿瘎绾э級;")
+    @ExcelColumn(name="鍐呭")
     private String detail;
 
     @ApiModelProperty(value = "鍥炬爣锛堣溅杈嗙被鍨嬩娇鐢級")
     @ExcelColumn(name="鍥炬爣锛堣溅杈嗙被鍨嬩娇鐢級")
     private String icon;
+
     @ApiModelProperty(value = "鎺掑簭鐮侊紙鍗囧簭锛�")
     @ExcelColumn(name="鎺掑簭鐮侊紙鍗囧簭锛�")
     private Integer sortnum;
 
-    @ApiModelProperty(value = "鏄惁鍥哄畾杞﹁締锛堣溅杈嗙被鍨嬩娇鐢級:0=鍚︼紱1=鏄紱", example = "1")
-    @ExcelColumn(name="鏄惁鍥哄畾杞﹁締锛堣溅杈嗙被鍨嬩娇鐢級:0=鍚︼紱1=鏄紱")
-    private Integer isFixed;
+    @ApiModelProperty(value = "闄勫睘瀛楁1 (type=1:鏄惁闇�瑕佷笂浼犻┚椹惰瘉锛�0=涓嶉渶瑕侊紱1=闇�瑕侊紱) ")
+    @ExcelColumn(name="鍐呭")
+    private String otherField;
+
+    @ApiModelProperty(value = "鏄惁鍥哄畾杞﹁締", example = "1")
+    @ExcelColumn(name="鏄惁鍥哄畾杞﹁締")
+    private Integer isFixed; // 寮冪敤
+
+
     @ApiModelProperty(value = "鏄惁鍥哄畾杞﹁締锛堣溅杈嗙被鍨嬩娇鐢級:0=鍚︼紱1=鏄紱", example = "1")
     @TableField(exist = false)
     private String updateUserName;
+
     @ApiModelProperty(value = "椁愭爣绛夐厤缃」闆嗗悎", example = "1")
     @TableField(exist = false)
     private JSONArray detailList;
+
     @ApiModelProperty(value = "鍥炬爣鍏ㄨ矾寰�")
     @TableField(exist = false)
     private String iconFull;
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
new file mode 100644
index 0000000..7e3a6aa
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/business/model/DriverInfo.java
@@ -0,0 +1,145 @@
+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;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鍙告満娉ㄥ唽淇℃伅
+ * @author rk
+ * @date 2026/04/08
+ */
+@Data
+@ApiModel("鍙告満娉ㄥ唽淇℃伅")
+@TableName("`driver_info`")
+public class DriverInfo {
+
+    @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 = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name = "鍒涘缓鏃堕棿", index = 1, width = 16, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    private Integer updateUser;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "濮撳悕")
+    @ExcelColumn(name = "濮撳悕", index = 2, width = 10)
+    private String name;
+
+    @ApiModelProperty(value = "鎵嬫満鍙�")
+    @ExcelColumn(name = "鎵嬫満鍙�", index = 3, width = 12)
+    private String telephone;
+
+    @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")
+    private Integer areaId;
+
+    @ApiModelProperty(value = "灞呬綇鍦板潃")
+    private String livePlace;
+
+    @ApiModelProperty(value = "澶村儚鍥剧墖")
+    private String imgurl;
+
+    @ApiModelProperty(value = "杞﹁締绫诲瀷", example = "1")
+    private Integer carType;
+
+    @ApiModelProperty(value = "杞︾墝鍙�")
+    @ExcelColumn(name = "杞︾墝鍙�", index = 6, width = 10)
+    private String carCode;
+
+    @ApiModelProperty(value = "杞﹁締棰滆壊")
+    private String carColor;
+
+    @ApiModelProperty(value = "椹鹃┒璇佹湁鏁堟湡寮�濮嬫椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date cardStartDate;
+
+    @ApiModelProperty(value = "椹鹃┒璇佹湁鏁堟湡缁撴潫鏃堕棿")
+    @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=瀹℃壒椹冲洖;")
+    private Integer status;
+
+    @ApiModelProperty(value = "OPENID(APP)")
+    private String openid;
+
+    @ApiModelProperty(value = "UNIONID")
+    private String unionid;
+
+    @ApiModelProperty(value = "瀹℃壒鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date auditTime;
+
+    @ApiModelProperty(value = "瀹℃壒浜�", example = "1")
+    private Integer auditUser;
+
+    @ApiModelProperty(value = "瀹℃壒澶囨敞")
+    private String auditRemark;
+
+    @ApiModelProperty(value = "浼氬憳涓婚敭", example = "1")
+    private Integer memberId;
+
+    @ApiModelProperty(value = "韬唤璇佹闈㈢収")
+    private String idcardImg;
+
+    @ApiModelProperty(value = "韬唤璇佸弽闈㈢収")
+    private String idcardImgBack;
+
+    @ApiModelProperty(value = "杞﹁締鐓х墖鍒楄〃")
+    @TableField(exist = false)
+    private List<Multifile> carImgList = new ArrayList<>();
+
+    @ApiModelProperty(value = "椹鹃┒璇佺収鐗囧垪琛�")
+    @TableField(exist = false)
+    private List<Multifile> licenseImgList = new ArrayList<>();
+
+    @ApiModelProperty(value = "鍏朵粬璧勬枡鐓х墖鍒楄〃")
+    @TableField(exist = false)
+    private List<Multifile> otherImgList = new ArrayList<>();
+
+    @ApiModelProperty(value = "鏄惁闇�瑕佷笂浼犻┚椹惰瘉锛�0=涓嶉渶瑕侊紱1=闇�瑕�")
+    @TableField(exist = false)
+    private Integer needLicense;
+
+    @ApiModelProperty(value = "杞﹁締绫诲瀷鍚嶇О")
+    @TableField(exist = false)
+    private String carTypeName;
+
+
+
+}
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 03ff91f..b52946e 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,13 +67,13 @@
     @ExcelColumn(name="鐪熷疄濮撳悕",index = 4,width = 10)
     private String name;
 
-    @ApiModelProperty(value = "鐢ㄥ伐韬唤:0=鏈敵璇凤紱1=鐢宠涓紱2=宸查�氳繃锛�3=鏈�氳繃锛�", example = "1")
+    @ApiModelProperty(value = "鐢ㄥ伐韬唤:0=鏈敵璇凤紱1=鐢宠涓紱2=宸查�氳繃锛�3=鏈�氳繃锛�", example = "1") //寮冪敤
     private Integer workerIdentity;
 
-    @ApiModelProperty(value = "璐ц繍韬唤:0=鏈敵璇凤紱1=鐢宠涓紱2=宸查�氳繃锛�3=鏈�氳繃锛�", example = "1")
+    @ApiModelProperty(value = "璐ц繍韬唤:0=鏈敵璇凤紱1=鐢宠涓紱2=宸查�氳繃锛�3=鏈�氳繃锛�", example = "1") //寮冪敤
     private Integer driverIdentity;
 
-    @ApiModelProperty(value = "渚涢韬唤:0=鏈敵璇凤紱1=鐢宠涓紱2=宸查�氳繃锛�3=鏈�氳繃锛�", example = "1")
+    @ApiModelProperty(value = "渚涢韬唤:0=鏈敵璇凤紱1=鐢宠涓紱2=宸查�氳繃锛�3=鏈�氳繃锛�", example = "1") //寮冪敤
     private Integer chefIdentity;
 
     @ApiModelProperty(value = "褰撳墠浣欓(鍗曚綅:鍒�)", example = "1")
@@ -82,7 +82,7 @@
     @ApiModelProperty(value = "鍘嗗彶鎬婚噾棰�(鍗曚綅:鍒�)", example = "1")
     private Long totalAmount;
 
-    @ApiModelProperty(value = "鐘舵��", example = "1")
+    @ApiModelProperty(value = "鐘舵�� 0=姝e父锛�1=鍋滅敤锛�2=宸叉敞閿�", example = "1")
     private Integer status;
 
     @ApiModelProperty(value = "鏈�鍚庣櫥褰曟椂闂�")
@@ -134,6 +134,19 @@
     @ApiModelProperty(value = "褰撳墠浣跨敤韬唤:0=鐢ㄥ伐鍙戝竷鏂�;1=鐢ㄥ伐鎺ュ崟鏂�;", example = "1")
     private Integer useIdentity;
 
+    @ApiModelProperty(value = "鐢ㄦ埛绫诲瀷锛�0=浼氬憳鐢ㄦ埛锛�1=鍙告満锛�2=搴楅摵浜哄憳锛�(鍙告満涓庡簵閾哄潎鍜屼細鍛樿〃浣跨敤鍚屼富閿��)", example = "1")
+    private Integer userType;
+
+    @ApiModelProperty(value = "涓氬姟鐘舵�侊細0=鏈璇侊紱1=璁よ瘉閫氳繃锛�2=璁よ瘉鏈�氳繃 锛�3=宸叉敮浠樻娂閲�", example = "1")
+    private Integer businessStatus;
+
+    @ApiModelProperty(value = "鐧诲綍瀵嗙爜", example = "1")
+    private String password;
+
+    @ApiModelProperty(value = "瀵嗙爜鐩�", example = "1")
+    private String salt;
+
+
     @ApiModelProperty(value = "鎴戠殑 - 鏁版嵁淇℃伅", example = "1")
     @TableField(exist = false)
     private UserCenterVO userCenterVO;
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 f09837d..11bc06d 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,8 @@
     @ApiModelProperty(value = "绫诲瀷0鍥剧墖 1瑙嗛 2鍏朵粬", example = "1")
     private Integer type;
 
-//    @ApiModelProperty(value = "鍏宠仈瀵硅薄绫诲瀷 0SHE涓婃姤 1璺岀粖婊戜笂鎶� 2璺岀粖婊戝鐞� 3璺岀粖婊戝垎閰嶇墿涓氫富绠� 4璺岀粖婊戝垎閰嶅鐞嗕汉 5DCA椋庨櫓涓婃姤 6DCA椋庨櫓澶勭悊 7DCA宸ュ崟鍥剧墖", example = "1")
-//    @ExcelExportColumn(name="鍏宠仈瀵硅薄绫诲瀷 0SHE涓婃姤 1璺岀粖婊戜笂鎶� 2璺岀粖婊戝鐞� 3璺岀粖婊戝垎閰嶇墿涓氫富绠� 4璺岀粖婊戝垎閰嶅鐞嗕汉 5DCA椋庨櫓涓婃姤 6DCA椋庨櫓澶勭悊 7DCA宸ュ崟鍥剧墖")
-    @ApiModelProperty(value = "鍏宠仈瀵硅薄绫诲瀷 0韬唤鐢宠璧勬枡 1璁㈠崟闄勪欢", example = "1")
+    @ApiModelProperty(value = "鍏宠仈瀵硅薄绫诲瀷锛�0=闂ㄥ簵鍏朵粬鏉愭枡锛�1=闂ㄥ簵鍐呴儴鐓х墖锛�2=璁㈠崟瀵勫瓨鍥剧墖锛�3=璁㈠崟鍙栦欢鍥剧墖锛�4=鍙告満鍙栦欢鍥剧墖锛�5=鍙告満瀹屾垚鍥剧墖锛�6=鍙告満瀹炲悕璁よ瘉杞﹁締鐓х墖锛�7=鍙告満瀹炲悕璁よ瘉椹鹃┒璇佺収鐗囷紱8=鍙告満瀹炲悕璁よ瘉鍏朵粬鍥剧墖锛�" +
+            "9=闂ㄥ簵闂ㄥご鐓э紱10=绀句繚缂寸撼璇佹槑锛�11=鏈夋晥鍔冲姩鍚堝悓锛�", example = "1")
     private Integer objType;
 
     @ApiModelProperty(value = "鏂囦欢鍦板潃")
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
new file mode 100644
index 0000000..fa81fd9
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/business/model/PricingRule.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.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;
+
+/**
+ * 璁′环瑙勫垯閰嶇疆
+ * @author rk
+ * @date 2026/04/08
+ */
+@Data
+@ApiModel("璁′环瑙勫垯閰嶇疆")
+@TableName("`pricing_rule`")
+public class PricingRule {
+
+    @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 = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name = "鍒涘缓鏃堕棿", index = 1, width = 16, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    private Integer updateUser;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鍩庡競涓婚敭锛坅rea_id锛�", example = "1")
+    private Integer cityId;
+
+    @ApiModelProperty(value = "绫诲瀷锛�0=灏卞湴瀛樺彇瑙勫垯锛�1=寮傚湴瀛樺彇瑙勫垯锛�2=棰勮澶辨晥锛�3=闂ㄥ簵娉ㄥ唽鎶奸噾锛�4=鍒嗘垚姣斾緥", example = "0")
+    @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) = 绫诲瀷锛堜紒涓�/涓汉/閰嶉�佸憳锛�")
+    private String fieldA;
+
+    @ApiModelProperty(value = "鍙傛暟2锛歵ype 锛�0锛�=  鏀惰垂鍗曚环 ;type 锛�1锛�= 閰嶉�佽捣姝ラ噷绋嬪叕閲屾暟 锛泃ype 锛�2锛�= 璧烽�侀噷绋� km 锛� type (3)  = 鎶奸噾锛泃ype (4) = 鍦扮偣绫诲瀷锛堝瘎浠剁偣/鍙栦欢鐐�/鍒嗘垚姣斾緥锛�")
+    private String fieldB;
+
+    @ApiModelProperty(value = "鍙傛暟3锛歵ype 锛�1锛�= 閰嶉�佽捣姝ラ噷绋嬫瘡鍏噷鍗曚环 锛泃ype (2)  = 璧烽�佹椂闀匡紱 type (3)  = 鎶奸噾锛泃ype (4) = 鍒嗘垚姣斾緥")
+    private String fieldC;
+
+    @ApiModelProperty(value = "鍙傛暟4锛歵ype=1  瓒呭嚭棣栧崟閲岀▼鍏噷鏁� 锛� type =2  缁�侀噷绋� km锛�")
+    private String fieldD;
+
+    @ApiModelProperty(value = "鍙傛暟5锛歵ype=1  瓒呭嚭棣栧崟閲岀▼姣忓叕閲� 鍗曚环 锛� type =2 缁�佹椂闀�")
+    private String fieldE;
+
+}
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
new file mode 100644
index 0000000..deb42ac
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/business/model/ShopInfo.java
@@ -0,0 +1,124 @@
+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.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;
+
+/**
+ * 闂ㄥ簵淇℃伅
+ * @author rk
+ * @date 2026/04/08
+ */
+@Data
+@ApiModel("闂ㄥ簵淇℃伅")
+@TableName("`shop_info`")
+public class ShopInfo {
+
+    @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 = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name = "鍒涘缓鏃堕棿", index = 1, width = 16, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    private Integer updateUser;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "浼佷笟绫诲瀷锛�0=涓汉锛�1=浼佷笟", example = "0")
+    @ExcelColumn(name = "浼佷笟绫诲瀷", index = 2, width = 10, valueMapping = "0=涓汉;1=浼佷笟;")
+    private Integer companyType;
+
+    @ApiModelProperty(value = "鍚嶇О/搴楅摵鍚嶇О")
+    @ExcelColumn(name = "搴楅摵鍚嶇О", index = 3, width = 15)
+    private String name;
+
+    @ApiModelProperty(value = "娉ㄥ唽鎵嬫満鍙�")
+    @ExcelColumn(name = "娉ㄥ唽鎵嬫満鍙�", index = 4, width = 12)
+    private String telephone;
+
+    @ApiModelProperty(value = "鐧诲綍瀵嗙爜")
+    private String password;
+
+    @ApiModelProperty(value = "瀵嗙爜鐩�")
+    private String salt;
+
+    @ApiModelProperty(value = "鑱旂郴浜哄悕绉�")
+    @ExcelColumn(name = "鑱旂郴浜�", index = 5, width = 10)
+    private String linkName;
+
+    @ApiModelProperty(value = "鑱旂郴浜虹數璇�")
+    @ExcelColumn(name = "鑱旂郴鐢佃瘽", index = 6, width = 12)
+    private String linkPhone;
+
+    @ApiModelProperty(value = "鑱旂郴浜鸿韩浠借瘉鍙风爜")
+    private String idcard;
+
+    @ApiModelProperty(value = "鍖哄垝涓婚敭", example = "1")
+    private Integer areaId;
+
+    @ApiModelProperty(value = "瀹氫綅缁忓害", example = "116.404")
+    private Double longitude;
+
+    @ApiModelProperty(value = "瀹氫綅绾害", example = "39.915")
+    private Double latitude;
+
+    @ApiModelProperty(value = "璇︾粏鍦板潃")
+    private String address;
+
+    @ApiModelProperty(value = "娉曚汉濮撳悕锛堜紒涓氱被鍨嬩娇鐢級")
+    private String legalPersonName;
+
+    @ApiModelProperty(value = "娉曚汉鐢佃瘽锛堜紒涓氱被鍨嬩娇鐢級")
+    private String legalPersonPhone;
+
+    @ApiModelProperty(value = "娉曚汉韬唤璇佸彿鐮侊紙浼佷笟绫诲瀷浣跨敤锛�")
+    private String legalPersonCard;
+
+    @ApiModelProperty(value = "韬唤璇佹闈㈢収")
+    private String idcardImg;
+
+    @ApiModelProperty(value = "韬唤璇佸弽闈㈢収")
+    private String idcardImgBack;
+
+    @ApiModelProperty(value = "钀ヤ笟鎵х収")
+    private String businessImg;
+
+    @ApiModelProperty(value = "鐘舵�侊細0=寰呭鎵癸紱1=瀹℃壒閫氳繃锛�2=瀹℃壒鏈�氳繃", example = "0")
+    @ExcelColumn(name = "鐘舵��", index = 7, width = 10, valueMapping = "0=寰呭鎵�;1=瀹℃壒閫氳繃;2=瀹℃壒鏈�氳繃;")
+    private Integer status;
+
+    @ApiModelProperty(value = "瀹℃壒鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date auditTime;
+
+    @ApiModelProperty(value = "瀹℃壒浜�", example = "1")
+    private Integer auditUserId;
+
+    @ApiModelProperty(value = "瀹℃壒澶囨敞")
+    private String auditRemark;
+
+    @ApiModelProperty(value = "OPENID")
+    private String openid;
+
+}
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
new file mode 100644
index 0000000..c1897aa
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/business/model/Smsrecord.java
@@ -0,0 +1,71 @@
+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.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;
+
+/**
+ * 鐭俊楠岃瘉鐮�
+ * @author rk
+ * @date 2026/04/08
+ */
+@Data
+@ApiModel("鐭俊楠岃瘉鐮�")
+@TableName("`smsrecord`")
+public class Smsrecord {
+
+    @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 = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name = "鍒涘缓鏃堕棿", index = 1, width = 16, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    private Integer updateUser;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鎵嬫満鍙�")
+    @ExcelColumn(name = "鎵嬫満鍙�", index = 2, width = 12)
+    private String phone;
+
+    @ApiModelProperty(value = "鐭俊鍐呭")
+    @ExcelColumn(name = "鐭俊鍐呭", index = 3, width = 20)
+    private String content;
+
+    @ApiModelProperty(value = "鐭俊绫诲瀷锛�0=楠岃瘉鐮�", example = "0")
+    @ExcelColumn(name = "鐭俊绫诲瀷", index = 4, width = 10, valueMapping = "0=楠岃瘉鐮�;")
+    private Integer type;
+
+    @ApiModelProperty(value = "鏈夋晥鏈�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date validDate;
+
+    @ApiModelProperty(value = "鍏抽敭瀛楋紙楠岃瘉鐮佺瓑锛�")
+    private String code;
+
+    @ApiModelProperty(value = "鐘舵�� 0鏈娇鐢� 1宸蹭娇鐢� 2宸茶繃鏈�", example = "0")
+    @ExcelColumn(name = "鐘舵��", index = 5, width = 10, valueMapping = "0=鏈娇鐢�;1=宸蹭娇鐢�;2=宸茶繃鏈�;")
+    private Integer status;
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/AreasDto.java b/server/services/src/main/java/com/doumee/dao/dto/AreasDto.java
new file mode 100644
index 0000000..5072a5a
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/AreasDto.java
@@ -0,0 +1,25 @@
+package com.doumee.dao.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author Eva.Caesar Liu
+ * @date 2023/02/14 11:14
+ */
+@Data
+@ApiModel("鐪佸競鍖烘煡璇㈠弬鏁�")
+public class AreasDto implements Serializable {
+
+    @ApiModelProperty(value = "鍚嶇О" )
+    private String name;
+    @ApiModelProperty(value = "绫诲瀷 0鐪� 1甯� 2鍖哄幙", example = "1")
+    private Integer type;
+    @ApiModelProperty(value = "鏄惁鍖呭惈瀛愯妭鐐� 0涓嶅寘鍚� 1鍖呭惈", example = "1")
+    private int flag;
+    @ApiModelProperty(value = "鐖惰妭鐐圭紪鐮�", example = "1")
+    private Integer parentId;
+}
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 0e813b1..93ea87d 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,4 +23,7 @@
     @ApiModelProperty(value = "瀹℃壒鎻忚堪")
     private String auditRemark;
 
+    @ApiModelProperty(value = "瀹℃壒浜虹紪鐮侊紙鏈嶅姟绔~鍏咃級", hidden = true)
+    private Integer auditUser;
+
 }
diff --git a/server/services/src/main/java/com/doumee/dao/dto/DriverLoginRequest.java b/server/services/src/main/java/com/doumee/dao/dto/DriverLoginRequest.java
new file mode 100644
index 0000000..fcf2cd1
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/DriverLoginRequest.java
@@ -0,0 +1,27 @@
+package com.doumee.dao.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import java.io.Serializable;
+
+/**
+ * 鍙告満鐧诲綍璇锋眰绫�
+ * @author rk
+ * @date 2026/04/08
+ */
+@Data
+@ApiModel("鍙告満鐧诲綍璇锋眰绫�")
+public class DriverLoginRequest implements Serializable {
+
+    @NotEmpty(message = "鎵嬫満鍙蜂笉鑳戒负绌�")
+    @ApiModelProperty(value = "鎵嬫満鍙�", required = true)
+    private String telephone;
+
+    @NotEmpty(message = "瀵嗙爜涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "鐧诲綍瀵嗙爜", required = true)
+    private String password;
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/DriverRegisterRequest.java b/server/services/src/main/java/com/doumee/dao/dto/DriverRegisterRequest.java
new file mode 100644
index 0000000..d4af685
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/DriverRegisterRequest.java
@@ -0,0 +1,27 @@
+package com.doumee.dao.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import java.io.Serializable;
+
+/**
+ * 鍙告満楠岃瘉鐮佺櫥褰曡姹傜被
+ * @author rk
+ * @date 2026/04/08
+ */
+@Data
+@ApiModel("鍙告満楠岃瘉鐮佺櫥褰曡姹傜被")
+public class DriverRegisterRequest implements Serializable {
+
+    @NotEmpty(message = "鎵嬫満鍙蜂笉鑳戒负绌�")
+    @ApiModelProperty(value = "鎵嬫満鍙�", required = true)
+    private String telephone;
+
+    @NotEmpty(message = "楠岃瘉鐮佷笉鑳戒负绌�")
+    @ApiModelProperty(value = "楠岃瘉鐮�", required = true)
+    private String code;
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/DriverVerifyRequest.java b/server/services/src/main/java/com/doumee/dao/dto/DriverVerifyRequest.java
new file mode 100644
index 0000000..a9fdee4
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/DriverVerifyRequest.java
@@ -0,0 +1,75 @@
+package com.doumee.dao.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鍙告満瀹炲悕璁よ瘉璇锋眰绫�
+ * @author rk
+ * @date 2026/04/08
+ */
+@Data
+@ApiModel("鍙告満瀹炲悕璁よ瘉璇锋眰绫�")
+public class DriverVerifyRequest implements Serializable {
+
+    @NotEmpty(message = "濮撳悕涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "濮撳悕", required = true)
+    private String name;
+
+    @NotEmpty(message = "韬唤璇佸彿涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "韬唤璇佸彿鐮�", required = true)
+    private String idcard;
+
+    @NotNull(message = "濠氬Щ鐘舵�佷笉鑳戒负绌�")
+    @ApiModelProperty(value = "濠氬Щ鐘舵�侊細0=鏈锛�1=宸插锛�2=绂诲紓锛�3=涓у伓", required = true, example = "0")
+    private Integer maritalStatus;
+
+    @ApiModelProperty(value = "鍖哄垝涓婚敭", example = "1")
+    private Integer areaId;
+
+    @NotEmpty(message = "灞呬綇鍦板潃涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "灞呬綇鍦板潃", required = true)
+    private String livePlace;
+
+    @NotEmpty(message = "杞︾墝鍙蜂笉鑳戒负绌�")
+    @ApiModelProperty(value = "杞︾墝鍙�", required = true)
+    private String carCode;
+
+    @NotNull(message = "杞﹁締绫诲瀷涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "杞﹁締绫诲瀷锛堝叧鑱攃ategory type=1锛�", required = true, example = "1")
+    private Integer carType;
+
+    @ApiModelProperty(value = "杞﹁締棰滆壊")
+    private String carColor;
+
+    @ApiModelProperty(value = "椹鹃┒璇佹湁鏁堟湡寮�濮嬫椂闂�")
+    private Date cardStartDate;
+
+    @ApiModelProperty(value = "椹鹃┒璇佹湁鏁堟湡缁撴潫鏃堕棿")
+    private Date cardEndDate;
+
+    @NotEmpty(message = "韬唤璇佹闈㈢収涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "韬唤璇佹闈㈢収", required = true)
+    private String idcardImg;
+
+    @NotEmpty(message = "韬唤璇佸弽闈㈢収涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "韬唤璇佸弽闈㈢収", required = true)
+    private String idcardImgBack;
+
+    @ApiModelProperty(value = "杞﹁締鐓х墖锛堟渶澶�3寮狅紝mutifile objType=6锛�")
+    private List<String> carImgUrls;
+
+    @ApiModelProperty(value = "椹鹃┒璇佺収鐗囷紙鏈�澶�3寮狅紝mutifile objType=7锛�")
+    private List<String> licenseImgUrls;
+
+    @ApiModelProperty(value = "鍏朵粬璧勬枡鐓х墖锛堟渶澶�3寮狅紝mutifile objType=8锛�")
+    private List<String> otherImgUrls;
+
+}
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
new file mode 100644
index 0000000..eb70d14
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/EstimatedDeliverySaveDTO.java
@@ -0,0 +1,38 @@
+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/08
+ */
+@Data
+@ApiModel("棰勮鏃舵晥閰嶇疆淇濆瓨璇锋眰")
+public class EstimatedDeliverySaveDTO implements Serializable {
+
+    @ApiModelProperty(value = "鍩庡競涓婚敭", required = true, example = "1")
+    @NotNull(message = "鍩庡競涓婚敭涓嶈兘涓虹┖")
+    private Integer cityId;
+
+    @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/LocalStoragePricingItemDTO.java b/server/services/src/main/java/com/doumee/dao/dto/LocalStoragePricingItemDTO.java
new file mode 100644
index 0000000..b61ba87
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/LocalStoragePricingItemDTO.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;
+import java.io.Serializable;
+
+/**
+ * 灏卞湴瀛樺彇瑙勫垯椤�
+ * @author rk
+ * @date 2026/04/08
+ */
+@Data
+@ApiModel("灏卞湴瀛樺彇瑙勫垯椤�")
+public class LocalStoragePricingItemDTO implements Serializable {
+
+    @ApiModelProperty(value = "鐗╁搧瑙勬牸涓婚敭(category.id, type=4)", required = true, example = "1")
+    @NotNull(message = "鐗╁搧瑙勬牸涓婚敭涓嶈兘涓虹┖")
+    private Integer categoryId;
+
+    @ApiModelProperty(value = "鏀惰垂鍗曚环", required = true, example = "10.50")
+    @NotNull(message = "鏀惰垂鍗曚环涓嶈兘涓虹┖")
+    private String unitPrice;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/LocalStoragePricingSaveDTO.java b/server/services/src/main/java/com/doumee/dao/dto/LocalStoragePricingSaveDTO.java
new file mode 100644
index 0000000..3ab3a86
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/LocalStoragePricingSaveDTO.java
@@ -0,0 +1,30 @@
+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.io.Serializable;
+import java.util.List;
+
+/**
+ * 灏卞湴瀛樺彇瑙勫垯鎵归噺淇濆瓨璇锋眰
+ * @author rk
+ * @date 2026/04/08
+ */
+@Data
+@ApiModel("灏卞湴瀛樺彇瑙勫垯鎵归噺淇濆瓨璇锋眰")
+public class LocalStoragePricingSaveDTO implements Serializable {
+
+    @ApiModelProperty(value = "鍩庡競涓婚敭", required = true, example = "1")
+    @NotNull(message = "鍩庡競涓婚敭涓嶈兘涓虹┖")
+    private Integer cityId;
+
+    @ApiModelProperty(value = "瑙勫垯鏄庣粏鍒楄〃", required = true)
+    @NotEmpty(message = "瑙勫垯鏄庣粏涓嶈兘涓虹┖")
+    @Valid
+    private List<LocalStoragePricingItemDTO> items;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/RemoteDeliveryPricingItemDTO.java b/server/services/src/main/java/com/doumee/dao/dto/RemoteDeliveryPricingItemDTO.java
new file mode 100644
index 0000000..4d38cdc
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/RemoteDeliveryPricingItemDTO.java
@@ -0,0 +1,38 @@
+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/08
+ */
+@Data
+@ApiModel("寮傚湴瀵勯�佽鍒欓」")
+public class RemoteDeliveryPricingItemDTO implements Serializable {
+
+    @ApiModelProperty(value = "鐗╁搧瑙勬牸涓婚敭(category.id, type=4)", required = true, example = "1")
+    @NotNull(message = "鐗╁搧瑙勬牸涓婚敭涓嶈兘涓虹┖")
+    private Integer categoryId;
+
+    @ApiModelProperty(value = "閰嶉�佽捣姝ラ噷绋嬪叕閲屾暟", required = true, example = "5")
+    @NotNull(message = "閰嶉�佽捣姝ラ噷绋嬩笉鑳戒负绌�")
+    private String startDistance;
+
+    @ApiModelProperty(value = "閰嶉�佽捣姝ラ噷绋嬫瘡鍏噷鍗曚环", required = true, example = "3.00")
+    @NotNull(message = "閰嶉�佽捣姝ラ噷绋嬫瘡鍏噷鍗曚环涓嶈兘涓虹┖")
+    private String startPrice;
+
+    @ApiModelProperty(value = "瓒呭嚭棣栧崟閲岀▼鍏噷鏁�", required = true, example = "10")
+    @NotNull(message = "瓒呭嚭棣栧崟閲岀▼涓嶈兘涓虹┖")
+    private String extraDistance;
+
+    @ApiModelProperty(value = "瓒呭嚭棣栧崟閲岀▼姣忓叕閲屽崟浠�", required = true, example = "2.00")
+    @NotNull(message = "瓒呭嚭棣栧崟閲岀▼姣忓叕閲屽崟浠蜂笉鑳戒负绌�")
+    private String extraPrice;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/RemoteDeliveryPricingSaveDTO.java b/server/services/src/main/java/com/doumee/dao/dto/RemoteDeliveryPricingSaveDTO.java
new file mode 100644
index 0000000..3a7d61f
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/RemoteDeliveryPricingSaveDTO.java
@@ -0,0 +1,30 @@
+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.io.Serializable;
+import java.util.List;
+
+/**
+ * 寮傚湴瀵勯�佽鍒欐壒閲忎繚瀛樿姹�
+ * @author rk
+ * @date 2026/04/08
+ */
+@Data
+@ApiModel("寮傚湴瀵勯�佽鍒欐壒閲忎繚瀛樿姹�")
+public class RemoteDeliveryPricingSaveDTO implements Serializable {
+
+    @ApiModelProperty(value = "鍩庡競涓婚敭", required = true, example = "1")
+    @NotNull(message = "鍩庡競涓婚敭涓嶈兘涓虹┖")
+    private Integer cityId;
+
+    @ApiModelProperty(value = "瑙勫垯鏄庣粏鍒楄〃", required = true)
+    @NotEmpty(message = "瑙勫垯鏄庣粏涓嶈兘涓虹┖")
+    @Valid
+    private List<RemoteDeliveryPricingItemDTO> items;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/RevenueShareItemDTO.java b/server/services/src/main/java/com/doumee/dao/dto/RevenueShareItemDTO.java
new file mode 100644
index 0000000..a06536b
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/RevenueShareItemDTO.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;
+import java.io.Serializable;
+
+/**
+ * 鍒嗘垚姣斾緥瑙勫垯椤�
+ * @author rk
+ * @date 2026/04/08
+ */
+@Data
+@ApiModel("鍒嗘垚姣斾緥瑙勫垯椤�")
+public class RevenueShareItemDTO implements Serializable {
+
+    @ApiModelProperty(value = "绫诲瀷(0=浼佷笟瀵�, 1=涓汉瀵�, 2=浼佷笟鍙�, 3=涓汉鍙�, 4=閰嶉�佸憳)", required = true, example = "0")
+    @NotNull(message = "绫诲瀷涓嶈兘涓虹┖")
+    private Integer fieldType;
+
+    @ApiModelProperty(value = "鍒嗘垚姣斾緥", required = true, example = "0.15")
+    @NotNull(message = "鍒嗘垚姣斾緥涓嶈兘涓虹┖")
+    private String ratio;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/RevenueShareSaveDTO.java b/server/services/src/main/java/com/doumee/dao/dto/RevenueShareSaveDTO.java
new file mode 100644
index 0000000..b34bfb2
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/RevenueShareSaveDTO.java
@@ -0,0 +1,30 @@
+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.io.Serializable;
+import java.util.List;
+
+/**
+ * 鍒嗘垚姣斾緥鎵归噺淇濆瓨璇锋眰
+ * @author rk
+ * @date 2026/04/08
+ */
+@Data
+@ApiModel("鍒嗘垚姣斾緥鎵归噺淇濆瓨璇锋眰")
+public class RevenueShareSaveDTO implements Serializable {
+
+    @ApiModelProperty(value = "鍩庡競涓婚敭", required = true, example = "1")
+    @NotNull(message = "鍩庡競涓婚敭涓嶈兘涓虹┖")
+    private Integer cityId;
+
+    @ApiModelProperty(value = "瑙勫垯鏄庣粏鍒楄〃(浼佷笟瀵�/涓汉瀵�/浼佷笟鍙�/涓汉鍙�/閰嶉�佸憳鍏�5鏉�)", required = true)
+    @NotEmpty(message = "瑙勫垯鏄庣粏涓嶈兘涓虹┖")
+    @Valid
+    private List<RevenueShareItemDTO> items;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/StoreDepositItemDTO.java b/server/services/src/main/java/com/doumee/dao/dto/StoreDepositItemDTO.java
new file mode 100644
index 0000000..8d389aa
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/StoreDepositItemDTO.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;
+import java.io.Serializable;
+
+/**
+ * 闂ㄥ簵娉ㄥ唽鎶奸噾瑙勫垯椤�
+ * @author rk
+ * @date 2026/04/08
+ */
+@Data
+@ApiModel("闂ㄥ簵娉ㄥ唽鎶奸噾瑙勫垯椤�")
+public class StoreDepositItemDTO implements Serializable {
+
+    @ApiModelProperty(value = "浼佷笟绫诲瀷(0=浼佷笟, 1=涓汉)", required = true, example = "0")
+    @NotNull(message = "浼佷笟绫诲瀷涓嶈兘涓虹┖")
+    private Integer fieldType;
+
+    @ApiModelProperty(value = "鎶奸噾閲戦", required = true, example = "5000.00")
+    @NotNull(message = "鎶奸噾閲戦涓嶈兘涓虹┖")
+    private String depositAmount;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/StoreDepositSaveDTO.java b/server/services/src/main/java/com/doumee/dao/dto/StoreDepositSaveDTO.java
new file mode 100644
index 0000000..e1162d9
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/StoreDepositSaveDTO.java
@@ -0,0 +1,30 @@
+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.io.Serializable;
+import java.util.List;
+
+/**
+ * 闂ㄥ簵娉ㄥ唽鎶奸噾鎵归噺淇濆瓨璇锋眰
+ * @author rk
+ * @date 2026/04/08
+ */
+@Data
+@ApiModel("闂ㄥ簵娉ㄥ唽鎶奸噾鎵归噺淇濆瓨璇锋眰")
+public class StoreDepositSaveDTO implements Serializable {
+
+    @ApiModelProperty(value = "鍩庡競涓婚敭", required = true, example = "1")
+    @NotNull(message = "鍩庡競涓婚敭涓嶈兘涓虹┖")
+    private Integer cityId;
+
+    @ApiModelProperty(value = "瑙勫垯鏄庣粏鍒楄〃(浼佷笟+涓汉鍏�2鏉�)", required = true)
+    @NotEmpty(message = "瑙勫垯鏄庣粏涓嶈兘涓虹┖")
+    @Valid
+    private List<StoreDepositItemDTO> items;
+}
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
new file mode 100644
index 0000000..7ee4a69
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/vo/EstimatedDeliveryVO.java
@@ -0,0 +1,35 @@
+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/08
+ */
+@Data
+@ApiModel("棰勮鏃舵晥閰嶇疆(鍒楄〃杩斿洖)")
+public class EstimatedDeliveryVO implements Serializable {
+
+    @ApiModelProperty(value = "瑙勫垯涓婚敭")
+    private Integer pricingRuleId;
+
+    @ApiModelProperty(value = "鍩庡競涓婚敭")
+    private Integer cityId;
+
+    @ApiModelProperty(value = "璧烽�侀噷绋�(鍏噷)")
+    private String startDistance;
+
+    @ApiModelProperty(value = "璧烽�佹椂闀�")
+    private String startTime;
+
+    @ApiModelProperty(value = "缁�侀噷绋�(鍏噷)")
+    private String continueDistance;
+
+    @ApiModelProperty(value = "缁�佹椂闀�")
+    private String continueTime;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/vo/LocalStoragePricingVO.java b/server/services/src/main/java/com/doumee/dao/vo/LocalStoragePricingVO.java
new file mode 100644
index 0000000..22b2e71
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/vo/LocalStoragePricingVO.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.io.Serializable;
+
+/**
+ * 灏卞湴瀛樺彇瑙勫垯鍒楄〃杩斿洖
+ * @author rk
+ * @date 2026/04/08
+ */
+@Data
+@ApiModel("灏卞湴瀛樺彇瑙勫垯椤�(鍒楄〃杩斿洖)")
+public class LocalStoragePricingVO implements Serializable {
+
+    @ApiModelProperty(value = "瑙勫垯涓婚敭")
+    private Integer pricingRuleId;
+
+    @ApiModelProperty(value = "鐗╁搧灏哄涓婚敭")
+    private Integer categoryId;
+
+    @ApiModelProperty(value = "鐗╁搧灏哄鍚嶇О")
+    private String categoryName;
+
+    @ApiModelProperty(value = "鏀惰垂鍗曚环")
+    private String unitPrice;
+
+    @ApiModelProperty(value = "鍩庡競涓婚敭")
+    private Integer cityId;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/vo/RemoteDeliveryPricingVO.java b/server/services/src/main/java/com/doumee/dao/vo/RemoteDeliveryPricingVO.java
new file mode 100644
index 0000000..77504e8
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/vo/RemoteDeliveryPricingVO.java
@@ -0,0 +1,41 @@
+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/08
+ */
+@Data
+@ApiModel("寮傚湴瀵勯�佽鍒欓」(鍒楄〃杩斿洖)")
+public class RemoteDeliveryPricingVO implements Serializable {
+
+    @ApiModelProperty(value = "瑙勫垯涓婚敭")
+    private Integer pricingRuleId;
+
+    @ApiModelProperty(value = "鐗╁搧灏哄涓婚敭")
+    private Integer categoryId;
+
+    @ApiModelProperty(value = "鐗╁搧灏哄鍚嶇О")
+    private String categoryName;
+
+    @ApiModelProperty(value = "閰嶉�佽捣姝ラ噷绋嬪叕閲屾暟")
+    private String startDistance;
+
+    @ApiModelProperty(value = "閰嶉�佽捣姝ラ噷绋嬫瘡鍏噷鍗曚环")
+    private String startPrice;
+
+    @ApiModelProperty(value = "瓒呭嚭棣栧崟閲岀▼鍏噷鏁�")
+    private String extraDistance;
+
+    @ApiModelProperty(value = "瓒呭嚭棣栧崟閲岀▼姣忓叕閲屽崟浠�")
+    private String extraPrice;
+
+    @ApiModelProperty(value = "鍩庡競涓婚敭")
+    private Integer cityId;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/vo/RevenueShareVO.java b/server/services/src/main/java/com/doumee/dao/vo/RevenueShareVO.java
new file mode 100644
index 0000000..e97a584
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/vo/RevenueShareVO.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.io.Serializable;
+
+/**
+ * 鍒嗘垚姣斾緥鍒楄〃杩斿洖
+ * @author rk
+ * @date 2026/04/08
+ */
+@Data
+@ApiModel("鍒嗘垚姣斾緥(鍒楄〃杩斿洖)")
+public class RevenueShareVO implements Serializable {
+
+    @ApiModelProperty(value = "瑙勫垯涓婚敭")
+    private Integer pricingRuleId;
+
+    @ApiModelProperty(value = "鍩庡競涓婚敭")
+    private Integer cityId;
+
+    @ApiModelProperty(value = "绫诲瀷(0=浼佷笟瀵�, 1=涓汉瀵�, 2=浼佷笟鍙�, 3=涓汉鍙�, 4=閰嶉�佸憳)")
+    private Integer fieldType;
+
+    @ApiModelProperty(value = "绫诲瀷鍚嶇О")
+    private String fieldTypeName;
+
+    @ApiModelProperty(value = "鍒嗘垚姣斾緥")
+    private String ratio;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/vo/StoreDepositVO.java b/server/services/src/main/java/com/doumee/dao/vo/StoreDepositVO.java
new file mode 100644
index 0000000..858de21
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/vo/StoreDepositVO.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.io.Serializable;
+
+/**
+ * 闂ㄥ簵娉ㄥ唽鎶奸噾鍒楄〃杩斿洖
+ * @author rk
+ * @date 2026/04/08
+ */
+@Data
+@ApiModel("闂ㄥ簵娉ㄥ唽鎶奸噾(鍒楄〃杩斿洖)")
+public class StoreDepositVO implements Serializable {
+
+    @ApiModelProperty(value = "瑙勫垯涓婚敭")
+    private Integer pricingRuleId;
+
+    @ApiModelProperty(value = "鍩庡競涓婚敭")
+    private Integer cityId;
+
+    @ApiModelProperty(value = "浼佷笟绫诲瀷(0=浼佷笟, 1=涓汉)")
+    private Integer fieldType;
+
+    @ApiModelProperty(value = "浼佷笟绫诲瀷鍚嶇О")
+    private String fieldTypeName;
+
+    @ApiModelProperty(value = "鎶奸噾閲戦")
+    private String depositAmount;
+}
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
new file mode 100644
index 0000000..6880174
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/service/business/AreasService.java
@@ -0,0 +1,136 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.Areas;
+
+import java.util.List;
+
+/**
+ * 鐪佸競鍖轰俊鎭〃Service瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2023/02/15 08:55
+ */
+public interface AreasService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param areas 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(Areas areas);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param areas 瀹炰綋瀵硅薄
+     */
+    void delete(Areas areas);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param areas 瀹炰綋瀵硅薄
+     */
+    void updateById(Areas areas);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param areass 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<Areas> areass);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return Areas
+     */
+    Areas findById(Integer id);
+
+    /**
+     * 鏍规嵁id鍜宼ype鏌ヨ瀵硅薄淇℃伅
+     * @param id
+     * @param type null 鏌ヨ鍏ㄩ儴 0鐪佷唤 1鍩庡競 2鍖哄煙
+     * @return
+     */
+    Areas findById(Integer id,Integer type);
+
+
+    Areas findByName(String name,Integer type);
+    Areas findByNameAndParentId(String name,Integer type,Integer parentId);
+
+    List<Areas> findByParentId(Integer parentId ,Integer type,int flag);
+
+    List<Areas> findChildByParentId(Integer id,List<Areas>  list);
+
+    boolean isAreaValid(String proName,String cityName,String areaName);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param areas 瀹炰綋瀵硅薄
+     * @return Areas
+     */
+    Areas findOne(Areas areas);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param areas 瀹炰綋瀵硅薄
+     * @return List<Areas>
+     */
+    List<Areas> findList(Areas areas);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<Areas>
+     */
+    PageData<Areas> findPage(PageWrap<Areas> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param areas 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(Areas areas);
+
+    void cacheData();
+
+    Areas findByCityAndArea(String cityName, String areasName);
+
+    String getAddress(Integer cityId,Integer areaId);
+
+    String getAddress(Integer areaId);
+
+    List<Areas> listByParentId(Areas model);
+
+
+    /**
+     * 鑾峰彇鍩庡競淇℃伅
+     * @param areas
+     * @return
+     */
+
+    List<Areas> getCityList(Areas areas);
+
+}
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
new file mode 100644
index 0000000..b3bf4d9
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/service/business/BannerService.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.Banner;
+
+import java.util.List;
+
+/**
+ * 杞挱鍥維ervice瀹氫箟
+ * @author rk
+ * @date 2026/04/08
+ */
+public interface BannerService {
+
+    Integer create(Banner banner);
+
+    void deleteById(Integer id);
+
+    void delete(Banner banner);
+
+    void deleteByIdInBatch(List<Integer> ids);
+
+    void updateById(Banner banner);
+
+    void updateByIdInBatch(List<Banner> banners);
+
+    Banner findById(Integer id);
+
+    Banner findOne(Banner banner);
+
+    List<Banner> findList(Banner banner);
+
+    PageData<Banner> findPage(PageWrap<Banner> pageWrap);
+
+    long count(Banner banner);
+}
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
new file mode 100644
index 0000000..ba4fe34
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/service/business/DriverInfoService.java
@@ -0,0 +1,149 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.DriverInfo;
+import com.doumee.dao.dto.DriverLoginRequest;
+import com.doumee.dao.dto.DriverRegisterRequest;
+import com.doumee.dao.dto.DriverVerifyRequest;
+import com.doumee.dao.vo.AccountResponse;
+
+import java.util.List;
+
+/**
+ * 鍙告満娉ㄥ唽淇℃伅Service瀹氫箟
+ * @author rk
+ * @date 2026/04/08
+ */
+public interface DriverInfoService {
+
+    /**
+     * 鍒涘缓
+     *
+     * @param driverInfo 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(DriverInfo driverInfo);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param driverInfo 瀹炰綋瀵硅薄
+     */
+    void delete(DriverInfo driverInfo);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param driverInfo 瀹炰綋瀵硅薄
+     */
+    void updateById(DriverInfo driverInfo);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param driverInfos 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<DriverInfo> driverInfos);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return DriverInfo
+     */
+    DriverInfo findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param driverInfo 瀹炰綋瀵硅薄
+     * @return DriverInfo
+     */
+    DriverInfo findOne(DriverInfo driverInfo);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param driverInfo 瀹炰綋瀵硅薄
+     * @return List<DriverInfo>
+     */
+    List<DriverInfo> findList(DriverInfo driverInfo);
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<DriverInfo>
+     */
+    PageData<DriverInfo> findPage(PageWrap<DriverInfo> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param driverInfo 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(DriverInfo driverInfo);
+
+    /**
+     * 鍙告満楠岃瘉鐮佺櫥褰曪紙鎵嬫満鍙�+鐭俊楠岃瘉鐮侊紝鏃犺处鍙疯嚜鍔ㄦ敞鍐岋級
+     *
+     * @param request 楠岃瘉鐮佺櫥褰曡姹�
+     * @return AccountResponse
+     */
+    AccountResponse register(DriverRegisterRequest request);
+
+    /**
+     * 鍙戦�佸徃鏈洪獙璇佺爜鐧诲綍楠岃瘉鐮�
+     *
+     * @param telephone 鎵嬫満鍙�
+     */
+    void sendRegisterCode(String telephone);
+
+    /**
+     * 鍙告満鎵嬫満鍙�+瀵嗙爜鐧诲綍
+     *
+     * @param request 鐧诲綍璇锋眰
+     * @return AccountResponse
+     */
+    AccountResponse login(DriverLoginRequest request);
+
+    /**
+     * 鎻愪氦瀹炲悕璁よ瘉锛堝垵娆℃彁浜ゆ垨椹冲洖鍚庝慨鏀癸級
+     *
+     * @param memberId 浼氬憳涓婚敭
+     * @param request  璁よ瘉璇锋眰
+     */
+    void submitVerify(Integer memberId, DriverVerifyRequest request);
+
+    /**
+     * 鏌ヨ鍙告満瀹炲悕璁よ瘉璇︽儏
+     *
+     * @param memberId 浼氬憳涓婚敭
+     * @return DriverInfo
+     */
+    DriverInfo getVerifyDetail(Integer memberId);
+
+    /**
+     * 瀹℃壒鍙告満瀹炲悕璁よ瘉锛堢鐞嗙锛�
+     *
+     * @param auditDTO 瀹℃壒鍙傛暟
+     */
+    void auditVerify(com.doumee.dao.dto.AuditDTO auditDTO);
+
+}
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 c09bdf0..a8f8af6 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
@@ -135,11 +135,11 @@
      */
     void editMemberInfo(Member member);
 
-    /**
-     * 鍒囨崲鐢ㄥ伐韬唤
-     * @param member
-     */
-    void editUseIdentity(Member member);
+//    /**
+//     * 鍒囨崲鐢ㄥ伐韬唤
+//     * @param member
+//     */
+//    void editUseIdentity(Member member);
 
     /**
      * 涓汉淇℃伅
@@ -150,5 +150,7 @@
 
     UserCenterVO getPlatformAboutUs();
 
+    void logOut(String token,Integer memberId);
+
     void logOff(String token,Integer memberId);
 }
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
new file mode 100644
index 0000000..59a8bf7
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/service/business/PricingRuleService.java
@@ -0,0 +1,174 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.PricingRule;
+import com.doumee.dao.dto.LocalStoragePricingSaveDTO;
+import com.doumee.dao.dto.RemoteDeliveryPricingSaveDTO;
+import com.doumee.dao.dto.EstimatedDeliverySaveDTO;
+import com.doumee.dao.dto.StoreDepositSaveDTO;
+import com.doumee.dao.dto.RevenueShareSaveDTO;
+import com.doumee.dao.vo.LocalStoragePricingVO;
+import com.doumee.dao.vo.RemoteDeliveryPricingVO;
+import com.doumee.dao.vo.EstimatedDeliveryVO;
+import com.doumee.dao.vo.StoreDepositVO;
+import com.doumee.dao.vo.RevenueShareVO;
+
+import java.util.List;
+
+/**
+ * 璁′环瑙勫垯閰嶇疆Service瀹氫箟
+ * @author rk
+ * @date 2026/04/08
+ */
+public interface PricingRuleService {
+
+    /**
+     * 鍒涘缓
+     *
+     * @param pricingRule 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(PricingRule pricingRule);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param pricingRule 瀹炰綋瀵硅薄
+     */
+    void delete(PricingRule pricingRule);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param pricingRule 瀹炰綋瀵硅薄
+     */
+    void updateById(PricingRule pricingRule);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param pricingRules 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<PricingRule> pricingRules);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return PricingRule
+     */
+    PricingRule findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param pricingRule 瀹炰綋瀵硅薄
+     * @return PricingRule
+     */
+    PricingRule findOne(PricingRule pricingRule);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param pricingRule 瀹炰綋瀵硅薄
+     * @return List<PricingRule>
+     */
+    List<PricingRule> findList(PricingRule pricingRule);
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<PricingRule>
+     */
+    PageData<PricingRule> findPage(PageWrap<PricingRule> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param pricingRule 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(PricingRule pricingRule);
+
+    /**
+     * 鎵归噺淇濆瓨灏卞湴瀛樺彇瑙勫垯
+     * @param request 鎵归噺淇濆瓨璇锋眰
+     */
+    void batchSaveLocalStoragePricing(LocalStoragePricingSaveDTO request);
+
+    /**
+     * 鏌ヨ灏卞湴瀛樺彇瑙勫垯鍒楄〃
+     * @param cityId 鍩庡競涓婚敭
+     * @return 灏卞湴瀛樺彇瑙勫垯鍒楄〃
+     */
+    List<LocalStoragePricingVO> listLocalStoragePricing(Integer cityId);
+
+    /**
+     * 鎵归噺淇濆瓨寮傚湴瀵勯�佽鍒�
+     * @param request 鎵归噺淇濆瓨璇锋眰
+     */
+    void batchSaveRemoteDeliveryPricing(RemoteDeliveryPricingSaveDTO request);
+
+    /**
+     * 鏌ヨ寮傚湴瀵勯�佽鍒欏垪琛�
+     * @param cityId 鍩庡競涓婚敭
+     * @return 寮傚湴瀵勯�佽鍒欏垪琛�
+     */
+    List<RemoteDeliveryPricingVO> listRemoteDeliveryPricing(Integer cityId);
+
+    /**
+     * 淇濆瓨棰勮鏃舵晥閰嶇疆(鏈夊垯鏇存柊锛屾棤鍒欐柊澧�)
+     * @param request 淇濆瓨璇锋眰
+     */
+    void saveEstimatedDelivery(EstimatedDeliverySaveDTO request);
+
+    /**
+     * 鏌ヨ棰勮鏃舵晥閰嶇疆(鏈変笖鍙湁涓�鏉★紝鏃犳暟鎹繑鍥炵┖瀵硅薄)
+     * @param cityId 鍩庡競涓婚敭
+     * @return 棰勮鏃舵晥閰嶇疆
+     */
+    EstimatedDeliveryVO getEstimatedDelivery(Integer cityId);
+
+    /**
+     * 鎵归噺淇濆瓨闂ㄥ簵娉ㄥ唽鎶奸噾
+     * @param request 鎵归噺淇濆瓨璇锋眰
+     */
+    void batchSaveStoreDeposit(StoreDepositSaveDTO request);
+
+    /**
+     * 鏌ヨ闂ㄥ簵娉ㄥ唽鎶奸噾鍒楄〃(鍥哄畾杩斿洖2鏉�)
+     * @param cityId 鍩庡競涓婚敭
+     * @return 闂ㄥ簵娉ㄥ唽鎶奸噾鍒楄〃
+     */
+    List<StoreDepositVO> listStoreDeposit(Integer cityId);
+
+    /**
+     * 鎵归噺淇濆瓨鍒嗘垚姣斾緥
+     * @param request 鎵归噺淇濆瓨璇锋眰
+     */
+    void batchSaveRevenueShare(RevenueShareSaveDTO request);
+
+    /**
+     * 鏌ヨ鍒嗘垚姣斾緥鍒楄〃(鍥哄畾杩斿洖5鏉�)
+     * @param cityId 鍩庡競涓婚敭
+     * @return 鍒嗘垚姣斾緥鍒楄〃
+     */
+    List<RevenueShareVO> listRevenueShare(Integer cityId);
+
+}
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
new file mode 100644
index 0000000..8114534
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/service/business/ShopInfoService.java
@@ -0,0 +1,99 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.ShopInfo;
+
+import java.util.List;
+
+/**
+ * 闂ㄥ簵淇℃伅Service瀹氫箟
+ * @author rk
+ * @date 2026/04/08
+ */
+public interface ShopInfoService {
+
+    /**
+     * 鍒涘缓
+     *
+     * @param shopInfo 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(ShopInfo shopInfo);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param shopInfo 瀹炰綋瀵硅薄
+     */
+    void delete(ShopInfo shopInfo);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param shopInfo 瀹炰綋瀵硅薄
+     */
+    void updateById(ShopInfo shopInfo);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param shopInfos 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<ShopInfo> shopInfos);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return ShopInfo
+     */
+    ShopInfo findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param shopInfo 瀹炰綋瀵硅薄
+     * @return ShopInfo
+     */
+    ShopInfo findOne(ShopInfo shopInfo);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param shopInfo 瀹炰綋瀵硅薄
+     * @return List<ShopInfo>
+     */
+    List<ShopInfo> findList(ShopInfo shopInfo);
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<ShopInfo>
+     */
+    PageData<ShopInfo> findPage(PageWrap<ShopInfo> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param shopInfo 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(ShopInfo shopInfo);
+
+}
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
new file mode 100644
index 0000000..8de2019
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/service/business/SmsrecordService.java
@@ -0,0 +1,99 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.Smsrecord;
+
+import java.util.List;
+
+/**
+ * 鐭俊楠岃瘉鐮丼ervice瀹氫箟
+ * @author rk
+ * @date 2026/04/08
+ */
+public interface SmsrecordService {
+
+    /**
+     * 鍒涘缓
+     *
+     * @param smsrecord 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(Smsrecord smsrecord);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param smsrecord 瀹炰綋瀵硅薄
+     */
+    void delete(Smsrecord smsrecord);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param smsrecord 瀹炰綋瀵硅薄
+     */
+    void updateById(Smsrecord smsrecord);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param smsrecords 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<Smsrecord> smsrecords);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return Smsrecord
+     */
+    Smsrecord findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param smsrecord 瀹炰綋瀵硅薄
+     * @return Smsrecord
+     */
+    Smsrecord findOne(Smsrecord smsrecord);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param smsrecord 瀹炰綋瀵硅薄
+     * @return List<Smsrecord>
+     */
+    List<Smsrecord> findList(Smsrecord smsrecord);
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<Smsrecord>
+     */
+    PageData<Smsrecord> findPage(PageWrap<Smsrecord> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param smsrecord 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(Smsrecord smsrecord);
+
+}
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
new file mode 100644
index 0000000..93c32f3
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/service/business/impl/AreasServiceImpl.java
@@ -0,0 +1,521 @@
+package com.doumee.service.business.impl;
+
+import com.alibaba.fastjson.JSON;
+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.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.PinYinUtil;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.AreasMapper;
+import com.doumee.dao.business.model.Areas;
+import com.doumee.service.business.AreasService;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 鐪佸競鍖轰俊鎭〃Service瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2023/02/15 08:55
+ */
+@Service
+public class AreasServiceImpl implements AreasService {
+    public static   List<Areas> ALL_AREA_LIST;
+    public static   List<Areas> PROVINCE_LIST;
+    public static   List<Areas> CITY_LIST;
+    public static   List<Areas> AREA_LIST;
+    public static   List<Areas> ALL_AREA_TREE;
+
+    @Autowired
+    private AreasMapper areasMapper;
+
+    @Autowired
+    RestTemplate restTemplate ;
+
+
+    @Override
+    public Integer create(Areas areas) {
+/*
+
+        if (Objects.isNull(areas.getParentId())){
+            areas.setType(Constants.ZERO);
+        }else {
+            Areas parentArea = areasMapper.selectById(areas.getParentId());
+            if (Objects.isNull(parentArea)){
+                areas.setType(Constants.ZERO);
+            }else {
+                areas.setType(parentArea.getType()+Constants.ONE);
+            }
+        }*/
+        areas.setIsdeleted(Constants.ZERO);
+        areasMapper.insert(areas);
+        areas.setCode(areas.getId().toString());
+        areasMapper.updateById(areas);
+        //鍒锋柊缂撳瓨鏁版嵁
+        cacheData();
+        return areas.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        areasMapper.deleteById(id);
+        //鍒锋柊缂撳瓨鏁版嵁
+        cacheData();
+    }
+
+    @Override
+    public void delete(Areas areas) {
+        UpdateWrapper<Areas> deleteWrapper = new UpdateWrapper<>(areas);
+        areasMapper.delete(deleteWrapper);
+        //鍒锋柊缂撳瓨鏁版嵁
+        cacheData();
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        areasMapper.deleteBatchIds(ids);
+        //鍒锋柊缂撳瓨鏁版嵁
+        cacheData();
+    }
+
+    @Override
+    public void updateById(Areas areas) {
+
+        UpdateWrapper<Areas> wrapper = new UpdateWrapper<>();
+        wrapper.lambda().eq(Areas::getId,areas.getId());
+        Areas update = new Areas();
+        update.setName(areas.getName());
+        update.setSortnum(areas.getSortnum());
+        areasMapper.update(update,wrapper);
+        //鍒锋柊缂撳瓨鏁版嵁
+        cacheData();
+    }
+
+    @Override
+    public void updateByIdInBatch(List<Areas> areass) {
+        if (CollectionUtils.isEmpty(areass)) {
+            return;
+        }
+        for (Areas areas: areass) {
+            this.updateById(areas);
+        }
+        //鍒锋柊缂撳瓨鏁版嵁
+        cacheData();
+    }
+
+    @Override
+    public Areas findById(Integer id) {
+        if(ALL_AREA_LIST!=null){
+            for(Areas a : ALL_AREA_LIST){
+                if(Constants.equalsInteger(a.getId(),id)){
+                    return a;
+                }
+            }
+        }
+   //     return areasMapper.selectById(id);
+        return  null;
+    }
+    @Override
+    public Areas findById(Integer id,Integer type) {
+        List<Areas> list = null;
+        if(type == null){
+            list = ALL_AREA_LIST;
+        }else if(Constants.equalsInteger(type,Constants.ZERO)){
+            list = PROVINCE_LIST;
+        }else  if(Constants.equalsInteger(type,Constants.ONE)){
+            list = CITY_LIST;
+        } else if (Constants.equalsInteger(type,Constants.TWO)){
+            list =  AREA_LIST;
+        }
+        if(list!=null){
+            for(Areas a : list){
+                if(Constants.equalsInteger(a.getId(),id)){
+                    return a;
+                }
+            }
+        }
+        return null;
+    }
+
+
+    @Override
+    public Areas findByName(String name,Integer type){
+        List<Areas> list = null;
+        if(type == null){
+            list = ALL_AREA_LIST;
+        }else if(Constants.equalsInteger(type,Constants.ZERO)){
+            list = PROVINCE_LIST;
+        }else  if(Constants.equalsInteger(type,Constants.ONE)){
+            list = CITY_LIST;
+        } else if (Constants.equalsInteger(type,Constants.TWO)){
+            list =  AREA_LIST;
+        }
+        if(list!=null){
+            for(Areas a : list){
+                if(StringUtils.equals(name,a.getName())){
+                    return a;
+                }
+            }
+        }
+        return null;
+    }
+    @Override
+    public Areas findByNameAndParentId(String name,Integer type,Integer parentId){
+        List<Areas> list = null;
+        if(type == null){
+            list = ALL_AREA_LIST;
+        }else if(Constants.equalsInteger(type,Constants.ZERO)){
+            list = PROVINCE_LIST;
+        }else  if(Constants.equalsInteger(type,Constants.ONE)){
+            list = CITY_LIST;
+        } else if (Constants.equalsInteger(type,Constants.TWO)){
+            list =  AREA_LIST;
+        }
+        if(list!=null){
+            for(Areas a : list){
+                if(StringUtils.equals(name,a.getName()) && Constants.equalsInteger(parentId,a.getParentId())){
+                    return a;
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     *
+     * @param type
+     * @param parentId
+     * @param flag 0鏃犲瓙闆� 1鍖呭惈瀛愰泦鍘垮尯
+     * @return
+     */
+    @Override
+    public List<Areas> findByParentId(Integer parentId,Integer type ,int flag) {
+
+        List<Areas> list = null;
+        if(type == null){
+            list = ALL_AREA_LIST;
+        }else if(Constants.equalsInteger(type,Constants.ZERO)){
+            list = PROVINCE_LIST;
+        }else  if(Constants.equalsInteger(type,Constants.ONE)){
+            list = CITY_LIST;
+        } else if (Constants.equalsInteger(type,Constants.TWO)){
+            list =  AREA_LIST;
+        }
+        if(list!=null && Objects.nonNull(parentId)){
+            list = list.stream().filter(s->Constants.equalsInteger(s.getParentId(),parentId))
+                    .collect(Collectors.toList());
+        }
+        if(flag == 0){
+            List<Areas> result = new ArrayList<>();
+            for(Areas a : list){
+                Areas r = new Areas();
+                BeanUtils.copyProperties(a,r);
+                r.setChildList(null);
+                result.add(r);
+            }
+            return  result;
+        }
+        return list;
+    }
+
+    @Override
+    public List<Areas> findChildByParentId(Integer id,List<Areas> list){
+        List<Areas> result =null;
+        if(list == null){
+            list = ALL_AREA_LIST;
+        }
+        if(list!=null && list.size()>0){
+            for(Areas model :list){
+                if(Constants.equalsInteger(id,model.getParentId())){
+                    if(result == null){
+                        result = new ArrayList<>();
+                    }
+                    result.add(model );
+                }
+            }
+        }
+        return result;
+    }
+
+    @Override
+    public boolean isAreaValid(String proName,String cityName,String areaName){
+        Areas pro = findByName(proName,Constants.ZERO);
+        if(pro == null){
+            return  false;
+        }
+        Areas city = findByName(proName,Constants.ONE);
+        if(city == null && !Constants.equalsInteger(city.getParentId(),pro.getId())){
+            return  false;
+        }
+        Areas area = findByName(proName,Constants.TWO);
+        if(area == null && !Constants.equalsInteger(area.getParentId(),city.getId())){
+            return  false;
+        }
+        return false;
+    }
+    @Override
+    public Areas findOne(Areas areas) {
+        QueryWrapper<Areas> wrapper = new QueryWrapper<>(areas);
+        return areasMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<Areas> findList(Areas areas) {
+        List<Areas> list = null;
+        Integer type =areas.getType();
+        if(type == null){
+            list = ALL_AREA_LIST;
+        }else if(Constants.equalsInteger(type,Constants.ZERO)){
+            list = PROVINCE_LIST;
+        }else  if(Constants.equalsInteger(type,Constants.ONE)){
+            list = CITY_LIST;
+        } else if (Constants.equalsInteger(type,Constants.TWO)){
+            list =  AREA_LIST;
+        }
+        List<Areas> result = null;
+        if(StringUtils.isNotBlank(areas.getName())){
+            for(Areas a : list){
+                if(StringUtils.contains(a.getName(),areas.getName())){
+                    if(result == null){
+                        result = new ArrayList<>();
+                    }
+                    result.add(a);
+                }
+            }
+            return  result;
+        }
+        return list;
+    }
+
+    @Override
+    public  List<Areas> listByParentId(Areas areas) {
+        List<Areas> list = null;
+        Integer type =areas.getType();
+        if(type == null){
+            list = ALL_AREA_LIST;
+        }else if(Constants.equalsInteger(type,Constants.ZERO)){
+            list = PROVINCE_LIST;
+        }else  if(Constants.equalsInteger(type,Constants.ONE)){
+            list = CITY_LIST;
+        } else if (Constants.equalsInteger(type,Constants.TWO)){
+            list =  AREA_LIST;
+        }
+        List<Areas> result = null;
+        if( areas.getParentId() !=null){
+            for(Areas a : list){
+                if(Constants.equalsInteger(a.getParentId(),areas.getParentId())){
+                    if(result == null){
+                        result = new ArrayList<>();
+                    }
+                    result.add(a);
+                }
+            }
+            return  result;
+        }
+        return list;
+    }
+    @Override
+    public  void cacheData() {
+       Areas a = new Areas();
+       a.setIsdeleted(Constants.ZERO);
+       ALL_AREA_LIST = null;
+       PROVINCE_LIST =null;
+       CITY_LIST=null;
+       AREA_LIST = null;
+       ALL_AREA_TREE = null;
+       ALL_AREA_LIST =  areasMapper.selectJoinList(Areas.class,new MPJLambdaWrapper<Areas>()
+                .selectAll(Areas.class)
+               .eq(Areas::getIsdeleted,Constants.ZERO)
+               .orderByDesc(Areas::getSortnum));
+       if(ALL_AREA_LIST!=null){
+           for(Areas model : ALL_AREA_LIST){
+                if(Constants.equalsInteger(model.getType(),Constants.ZERO)){
+                    if(PROVINCE_LIST == null){
+                        PROVINCE_LIST = new ArrayList<>();
+                    }
+                    PROVINCE_LIST.add(model);
+                }else if(Constants.equalsInteger(model.getType(),Constants.ONE)){
+                    if(CITY_LIST == null){
+                        CITY_LIST = new ArrayList<>();
+                    }
+                    CITY_LIST.add(model);
+                    if(model.getParentId() != null){
+                        Areas p = findById(model.getParentId());
+                        if(p!=null  ){
+                            model.setProvinceId(p.getId());
+                            model.setProvinceName(p.getName());
+                        }
+                    }
+                }else if(Constants.equalsInteger(model.getType(),Constants.TWO)){
+                    if(AREA_LIST == null){
+                        AREA_LIST = new ArrayList<>();
+                    }
+                    AREA_LIST.add(model);
+                    Areas city = findById(model.getParentId());
+                    if(city!=null  ){
+                        model.setCityId(city.getId());
+                        model.setCityName(city.getName());
+                        if(city!=null && city.getParentId()!=null){
+                            Areas p = findById(city.getParentId());
+                            if(p!=null  ){
+                                model.setProvinceId(p.getId());
+                                model.setProvinceName(p.getName());
+                            }
+                        }
+                    }
+                }
+           }
+       }
+       if(CITY_LIST!=null){
+           for(Areas aa : CITY_LIST){
+               aa.setChildList(findChildByParentId(aa.getId(), AREA_LIST));
+           }
+       }
+       if(PROVINCE_LIST!=null){
+           for(Areas aa : PROVINCE_LIST){
+               aa.setChildList(findChildByParentId(aa.getId(),CITY_LIST));
+           }
+       }
+       System.out.println("=================");
+    }
+
+    @Override
+    public PageData<Areas> findPage(PageWrap<Areas> pageWrap) {
+        IPage<Areas> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<Areas> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(Areas::getId, pageWrap.getModel().getId());
+        }
+
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(Areas::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(Areas::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(Areas::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(Areas::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(Areas::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(Areas::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(Areas::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getName() != null) {
+            queryWrapper.lambda().eq(Areas::getName, pageWrap.getModel().getName());
+        }
+        if (pageWrap.getModel().getInfo() != null) {
+            queryWrapper.lambda().eq(Areas::getInfo, pageWrap.getModel().getInfo());
+        }
+        if (pageWrap.getModel().getCode() != null) {
+            queryWrapper.lambda().eq(Areas::getCode, pageWrap.getModel().getCode());
+        }
+        if (pageWrap.getModel().getParentId() != null) {
+            queryWrapper.lambda().eq(Areas::getParentId, pageWrap.getModel().getParentId());
+        }
+        if (pageWrap.getModel().getType() != null) {
+            queryWrapper.lambda().eq(Areas::getType, pageWrap.getModel().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(areasMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(Areas areas) {
+        QueryWrapper<Areas> wrapper = new QueryWrapper<>(areas);
+        return areasMapper.selectCount(wrapper);
+    }
+
+    @Override
+    public Areas findByCityAndArea(String cityName, String areasName) {
+        Areas city = findByName(cityName,Constants.ONE);
+        if(city !=null){
+           return  findByNameAndParentId(areasName,Constants.TWO,city.getId());
+        }
+        return null;
+    }
+
+    @Override
+    public String getAddress(Integer cityId,Integer areaId){
+        Areas cityAreas = findById(cityId, Constants.ONE);
+        Areas areas = findById(areaId, Constants.TWO);
+
+        String cityName = Optional.ofNullable(cityAreas)
+                .map(s -> s.getProvinceName() + s.getName())
+                .orElseThrow(() -> new BusinessException(ResponseStatus.BAD_REQUEST));
+        String areaName = Optional.ofNullable(areas).map(s -> s.getName()).orElse("");
+
+        return cityName+areaName;
+    }
+
+    @Override
+    public String getAddress(Integer areaId) {
+        Areas areas = findById(areaId, Constants.TWO);
+
+        String cityName = Optional.ofNullable(areas)
+                .map(s -> s.getProvinceName() + s.getCityName())
+                .orElseThrow(() -> new BusinessException(ResponseStatus.BAD_REQUEST));
+        String areaName = Optional.ofNullable(areas).map(s -> s.getName()).orElse("");
+        return cityName+areaName;
+    }
+    public static Areas getAddressByAreaId(Integer areaId) {
+        if(areaId ==null){
+            return null;
+        }
+        if(AREA_LIST!=null){
+            for(Areas a : AREA_LIST){
+                if(Constants.equalsInteger(a.getId(),areaId)){
+                    return a;
+//                    return  StringUtils.defaultString(a.getProvinceName(),"")+StringUtils.defaultString(a.getCityName(),"")+StringUtils.defaultString(a.getName(),"")
+                }
+            }
+        }
+        return null;
+    }
+    @Override
+    public List<Areas> getCityList(Areas areas)  {
+        //鏌ヨ鍏ㄩ儴鍩庡競鏁版嵁
+        List<Areas>  dataList = findByParentId(null,Constants.ONE,0);
+
+        if (StringUtils.isNotBlank(areas.getCityName())){
+            dataList = dataList.stream().filter(s -> s.getName().contains(areas.getCityName())).collect(Collectors.toList());
+        }
+        if(dataList != null){
+            for(Areas c: dataList){
+                c.setFullspell(PinYinUtil.getFullSpell(c.getName()));
+                c.setFirstSpell(PinYinUtil.getFirstFirstSpell(c.getName()));
+            }
+            Collections.sort(dataList);
+        }
+        return dataList;
+    }
+
+}
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
new file mode 100644
index 0000000..53f9009
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/service/business/impl/BannerServiceImpl.java
@@ -0,0 +1,148 @@
+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.BannerMapper;
+import com.doumee.dao.business.model.Banner;
+import com.doumee.service.business.BannerService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 杞挱鍥維ervice瀹炵幇
+ * @author rk
+ * @date 2026/04/08
+ */
+@Service
+public class BannerServiceImpl implements BannerService {
+
+    @Autowired
+    private BannerMapper bannerMapper;
+
+    @Override
+    public Integer create(Banner banner) {
+        bannerMapper.insert(banner);
+        return banner.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        bannerMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(Banner banner) {
+        UpdateWrapper<Banner> deleteWrapper = new UpdateWrapper<>(banner);
+        bannerMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        bannerMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(Banner banner) {
+        bannerMapper.updateById(banner);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<Banner> banners) {
+        if (CollectionUtils.isEmpty(banners)) {
+            return;
+        }
+        for (Banner banner : banners) {
+            this.updateById(banner);
+        }
+    }
+
+    @Override
+    public Banner findById(Integer id) {
+        Banner banner = bannerMapper.selectById(id);
+        if (Objects.isNull(banner)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        return banner;
+    }
+
+    @Override
+    public Banner findOne(Banner banner) {
+        QueryWrapper<Banner> wrapper = new QueryWrapper<>(banner);
+        return bannerMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<Banner> findList(Banner banner) {
+        QueryWrapper<Banner> wrapper = new QueryWrapper<>(banner);
+        return bannerMapper.selectList(wrapper);
+    }
+
+    @Override
+    public PageData<Banner> findPage(PageWrap<Banner> pageWrap) {
+        IPage<Banner> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        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());
+        }
+        for (PageWrap.SortData sortData : pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(bannerMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(Banner banner) {
+        QueryWrapper<Banner> wrapper = new QueryWrapper<>(banner);
+        return bannerMapper.selectCount(wrapper);
+    }
+}
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
new file mode 100644
index 0000000..e67a9b0
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java
@@ -0,0 +1,585 @@
+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.config.jwt.JwtTokenUtil;
+import com.doumee.core.utils.Secure;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.DriverInfoMapper;
+import com.doumee.dao.business.MemberMapper;
+import com.doumee.dao.business.MultifileMapper;
+import com.doumee.dao.business.SmsrecordMapper;
+import com.doumee.dao.business.CategoryMapper;
+import com.doumee.dao.business.model.Category;
+import com.doumee.dao.business.model.DriverInfo;
+import com.doumee.dao.business.model.Member;
+import com.doumee.dao.business.model.Multifile;
+import com.doumee.dao.business.model.Smsrecord;
+import com.doumee.dao.vo.AccountResponse;
+import com.doumee.dao.dto.AuditDTO;
+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 org.apache.commons.lang3.RandomStringUtils;
+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.util.CollectionUtils;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 鍙告満娉ㄥ唽淇℃伅Service瀹炵幇
+ * @author rk
+ * @date 2026/04/08
+ */
+@Service
+public class DriverInfoServiceImpl implements DriverInfoService {
+
+    @Autowired
+    private DriverInfoMapper driverInfoMapper;
+
+    @Autowired
+    private MemberMapper memberMapper;
+
+    @Autowired
+    private SmsrecordMapper smsrecordMapper;
+
+    @Autowired
+    private JwtTokenUtil jwtTokenUtil;
+
+    @Autowired
+    private Secure secure;
+
+    @Autowired
+    private RedisTemplate<String, Object> redisTemplate;
+
+    @Autowired
+    private MultifileMapper multifileMapper;
+
+    @Autowired
+    private CategoryMapper categoryMapper;
+
+    @Override
+    public Integer create(DriverInfo driverInfo) {
+        driverInfoMapper.insert(driverInfo);
+        return driverInfo.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        driverInfoMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(DriverInfo driverInfo) {
+        UpdateWrapper<DriverInfo> deleteWrapper = new UpdateWrapper<>(driverInfo);
+        driverInfoMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        driverInfoMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(DriverInfo driverInfo) {
+        driverInfoMapper.updateById(driverInfo);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<DriverInfo> driverInfos) {
+        if (CollectionUtils.isEmpty(driverInfos)) {
+            return;
+        }
+        for (DriverInfo driverInfo : driverInfos) {
+            this.updateById(driverInfo);
+        }
+    }
+
+    @Override
+    public DriverInfo findById(Integer id) {
+        DriverInfo driverInfo = driverInfoMapper.selectById(id);
+        if (Objects.isNull(driverInfo)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        return driverInfo;
+    }
+
+    @Override
+    public DriverInfo findOne(DriverInfo driverInfo) {
+        QueryWrapper<DriverInfo> wrapper = new QueryWrapper<>(driverInfo);
+        return driverInfoMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<DriverInfo> findList(DriverInfo driverInfo) {
+        QueryWrapper<DriverInfo> wrapper = new QueryWrapper<>(driverInfo);
+        return driverInfoMapper.selectList(wrapper);
+    }
+
+    @Override
+    public PageData<DriverInfo> findPage(PageWrap<DriverInfo> pageWrap) {
+        IPage<DriverInfo> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<DriverInfo> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        pageWrap.getModel().setDeleted(Constants.ZERO);
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(DriverInfo::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getDeleted() != null) {
+            queryWrapper.lambda().eq(DriverInfo::getDeleted, pageWrap.getModel().getDeleted());
+        }
+        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());
+        }
+        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().getAuditUser() != null) {
+            queryWrapper.lambda().eq(DriverInfo::getAuditUser, pageWrap.getModel().getAuditUser());
+        }
+        if (pageWrap.getModel().getMemberId() != null) {
+            queryWrapper.lambda().eq(DriverInfo::getMemberId, pageWrap.getModel().getMemberId());
+        }
+        for (PageWrap.SortData sortData : pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(driverInfoMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(DriverInfo driverInfo) {
+        QueryWrapper<DriverInfo> wrapper = new QueryWrapper<>(driverInfo);
+        return driverInfoMapper.selectCount(wrapper);
+    }
+
+    /***************鍙告満楠岃瘉鐮佺櫥褰曚笟鍔�*************/
+
+    @Override
+    public void sendRegisterCode(String telephone) {
+        if (StringUtils.isBlank(telephone)) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        // 鐢熸垚6浣嶆暟瀛楅獙璇佺爜
+        String code = RandomStringUtils.randomNumeric(6);
+        // 鍙戦�佺煭淇�
+        String templateParam = "{\"code\":\"" + code + "\"}";
+        AliSmsService.sendSms(telephone, "SMS_491325122", templateParam);
+        // 淇濆瓨鐭俊璁板綍
+        Smsrecord smsrecord = new Smsrecord();
+        smsrecord.setDeleted(Constants.ZERO);
+        smsrecord.setCreateTime(new Date());
+        smsrecord.setUpdateTime(new Date());
+        smsrecord.setPhone(telephone);
+        smsrecord.setContent("鍙告満楠岃瘉鐮佺櫥褰曪細" + code);
+        smsrecord.setType(Constants.ZERO);
+        smsrecord.setCode(code);
+        smsrecord.setStatus(Constants.ZERO);
+        // 鏈夋晥鏈�15鍒嗛挓
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(new Date());
+        calendar.add(Calendar.MINUTE, 15);
+        smsrecord.setValidDate(calendar.getTime());
+        smsrecordMapper.insert(smsrecord);
+    }
+
+    @Override
+    @Transactional
+    public AccountResponse register(DriverRegisterRequest request) {
+        String telephone = request.getTelephone();
+        String code = request.getCode();
+        if (StringUtils.isAnyBlank(telephone, code)) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        // 1. 楠岃瘉鐭俊楠岃瘉鐮�
+        QueryWrapper<Smsrecord> smsWrapper = new QueryWrapper<>();
+        smsWrapper.lambda().eq(Smsrecord::getPhone, telephone)
+                .eq(Smsrecord::getCode, code)
+                .eq(Smsrecord::getType, Constants.ZERO)
+                .eq(Smsrecord::getStatus, Constants.ZERO)
+                .ge(Smsrecord::getValidDate, new Date())
+                .orderByDesc(Smsrecord::getCreateTime)
+                .last("limit 1");
+        Smsrecord smsrecord = smsrecordMapper.selectOne(smsWrapper);
+        if (Objects.isNull(smsrecord)) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "楠岃瘉鐮侀敊璇垨宸茶繃鏈�");
+        }
+        // 鏍囪楠岃瘉鐮佸凡浣跨敤
+        smsrecord.setStatus(Constants.ONE);
+        smsrecord.setUpdateTime(new Date());
+        smsrecordMapper.updateById(smsrecord);
+
+        // 2. 鏌ヨ鏄惁宸叉湁鍙告満璐﹀彿
+        Member existMember = memberMapper.selectOne(new QueryWrapper<Member>().lambda()
+                .eq(Member::getTelephone, telephone)
+                .eq(Member::getUserType, Constants.ONE)
+                .ne(Member::getStatus, Constants.TWO)
+                .last("limit 1"));
+
+        Date now = new Date();
+        Member member;
+
+        if (Objects.nonNull(existMember)) {
+            // 宸叉湁鍙告満璐﹀彿锛岀洿鎺ョ櫥褰�
+            if (!Constants.equalsInteger(existMember.getStatus(), Constants.ZERO)) {
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "璐﹀彿宸插仠鐢紝璇疯仈绯荤鐞嗗憳");
+            }
+            // 鏇存柊鐧诲綍淇℃伅
+            memberMapper.update(new UpdateWrapper<Member>().lambda()
+                    .set(Member::getLoginTime, now)
+                    .setSql("login_times = login_times + 1")
+                    .eq(Member::getId, existMember.getId()));
+            // 鏇存柊鍐呭瓨涓殑鐧诲綍淇℃伅
+            existMember.setLoginTime(now);
+            existMember.setLoginTimes(existMember.getLoginTimes() + 1);
+            member = existMember;
+        } else {
+            // 娌℃湁鍙告満璐﹀彿锛屾敞鍐屾柊鐢ㄦ埛锛岄粯璁ゅ瘑鐮佷负鎵嬫満鍙峰悗鍏綅
+            String salt = RandomStringUtils.randomAlphanumeric(6);
+            String defaultPassword = telephone.substring(telephone.length() - 6);
+            member = new Member();
+            member.setDeleted(Constants.ZERO);
+            member.setCreateTime(now);
+            member.setUpdateTime(now);
+            member.setTelephone(telephone);
+            member.setNickName(telephone);
+            member.setName(telephone);
+            member.setUserType(Constants.ONE);
+            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);
+            member.setLoginTime(now);
+            member.setLoginTimes(Constants.ONE.longValue());
+            member.setReceiveNum(Constants.ZERO.longValue());
+            member.setPublishNum(Constants.ZERO.longValue());
+            member.setAutoReceiveStatus(Constants.ONE);
+            member.setUseIdentity(Constants.ZERO);
+            memberMapper.insert(member);
+
+            // 鍒涘缓鍙告満鍩虹淇℃伅锛坰tatus=0锛屾敞鍐岀姸鎬侊級
+            DriverInfo driverInfo = new DriverInfo();
+            driverInfo.setDeleted(Constants.ZERO);
+            driverInfo.setCreateTime(now);
+            driverInfo.setUpdateTime(now);
+            driverInfo.setTelephone(telephone);
+            driverInfo.setMemberId(member.getId());
+            driverInfo.setStatus(Constants.ZERO);
+            driverInfoMapper.insert(driverInfo);
+        }
+
+        // 3. 鐢熸垚token杩斿洖
+        AccountResponse accountResponse = new AccountResponse();
+        accountResponse.setToken(JwtTokenUtil.generateTokenForRedis(member.getId(), Constants.ONE, JSONObject.toJSONString(member), redisTemplate));
+        accountResponse.setMember(member);
+        return accountResponse;
+    }
+
+    @Override
+    public AccountResponse login(DriverLoginRequest request) {
+        String telephone = request.getTelephone();
+        String password = request.getPassword();
+        if (StringUtils.isAnyBlank(telephone, password)) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        // 鏌ヨ鍙告満浼氬憳
+        Member member = memberMapper.selectOne(new QueryWrapper<Member>().lambda()
+                .eq(Member::getTelephone, telephone)
+                .eq(Member::getUserType, Constants.ONE)
+                .ne(Member::getStatus, Constants.TWO)
+                .last("limit 1"));
+        if (Objects.isNull(member)) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "璐﹀彿涓嶅瓨鍦�");
+        }
+        if (!Constants.equalsInteger(member.getStatus(), Constants.ZERO)) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "璐﹀彿宸插仠鐢紝璇疯仈绯荤鐞嗗憳");
+        }
+        // 鏍¢獙瀵嗙爜
+        String encryptPwd = secure.encryptPassword(password, member.getSalt());
+        if (!encryptPwd.equals(member.getPassword())) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "瀵嗙爜閿欒");
+        }
+        // 鏇存柊鐧诲綍淇℃伅
+        memberMapper.update(new UpdateWrapper<Member>().lambda()
+                .set(Member::getLoginTime, new Date())
+                .setSql("login_times = login_times + 1")
+                .eq(Member::getId, member.getId()));
+
+        AccountResponse accountResponse = new AccountResponse();
+        accountResponse.setToken(JwtTokenUtil.generateTokenForRedis(member.getId(), Constants.ONE, JSONObject.toJSONString(member), redisTemplate));
+        accountResponse.setMember(member);
+        return accountResponse;
+    }
+
+    /***************鍙告満瀹炲悕璁よ瘉涓氬姟*************/
+
+    @Override
+    @Transactional
+    public void submitVerify(Integer memberId, DriverVerifyRequest request) {
+        // 鍙傛暟鍩虹鏍¢獙
+        if (StringUtils.isAnyBlank(request.getName(), request.getIdcard(), request.getLivePlace(),
+                request.getCarCode(), request.getIdcardImg(), request.getIdcardImgBack())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        if (request.getMaritalStatus() == null || request.getCarType() == null) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        // 韬唤璇佸彿鏍煎紡鏍¢獙锛�18浣嶏紝鏈�鍚庝竴浣嶅彲涓篨锛�
+        if (!request.getIdcard().matches("^[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[\\dXx]$")) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "韬唤璇佸彿鏍煎紡涓嶆纭�");
+        }
+        // 鏌ヨ鍙告満淇℃伅
+        DriverInfo driverInfo = driverInfoMapper.selectOne(new QueryWrapper<DriverInfo>().lambda()
+                .eq(DriverInfo::getMemberId, memberId)
+                .eq(DriverInfo::getDeleted, Constants.ZERO)
+                .last("limit 1"));
+        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)) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "褰撳墠鐘舵�佷笉鍏佽鎻愪氦璁よ瘉");
+        }
+        // 鏍规嵁杞﹁締绫诲瀷鍒ゆ柇鏄惁闇�瑕侀┚椹惰瘉
+        Category category = categoryMapper.selectById(request.getCarType());
+        if (Objects.isNull(category) || !Constants.equalsInteger(category.getType(), Constants.ONE)) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "杞﹁締绫诲瀷涓嶅瓨鍦�");
+        }
+        boolean needLicense = Constants.equalsInteger(Integer.valueOf(category.getOtherField()), Constants.ONE);
+        if (needLicense) {
+            if (request.getCardStartDate() == null || request.getCardEndDate() == null) {
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "璇ヨ溅杈嗙被鍨嬮渶瑕佸~鍐欓┚椹惰瘉鏈夋晥鏈�");
+            }
+            if (request.getLicenseImgUrls() == null || request.getLicenseImgUrls().isEmpty()) {
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "璇ヨ溅杈嗙被鍨嬮渶瑕佷笂浼犻┚椹惰瘉鐓х墖");
+            }
+        }
+        // 杞﹁締鐓х墖蹇呭~
+        if (request.getCarImgUrls() == null || request.getCarImgUrls().isEmpty()) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "璇蜂笂浼犺溅杈嗙収鐗�");
+        }
+        // 鐓х墖鏁伴噺鏍¢獙
+        if (request.getCarImgUrls().size() > 3) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "杞﹁締鐓х墖鏈�澶氫笂浼�3寮�");
+        }
+        if (request.getLicenseImgUrls() != null && request.getLicenseImgUrls().size() > 3) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "椹鹃┒璇佺収鐗囨渶澶氫笂浼�3寮�");
+        }
+        if (request.getOtherImgUrls() != null && request.getOtherImgUrls().size() > 3) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "鍏朵粬璧勬枡鐓х墖鏈�澶氫笂浼�3寮�");
+        }
+
+        // 鏇存柊鍙告満淇℃伅
+        Date now = new Date();
+        driverInfoMapper.update(new UpdateWrapper<DriverInfo>().lambda()
+                .set(DriverInfo::getName, request.getName())
+                .set(DriverInfo::getIdcard, request.getIdcard())
+                .set(DriverInfo::getMaritalStatus, request.getMaritalStatus())
+                .set(DriverInfo::getAreaId, request.getAreaId())
+                .set(DriverInfo::getLivePlace, request.getLivePlace())
+                .set(DriverInfo::getCarCode, request.getCarCode())
+                .set(DriverInfo::getCarType, request.getCarType())
+                .set(DriverInfo::getCarColor, request.getCarColor())
+                .set(DriverInfo::getCardStartDate, request.getCardStartDate())
+                .set(DriverInfo::getCardEndDate, request.getCardEndDate())
+                .set(DriverInfo::getIdcardImg, request.getIdcardImg())
+                .set(DriverInfo::getIdcardImgBack, request.getIdcardImgBack())
+                .set(DriverInfo::getStatus, Constants.ONE)
+                .set(DriverInfo::getUpdateTime, now)
+                .set(DriverInfo::getAuditRemark, null)
+                .set(DriverInfo::getAuditTime, null)
+                .eq(DriverInfo::getId, driverInfo.getId()));
+
+        // 鍒犻櫎鏃х殑鐓х墖璁板綍
+        multifileMapper.delete(new QueryWrapper<Multifile>().lambda()
+                .eq(Multifile::getObjId, driverInfo.getId())
+                .in(Multifile::getObjType, 6, 7, 8));
+
+        // 淇濆瓨杞﹁締鐓х墖 objType=6
+        saveMultifileList(driverInfo.getId(), 6, request.getCarImgUrls(), now);
+        // 淇濆瓨椹鹃┒璇佺収鐗� objType=7
+        if (!CollectionUtils.isEmpty(request.getLicenseImgUrls())) {
+            saveMultifileList(driverInfo.getId(), 7, request.getLicenseImgUrls(), now);
+        }
+        // 淇濆瓨鍏朵粬璧勬枡鐓х墖 objType=8
+        if (!CollectionUtils.isEmpty(request.getOtherImgUrls())) {
+            saveMultifileList(driverInfo.getId(), 8, request.getOtherImgUrls(), now);
+        }
+
+        // 鏇存柊浼氬憳鍙告満璁よ瘉鐘舵�佷负璁よ瘉涓�
+        memberMapper.update(new UpdateWrapper<Member>().lambda()
+                .set(Member::getBusinessStatus, Constants.ONE)
+                .set(Member::getUpdateTime, now)
+                .eq(Member::getId, memberId));
+    }
+
+    @Override
+    public DriverInfo getVerifyDetail(Integer memberId) {
+        DriverInfo driverInfo = driverInfoMapper.selectOne(new QueryWrapper<DriverInfo>().lambda()
+                .eq(DriverInfo::getMemberId, memberId)
+                .eq(DriverInfo::getDeleted, Constants.ZERO)
+                .last("limit 1"));
+        if (Objects.isNull(driverInfo)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        // 鏌ヨ杞﹁締绫诲瀷鍚嶇О鍜屾槸鍚﹂渶瑕侀┚椹惰瘉
+        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);
+            }
+        }
+        // 鏌ヨ鐓х墖鍒楄〃
+        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) {
+                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
+    @Transactional
+    public void auditVerify(AuditDTO auditDTO) {
+        if (Objects.isNull(auditDTO.getId()) || Objects.isNull(auditDTO.getAuditStatus())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        DriverInfo driverInfo = driverInfoMapper.selectById(auditDTO.getId());
+        if (Objects.isNull(driverInfo)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        // 鍙湁鐘舵�佷负1(寰呭鎵�)涓斿凡濉啓璁よ瘉淇℃伅鎵嶈兘瀹℃壒
+        if (!Constants.equalsInteger(driverInfo.getStatus(), Constants.ONE)
+                || 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;
+        if (Constants.equalsInteger(auditDTO.getAuditStatus(), Constants.ZERO)) {
+            newStatus = Constants.TWO;  // 瀹℃壒閫氳繃
+        } else if (Constants.equalsInteger(auditDTO.getAuditStatus(), Constants.ONE)) {
+            newStatus = Constants.THREE;  // 瀹℃壒椹冲洖
+        } else {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "瀹℃壒鐘舵�佸弬鏁伴敊璇�");
+        }
+        // 鏇存柊鍙告満鐘舵��
+        driverInfoMapper.update(new UpdateWrapper<DriverInfo>().lambda()
+                .set(DriverInfo::getStatus, newStatus)
+                .set(DriverInfo::getAuditTime, now)
+                .set(DriverInfo::getAuditRemark, auditDTO.getAuditRemark())
+                .set(DriverInfo::getAuditUser, auditDTO.getAuditUser())
+                .set(DriverInfo::getUpdateTime, now)
+                .eq(DriverInfo::getId, auditDTO.getId()));
+        // 鏇存柊浼氬憳鍙告満璁よ瘉鐘舵�侊細閫氳繃=2锛岄┏鍥�=3
+        Integer driverStatus = Constants.equalsInteger(newStatus, Constants.TWO) ? Constants.TWO : Constants.THREE;
+        memberMapper.update(new UpdateWrapper<Member>().lambda()
+                .set(Member::getBusinessStatus, driverStatus)
+                .set(Member::getUpdateTime, now)
+                .eq(Member::getId, driverInfo.getMemberId()));
+    }
+
+    /**
+     * 鎵归噺淇濆瓨闄勪欢璁板綍
+     */
+    private void saveMultifileList(Integer objId, Integer objType, List<String> urls, Date now) {
+        int sortNum = 0;
+        for (String url : urls) {
+            Multifile multifile = new Multifile();
+            multifile.setObjId(objId);
+            multifile.setObjType(objType);
+            multifile.setType(Constants.ZERO);
+            multifile.setFileurl(url);
+            multifile.setIsdeleted(Constants.ZERO);
+            multifile.setCreateDate(now);
+            multifile.setSortnum(sortNum++);
+            multifileMapper.insert(multifile);
+        }
+    }
+
+}
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 16cb9e2..33dc998 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
@@ -69,6 +69,10 @@
     @Autowired
     private SystemDictDataBiz systemDictDataBiz;
 
+    @Autowired
+    private RedisTemplate<String,Object> redisTemplate;
+
+
     @Override
     public Integer create(Member member) {
         memberMapper.insert(member);
@@ -271,13 +275,18 @@
             if (StringUtils.isBlank(openId)) {
                 throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "鑾峰彇openid澶辫触锛佽鑱旂郴绠$悊鍛�");
             }
-            Member member = memberMapper.selectOne(new QueryWrapper<Member>().eq("openid", openId).eq("DELETED", Constants.ZERO).last("limit 1"));
+            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"));
             AccountResponse accountResponse = new AccountResponse();
             accountResponse.setOpenid(openId);
             if(Objects.isNull(member)){
                 return accountResponse;
             }
-            accountResponse.setToken(jwtTokenUtil.generateToken(member));
+            if(!Constants.equalsInteger(member.getStatus(),Constants.ZERO)){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "瀵逛笉璧凤紝璐﹀彿宸茬鐢紝璇疯仈绯荤鐞嗗憳!");
+            }
+            String token = JwtTokenUtil.generateTokenForRedis(member.getId(), Constants.ZERO, JSONObject.toJSONString(member), redisTemplate);
+            accountResponse.setToken(token);
             accountResponse.setMember(member);
             return accountResponse;
         } catch (WxErrorException e) {
@@ -301,8 +310,12 @@
             if(Objects.isNull(mobile)){
                 throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鏈幏鍙栧埌鎵嬫満鍙�");
             }
-            Member member =  memberMapper.selectOne(new QueryWrapper<Member>().lambda().eq(Member::getTelephone,mobile).last("limit 1"));
+            Member member =  memberMapper.selectOne(new QueryWrapper<Member>().lambda().eq(Member::getTelephone,mobile).eq(Member::getUserType,Constants.ZERO)
+                    .ne(Member::getStatus, Constants.TWO).last("limit 1"));
             if(Objects.nonNull(member)){
+                if(!Constants.equalsInteger(member.getStatus(),Constants.ZERO)){
+                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "瀵逛笉璧凤紝璐﹀彿宸茬鐢紝璇疯仈绯荤鐞嗗憳!");
+                }
                 memberMapper.update(new UpdateWrapper<Member>().lambda().set(Member::getTelephone,mobile)
                         .set(Member::getOpenid,wxPhoneRequest.getOpenid()).set(Member::getUpdateTime,new Date()).eq(Member::getId,member.getId()));
             }else{
@@ -328,8 +341,9 @@
                 member.setUseIdentity(Constants.ZERO);
                 memberMapper.insert(member);
             }
+            String token = JwtTokenUtil.generateTokenForRedis(member.getId(), Constants.ZERO, JSONObject.toJSONString(member), redisTemplate);
             AccountResponse accountResponse = new AccountResponse();
-            accountResponse.setToken(jwtTokenUtil.generateToken(member));
+            accountResponse.setToken(token);
             accountResponse.setMember(member);
             return accountResponse;
         } catch (Exception e) {
@@ -359,25 +373,25 @@
     }
 
 
-    @Override
-    public void editUseIdentity(Member member){
-        if(Objects.isNull(member)
-                || Objects.isNull(member.getUseIdentity())){
-            throw new BusinessException(ResponseStatus.BAD_REQUEST);
-        }
-        if(Constants.equalsInteger(member.getUseIdentity(),Constants.ZERO)){
-            member.setUseIdentity(Constants.ZERO);
-            memberMapper.update(new UpdateWrapper<Member>().lambda().set(Member::getUseIdentity,Constants.ZERO).eq(Member::getId,member.getId()));
-        }else{
-            if(identityInfoMapper.selectCount(new QueryWrapper<IdentityInfo>().lambda().eq(IdentityInfo::getDeleted,Constants.ZERO)
-                    .eq(IdentityInfo::getMemberId,member.getId())
-                    .eq(IdentityInfo::getAuditStatus,Constants.TWO))>Constants.ZERO){
-                memberMapper.update(new UpdateWrapper<Member>().lambda().set(Member::getUseIdentity,Constants.ONE).eq(Member::getId,member.getId()));
-            }else{
-                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"褰撳墠鏃犲彲鐢ㄦ帴鍗曡韩浠�!");
-            }
-        }
-    }
+//    @Override
+//    public void editUseIdentity(Member member){
+//        if(Objects.isNull(member)
+//                || Objects.isNull(member.getUseIdentity())){
+//            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+//        }
+//        if(Constants.equalsInteger(member.getUseIdentity(),Constants.ZERO)){
+//            member.setUseIdentity(Constants.ZERO);
+//            memberMapper.update(new UpdateWrapper<Member>().lambda().set(Member::getUseIdentity,Constants.ZERO).eq(Member::getId,member.getId()));
+//        }else{
+//            if(identityInfoMapper.selectCount(new QueryWrapper<IdentityInfo>().lambda().eq(IdentityInfo::getDeleted,Constants.ZERO)
+//                    .eq(IdentityInfo::getMemberId,member.getId())
+//                    .eq(IdentityInfo::getAuditStatus,Constants.TWO))>Constants.ZERO){
+//                memberMapper.update(new UpdateWrapper<Member>().lambda().set(Member::getUseIdentity,Constants.ONE).eq(Member::getId,member.getId()));
+//            }else{
+//                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"褰撳墠鏃犲彲鐢ㄦ帴鍗曡韩浠�!");
+//            }
+//        }
+//    }
 
 
     @Override
@@ -391,29 +405,29 @@
                     +systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.MEMBER_FILES).getCode();
             member.setFullCoverImage(path + member.getCoverImage());
         }
-        UserCenterVO userCenterVO = new UserCenterVO();
-        userCenterVO.setReleaseTaskTotal(Constants.ZERO);
-        userCenterVO.setWaitReceiveTotal(Constants.ZERO);
-        userCenterVO.setDoingTotal(Constants.ZERO);
-        userCenterVO.setWaitCommentTotal(Constants.ZERO);
-        userCenterVO.setTaskingTotal(Constants.ZERO);
-        userCenterVO.setDoneTotal(Constants.ZERO);
-        userCenterVO.setReceiveTotal(Constants.ZERO);
-        List<Orders> releaseOrders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda().eq(Orders::getDeleted,Constants.ZERO)
-                .eq(Orders::getReleaseMemberId,member.getId()));
-        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(releaseOrders)){
-            userCenterVO.setReleaseTaskTotal(releaseOrders.size());
-            userCenterVO.setWaitCommentTotal(releaseOrders.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ordersStatus.done.getKey())&&Constants.equalsInteger(i.getCommentStatus(),Constants.ZERO)).collect(Collectors.toList()).size());
-            userCenterVO.setDoingTotal(releaseOrders.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ordersStatus.doing.getKey())).collect(Collectors.toList()).size());
-            userCenterVO.setWaitReceiveTotal(releaseOrders.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ordersStatus.wait.getKey())).collect(Collectors.toList()).size());
-        }
-        List<Orders> acceptOrders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda().eq(Orders::getDeleted,Constants.ZERO).eq(Orders::getAcceptMemberId,member.getId()));
-        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(acceptOrders)){
-            userCenterVO.setReceiveTotal(acceptOrders.size());
-            userCenterVO.setTaskingTotal(acceptOrders.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ordersStatus.doing.getKey())).collect(Collectors.toList()).size());
-            userCenterVO.setDoneTotal(acceptOrders.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ordersStatus.done.getKey())).collect(Collectors.toList()).size());
-        }
-        member.setUserCenterVO(userCenterVO);
+//        UserCenterVO userCenterVO = new UserCenterVO();
+//        userCenterVO.setReleaseTaskTotal(Constants.ZERO);
+//        userCenterVO.setWaitReceiveTotal(Constants.ZERO);
+//        userCenterVO.setDoingTotal(Constants.ZERO);
+//        userCenterVO.setWaitCommentTotal(Constants.ZERO);
+//        userCenterVO.setTaskingTotal(Constants.ZERO);
+//        userCenterVO.setDoneTotal(Constants.ZERO);
+//        userCenterVO.setReceiveTotal(Constants.ZERO);
+//        List<Orders> releaseOrders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda().eq(Orders::getDeleted,Constants.ZERO)
+//                .eq(Orders::getReleaseMemberId,member.getId()));
+//        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(releaseOrders)){
+//            userCenterVO.setReleaseTaskTotal(releaseOrders.size());
+//            userCenterVO.setWaitCommentTotal(releaseOrders.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ordersStatus.done.getKey())&&Constants.equalsInteger(i.getCommentStatus(),Constants.ZERO)).collect(Collectors.toList()).size());
+//            userCenterVO.setDoingTotal(releaseOrders.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ordersStatus.doing.getKey())).collect(Collectors.toList()).size());
+//            userCenterVO.setWaitReceiveTotal(releaseOrders.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ordersStatus.wait.getKey())).collect(Collectors.toList()).size());
+//        }
+//        List<Orders> acceptOrders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda().eq(Orders::getDeleted,Constants.ZERO).eq(Orders::getAcceptMemberId,member.getId()));
+//        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(acceptOrders)){
+//            userCenterVO.setReceiveTotal(acceptOrders.size());
+//            userCenterVO.setTaskingTotal(acceptOrders.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ordersStatus.doing.getKey())).collect(Collectors.toList()).size());
+//            userCenterVO.setDoneTotal(acceptOrders.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ordersStatus.done.getKey())).collect(Collectors.toList()).size());
+//        }
+//        member.setUserCenterVO(userCenterVO);
         return member;
     }
 
@@ -424,20 +438,33 @@
     public UserCenterVO getPlatformAboutUs(){
         UserCenterVO userCenterVO = new UserCenterVO();
         userCenterVO.setAboutUs(StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.ABOUT_US).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.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()));
         return userCenterVO;
     }
 
     @Override
-    public void logOff(String token,Integer memberId){
+    public void logOut(String token,Integer memberId){
         memberMapper.update(new UpdateWrapper<Member>().lambda().setSql(" openid = null ").eq(Member::getId,memberId));
         jwtTokenUtil.logoutForH5(token);
     }
 
 
+    @Override
+    public void logOff(String token,Integer memberId){
+        Member  member = memberMapper.selectById(memberId);
+        if(Objects.nonNull(member)){
+            memberMapper.update(new UpdateWrapper<Member>().lambda()
+//                    .set(Member::getOpenId,null)
+                            .set(Member::getStatus,Constants.TWO)
+                            .eq(Member::getId,member.getId())
+            );
+        }
+        redisTemplate.delete(token);
+    }
 
 }
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
new file mode 100644
index 0000000..81bb4b4
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/service/business/impl/PricingRuleServiceImpl.java
@@ -0,0 +1,601 @@
+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.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.dto.LocalStoragePricingItemDTO;
+import com.doumee.dao.dto.LocalStoragePricingSaveDTO;
+import com.doumee.dao.dto.RemoteDeliveryPricingItemDTO;
+import com.doumee.dao.dto.RemoteDeliveryPricingSaveDTO;
+import com.doumee.dao.dto.EstimatedDeliverySaveDTO;
+import com.doumee.dao.dto.StoreDepositItemDTO;
+import com.doumee.dao.dto.StoreDepositSaveDTO;
+import com.doumee.dao.dto.RevenueShareItemDTO;
+import com.doumee.dao.dto.RevenueShareSaveDTO;
+import com.doumee.dao.vo.LocalStoragePricingVO;
+import com.doumee.dao.vo.RemoteDeliveryPricingVO;
+import com.doumee.dao.vo.EstimatedDeliveryVO;
+import com.doumee.dao.vo.StoreDepositVO;
+import com.doumee.dao.vo.RevenueShareVO;
+import com.doumee.service.business.PricingRuleService;
+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.*;
+import java.util.stream.Collectors;
+
+/**
+ * 璁′环瑙勫垯閰嶇疆Service瀹炵幇
+ * @author rk
+ * @date 2026/04/08
+ */
+@Service
+public class PricingRuleServiceImpl implements PricingRuleService {
+
+    @Autowired
+    private PricingRuleMapper pricingRuleMapper;
+
+    @Autowired
+    private CategoryMapper categoryMapper;
+
+    @Override
+    public Integer create(PricingRule pricingRule) {
+        pricingRuleMapper.insert(pricingRule);
+        return pricingRule.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        pricingRuleMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(PricingRule pricingRule) {
+        UpdateWrapper<PricingRule> deleteWrapper = new UpdateWrapper<>(pricingRule);
+        pricingRuleMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        pricingRuleMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(PricingRule pricingRule) {
+        pricingRuleMapper.updateById(pricingRule);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<PricingRule> pricingRules) {
+        if (CollectionUtils.isEmpty(pricingRules)) {
+            return;
+        }
+        for (PricingRule pricingRule : pricingRules) {
+            this.updateById(pricingRule);
+        }
+    }
+
+    @Override
+    public PricingRule findById(Integer id) {
+        PricingRule pricingRule = pricingRuleMapper.selectById(id);
+        if (Objects.isNull(pricingRule)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        return pricingRule;
+    }
+
+    @Override
+    public PricingRule findOne(PricingRule pricingRule) {
+        QueryWrapper<PricingRule> wrapper = new QueryWrapper<>(pricingRule);
+        return pricingRuleMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<PricingRule> findList(PricingRule pricingRule) {
+        QueryWrapper<PricingRule> wrapper = new QueryWrapper<>(pricingRule);
+        return pricingRuleMapper.selectList(wrapper);
+    }
+
+    @Override
+    public PageData<PricingRule> findPage(PageWrap<PricingRule> pageWrap) {
+        IPage<PricingRule> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<PricingRule> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        pageWrap.getModel().setDeleted(Constants.ZERO);
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(PricingRule::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getDeleted() != null) {
+            queryWrapper.lambda().eq(PricingRule::getDeleted, pageWrap.getModel().getDeleted());
+        }
+        if (pageWrap.getModel().getCreateUser() != null) {
+            queryWrapper.lambda().eq(PricingRule::getCreateUser, pageWrap.getModel().getCreateUser());
+        }
+        if (pageWrap.getModel().getCreateTime() != null) {
+            queryWrapper.lambda().ge(PricingRule::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateTime()));
+            queryWrapper.lambda().le(PricingRule::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateTime()));
+        }
+        if (pageWrap.getModel().getUpdateUser() != null) {
+            queryWrapper.lambda().eq(PricingRule::getUpdateUser, pageWrap.getModel().getUpdateUser());
+        }
+        if (pageWrap.getModel().getUpdateTime() != null) {
+            queryWrapper.lambda().ge(PricingRule::getUpdateTime, Utils.Date.getStart(pageWrap.getModel().getUpdateTime()));
+            queryWrapper.lambda().le(PricingRule::getUpdateTime, Utils.Date.getEnd(pageWrap.getModel().getUpdateTime()));
+        }
+        if (pageWrap.getModel().getRemark() != null) {
+            queryWrapper.lambda().eq(PricingRule::getRemark, pageWrap.getModel().getRemark());
+        }
+        if (pageWrap.getModel().getCityId() != null) {
+            queryWrapper.lambda().eq(PricingRule::getCityId, pageWrap.getModel().getCityId());
+        }
+        if (pageWrap.getModel().getType() != null) {
+            queryWrapper.lambda().eq(PricingRule::getType, pageWrap.getModel().getType());
+        }
+        if (pageWrap.getModel().getFieldA() != null) {
+            queryWrapper.lambda().eq(PricingRule::getFieldA, pageWrap.getModel().getFieldA());
+        }
+        if (pageWrap.getModel().getFieldB() != null) {
+            queryWrapper.lambda().eq(PricingRule::getFieldB, pageWrap.getModel().getFieldB());
+        }
+        if (pageWrap.getModel().getFieldC() != null) {
+            queryWrapper.lambda().eq(PricingRule::getFieldC, pageWrap.getModel().getFieldC());
+        }
+        if (pageWrap.getModel().getFieldD() != null) {
+            queryWrapper.lambda().eq(PricingRule::getFieldD, pageWrap.getModel().getFieldD());
+        }
+        if (pageWrap.getModel().getFieldE() != null) {
+            queryWrapper.lambda().eq(PricingRule::getFieldE, pageWrap.getModel().getFieldE());
+        }
+        for (PageWrap.SortData sortData : pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(pricingRuleMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(PricingRule pricingRule) {
+        QueryWrapper<PricingRule> wrapper = new QueryWrapper<>(pricingRule);
+        return pricingRuleMapper.selectCount(wrapper);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void batchSaveLocalStoragePricing(LocalStoragePricingSaveDTO request) {
+        // 鏍¢獙鍒嗙被鏁版嵁瀹屾暣鎬�
+        Set<Integer> requestCategoryIds = request.getItems().stream()
+                .map(LocalStoragePricingItemDTO::getCategoryId)
+                .collect(Collectors.toSet());
+        validateCategoryType4(requestCategoryIds);
+
+        // 閫愰」 upsert
+        Date now = new Date();
+        for (LocalStoragePricingItemDTO item : request.getItems()) {
+            // 鏌ヨ宸叉湁瑙勫垯
+            QueryWrapper<PricingRule> qw = new QueryWrapper<>();
+            qw.lambda()
+                    .eq(PricingRule::getType, Constants.ZERO)
+                    .eq(PricingRule::getFieldA, String.valueOf(item.getCategoryId()))
+                    .eq(PricingRule::getCityId, request.getCityId())
+                    .eq(PricingRule::getDeleted, Constants.ZERO)
+                    .last("limit 1");
+            PricingRule existing = pricingRuleMapper.selectOne(qw);
+
+            if (existing != null) {
+                // 鏇存柊
+                existing.setFieldB(item.getUnitPrice());
+                existing.setUpdateTime(now);
+                pricingRuleMapper.updateById(existing);
+            } else {
+                // 鏂板缓
+                PricingRule rule = new PricingRule();
+                rule.setType(Constants.ZERO);
+                rule.setFieldA(String.valueOf(item.getCategoryId()));
+                rule.setFieldB(item.getUnitPrice());
+                rule.setCityId(request.getCityId());
+                rule.setDeleted(Constants.ZERO);
+                rule.setCreateTime(now);
+                rule.setUpdateTime(now);
+                pricingRuleMapper.insert(rule);
+            }
+        }
+    }
+
+    @Override
+    public List<LocalStoragePricingVO> listLocalStoragePricing(Integer cityId) {
+        // 1. 鏌ヨ鎵�鏈� Category type=4, deleted=0
+        Category categoryQuery = new Category();
+        categoryQuery.setType(Constants.FOUR);
+        categoryQuery.setDeleted(Constants.ZERO);
+        List<Category> allCategories = categoryMapper.selectList(new QueryWrapper<>(categoryQuery));
+        Map<Integer, String> categoryNameMap = allCategories.stream()
+                .collect(Collectors.toMap(Category::getId, Category::getName));
+
+        // 2. 鏌ヨ宸叉湁瑙勫垯
+        QueryWrapper<PricingRule> qw = new QueryWrapper<>();
+        qw.lambda()
+                .eq(PricingRule::getType, Constants.ZERO)
+                .eq(PricingRule::getCityId, cityId)
+                .eq(PricingRule::getDeleted, Constants.ZERO);
+        List<PricingRule> rules = pricingRuleMapper.selectList(qw);
+        Map<String, PricingRule> existingMap = rules.stream()
+                .collect(Collectors.toMap(PricingRule::getFieldA, r -> r));
+
+        // 3. 鍩轰簬鎵�鏈夊垎绫荤粍瑁� VO锛屾棤瑙勫垯鍒欒繑鍥炵┖璁板綍
+        return allCategories.stream().map(category -> {
+            LocalStoragePricingVO vo = new LocalStoragePricingVO();
+            vo.setCategoryId(category.getId());
+            vo.setCategoryName(category.getName());
+            vo.setCityId(cityId);
+
+            PricingRule rule = existingMap.get(String.valueOf(category.getId()));
+            if (rule != null) {
+                vo.setPricingRuleId(rule.getId());
+                vo.setUnitPrice(rule.getFieldB());
+            }
+            return vo;
+        }).collect(Collectors.toList());
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void batchSaveRemoteDeliveryPricing(RemoteDeliveryPricingSaveDTO request) {
+        // 鏍¢獙鍒嗙被鏁版嵁瀹屾暣鎬�
+        Set<Integer> requestCategoryIds = request.getItems().stream()
+                .map(RemoteDeliveryPricingItemDTO::getCategoryId)
+                .collect(Collectors.toSet());
+        Map<Integer, String> categoryMap = validateCategoryType4(requestCategoryIds);
+
+        // 閫愰」 upsert
+        Date now = new Date();
+        for (RemoteDeliveryPricingItemDTO item : request.getItems()) {
+            QueryWrapper<PricingRule> qw = new QueryWrapper<>();
+            qw.lambda()
+                    .eq(PricingRule::getType, Constants.ONE)
+                    .eq(PricingRule::getFieldA, String.valueOf(item.getCategoryId()))
+                    .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.getStartPrice());
+                existing.setFieldD(item.getExtraDistance());
+                existing.setFieldE(item.getExtraPrice());
+                existing.setUpdateTime(now);
+                pricingRuleMapper.updateById(existing);
+            } else {
+                PricingRule rule = new PricingRule();
+                rule.setType(Constants.ONE);
+                rule.setFieldA(String.valueOf(item.getCategoryId()));
+                rule.setFieldB(item.getStartDistance());
+                rule.setFieldC(item.getStartPrice());
+                rule.setFieldD(item.getExtraDistance());
+                rule.setFieldE(item.getExtraPrice());
+                rule.setCityId(request.getCityId());
+                rule.setDeleted(Constants.ZERO);
+                rule.setCreateTime(now);
+                rule.setUpdateTime(now);
+                pricingRuleMapper.insert(rule);
+            }
+        }
+    }
+
+    @Override
+    public List<RemoteDeliveryPricingVO> listRemoteDeliveryPricing(Integer cityId) {
+        // 1. 鏌ヨ鎵�鏈� Category type=4, deleted=0
+        Category categoryQuery = new Category();
+        categoryQuery.setType(Constants.FOUR);
+        categoryQuery.setDeleted(Constants.ZERO);
+        List<Category> allCategories = categoryMapper.selectList(new QueryWrapper<>(categoryQuery));
+        Map<Integer, String> categoryNameMap = allCategories.stream()
+                .collect(Collectors.toMap(Category::getId, Category::getName));
+
+        // 2. 鏌ヨ宸叉湁瑙勫垯
+        QueryWrapper<PricingRule> qw = new QueryWrapper<>();
+        qw.lambda()
+                .eq(PricingRule::getType, Constants.ONE)
+                .eq(PricingRule::getCityId, cityId)
+                .eq(PricingRule::getDeleted, Constants.ZERO);
+        List<PricingRule> rules = pricingRuleMapper.selectList(qw);
+        Map<String, PricingRule> existingMap = rules.stream()
+                .collect(Collectors.toMap(PricingRule::getFieldA, r -> r));
+
+        // 3. 鍩轰簬鎵�鏈夊垎绫荤粍瑁� VO锛屾棤瑙勫垯鍒欒繑鍥炵┖璁板綍
+        return allCategories.stream().map(category -> {
+            RemoteDeliveryPricingVO vo = new RemoteDeliveryPricingVO();
+            vo.setCategoryId(category.getId());
+            vo.setCategoryName(category.getName());
+            vo.setCityId(cityId);
+
+            PricingRule rule = existingMap.get(String.valueOf(category.getId()));
+            if (rule != null) {
+                vo.setPricingRuleId(rule.getId());
+                vo.setStartDistance(rule.getFieldB());
+                vo.setStartPrice(rule.getFieldC());
+                vo.setExtraDistance(rule.getFieldD());
+                vo.setExtraPrice(rule.getFieldE());
+            }
+            return vo;
+        }).collect(Collectors.toList());
+    }
+
+    /**
+     * 鏍¢獙璇锋眰涓殑 categoryId 涓庡垎绫昏〃 type=4 鏁版嵁瀹屽叏鍖归厤
+     * @param requestCategoryIds 璇锋眰涓殑 categoryId 闆嗗悎
+     * @return 鍒嗙被琛� id->name 鏄犲皠
+     */
+    private Map<Integer, String> validateCategoryType4(Set<Integer> requestCategoryIds) {
+        Category categoryQuery = new Category();
+        categoryQuery.setType(Constants.FOUR);
+        categoryQuery.setDeleted(Constants.ZERO);
+        List<Category> allType4Categories = categoryMapper.selectList(new QueryWrapper<>(categoryQuery));
+
+        Map<Integer, String> categoryMap = allType4Categories.stream()
+                .collect(Collectors.toMap(Category::getId, Category::getName));
+        Set<Integer> allCategoryIds = categoryMap.keySet();
+
+        // 鏍¢獙锛氳姹備腑瀛樺湪浣嗗垎绫昏〃涓笉瀛樺湪鐨� categoryId
+        List<String> invalidIds = requestCategoryIds.stream()
+                .filter(id -> !allCategoryIds.contains(id))
+                .map(String::valueOf)
+                .collect(Collectors.toList());
+        if (!invalidIds.isEmpty()) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),
+                    "浠ヤ笅鐗╁搧瑙勬牸涓嶅瓨鍦�: " + String.join(", ", invalidIds));
+        }
+
+        // 鏍¢獙锛氬垎绫昏〃涓瓨鍦ㄤ絾璇锋眰涓己澶辩殑 categoryId
+        List<String> missingNames = allCategoryIds.stream()
+                .filter(id -> !requestCategoryIds.contains(id))
+                .map(id -> categoryMap.get(id) + "(" + id + ")")
+                .collect(Collectors.toList());
+        if (!missingNames.isEmpty()) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),
+                    "缂哄皯浠ヤ笅鐗╁搧瑙勬牸鐨勫畾浠烽厤缃�: " + String.join(", ", missingNames));
+        }
+
+        return categoryMap;
+    }
+
+    @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);
+
+        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);
+        }
+    }
+
+    @Override
+    public EstimatedDeliveryVO getEstimatedDelivery(Integer cityId) {
+        QueryWrapper<PricingRule> qw = new QueryWrapper<>();
+        qw.lambda()
+                .eq(PricingRule::getType, Constants.TWO)
+                .eq(PricingRule::getFieldA, "1")
+                .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());
+        }
+        return vo;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void batchSaveStoreDeposit(StoreDepositSaveDTO request) {
+        // 鏍¢獙锛氬繀椤诲寘鍚� fieldType=0(浼佷笟) 鍜� fieldType=1(涓汉) 鍚勪竴鏉�
+        Set<Integer> fieldTypes = request.getItems().stream()
+                .map(StoreDepositItemDTO::getFieldType)
+                .collect(Collectors.toSet());
+        if (!fieldTypes.contains(Constants.ZERO) || !fieldTypes.contains(Constants.ONE)) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),
+                    "蹇呴』鍖呭惈浼佷笟(0)鍜屼釜浜�(1)涓ゆ潯鏁版嵁");
+        }
+        if (request.getItems().size() != 2) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),
+                    "鏈変笖浠呮湁2鏉℃暟鎹�");
+        }
+
+        Date now = new Date();
+        for (StoreDepositItemDTO item : request.getItems()) {
+            QueryWrapper<PricingRule> qw = new QueryWrapper<>();
+            qw.lambda()
+                    .eq(PricingRule::getType, Constants.THREE)
+                    .eq(PricingRule::getFieldA, String.valueOf(item.getFieldType()))
+                    .eq(PricingRule::getCityId, request.getCityId())
+                    .eq(PricingRule::getDeleted, Constants.ZERO)
+                    .last("limit 1");
+            PricingRule existing = pricingRuleMapper.selectOne(qw);
+
+            if (existing != null) {
+                existing.setFieldB(item.getDepositAmount());
+                existing.setUpdateTime(now);
+                pricingRuleMapper.updateById(existing);
+            } else {
+                PricingRule rule = new PricingRule();
+                rule.setType(Constants.THREE);
+                rule.setFieldA(String.valueOf(item.getFieldType()));
+                rule.setFieldB(item.getDepositAmount());
+                rule.setCityId(request.getCityId());
+                rule.setDeleted(Constants.ZERO);
+                rule.setCreateTime(now);
+                rule.setUpdateTime(now);
+                pricingRuleMapper.insert(rule);
+            }
+        }
+    }
+
+    @Override
+    public List<StoreDepositVO> listStoreDeposit(Integer cityId) {
+        // 鏌ヨ宸叉湁瑙勫垯
+        QueryWrapper<PricingRule> qw = new QueryWrapper<>();
+        qw.lambda()
+                .eq(PricingRule::getType, Constants.THREE)
+                .eq(PricingRule::getCityId, cityId)
+                .eq(PricingRule::getDeleted, Constants.ZERO);
+        List<PricingRule> rules = pricingRuleMapper.selectList(qw);
+
+        // 鏋勫缓宸插瓨鍦ㄦ暟鎹殑鏄犲皠 fieldA -> rule
+        Map<String, PricingRule> existingMap = rules.stream()
+                .collect(Collectors.toMap(PricingRule::getFieldA, r -> r));
+
+        // 鍥哄畾杩斿洖2鏉★細浼佷笟(0)銆佷釜浜�(1)
+        List<StoreDepositVO> result = new ArrayList<>();
+        String[] typeNames = {"浼佷笟", "涓汉"};
+        for (int i = 0; i <= 1; i++) {
+            StoreDepositVO vo = new StoreDepositVO();
+            vo.setFieldType(i);
+            vo.setFieldTypeName(typeNames[i]);
+            vo.setCityId(cityId);
+
+            PricingRule rule = existingMap.get(String.valueOf(i));
+            if (rule != null) {
+                vo.setPricingRuleId(rule.getId());
+                vo.setDepositAmount(rule.getFieldB());
+            }
+            result.add(vo);
+        }
+        return result;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void batchSaveRevenueShare(RevenueShareSaveDTO request) {
+        // 鏍¢獙锛氬繀椤诲寘鍚� fieldType 0-4 鍚勪竴鏉�
+        Set<Integer> fieldTypes = request.getItems().stream()
+                .map(RevenueShareItemDTO::getFieldType)
+                .collect(Collectors.toSet());
+        if (fieldTypes.size() != Constants.FIVE) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),
+                    "蹇呴』鍖呭惈浼佷笟瀵�(0)銆佷釜浜哄瘎(1)銆佷紒涓氬彇(2)銆佷釜浜哄彇(3)銆侀厤閫佸憳(4)鍏�5鏉℃暟鎹�");
+        }
+        for (int i = 0; i <= Constants.FOUR; i++) {
+            if (!fieldTypes.contains(i)) {
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),
+                        "缂哄皯绫诲瀷" + i + "鐨勬暟鎹�");
+            }
+        }
+
+        Date now = new Date();
+        for (RevenueShareItemDTO item : request.getItems()) {
+            QueryWrapper<PricingRule> qw = new QueryWrapper<>();
+            qw.lambda()
+                    .eq(PricingRule::getType, Constants.FOUR)
+                    .eq(PricingRule::getFieldA, String.valueOf(item.getFieldType()))
+                    .eq(PricingRule::getCityId, request.getCityId())
+                    .eq(PricingRule::getDeleted, Constants.ZERO)
+                    .last("limit 1");
+            PricingRule existing = pricingRuleMapper.selectOne(qw);
+
+            if (existing != null) {
+                existing.setFieldB(item.getRatio());
+                existing.setUpdateTime(now);
+                pricingRuleMapper.updateById(existing);
+            } else {
+                PricingRule rule = new PricingRule();
+                rule.setType(Constants.FOUR);
+                rule.setFieldA(String.valueOf(item.getFieldType()));
+                rule.setFieldB(item.getRatio());
+                rule.setCityId(request.getCityId());
+                rule.setDeleted(Constants.ZERO);
+                rule.setCreateTime(now);
+                rule.setUpdateTime(now);
+                pricingRuleMapper.insert(rule);
+            }
+        }
+    }
+
+    @Override
+    public List<RevenueShareVO> listRevenueShare(Integer cityId) {
+        // 鏌ヨ宸叉湁瑙勫垯
+        QueryWrapper<PricingRule> qw = new QueryWrapper<>();
+        qw.lambda()
+                .eq(PricingRule::getType, Constants.FOUR)
+                .eq(PricingRule::getCityId, cityId)
+                .eq(PricingRule::getDeleted, Constants.ZERO);
+        List<PricingRule> rules = pricingRuleMapper.selectList(qw);
+
+        // 鏋勫缓宸插瓨鍦ㄦ暟鎹殑鏄犲皠 fieldA -> rule
+        Map<String, PricingRule> existingMap = rules.stream()
+                .collect(Collectors.toMap(PricingRule::getFieldA, r -> r));
+
+        // 鍥哄畾杩斿洖5鏉★細浼佷笟瀵�(0)銆佷釜浜哄瘎(1)銆佷紒涓氬彇(2)銆佷釜浜哄彇(3)銆侀厤閫佸憳(4)
+        List<RevenueShareVO> result = new ArrayList<>();
+        String[] typeNames = {"浼佷笟瀵�", "涓汉瀵�", "浼佷笟鍙�", "涓汉鍙�", "閰嶉�佸憳"};
+        for (int i = 0; i <= Constants.FOUR; i++) {
+            RevenueShareVO vo = new RevenueShareVO();
+            vo.setFieldType(i);
+            vo.setFieldTypeName(typeNames[i]);
+            vo.setCityId(cityId);
+
+            PricingRule rule = existingMap.get(String.valueOf(i));
+            if (rule != null) {
+                vo.setPricingRuleId(rule.getId());
+                vo.setRatio(rule.getFieldB());
+            }
+            result.add(vo);
+        }
+        return result;
+    }
+
+}
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
new file mode 100644
index 0000000..a69fee6
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java
@@ -0,0 +1,171 @@
+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.ShopInfoMapper;
+import com.doumee.dao.business.model.ShopInfo;
+import com.doumee.service.business.ShopInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 闂ㄥ簵淇℃伅Service瀹炵幇
+ * @author rk
+ * @date 2026/04/08
+ */
+@Service
+public class ShopInfoServiceImpl implements ShopInfoService {
+
+    @Autowired
+    private ShopInfoMapper shopInfoMapper;
+
+    @Override
+    public Integer create(ShopInfo shopInfo) {
+        shopInfoMapper.insert(shopInfo);
+        return shopInfo.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        shopInfoMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(ShopInfo shopInfo) {
+        UpdateWrapper<ShopInfo> deleteWrapper = new UpdateWrapper<>(shopInfo);
+        shopInfoMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        shopInfoMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(ShopInfo shopInfo) {
+        shopInfoMapper.updateById(shopInfo);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<ShopInfo> shopInfos) {
+        if (CollectionUtils.isEmpty(shopInfos)) {
+            return;
+        }
+        for (ShopInfo shopInfo : shopInfos) {
+            this.updateById(shopInfo);
+        }
+    }
+
+    @Override
+    public ShopInfo findById(Integer id) {
+        ShopInfo shopInfo = shopInfoMapper.selectById(id);
+        if (Objects.isNull(shopInfo)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        return shopInfo;
+    }
+
+    @Override
+    public ShopInfo findOne(ShopInfo shopInfo) {
+        QueryWrapper<ShopInfo> wrapper = new QueryWrapper<>(shopInfo);
+        return shopInfoMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<ShopInfo> findList(ShopInfo shopInfo) {
+        QueryWrapper<ShopInfo> wrapper = new QueryWrapper<>(shopInfo);
+        return shopInfoMapper.selectList(wrapper);
+    }
+
+    @Override
+    public PageData<ShopInfo> findPage(PageWrap<ShopInfo> pageWrap) {
+        IPage<ShopInfo> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<ShopInfo> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        pageWrap.getModel().setDeleted(Constants.ZERO);
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(ShopInfo::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getDeleted() != null) {
+            queryWrapper.lambda().eq(ShopInfo::getDeleted, pageWrap.getModel().getDeleted());
+        }
+        if (pageWrap.getModel().getCreateUser() != null) {
+            queryWrapper.lambda().eq(ShopInfo::getCreateUser, pageWrap.getModel().getCreateUser());
+        }
+        if (pageWrap.getModel().getCreateTime() != null) {
+            queryWrapper.lambda().ge(ShopInfo::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateTime()));
+            queryWrapper.lambda().le(ShopInfo::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateTime()));
+        }
+        if (pageWrap.getModel().getUpdateUser() != null) {
+            queryWrapper.lambda().eq(ShopInfo::getUpdateUser, pageWrap.getModel().getUpdateUser());
+        }
+        if (pageWrap.getModel().getUpdateTime() != null) {
+            queryWrapper.lambda().ge(ShopInfo::getUpdateTime, Utils.Date.getStart(pageWrap.getModel().getUpdateTime()));
+            queryWrapper.lambda().le(ShopInfo::getUpdateTime, Utils.Date.getEnd(pageWrap.getModel().getUpdateTime()));
+        }
+        if (pageWrap.getModel().getRemark() != null) {
+            queryWrapper.lambda().eq(ShopInfo::getRemark, pageWrap.getModel().getRemark());
+        }
+        if (pageWrap.getModel().getCompanyType() != null) {
+            queryWrapper.lambda().eq(ShopInfo::getCompanyType, pageWrap.getModel().getCompanyType());
+        }
+        if (pageWrap.getModel().getName() != null) {
+            queryWrapper.lambda().like(ShopInfo::getName, pageWrap.getModel().getName());
+        }
+        if (pageWrap.getModel().getTelephone() != null) {
+            queryWrapper.lambda().like(ShopInfo::getTelephone, pageWrap.getModel().getTelephone());
+        }
+        if (pageWrap.getModel().getLinkName() != null) {
+            queryWrapper.lambda().like(ShopInfo::getLinkName, pageWrap.getModel().getLinkName());
+        }
+        if (pageWrap.getModel().getLinkPhone() != null) {
+            queryWrapper.lambda().like(ShopInfo::getLinkPhone, pageWrap.getModel().getLinkPhone());
+        }
+        if (pageWrap.getModel().getAreaId() != null) {
+            queryWrapper.lambda().eq(ShopInfo::getAreaId, pageWrap.getModel().getAreaId());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(ShopInfo::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getAuditTime() != null) {
+            queryWrapper.lambda().ge(ShopInfo::getAuditTime, Utils.Date.getStart(pageWrap.getModel().getAuditTime()));
+            queryWrapper.lambda().le(ShopInfo::getAuditTime, Utils.Date.getEnd(pageWrap.getModel().getAuditTime()));
+        }
+        if (pageWrap.getModel().getAuditUserId() != null) {
+            queryWrapper.lambda().eq(ShopInfo::getAuditUserId, pageWrap.getModel().getAuditUserId());
+        }
+        if (pageWrap.getModel().getOpenid() != null) {
+            queryWrapper.lambda().like(ShopInfo::getOpenid, pageWrap.getModel().getOpenid());
+        }
+        for (PageWrap.SortData sortData : pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(shopInfoMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(ShopInfo shopInfo) {
+        QueryWrapper<ShopInfo> wrapper = new QueryWrapper<>(shopInfo);
+        return shopInfoMapper.selectCount(wrapper);
+    }
+
+}
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
new file mode 100644
index 0000000..9aa71eb
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/service/business/impl/SmsrecordServiceImpl.java
@@ -0,0 +1,159 @@
+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.SmsrecordMapper;
+import com.doumee.dao.business.model.Smsrecord;
+import com.doumee.service.business.SmsrecordService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 鐭俊楠岃瘉鐮丼ervice瀹炵幇
+ * @author rk
+ * @date 2026/04/08
+ */
+@Service
+public class SmsrecordServiceImpl implements SmsrecordService {
+
+    @Autowired
+    private SmsrecordMapper smsrecordMapper;
+
+    @Override
+    public Integer create(Smsrecord smsrecord) {
+        smsrecordMapper.insert(smsrecord);
+        return smsrecord.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        smsrecordMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(Smsrecord smsrecord) {
+        UpdateWrapper<Smsrecord> deleteWrapper = new UpdateWrapper<>(smsrecord);
+        smsrecordMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        smsrecordMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(Smsrecord smsrecord) {
+        smsrecordMapper.updateById(smsrecord);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<Smsrecord> smsrecords) {
+        if (CollectionUtils.isEmpty(smsrecords)) {
+            return;
+        }
+        for (Smsrecord smsrecord : smsrecords) {
+            this.updateById(smsrecord);
+        }
+    }
+
+    @Override
+    public Smsrecord findById(Integer id) {
+        Smsrecord smsrecord = smsrecordMapper.selectById(id);
+        if (Objects.isNull(smsrecord)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        return smsrecord;
+    }
+
+    @Override
+    public Smsrecord findOne(Smsrecord smsrecord) {
+        QueryWrapper<Smsrecord> wrapper = new QueryWrapper<>(smsrecord);
+        return smsrecordMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<Smsrecord> findList(Smsrecord smsrecord) {
+        QueryWrapper<Smsrecord> wrapper = new QueryWrapper<>(smsrecord);
+        return smsrecordMapper.selectList(wrapper);
+    }
+
+    @Override
+    public PageData<Smsrecord> findPage(PageWrap<Smsrecord> pageWrap) {
+        IPage<Smsrecord> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<Smsrecord> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        pageWrap.getModel().setDeleted(Constants.ZERO);
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(Smsrecord::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getDeleted() != null) {
+            queryWrapper.lambda().eq(Smsrecord::getDeleted, pageWrap.getModel().getDeleted());
+        }
+        if (pageWrap.getModel().getCreateUser() != null) {
+            queryWrapper.lambda().eq(Smsrecord::getCreateUser, pageWrap.getModel().getCreateUser());
+        }
+        if (pageWrap.getModel().getCreateTime() != null) {
+            queryWrapper.lambda().ge(Smsrecord::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateTime()));
+            queryWrapper.lambda().le(Smsrecord::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateTime()));
+        }
+        if (pageWrap.getModel().getUpdateUser() != null) {
+            queryWrapper.lambda().eq(Smsrecord::getUpdateUser, pageWrap.getModel().getUpdateUser());
+        }
+        if (pageWrap.getModel().getUpdateTime() != null) {
+            queryWrapper.lambda().ge(Smsrecord::getUpdateTime, Utils.Date.getStart(pageWrap.getModel().getUpdateTime()));
+            queryWrapper.lambda().le(Smsrecord::getUpdateTime, Utils.Date.getEnd(pageWrap.getModel().getUpdateTime()));
+        }
+        if (pageWrap.getModel().getRemark() != null) {
+            queryWrapper.lambda().eq(Smsrecord::getRemark, pageWrap.getModel().getRemark());
+        }
+        if (pageWrap.getModel().getPhone() != null) {
+            queryWrapper.lambda().like(Smsrecord::getPhone, pageWrap.getModel().getPhone());
+        }
+        if (pageWrap.getModel().getContent() != null) {
+            queryWrapper.lambda().like(Smsrecord::getContent, pageWrap.getModel().getContent());
+        }
+        if (pageWrap.getModel().getType() != null) {
+            queryWrapper.lambda().eq(Smsrecord::getType, pageWrap.getModel().getType());
+        }
+        if (pageWrap.getModel().getValidDate() != null) {
+            queryWrapper.lambda().ge(Smsrecord::getValidDate, Utils.Date.getStart(pageWrap.getModel().getValidDate()));
+            queryWrapper.lambda().le(Smsrecord::getValidDate, Utils.Date.getEnd(pageWrap.getModel().getValidDate()));
+        }
+        if (pageWrap.getModel().getCode() != null) {
+            queryWrapper.lambda().eq(Smsrecord::getCode, pageWrap.getModel().getCode());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(Smsrecord::getStatus, pageWrap.getModel().getStatus());
+        }
+        for (PageWrap.SortData sortData : pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(smsrecordMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(Smsrecord smsrecord) {
+        QueryWrapper<Smsrecord> wrapper = new QueryWrapper<>(smsrecord);
+        return smsrecordMapper.selectCount(wrapper);
+    }
+
+}
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 df272ad..eccaa23 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
@@ -62,8 +62,26 @@
     })
     public ApiResponse logOff() {
         String token = this.getRequest().getHeader(JwtTokenUtil.HEADER_KEY);
-        memberService.logOff(token,getMemberId());
+        memberService.logOut(token,getMemberId());
         return  ApiResponse.success("鎿嶄綔鎴愬姛");
     }
 
+    @LoginRequired
+    @ApiOperation(value = "鐢ㄦ埛娉ㄩ攢", notes = "灏忕▼搴忕")
+    @GetMapping("/logOut")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+    })
+    public ApiResponse logOut() {
+        String token = this.getRequest().getHeader(JwtTokenUtil.HEADER_KEY);
+        memberService.logOut(token,getMemberId());
+        return  ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
+
+
+
+
+
+
+
 }
diff --git a/server/web/src/main/java/com/doumee/api/web/DriverInfoApi.java b/server/web/src/main/java/com/doumee/api/web/DriverInfoApi.java
new file mode 100644
index 0000000..95cc355
--- /dev/null
+++ b/server/web/src/main/java/com/doumee/api/web/DriverInfoApi.java
@@ -0,0 +1,82 @@
+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.dto.DriverLoginRequest;
+import com.doumee.dao.dto.DriverRegisterRequest;
+import com.doumee.dao.dto.DriverVerifyRequest;
+import com.doumee.dao.vo.AccountResponse;
+import com.doumee.service.business.DriverInfoService;
+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.*;
+
+/**
+ * 鍙告満楠岃瘉鐮佺櫥褰曟帴鍙�
+ * @author rk
+ * @date 2026/04/08
+ */
+@Api(tags = "鍙告満楠岃瘉鐮佺櫥褰�")
+@Trace(exclude = true)
+@RestController
+@RequestMapping("/web/driverInfo")
+@Slf4j
+public class DriverInfoApi extends ApiController {
+
+    @Autowired
+    private DriverInfoService driverInfoService;
+
+    @Trace
+    @ApiOperation(value = "鍙戦�侀獙璇佺爜", notes = "鍙告満楠岃瘉鐮佺櫥褰�")
+    @GetMapping("/sendCode")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", dataType = "String", name = "telephone", value = "鎵嬫満鍙�", required = true)
+    })
+    public ApiResponse sendCode(@RequestParam String telephone) {
+        driverInfoService.sendRegisterCode(telephone);
+        return ApiResponse.success("楠岃瘉鐮佸彂閫佹垚鍔�");
+    }
+
+    @Trace
+    @ApiOperation(value = "鍙告満楠岃瘉鐮佺櫥褰�", notes = "鎵嬫満鍙�+楠岃瘉鐮侊紝鏃犺处鍙疯嚜鍔ㄦ敞鍐屽苟鐧诲綍")
+    @PostMapping("/register")
+    public ApiResponse<AccountResponse> register(@RequestBody DriverRegisterRequest request) {
+        return ApiResponse.success("娉ㄥ唽鎴愬姛", driverInfoService.register(request));
+    }
+
+    @Trace
+    @ApiOperation(value = "鍙告満鐧诲綍", notes = "鎵嬫満鍙�+瀵嗙爜鐧诲綍")
+    @PostMapping("/login")
+    public ApiResponse<AccountResponse> login(@RequestBody DriverLoginRequest request) {
+        return ApiResponse.success("鐧诲綍鎴愬姛", driverInfoService.login(request));
+    }
+
+    @LoginRequired
+    @Trace
+    @ApiOperation(value = "鎻愪氦瀹炲悕璁よ瘉", notes = "鍒濇鎻愪氦鎴栭┏鍥炲悗淇敼")
+    @PostMapping("/submitVerify")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true)
+    })
+    public ApiResponse submitVerify(@RequestBody DriverVerifyRequest request) {
+        driverInfoService.submitVerify(this.getMemberId(), request);
+        return ApiResponse.success("鎻愪氦鎴愬姛");
+    }
+
+    @LoginRequired
+    @Trace
+    @ApiOperation(value = "鏌ヨ瀹炲悕璁よ瘉璇︽儏", notes = "鍙告満绔煡璇�")
+    @GetMapping("/verifyDetail")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true)
+    })
+    public ApiResponse verifyDetail() {
+        return ApiResponse.success(driverInfoService.getVerifyDetail(this.getMemberId()));
+    }
+
+}
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
index eecd373..c02650b 100644
--- a/server/web/src/main/java/com/doumee/api/web/UserApi.java
+++ b/server/web/src/main/java/com/doumee/api/web/UserApi.java
@@ -43,14 +43,14 @@
     @Autowired
     private MemberService memberService;
 
-    @Autowired
-    private IdentityInfoService identityInfoService;
+//    @Autowired
+//    private IdentityInfoService identityInfoService;
 
-    @Autowired
-    private MemberRevenueService memberRevenueService;
-
-    @Autowired
-    private WithdrawalOrdersService withdrawalOrdersService;
+//    @Autowired
+//    private MemberRevenueService memberRevenueService;
+//
+//    @Autowired
+//    private WithdrawalOrdersService withdrawalOrdersService;
 
 
     @ApiOperation(value = "鑾峰彇绯荤粺閰嶇疆", notes = "灏忕▼搴忕")
@@ -83,80 +83,80 @@
         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 = "灏忕▼搴忕")
+//    @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 = "灏忕▼搴忕")
+//    @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("/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("/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(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));
-    }
+//    @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