From 59b1f0e9967902aa10f5e017d5a0bdfd1b60c9ea Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期三, 29 四月 2026 09:42:45 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 server/services/src/main/java/com/doumee/dao/business/model/ShopInfo.java                       |    3 
 server/services/src/main/java/com/doumee/dao/dto/ChangePasswordDTO.java                         |   26 +
 server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java       |   68 +-
 server/web/src/main/java/com/doumee/api/web/PaymentCallback.java                                |    9 
 server/services/src/main/java/com/doumee/config/wx/WxPayV3Service.java                          |    6 
 server/services/src/main/java/com/doumee/dao/dto/PrinterBindDTO.java                            |   25 +
 server/services/src/main/java/com/doumee/service/business/PrinterInfoService.java               |   37 +
 server/services/src/main/java/com/doumee/service/business/impl/SmsrecordServiceImpl.java        |    4 
 server/services/src/main/java/com/doumee/service/business/ShopInfoService.java                  |   15 
 server/web/src/main/java/com/doumee/api/web/ConfigApi.java                                      |   40 +
 server/services/src/main/java/com/doumee/service/business/impl/PrinterInfoServiceImpl.java      |  118 +++++
 server/services/src/main/java/com/doumee/core/utils/aliyun/AliSmsService.java                   |   32 -
 server/admin/src/main/java/com/doumee/api/business/DriverInfoController.java                    |    4 
 server/services/src/main/java/com/doumee/core/utils/xpyun/XpyunPrintService.java                |  199 +++++++++
 server/admin/src/main/java/com/doumee/api/business/ShopInfoController.java                      |   24 +
 server/services/src/main/java/com/doumee/service/business/impl/AreasServiceImpl.java            |    5 
 server/services/src/main/java/com/doumee/config/jwt/WebMvcConfig.java                           |    4 
 server/services/src/main/java/com/doumee/dao/business/model/DriverInfo.java                     |    6 
 server/services/src/main/java/com/doumee/core/constants/Constants.java                          |   31 
 server/.claude/settings.json                                                                    |   10 
 server/services/src/main/java/com/doumee/dao/business/PrinterInfoMapper.java                    |   12 
 server/services/src/main/java/com/doumee/service/business/impl/AppVersionServiceImpl.java       |   64 --
 server/services/src/main/java/com/doumee/dao/business/model/Category.java                       |    8 
 server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java |   43 +
 server/services/src/main/java/com/doumee/core/utils/xpyun/XpyunResponse.java                    |   18 
 server/admin/src/main/java/com/doumee/api/business/PrinterInfoController.java                   |   84 +++
 server/services/src/main/java/com/doumee/dao/vo/DriverCenterVO.java                             |    3 
 server/services/src/main/java/com/doumee/service/business/AreasService.java                     |    2 
 server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java         |   94 +++
 server/web/src/main/java/com/doumee/api/web/ShopInfoApi.java                                    |    7 
 server/services/src/main/java/com/doumee/dao/business/model/AppVersion.java                     |    5 
 server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java         |   10 
 server/services/src/main/java/com/doumee/dao/business/model/PrinterInfo.java                    |   55 ++
 server/web/src/main/java/com/doumee/api/web/DriverInfoApi.java                                  |    6 
 server/admin/src/main/java/com/doumee/api/business/MemberController.java                        |   15 
 server/services/src/main/java/com/doumee/dao/dto/WithdrawalDTO.java                             |    4 
 server/services/db/db_change.sql                                                                |   31 +
 server/services/src/main/java/com/doumee/dao/business/model/Orders.java                         |   12 
 server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java           |    8 
 server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java           |  152 +++---
 server/services/src/main/java/com/doumee/config/alipay/AlipayFundTransUniTransfer.java          |    4 
 41 files changed, 1,053 insertions(+), 250 deletions(-)

diff --git a/server/.claude/settings.json b/server/.claude/settings.json
new file mode 100644
index 0000000..1003419
--- /dev/null
+++ b/server/.claude/settings.json
@@ -0,0 +1,10 @@
+{
+  "permissions": {
+    "allow": [
+      "WebSearch"
+    ],
+    "additionalDirectories": [
+      "d:\\DouMee\\javaCodeGit\\gtzxinglijicun\\server\\services\\src\\main\\java\\com\\doumee\\core\\utils"
+    ]
+  }
+}
diff --git a/server/admin/src/main/java/com/doumee/api/business/DriverInfoController.java b/server/admin/src/main/java/com/doumee/api/business/DriverInfoController.java
index 32afb96..e83a307 100644
--- a/server/admin/src/main/java/com/doumee/api/business/DriverInfoController.java
+++ b/server/admin/src/main/java/com/doumee/api/business/DriverInfoController.java
@@ -109,9 +109,9 @@
     }
 
     @ApiOperation("淇敼鍙告満鐘舵��")
-    @PostMapping("/changeStatus")
+    @PostMapping("/updateStatus")
     @RequiresPermissions("business:driverInfo:update")
-    public ApiResponse changeStatus(@RequestBody ChangeStatusDTO dto) {
+    public ApiResponse updateStatus(@RequestBody ChangeStatusDTO dto) {
         driverInfoService.changeStatus(dto);
         return ApiResponse.success("鎿嶄綔鎴愬姛");
     }
diff --git a/server/admin/src/main/java/com/doumee/api/business/MemberController.java b/server/admin/src/main/java/com/doumee/api/business/MemberController.java
index 16544ac..b87ce4b 100644
--- a/server/admin/src/main/java/com/doumee/api/business/MemberController.java
+++ b/server/admin/src/main/java/com/doumee/api/business/MemberController.java
@@ -8,6 +8,7 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.Member;
+import com.doumee.dao.dto.ChangeStatusDTO;
 import com.doumee.dao.dto.MemberListQueryDTO;
 import com.doumee.dao.vo.MemberDetailVO;
 import com.doumee.dao.vo.MemberListVO;
@@ -118,4 +119,18 @@
     public ApiResponse<MemberDetailVO> findMemberDetail(@PathVariable Integer id) {
         return ApiResponse.success(memberService.findMemberDetail(id));
     }
+
+    @ApiOperation("淇敼浼氬憳鐘舵��")
+    @PostMapping("/updateStatus")
+    @RequiresPermissions("business:member:update")
+    public ApiResponse updateStatus(@RequestBody ChangeStatusDTO dto) {
+        if (dto.getId() == null || dto.getStatus() == null || (dto.getStatus() != 0 && dto.getStatus() != 1)) {
+            return ApiResponse.failed("鍙傛暟閿欒锛岀姸鎬侊細0=鍚敤锛�1=绂佺敤");
+        }
+        Member member = new Member();
+        member.setId(dto.getId());
+        member.setStatus(dto.getStatus());
+        memberService.updateById(member);
+        return ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
 }
diff --git a/server/admin/src/main/java/com/doumee/api/business/PrinterInfoController.java b/server/admin/src/main/java/com/doumee/api/business/PrinterInfoController.java
new file mode 100644
index 0000000..aafc45e
--- /dev/null
+++ b/server/admin/src/main/java/com/doumee/api/business/PrinterInfoController.java
@@ -0,0 +1,84 @@
+package com.doumee.api.business;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.PrinterInfo;
+import com.doumee.service.business.PrinterInfoService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 鎵撳嵃鏈轰俊鎭�
+ * @author rk
+ * @date 2026/04/28
+ */
+@Api(tags = "鎵撳嵃鏈轰俊鎭�")
+@RestController
+@RequestMapping("/business/printerInfo")
+public class PrinterInfoController extends BaseController {
+
+    @Autowired
+    private PrinterInfoService printerInfoService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:printerInfo:create")
+    public ApiResponse create(@RequestBody PrinterInfo printerInfo) {
+        printerInfo.setCreateUser(this.getLoginUser().getId());
+        return ApiResponse.success(printerInfoService.create(printerInfo));
+    }
+
+    @ApiOperation("鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:printerInfo:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        printerInfoService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:printerInfo: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));
+        }
+        printerInfoService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:printerInfo:update")
+    public ApiResponse updateById(@RequestBody PrinterInfo printerInfo) {
+        printerInfo.setUpdateUser(this.getLoginUser().getId());
+        printerInfoService.updateById(printerInfo);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:printerInfo:query")
+    public ApiResponse<PageData<PrinterInfo>> findPage(@RequestBody PageWrap<PrinterInfo> pageWrap) {
+        return ApiResponse.success(printerInfoService.findPage(pageWrap));
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:printerInfo:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(printerInfoService.findById(id));
+    }
+}
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
index 98989c6..55e0888 100644
--- a/server/admin/src/main/java/com/doumee/api/business/ShopInfoController.java
+++ b/server/admin/src/main/java/com/doumee/api/business/ShopInfoController.java
@@ -9,6 +9,7 @@
 import com.doumee.dao.business.model.ShopInfo;
 import com.doumee.dao.dto.AuditDTO;
 import com.doumee.dao.dto.ChangeStatusDTO;
+import com.doumee.dao.dto.PrinterBindDTO;
 import com.doumee.dao.dto.ResetPasswordDTO;
 import com.doumee.dao.dto.ShopUpdateDTO;
 import com.doumee.dao.vo.ShopDetailVO;
@@ -135,4 +136,27 @@
         return ApiResponse.success("淇敼鎴愬姛");
     }
 
+    @ApiOperation("缁戝畾鎵撳嵃鏈�")
+    @PostMapping("/bindPrinter")
+    @RequiresPermissions("business:shopInfo:update")
+    public ApiResponse bindPrinter(@RequestBody @javax.validation.Valid PrinterBindDTO dto) {
+        shopInfoService.bindPrinter(dto);
+        return ApiResponse.success("缁戝畾鎴愬姛");
+    }
+
+    @ApiOperation("瑙g粦鎵撳嵃鏈�")
+    @PostMapping("/unbindPrinter/{shopId}")
+    @RequiresPermissions("business:shopInfo:update")
+    public ApiResponse unbindPrinter(@PathVariable Integer shopId) {
+        shopInfoService.unbindPrinter(shopId);
+        return ApiResponse.success("瑙g粦鎴愬姛");
+    }
+
+    @ApiOperation("鏌ヨ鎵撳嵃鏈虹姸鎬�")
+    @GetMapping("/printerStatus/{shopId}")
+    @RequiresPermissions("business:shopInfo:query")
+    public ApiResponse queryPrinterStatus(@PathVariable Integer shopId) {
+        return ApiResponse.success(shopInfoService.queryPrinterStatus(shopId));
+    }
+
 }
diff --git a/server/services/db/db_change.sql b/server/services/db/db_change.sql
index de96424..2d5ddb2 100644
--- a/server/services/db/db_change.sql
+++ b/server/services/db/db_change.sql
@@ -5,6 +5,37 @@
 
 
 -- ============================================================
+-- 2026/04/28 APP鐗堟湰鏂囦欢璺緞瀛楀吀
+-- ============================================================
+INSERT INTO `system_dict_data` (`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `DELETED`) VALUES ((SELECT `id` FROM `system_dict` WHERE `code` = 'OSS'), '', 'APP_FILES', 'APP鐗堟湰鏂囦欢璺緞', 0, 0, 1, NOW(), 0);
+
+
+-- ============================================================
+-- 2026/04/28 鎵撳嵃鏈轰俊鎭〃 + 鏉冮檺
+-- ============================================================
+
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:printerInfo: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:printerInfo: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:printerInfo: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:printerInfo:query', '鏌ヨ鎵撳嵃鏈�', '鎵撳嵃鏈轰俊鎭�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
+
+
+-- ============================================================
+-- 2026/04/28 鑺儴浜戞墦鍗版満闆嗘垚锛氶棬搴楄〃澧炲姞鎵撳嵃鏈篠N瀛楁
+-- ============================================================
+ALTER TABLE `shop_info` ADD COLUMN `PRINTER_SN` VARCHAR(64) DEFAULT NULL COMMENT '鑺儴浜戞墦鍗版満SN缂栧彿' AFTER `BUSINESS_TYPE`;
+
+
+-- ============================================================
+-- 2026/04/28 鑺儴浜戞墦鍗版満閰嶇疆瀛楀吀锛堣处鍙蜂俊鎭悗缁墜鍔ㄧ淮鎶ODE鍊硷級
+-- ============================================================
+INSERT INTO `system_dict` (`id`, `code`, `name`, `disabled`, `deleted`) VALUES (106, 'XPYUN_CONFIG', '鑺儴浜戦厤缃�', 0, 0);
+INSERT INTO `system_dict_data` (`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `DELETED`) VALUES (106, '', 'XPYUN_USER', '鑺儴浜戝紑鍙戣�匢D', 0, 0, 1, NOW(), 0);
+INSERT INTO `system_dict_data` (`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `DELETED`) VALUES (106, '', 'XPYUN_USER_KEY', '鑺儴浜戝紑鍙戣�呭瘑閽�', 1, 0, 1, NOW(), 0);
+
+
+-- ============================================================
 -- 2026/04/22 璁㈠崟閫�娆捐〃鏂板閫�娆惧墠璁㈠崟鐘舵�佸瓧娈�
 -- ============================================================
 ALTER TABLE `orders_refund` ADD COLUMN `BEFORE_STATUS` INT NULL DEFAULT NULL COMMENT '閫�娆惧墠璁㈠崟鐘舵��' AFTER `STATUS`;
diff --git a/server/services/src/main/java/com/doumee/config/alipay/AlipayFundTransUniTransfer.java b/server/services/src/main/java/com/doumee/config/alipay/AlipayFundTransUniTransfer.java
index 5202daa..0aafe4e 100644
--- a/server/services/src/main/java/com/doumee/config/alipay/AlipayFundTransUniTransfer.java
+++ b/server/services/src/main/java/com/doumee/config/alipay/AlipayFundTransUniTransfer.java
@@ -75,10 +75,10 @@
         // 璁剧疆鍟嗗渚у敮涓�璁㈠崟鍙�
         data.setOutBizNo(dto.getOutBizNo());
         // 璁剧疆璁㈠崟鎬婚噾棰�
-        data.setTransAmount("1");
+        data.setTransAmount("0.1");
         // 璁剧疆鎻忚堪鐗瑰畾鐨勪笟鍔″満鏅�
         data.setOutBizNo(dto.getOutBizNo());
-        data.setTransAmount(dto.getTransAmount().setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
+//        data.setTransAmount(dto.getTransAmount().setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
         data.setBizScene("DIRECT_TRANSFER");
         // 璁剧疆涓氬姟浜у搧鐮�
         data.setProductCode("TRANS_ACCOUNT_NO_PWD");
diff --git a/server/services/src/main/java/com/doumee/config/jwt/WebMvcConfig.java b/server/services/src/main/java/com/doumee/config/jwt/WebMvcConfig.java
index 289102e..06c4084 100644
--- a/server/services/src/main/java/com/doumee/config/jwt/WebMvcConfig.java
+++ b/server/services/src/main/java/com/doumee/config/jwt/WebMvcConfig.java
@@ -171,10 +171,6 @@
             if(isForbidden == Constants.ONE){
                 throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍟嗘埛宸茬鐢�,璇疯仈绯荤鐞嗗憳");
             }
-            String dbOpenid = dao.queryForObject(" select ifnull(openid,'')  from shop_info where id  = ?", String.class, shopId);
-            if(StringUtils.isBlank(dbOpenid)||!openid.equals(dbOpenid)){
-                throw new BusinessException(ResponseStatus.SHOP_TOKEN_EXCEED_TIME);
-            }
             Integer count = dao.queryForObject("select count(1) from shop_info where id  = ?", Integer.class, shopId);
             if (count != null && count > 0) {
                 request.setAttribute(JwtTokenUtil.SHOP_ID, shop.getId());
diff --git a/server/services/src/main/java/com/doumee/config/wx/WxPayV3Service.java b/server/services/src/main/java/com/doumee/config/wx/WxPayV3Service.java
index 6faab65..2224ae4 100644
--- a/server/services/src/main/java/com/doumee/config/wx/WxPayV3Service.java
+++ b/server/services/src/main/java/com/doumee/config/wx/WxPayV3Service.java
@@ -59,7 +59,7 @@
 
             com.wechat.pay.java.service.payments.jsapi.model.Amount amount =
                     new com.wechat.pay.java.service.payments.jsapi.model.Amount();
-            amount.setTotal(1);//totalCents.intValue());
+            amount.setTotal(totalCents.intValue());
             amount.setCurrency("CNY");
             request.setAmount(amount);
 
@@ -109,8 +109,8 @@
             request.setNotifyUrl(notifyUrl);
 
             AmountReq amount = new AmountReq();
-            amount.setRefund(1L);//refundCents);
-            amount.setTotal(1L);//totalCents);
+            amount.setRefund(refundCents);
+            amount.setTotal(totalCents);
             amount.setCurrency("CNY");
             request.setAmount(amount);
 
diff --git a/server/services/src/main/java/com/doumee/core/constants/Constants.java b/server/services/src/main/java/com/doumee/core/constants/Constants.java
index 478b52a..467cfc2 100644
--- a/server/services/src/main/java/com/doumee/core/constants/Constants.java
+++ b/server/services/src/main/java/com/doumee/core/constants/Constants.java
@@ -88,6 +88,7 @@
     public static final String DRIVER_FILES = "DRIVER_FILES";
     public static final String BANNER_FILES = "BANNER_FILES";
     public static final String ORDERS_FILES = "ORDERS_FILES";
+    public static final String APP_FILES = "APP_FILES";
 
     // 杩愯惀閰嶇疆
     public static final String OPERATION_CONFIG = "OPERATION_CONFIG";
@@ -102,6 +103,12 @@
     public static final String OP_NO_GRAB_NOTIFY_TIME = "NO_GRAB_NOTIFY_TIME";
     public static final String OP_NO_GRAB_NOTIFY_USERS = "NO_GRAB_NOTIFY_USERS";
     public static final String OP_DEFAULT_DELIVERY_RANGE = "DEFAULT_DELIVERY_RANGE";
+
+    // 鑺儴浜戞墦鍗版満閰嶇疆
+    public static final String XPYUN_CONFIG = "XPYUN_CONFIG";
+    public static final String XPYUN_USER = "XPYUN_USER";
+    public static final String XPYUN_USER_KEY = "XPYUN_USER_KEY";
+
     public static boolean WORKORDER_SHE_EMAIL_SENDING = false;
     public static  boolean DEALING_COMPANY_SYNC = false ;
     public static  boolean DEALING_MEMBER_SYNC = false ;
@@ -431,7 +438,7 @@
         waitPay(0, "寰呮敮浠�", new int[]{OrderStatus.waitPay.status}),
         waitDeposit(1, "寰呮牳楠�", new int[]{OrderStatus.waitDeposit.status}),
         waitDeliver(2, "寰呴厤閫�", new int[]{OrderStatus.accepted.status}),
-        waitReceive(3, "寰呮敹璐�", new int[]{ OrderStatus.delivering.status, OrderStatus.arrived.status}),
+        waitReceive(3, "寰呮敹璐�", new int[]{  OrderStatus.arrived.status}),
         finished(4, "宸插畬鎴�", new int[]{OrderStatus.finished.status}),
         refund(5, "鍙栨秷", new int[]{OrderStatus.cancelled.status}),
         home(6, "棣栭〉鏌ヨ", new int[]{OrderStatus.waitPay.status, OrderStatus.waitDeposit.status, OrderStatus.deposited.status
@@ -603,22 +610,22 @@
     @Getter
     @AllArgsConstructor
     public enum SmsNotify {
-        PLATFORM_WAIT_GRAB("SMS_505790009", "骞冲彴绔�-寰呮姠鍗�", "鎮ㄥソ锛岃鍗曪細{orderNo}宸茶秴杩噞time}鍒嗛挓鏃犲徃鏈烘姠鍗曪紝璇峰敖蹇姞鎬ユ淳鍗曪紝閬垮厤瀹㈡埛杩囦箙绛夊緟銆�"),
-        SHOP_REFUNDING("SMS_505900008", "闂ㄥ簵绔�-閫�娆句腑", "琛屾潕璁㈠崟锛歿orderNo}瀹㈡埛宸叉彁浜ら��娆剧敵璇凤紝璇峰敖蹇鐞嗐��"),
-        SHOP_WAIT_VERIFY("SMS_505925004", "闂ㄥ簵绔�-寰呮牳楠�", "鏂拌鏉庤鍗曪細{orderNo}瀹㈡埛宸叉敮浠橈紝璇峰敖蹇牳楠岀敤鎴风墿鍝佷俊鎭��"),
-        DRIVER_REFUNDING("SMS_505795005", "鍙告満绔�-閫�娆句腑", "琛屾潕璁㈠崟锛歿orderNo}鐢ㄦ埛宸叉彁浜ら��娆剧敵璇凤紝璇ヨ鍗曚换鍔″凡鍙栨秷锛岃鍕垮墠寰�銆�"),
-        DRIVER_WAIT_PICKUP("SMS_505650038", "鍙告満绔�-寰呭彇浠�", "鎮ㄥ凡鎶㈠崟鎴愬姛锛岃鍗晎orderNo}锛岃鎸夋椂鍒皗address}鍙栦欢銆�"),
-        MEMBER_CANCELLED("SMS_505605028", "浼氬憳绔�-宸插彇娑�", "鎮ㄧ殑琛屾潕璁㈠崟锛歿orderNo}宸插彇娑堬紝鎰熻阿鎮ㄧ殑鏀寔锛屾杩庝笅娆″啀浼氥��"),
-        MEMBER_REFUNDED("SMS_505920002", "浼氬憳绔�-宸查��娆�", "鎮ㄧ殑琛屾潕璁㈠崟锛歿orderNo}閫�娆惧凡瀹屾垚锛岄噾棰漿money}鍏冨皢鍘熻矾閫�鍥烇紝璇锋敞鎰忔煡鏀躲��"),
-        MEMBER_ARRIVED("SMS_505875004", "浼氬憳绔�-宸查�佽揪", "鎮ㄧ殑琛屾潕璁㈠崟锛歿orderNo}宸查�佸埌{address}锛岃鍙婃椂鍙栦欢锛屽彇浠剁爜锛歿code}銆�"),
-        MEMBER_DELIVERING("SMS_505935002", "浼氬憳绔�-閰嶉�佷腑", "鎮ㄧ殑琛屾潕璁㈠崟锛歿orderNo}宸茬敱鍙告満{name}鍙栦欢锛屾杩愬線鐩殑鍦般��"),
+        PLATFORM_WAIT_GRAB("SMS_505865290", "骞冲彴绔�-寰呮姠鍗�", "鎮ㄥソ锛岃鍗曪細{orderNo}宸茶秴杩噞time}鍒嗛挓鏃犲徃鏈烘姠鍗曪紝璇峰敖蹇姞鎬ユ淳鍗曪紝閬垮厤瀹㈡埛杩囦箙绛夊緟銆�"),
+        SHOP_REFUNDING("SMS_505905263", "闂ㄥ簵绔�-閫�娆句腑", "琛屾潕璁㈠崟锛歿orderNo}瀹㈡埛宸叉彁浜ら��娆剧敵璇凤紝璇峰敖蹇鐞嗐��"),
+        SHOP_WAIT_VERIFY("SMS_505915292", "闂ㄥ簵绔�-寰呮牳楠�", "鏂拌鏉庤鍗曪細{orderNo}瀹㈡埛宸叉敮浠橈紝璇峰敖蹇牳楠岀敤鎴风墿鍝佷俊鎭��"),
+        DRIVER_REFUNDING("SMS_505905264", "鍙告満绔�-閫�娆句腑", "琛屾潕璁㈠崟锛歿orderNo}鐢ㄦ埛宸叉彁浜ら��娆剧敵璇凤紝璇ヨ鍗曚换鍔″凡鍙栨秷锛岃鍕垮墠寰�銆�"),
+        DRIVER_WAIT_PICKUP("SMS_505960277", "鍙告満绔�-寰呭彇浠�", "鎮ㄥ凡鎶㈠崟鎴愬姛锛岃鍗晎orderNo}锛岃鎸夋椂鍒皗address}鍙栦欢銆�"),
+        MEMBER_CANCELLED("SMS_505615328", "浼氬憳绔�-宸插彇娑�", "鎮ㄧ殑琛屾潕璁㈠崟锛歿orderNo}宸插彇娑堬紝鎰熻阿鎮ㄧ殑鏀寔锛屾杩庝笅娆″啀浼氥��"),
+        MEMBER_REFUNDED("SMS_505850299", "浼氬憳绔�-宸查��娆�", "鎮ㄧ殑琛屾潕璁㈠崟锛歿orderNo}閫�娆惧凡瀹屾垚锛岄噾棰漿money}鍏冨皢鍘熻矾閫�鍥烇紝璇锋敞鎰忔煡鏀躲��"),
+        MEMBER_ARRIVED("SMS_505645328", "浼氬憳绔�-宸查�佽揪", "鎮ㄧ殑琛屾潕璁㈠崟锛歿orderNo}宸查�佸埌{address}锛岃鍙婃椂鍙栦欢锛屽彇浠剁爜锛歿code}銆�"),
+        MEMBER_DELIVERING("SMS_505715321", "浼氬憳绔�-閰嶉�佷腑", "鎮ㄧ殑琛屾潕璁㈠崟锛歿orderNo}宸茬敱鍙告満{name}鍙栦欢锛屾杩愬線鐩殑鍦般��"),
         VERIFY_CODE("SMS_333770877", "楠岃瘉鐮佺煭淇�", "鎮ㄧ殑楠岃瘉鐮佷负锛歿code}锛岃鍕挎硠闇蹭簬浠栦汉锛�"),
         DRIVER_AUTH_REJECTED("SMS_505790115", "鍙告満绔�-鍙告満璁よ瘉琚嫆缁�", "灏婃暚鐨剓driver}锛屽緢閬楁喚锛屾偍鐨勫徃鏈鸿璇佹湭閫氳繃瀹℃牳銆傚師鍥狅細{reason}銆傛偍鍙慨鏀硅祫鏂欏悗閲嶆柊鎻愪氦銆�"),
         DRIVER_AUTH_APPROVED("SMS_505885083", "鍙告満绔�-鍙告満璁よ瘉閫氳繃", "灏婃暚鐨剓driver}锛屾伃鍠滄偍宸查�氳繃骞冲彴鍙告満璁よ瘉瀹℃牳銆傛偍鍙櫥褰曞徃鏈虹APP寮�濮嬫帴鍗曪紝閰嶉�佽繃绋嬩腑璇锋敞鎰忓畨鍏紝绁濇偍鎺ュ崟椤哄埄锛�"),
-        DRIVER_URGENT_DISPATCH("SMS_505885082", "鍙告満绔�-鍔犳�ユ淳鍗�", "鎮ㄥソ锛屾偍鏈変竴涓柊鐨勮鏉庤鍗曪紙缂栧彿锛歿orderNo}锛夈�傝捣鐐癸細{address1}锛岀粓鐐癸細{address2}锛岄厤閫佽垂{money1}鍏冿紙鍚姞鎬ヨ垂{money2}鍏冿級銆傝灏藉揩纭璁㈠崟浠诲姟銆�"),
+        DRIVER_URGENT_DISPATCH("SMS_505940293", "鍙告満绔�-鍔犳�ユ淳鍗�", "鎮ㄥソ锛屾偍鏈変竴涓柊鐨勮鏉庤鍗曪紙缂栧彿锛歿orderNo}锛夈�傝捣鐐癸細{address1}锛岀粓鐐癸細{address2}锛岄厤閫佽垂{money1}鍏冿紙鍚姞鎬ヨ垂{money2}鍏冿級銆傝灏藉揩纭璁㈠崟浠诲姟銆�"),
         SHOP_AUTH_REJECTED("SMS_505925106", "闂ㄥ簵绔�-璧勬枡瀹℃牳琚嫆缁�", "寰堥仐鎲撅紝鎮ㄧ殑闂ㄥ簵\"{storeName}\"鏈�氳繃瀹℃牳锛屽師鍥狅細{reason}锛屾偍鍙慨鏀硅祫鏂欏悗閲嶆柊鎻愪氦銆�"),
         SHOP_AUTH_APPROVED_DEPOSIT("SMS_505705111", "闂ㄥ簵绔�-瀹℃牳閫氳繃闇�缂寸撼鎶奸噾", "鎭枩鎮紒鎮ㄧ殑闂ㄥ簵\"{storeName}\"宸查�氳繃鍒濇瀹℃牳銆傝鏀粯鎶奸噾{money}鍏冧互瀹屾垚鍏ラ┗锛屾敮浠樺悗鍗冲彲鐧诲綍闂ㄥ簵鍚庡彴姝e紡鎺ュ崟銆�"),
-        SHOP_AUTH_SUCCESS("SMS_505810110", "闂ㄥ簵绔�-鎴愬姛鍏ラ┗閫氱煡", "鎭枩鎮紒鎮ㄧ殑闂ㄥ簵\"{storeName}\"宸查�氳繃骞冲彴瀹℃牳锛屾寮忓叆椹绘垚鍔熴�傛偍鍙櫥褰曞晢瀹跺悗鍙板紑濮嬫帴鍗曪紝璐﹀彿锛歿phone}锛屽垵濮嬪瘑鐮侊細{password}锛堝缓璁娆$櫥褰曞悗淇敼锛夈��"),
+        SHOP_AUTH_SUCCESS("SMS_505915289", "闂ㄥ簵绔�-鎴愬姛鍏ラ┗閫氱煡", "鎭枩鎮紒鎮ㄧ殑闂ㄥ簵\"{storeName}\"宸查�氳繃骞冲彴瀹℃牳锛屾寮忓叆椹绘垚鍔熴�� 鎮ㄥ彲鐧诲綍鍟嗗鍚庡彴寮�濮嬫帴鍗曪紝璐﹀彿锛氭敞鍐屾墜鏈哄彿锛屽垵濮嬪瘑鐮侊細锛歿password}锛堝缓璁娆$櫥褰曞悗淇敼锛夈��"),
         ;
 
         private final String templateCode;
diff --git a/server/services/src/main/java/com/doumee/core/utils/aliyun/AliSmsService.java b/server/services/src/main/java/com/doumee/core/utils/aliyun/AliSmsService.java
index e18cb9c..d6d889d 100644
--- a/server/services/src/main/java/com/doumee/core/utils/aliyun/AliSmsService.java
+++ b/server/services/src/main/java/com/doumee/core/utils/aliyun/AliSmsService.java
@@ -44,49 +44,33 @@
      * @param templateParam 妯℃澘鍙橀噺json瀛楃涓�
      * @return 澶勭悊缁撴灉
      */
-    public static Boolean sendSms(String phone, String templateCode, String templateParam) {
+    public static String sendSms(String phone, String templateCode, String templateParam) {
         try {
-            //璁剧疆瓒呮椂鏃堕棿-鍙嚜琛岃皟鏁�
             System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
             System.setProperty("sun.net.client.defaultReadTimeout", "10000");
-            //鍒濆鍖朼scClient闇�瑕佺殑鍑犱釜鍙傛暟
-            //鐭俊API浜у搧鍚嶇О锛堢煭淇′骇鍝佸悕鍥哄畾锛屾棤闇�淇敼锛�
             final String product = "Dysmsapi";
-            //鐭俊API浜у搧鍩熷悕锛堟帴鍙e湴鍧�鍥哄畾锛屾棤闇�淇敼锛�
             final String domain = "dysmsapi.aliyuncs.com";
-            //鍒濆鍖朼scClient,鏆傛椂涓嶆敮鎸佸region锛堣鍕夸慨鏀癸級
             IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", ACCESS_KEY_ID, ACCESS_KEY_SECRET);
             DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
             IAcsClient acsClient = new DefaultAcsClient(profile);
-            //缁勮璇锋眰瀵硅薄
             SendSmsRequest request = new SendSmsRequest();
-            //浣跨敤post鎻愪氦
             request.setMethod(MethodType.POST);
-            //蹇呭~:寰呭彂閫佹墜鏈哄彿銆傛敮鎸佷互閫楀彿鍒嗛殧鐨勫舰寮忚繘琛屾壒閲忚皟鐢紝鎵归噺涓婇檺涓�1000涓墜鏈哄彿鐮�,鎵归噺璋冪敤鐩稿浜庡崟鏉¤皟鐢ㄥ強鏃舵�х◢鏈夊欢杩�,楠岃瘉鐮佺被鍨嬬殑鐭俊鎺ㄨ崘浣跨敤鍗曟潯璋冪敤鐨勬柟寮�
             request.setPhoneNumbers(phone);
-            //蹇呭~:鐭俊绛惧悕-鍙湪鐭俊鎺у埗鍙颁腑鎵惧埌
             request.setSignName(SING_NAME);
-            //蹇呭~:鐭俊妯℃澘-鍙湪鐭俊鎺у埗鍙颁腑鎵惧埌
             request.setTemplateCode(templateCode);
-            //鍙��:妯℃澘涓殑鍙橀噺鏇挎崲JSON涓�,濡傛ā鏉垮唴瀹逛负"浜茬埍鐨�${name},鎮ㄧ殑楠岃瘉鐮佷负${code}"鏃讹紝姝ゅ鐨勫�间负
-            //鍙嬫儏鎻愮ず:濡傛灉JSON涓渶瑕佸甫鎹㈣绗�,璇峰弬鐓ф爣鍑嗙殑JSON鍗忚瀵规崲琛岀鐨勮姹�,姣斿鐭俊鍐呭涓寘鍚玕r\n鐨勬儏鍐靛湪JSON涓渶瑕佽〃绀烘垚\\r\n,鍚﹀垯浼氬鑷碕SON鍦ㄦ湇鍔$瑙f瀽澶辫触
             request.setTemplateParam(templateParam);
-            //鍙��-涓婅鐭俊鎵╁睍鐮�(鎵╁睍鐮佸瓧娈垫帶鍒跺湪7浣嶆垨浠ヤ笅锛屾棤鐗规畩闇�姹傜敤鎴疯蹇界暐姝ゅ瓧娈�)
-            //dto.setSmsUpExtendCode("90997");
-            //鍙��:outId涓烘彁渚涚粰涓氬姟鏂规墿灞曞瓧娈�,鏈�缁堝湪鐭俊鍥炴墽娑堟伅涓皢姝ゅ�煎甫鍥炵粰璋冪敤鑰�
-            //dto.setOutId("yourOutId");
-            //璇锋眰澶辫触杩欓噷浼氭姏ClientException寮傚父
             SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
             if (sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {
-                log.info("鐭俊鍙戦�佸唴瀹癸細"+phone + "-" + templateCode + "-" + templateParam + " >>> " + JSON.toJSONString(sendSmsResponse));
-                return true;
+                log.info("鐭俊鍙戦�佹垚鍔燂細phone={}, template={}", phone, templateCode);
+                return null;
             } else {
-                log.error("鐭俊鍙戦�佸唴瀹癸細"+phone + "-" + templateCode + "-" + templateParam + " >>> " + JSON.toJSONString(sendSmsResponse));
+                String error = sendSmsResponse.getCode() + ":" + sendSmsResponse.getMessage();
+                log.error("鐭俊鍙戦�佸け璐ワ細phone={}, template={}, error={}", phone, templateCode, error);
+                return error;
             }
         } catch (Exception e) {
-            e.printStackTrace();
-//            logger.error(e);
+            log.error("鐭俊鍙戦�佸紓甯革細phone={}, template={}, error={}", phone, templateCode, e.getMessage());
+            return e.getMessage();
         }
-        return false;
     }
 }
diff --git a/server/services/src/main/java/com/doumee/core/utils/xpyun/XpyunPrintService.java b/server/services/src/main/java/com/doumee/core/utils/xpyun/XpyunPrintService.java
new file mode 100644
index 0000000..d059d4e
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/core/utils/xpyun/XpyunPrintService.java
@@ -0,0 +1,199 @@
+package com.doumee.core.utils.xpyun;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.core.constants.Constants;
+import com.doumee.core.utils.HttpsUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鑺儴浜戞墦鍗版満API鏈嶅姟
+ */
+@Slf4j
+@Service
+public class XpyunPrintService {
+
+    private static final String BASE_URL = "https://open.xpyun.net/api/openapi/xprinter/";
+
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+
+    /**
+     * 娣诲姞鎵撳嵃鏈�
+     */
+    public XpyunResponse addPrinter(String sn, String name) {
+        JSONObject body = buildBaseRequest();
+        JSONArray printerContent = new JSONArray();
+        JSONObject printer = new JSONObject();
+        printer.put("sn", sn);
+        printer.put("name", name);
+        printerContent.add(printer);
+        body.put("printerContent", printerContent);
+        return callApi("addPrinters", body);
+    }
+
+    /**
+     * 鍒犻櫎鎵撳嵃鏈�
+     */
+    public XpyunResponse deletePrinter(String sn) {
+        JSONObject body = buildBaseRequest();
+        JSONArray snlist = new JSONArray();
+        snlist.add(sn);
+        body.put("snlist", snlist);
+        return callApi("delPrinters", body);
+    }
+
+    /**
+     * 鏌ヨ鎵撳嵃鏈虹姸鎬�
+     */
+    public XpyunResponse queryPrinterStatus(String sn) {
+        JSONObject body = buildBaseRequest();
+        body.put("sn", sn);
+        return callApi("queryPrinterStatus", body);
+    }
+
+    /**
+     * 鎵撳嵃鏍囩
+     */
+    public XpyunResponse printLabel(String sn, String content) {
+        JSONObject body = buildBaseRequest();
+        body.put("sn", sn);
+        body.put("content", content);
+        return callApi("printLabel", body);
+    }
+
+    /**
+     * 鏋勫缓璁㈠崟鏍囩鍐呭 (60mm 脳 60mm = 480 脳 480 dots)
+     *
+     * 甯冨眬:
+     * shopName                   sn/countSn
+     * 璁㈠崟缂栧彿锛歝ode              涓嬪崟鏃堕棿锛歺xx
+     * 鏀朵欢淇℃伅锛氬紶涓夛紙鎵嬫満灏惧彿1234锛�
+     * 璁㈠崟琛屾潕锛�
+     *   琛屾潕绠泵�1 鍙岃偐鍖吤�2
+     * 璁㈠崟澶囨敞
+     *   xxxxxxx
+     */
+    public String buildOrderLabel(String shopName, String orderCode, String createTime,
+                                  String takeUser, String takePhone,
+                                  String goodsInfo, String remark,
+                                  String snLabel) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("<PAGE>");
+        sb.append("<WIDTH>480</WIDTH>");
+        sb.append("<HEIGHT>480</HEIGHT>");
+
+        // 绗�1琛�: shopName 宸︿晶, snLabel 鍙充晶
+        sb.append("<TEXT X=\"8\" Y=\"8\" W=\"320\" H=\"28\" T=\"16\">")
+                .append(escapeXml(shopName)).append("</TEXT>");
+        sb.append("<TEXT X=\"340\" Y=\"8\" W=\"140\" H=\"28\" T=\"14\">")
+                .append(escapeXml(snLabel)).append("</TEXT>");
+
+        // 绗�2琛�: 璁㈠崟缂栧彿 + 涓嬪崟鏃堕棿
+        sb.append("<TEXT X=\"8\" Y=\"44\" W=\"340\" H=\"24\" T=\"13\">")
+                .append("璁㈠崟缂栧彿锛�").append(escapeXml(orderCode)).append("</TEXT>");
+        sb.append("<TEXT X=\"356\" Y=\"44\" W=\"124\" H=\"24\" T=\"13\">")
+                .append(escapeXml(createTime)).append("</TEXT>");
+
+        // 璁㈠崟缂栧彿鏉″舰鐮�
+        sb.append("<C128 X=\"8\" Y=\"72\" W=\"464\" H=\"56\" T=\"")
+                .append(escapeXml(orderCode)).append("\"/>");
+
+        // 绗�4琛�: 鏀朵欢淇℃伅
+        String contactInfo = takeUser != null ? takeUser : "";
+        if (takePhone != null && takePhone.length() >= 4) {
+            contactInfo += "锛堟墜鏈哄熬鍙�" + takePhone.substring(takePhone.length() - 4) + "锛�";
+        }
+        sb.append("<TEXT X=\"8\" Y=\"140\" W=\"464\" H=\"24\" T=\"13\">")
+                .append("鏀朵欢淇℃伅锛�").append(escapeXml(contactInfo)).append("</TEXT>");
+
+        // 绗�5琛�: 璁㈠崟琛屾潕
+        sb.append("<TEXT X=\"8\" Y=\"172\" W=\"464\" H=\"24\" T=\"13\">")
+                .append("璁㈠崟琛屾潕锛�</TEXT>");
+        if (StringUtils.isNotBlank(goodsInfo)) {
+            sb.append("<TEXT X=\"8\" Y=\"200\" W=\"464\" H=\"24\" T=\"12\">")
+                    .append(escapeXml(goodsInfo)).append("</TEXT>");
+        }
+
+        // 璁㈠崟澶囨敞
+        if (StringUtils.isNotBlank(remark)) {
+            sb.append("<TEXT X=\"8\" Y=\"240\" W=\"464\" H=\"24\" T=\"13\">")
+                    .append("璁㈠崟澶囨敞锛�</TEXT>");
+            sb.append("<TEXT X=\"8\" Y=\"268\" W=\"464\" H=\"48\" T=\"12\">")
+                    .append(escapeXml(remark)).append("</TEXT>");
+        }
+
+        sb.append("</PAGE>");
+        return sb.toString();
+    }
+
+    // ========== 绉佹湁鏂规硶 ==========
+
+    private JSONObject buildBaseRequest() {
+        String user = systemDictDataBiz.queryByCode(Constants.XPYUN_CONFIG, Constants.XPYUN_USER).getCode();
+        String userKey = systemDictDataBiz.queryByCode(Constants.XPYUN_CONFIG, Constants.XPYUN_USER_KEY).getCode();
+        long timestamp = System.currentTimeMillis() / 1000;
+        String sign = sha1(user + userKey + timestamp);
+
+        JSONObject body = new JSONObject();
+        body.put("user", user);
+        body.put("timestamp", timestamp);
+        body.put("sign", sign);
+        return body;
+    }
+
+    private XpyunResponse callApi(String endpoint, JSONObject body) {
+        try {
+            String url = BASE_URL + endpoint;
+            String result = HttpsUtil.postJson(url, body.toJSONString());
+            if (result == null) {
+                log.error("鑺儴浜慉PI璋冪敤澶辫触: endpoint={}, 鍝嶅簲涓虹┖", endpoint);
+                XpyunResponse resp = new XpyunResponse();
+                resp.setCode(-1);
+                resp.setMsg("鍝嶅簲涓虹┖");
+                return resp;
+            }
+            return JSON.parseObject(result, XpyunResponse.class);
+        } catch (Exception e) {
+            log.error("鑺儴浜慉PI璋冪敤寮傚父: endpoint={}, error={}", endpoint, e.getMessage(), e);
+            XpyunResponse resp = new XpyunResponse();
+            resp.setCode(-1);
+            resp.setMsg(e.getMessage());
+            return resp;
+        }
+    }
+
+    private static String sha1(String input) {
+        try {
+            MessageDigest md = MessageDigest.getInstance("SHA-1");
+            byte[] digest = md.digest(input.getBytes(StandardCharsets.UTF_8));
+            StringBuilder sb = new StringBuilder();
+            for (byte b : digest) {
+                sb.append(String.format("%02x", b));
+            }
+            return sb.toString();
+        } catch (Exception e) {
+            throw new RuntimeException("SHA-1璁$畻澶辫触", e);
+        }
+    }
+
+    private static String escapeXml(String text) {
+        if (text == null) return "";
+        return text.replace("&", "&amp;")
+                .replace("<", "&lt;")
+                .replace(">", "&gt;")
+                .replace("\"", "&quot;")
+                .replace("'", "&apos;");
+    }
+}
diff --git a/server/services/src/main/java/com/doumee/core/utils/xpyun/XpyunResponse.java b/server/services/src/main/java/com/doumee/core/utils/xpyun/XpyunResponse.java
new file mode 100644
index 0000000..94ef363
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/core/utils/xpyun/XpyunResponse.java
@@ -0,0 +1,18 @@
+package com.doumee.core.utils.xpyun;
+
+import lombok.Data;
+
+/**
+ * 鑺儴浜慉PI鍝嶅簲
+ */
+@Data
+public class XpyunResponse {
+
+    private Integer code;
+
+    private String msg;
+
+    private Object data;
+
+    private Long serverExecutedTime;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/business/PrinterInfoMapper.java b/server/services/src/main/java/com/doumee/dao/business/PrinterInfoMapper.java
new file mode 100644
index 0000000..82b8922
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/business/PrinterInfoMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.doumee.dao.business.model.PrinterInfo;
+import com.github.yulichang.base.MPJBaseMapper;
+
+/**
+ * 鎵撳嵃鏈轰俊鎭疢apper
+ * @author rk
+ * @date 2026/04/28
+ */
+public interface PrinterInfoMapper extends MPJBaseMapper<PrinterInfo> {
+}
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/AppVersion.java b/server/services/src/main/java/com/doumee/dao/business/model/AppVersion.java
index ff34807..e1a5367 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/AppVersion.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/AppVersion.java
@@ -1,6 +1,7 @@
 package com.doumee.dao.business.model;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.doumee.core.annotation.excel.ExcelColumn;
@@ -91,4 +92,8 @@
     @ExcelColumn(name = "鐗堟湰鍙�")
     private Integer versionNum;
 
+    @ApiModelProperty(value = "鍒涘缓浜哄悕绉�")
+    @TableField(exist = false)
+    private String createUserName;
+
 }
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 b77bd52..6193e3a 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
@@ -102,4 +102,12 @@
     @ApiModelProperty(value = "鑷叧鑱斿璞″悕绉�")
     @TableField(exist = false)
     private String relationName;
+
+    @ApiModelProperty(value = "鑷叧鑱斿璞therField")
+    @TableField(exist = false)
+    private String relationOtherField;
+
+    @ApiModelProperty(value = "鑷叧鑱斿璞″娉�")
+    @TableField(exist = false)
+    private String relationRemark;
 }
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/DriverInfo.java b/server/services/src/main/java/com/doumee/dao/business/model/DriverInfo.java
index 8a0f9c1..d7c54ae 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/DriverInfo.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/DriverInfo.java
@@ -111,7 +111,7 @@
     private String unionid;
 
     @ApiModelProperty(value = "瀹℃壒鏃堕棿")
-    @JsonFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date auditTime;
 
     @ApiModelProperty(value = "瀹℃壒浜�", example = "1")
@@ -229,4 +229,8 @@
     @ApiModelProperty(value = "鍖哄幙鍚嶇О")
     private String districtName;
 
+    @TableField(exist = false)
+    @ApiModelProperty(value = "瀹℃壒浜哄悕绉�")
+    private String auditUserName;
+
 }
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/Orders.java b/server/services/src/main/java/com/doumee/dao/business/model/Orders.java
index 916f386..ae1f59d 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/Orders.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/Orders.java
@@ -370,13 +370,13 @@
     private Date platformSmsNotifiedTime;
 
     @TableField(exist = false)
-    @ApiModelProperty(value = "鍒涘缓寮�濮嬫椂闂�(鏌ヨ鐢�)", example = "2026-01-01")
-    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "鍒涘缓寮�濮嬫椂闂�(鏌ヨ鐢�)", example = "2026-01-01 00:00:00")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date createStartTime;
 
     @TableField(exist = false)
-    @ApiModelProperty(value = "鍒涘缓缁撴潫鏃堕棿(鏌ヨ鐢�)", example = "2026-12-31")
-    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "鍒涘缓缁撴潫鏃堕棿(鏌ヨ鐢�)", example = "2026-12-31 23:59:59")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date createEndTime;
 
     @TableField(exist = false)
@@ -443,4 +443,8 @@
     @ApiModelProperty(value = "鍙告満鐢佃瘽锛堝叧鑱旀煡璇級")
     private String driverPhone;
 
+    @TableField(exist = false)
+    @ApiModelProperty(value = "闂ㄥ簵涓婚敭锛堝悓鏃舵煡璇㈠瓨浠�/鍙栦欢闂ㄥ簵锛�")
+    private Integer shopId;
+
 }
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/PrinterInfo.java b/server/services/src/main/java/com/doumee/dao/business/model/PrinterInfo.java
new file mode 100644
index 0000000..d6f16aa
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/business/model/PrinterInfo.java
@@ -0,0 +1,55 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 鎵撳嵃鏈轰俊鎭�
+ * @author rk
+ * @date 2026/04/28
+ */
+@Data
+@ApiModel("鎵撳嵃鏈轰俊鎭�")
+@TableName("`printer_info`")
+public class PrinterInfo {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    private Integer id;
+
+    @ApiModelProperty(value = "鏄惁宸插垹闄� 0鏈垹闄� 1宸插垹闄�")
+    private Integer deleted;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�")
+    private Integer createUser;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    private Date createTime;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�")
+    private Integer updateUser;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鎵撳嵃鏈哄悕绉�")
+    private String name;
+
+    @ApiModelProperty(value = "SN")
+    private String sn;
+
+    @ApiModelProperty(value = "闂ㄥ簵涓婚敭")
+    private Integer shopId;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/ShopInfo.java b/server/services/src/main/java/com/doumee/dao/business/model/ShopInfo.java
index aa6ab19..b93c060 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/ShopInfo.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/ShopInfo.java
@@ -186,6 +186,9 @@
     @ApiModelProperty(value = "闂ㄥ簵钀ヤ笟绫诲瀷锛�0=闈炲叏澶╋紱1=鍏ㄥぉ", example = "0")
     private Integer businessType;
 
+    @ApiModelProperty(value = "鑺儴浜戞墦鍗版満SN缂栧彿")
+    private String printerSn;
+
 
     // 闈炴寔涔呭寲锛氶檮浠跺垪琛�
     @TableField(exist = false)
diff --git a/server/services/src/main/java/com/doumee/dao/dto/ChangePasswordDTO.java b/server/services/src/main/java/com/doumee/dao/dto/ChangePasswordDTO.java
new file mode 100644
index 0000000..529d02f
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/ChangePasswordDTO.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.NotBlank;
+
+/**
+ * 淇敼瀵嗙爜璇锋眰
+ *
+ * @author rk
+ * @date 2026/04/28
+ */
+@Data
+@ApiModel("淇敼瀵嗙爜璇锋眰")
+public class ChangePasswordDTO {
+
+    @NotBlank(message = "鏃у瘑鐮佷笉鑳戒负绌�")
+    @ApiModelProperty(value = "鏃у瘑鐮�", required = true)
+    private String oldPassword;
+
+    @NotBlank(message = "鏂板瘑鐮佷笉鑳戒负绌�")
+    @ApiModelProperty(value = "鏂板瘑鐮�", required = true)
+    private String newPassword;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/PrinterBindDTO.java b/server/services/src/main/java/com/doumee/dao/dto/PrinterBindDTO.java
new file mode 100644
index 0000000..f5a02bc
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/dto/PrinterBindDTO.java
@@ -0,0 +1,25 @@
+package com.doumee.dao.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel("鎵撳嵃鏈虹粦瀹氳姹�")
+public class PrinterBindDTO {
+
+    @ApiModelProperty(value = "闂ㄥ簵ID", required = true)
+    @NotNull(message = "闂ㄥ簵ID涓嶈兘涓虹┖")
+    private Integer shopId;
+
+    @ApiModelProperty(value = "鎵撳嵃鏈篠N缂栧彿", required = true)
+    @NotBlank(message = "鎵撳嵃鏈篠N涓嶈兘涓虹┖")
+    private String printerSn;
+
+    @ApiModelProperty(value = "鎵撳嵃鏈篕EY", required = true)
+    @NotBlank(message = "鎵撳嵃鏈篕EY涓嶈兘涓虹┖")
+    private String printerKey;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/dto/WithdrawalDTO.java b/server/services/src/main/java/com/doumee/dao/dto/WithdrawalDTO.java
index 10b9d97..97a3010 100644
--- a/server/services/src/main/java/com/doumee/dao/dto/WithdrawalDTO.java
+++ b/server/services/src/main/java/com/doumee/dao/dto/WithdrawalDTO.java
@@ -28,4 +28,8 @@
     @NotBlank(message = "鏀粯瀹濇彁鐜拌处鎴蜂笉鑳戒负绌�")
     private String aliAccount;
 
+    @ApiModelProperty(value = "鏀粯瀹濆疄鍚嶅鍚�", required = true)
+    @NotBlank(message = "鏀粯瀹濆疄鍚嶅鍚嶄笉鑳戒负绌�")
+    private String aliName;
+
 }
diff --git a/server/services/src/main/java/com/doumee/dao/vo/DriverCenterVO.java b/server/services/src/main/java/com/doumee/dao/vo/DriverCenterVO.java
index 422938d..929217f 100644
--- a/server/services/src/main/java/com/doumee/dao/vo/DriverCenterVO.java
+++ b/server/services/src/main/java/com/doumee/dao/vo/DriverCenterVO.java
@@ -31,6 +31,9 @@
     @ApiModelProperty(value = "鍙告満瀹氱骇锛�5=S 4=A 3=B 2=C 1=D")
     private Integer driverLevel;
 
+    @ApiModelProperty(value = "鍙告満瀹氱骇鍚嶇О锛歋/A/B/C/D")
+    private String driverLevelName;
+
     @ApiModelProperty(value = "瀹℃牳鐘舵�侊細0=寰呭鎵� 1=瀹℃壒閫氳繃 2=瀹℃壒椹冲洖")
     private Integer auditStatus;
 
diff --git a/server/services/src/main/java/com/doumee/service/business/AreasService.java b/server/services/src/main/java/com/doumee/service/business/AreasService.java
index 4e29e04..6871b4b 100644
--- a/server/services/src/main/java/com/doumee/service/business/AreasService.java
+++ b/server/services/src/main/java/com/doumee/service/business/AreasService.java
@@ -64,6 +64,8 @@
      */
     Areas findById(Integer id);
 
+    Areas getById(Integer id);
+
     /**
      * 鏍规嵁id鍜宼ype鏌ヨ瀵硅薄淇℃伅
      * @param id
diff --git a/server/services/src/main/java/com/doumee/service/business/PrinterInfoService.java b/server/services/src/main/java/com/doumee/service/business/PrinterInfoService.java
new file mode 100644
index 0000000..54cf9f2
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/service/business/PrinterInfoService.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.PrinterInfo;
+
+import java.util.List;
+
+/**
+ * 鎵撳嵃鏈轰俊鎭疭ervice瀹氫箟
+ * @author rk
+ * @date 2026/04/28
+ */
+public interface PrinterInfoService {
+
+    Integer create(PrinterInfo printerInfo);
+
+    void deleteById(Integer id);
+
+    void delete(PrinterInfo printerInfo);
+
+    void deleteByIdInBatch(List<Integer> ids);
+
+    void updateById(PrinterInfo printerInfo);
+
+    void updateByIdInBatch(List<PrinterInfo> printerInfos);
+
+    PrinterInfo findById(Integer id);
+
+    PrinterInfo findOne(PrinterInfo printerInfo);
+
+    List<PrinterInfo> findList(PrinterInfo printerInfo);
+
+    PageData<PrinterInfo> findPage(PageWrap<PrinterInfo> pageWrap);
+
+    long count(PrinterInfo printerInfo);
+}
diff --git a/server/services/src/main/java/com/doumee/service/business/ShopInfoService.java b/server/services/src/main/java/com/doumee/service/business/ShopInfoService.java
index be2b405..35a568e 100644
--- a/server/services/src/main/java/com/doumee/service/business/ShopInfoService.java
+++ b/server/services/src/main/java/com/doumee/service/business/ShopInfoService.java
@@ -219,4 +219,19 @@
      */
     void changePassword(Integer shopId, String oldPassword, String newPassword, String token);
 
+    /**
+     * 缁戝畾鎵撳嵃鏈�
+     */
+    void bindPrinter(com.doumee.dao.dto.PrinterBindDTO dto);
+
+    /**
+     * 瑙g粦鎵撳嵃鏈�
+     */
+    void unbindPrinter(Integer shopId);
+
+    /**
+     * 鏌ヨ鎵撳嵃鏈虹姸鎬�
+     */
+    Object queryPrinterStatus(Integer shopId);
+
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/AppVersionServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/AppVersionServiceImpl.java
index 814ee65..28b7b42 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/AppVersionServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/AppVersionServiceImpl.java
@@ -13,6 +13,7 @@
 import com.doumee.dao.business.AppVersionMapper;
 import com.doumee.dao.business.model.AppVersion;
 import com.doumee.service.business.AppVersionService;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -108,55 +109,30 @@
     @Override
     public PageData<AppVersion> findPage(PageWrap<AppVersion> pageWrap) {
         IPage<AppVersion> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
-        QueryWrapper<AppVersion> queryWrapper = new QueryWrapper<>();
-        Utils.MP.blankToNull(pageWrap.getModel());
-        pageWrap.getModel().setDeleted(Constants.ZERO);
-        if (pageWrap.getModel().getId() != null) {
-            queryWrapper.lambda().eq(AppVersion::getId, pageWrap.getModel().getId());
+        MPJLambdaWrapper<AppVersion> wrapper = new MPJLambdaWrapper<>();
+        wrapper.selectAll(AppVersion.class)
+                .select("su.REALNAME as createUserName")
+                .leftJoin("system_user su on su.ID = t.CREATE_USER")
+                .eq(AppVersion::getDeleted, Constants.ZERO);
+        AppVersion model = pageWrap.getModel();
+        Utils.MP.blankToNull(model);
+        if (model.getVersionInfo() != null) {
+            wrapper.like(AppVersion::getVersionInfo, model.getVersionInfo());
         }
-        if (pageWrap.getModel().getDeleted() != null) {
-            queryWrapper.lambda().eq(AppVersion::getDeleted, pageWrap.getModel().getDeleted());
+        if (model.getName() != null) {
+            wrapper.like(AppVersion::getName, model.getName());
         }
-        if (pageWrap.getModel().getCreateUser() != null) {
-            queryWrapper.lambda().eq(AppVersion::getCreateUser, pageWrap.getModel().getCreateUser());
+        if (model.getTitle() != null) {
+            wrapper.like(AppVersion::getTitle, model.getTitle());
         }
-        if (pageWrap.getModel().getCreateTime() != null) {
-            queryWrapper.lambda().ge(AppVersion::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateTime()));
-            queryWrapper.lambda().le(AppVersion::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateTime()));
+        if (model.getIsForce() != null) {
+            wrapper.eq(AppVersion::getIsForce, model.getIsForce());
         }
-        if (pageWrap.getModel().getUpdateUser() != null) {
-            queryWrapper.lambda().eq(AppVersion::getUpdateUser, pageWrap.getModel().getUpdateUser());
+        if (model.getType() != null) {
+            wrapper.eq(AppVersion::getType, model.getType());
         }
-        if (pageWrap.getModel().getUpdateTime() != null) {
-            queryWrapper.lambda().ge(AppVersion::getUpdateTime, Utils.Date.getStart(pageWrap.getModel().getUpdateTime()));
-            queryWrapper.lambda().le(AppVersion::getUpdateTime, Utils.Date.getEnd(pageWrap.getModel().getUpdateTime()));
-        }
-        if (pageWrap.getModel().getRemark() != null) {
-            queryWrapper.lambda().eq(AppVersion::getRemark, pageWrap.getModel().getRemark());
-        }
-        if (pageWrap.getModel().getVersionInfo() != null) {
-            queryWrapper.lambda().like(AppVersion::getVersionInfo, pageWrap.getModel().getVersionInfo());
-        }
-        if (pageWrap.getModel().getName() != null) {
-            queryWrapper.lambda().like(AppVersion::getName, pageWrap.getModel().getName());
-        }
-        if (pageWrap.getModel().getTitle() != null) {
-            queryWrapper.lambda().like(AppVersion::getTitle, pageWrap.getModel().getTitle());
-        }
-        if (pageWrap.getModel().getIsForce() != null) {
-            queryWrapper.lambda().eq(AppVersion::getIsForce, pageWrap.getModel().getIsForce());
-        }
-        if (pageWrap.getModel().getType() != null) {
-            queryWrapper.lambda().eq(AppVersion::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(appVersionMapper.selectPage(page, queryWrapper));
+        wrapper.orderByDesc(AppVersion::getId);
+        return PageData.from(appVersionMapper.selectJoinPage(page, AppVersion.class, wrapper));
     }
 
     @Override
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/AreasServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/AreasServiceImpl.java
index 8408aca..fa0eda3 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/AreasServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/AreasServiceImpl.java
@@ -133,6 +133,11 @@
     }
 
     @Override
+    public Areas getById(Integer id) {
+       return areasMapper.selectById(id);
+    }
+
+    @Override
     public Areas findById(Integer id) {
         if(ALL_AREA_LIST!=null){
             for(Areas a : ALL_AREA_LIST){
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
index bf73741..f53c922 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
@@ -252,11 +252,17 @@
                 }
             }
             java.util.Map<Integer, String> relationNameMap = new java.util.HashMap<>();
+            java.util.Map<Integer, String> relationOtherFieldMap = new java.util.HashMap<>();
+            java.util.Map<Integer, String> relationRemarkMap = new java.util.HashMap<>();
             if (!relationIds.isEmpty()) {
                 categoryMapper.selectList(new QueryWrapper<Category>().lambda()
                         .in(Category::getId, relationIds)
                         .eq(Category::getDeleted, Constants.ZERO))
-                        .forEach(c -> relationNameMap.put(c.getId(), c.getName()));
+                        .forEach(c -> {
+                            relationNameMap.put(c.getId(), c.getName());
+                            relationOtherFieldMap.put(c.getId(), c.getOtherField());
+                            relationRemarkMap.put(c.getId(), c.getRemark());
+                        });
             }
             for (Category category:categoryList) {
                 if(StringUtils.isNotBlank(category.getIcon())){
@@ -264,6 +270,8 @@
                 }
                 if (category.getRelationId() != null) {
                     category.setRelationName(relationNameMap.get(category.getRelationId()));
+                    category.setRelationOtherField(relationOtherFieldMap.get(category.getRelationId()));
+                    category.setRelationRemark(relationRemarkMap.get(category.getRelationId()));
                 }
             }
         }
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java
index 6617be5..7d642a5 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java
@@ -34,6 +34,8 @@
 import com.doumee.dao.vo.DriverCancelLimitVO;
 import com.doumee.dao.vo.DriverCenterVO;
 import com.doumee.dao.vo.DriverGrabOrderVO;
+import com.doumee.dao.system.model.SystemUser;
+import com.doumee.service.system.SystemUserService;
 import com.doumee.dao.vo.DriverOrderDetailVO;
 import com.doumee.core.utils.aliyun.AliSmsService;
 import com.doumee.service.business.DriverInfoService;
@@ -115,6 +117,9 @@
 
     @Autowired
     private AreasBizImpl areasBiz;
+
+    @Autowired
+    private SystemUserService systemUserService;
 
     /**
      * 鍙戦�佽鍗曠珯鍐呬俊閫氱煡
@@ -270,13 +275,7 @@
                 .select(" ( select ifnull(sum(r.OPT_TYPE * r.AMOUNT),0) from revenue r where r.MEMBER_TYPE = 1 and r.MEMBER_ID= t.id and r.VAILD_STATUS = 1 ) as memberAmount ")
                 .selectAs(Category::getName,DriverInfo::getCarTypeName)
                 .leftJoin(Category.class, Category::getId,DriverInfo::getCarType);
-        for (PageWrap.SortData sortData : pageWrap.getSorts()) {
-            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
-                queryWrapper.orderByDesc(sortData.getProperty());
-            } else {
-                queryWrapper.orderByAsc(sortData.getProperty());
-            }
-        }
+        queryWrapper.orderByDesc(DriverInfo::getId);
         PageData<DriverInfo> pageData = PageData.from(driverInfoMapper.selectPage(page, queryWrapper));
         for (DriverInfo d : pageData.getRecords()) {
             d.setGender(Constants.getGenderByIdCard(d.getIdcard()));
@@ -301,7 +300,7 @@
         String code = RandomStringUtils.randomNumeric(6);
         // 鍙戦�佺煭淇�
         String templateParam = "{\"code\":\"" + code + "\"}";
-        AliSmsService.sendSms(telephone, "SMS_491325122", templateParam);
+        AliSmsService.sendSms(telephone, Constants.SmsNotify.VERIFY_CODE.getTemplateCode(), templateParam);
         // 淇濆瓨鐭俊璁板綍
         Smsrecord smsrecord = new Smsrecord();
         smsrecord.setDeleted(Constants.ZERO);
@@ -716,6 +715,17 @@
                 }
             }
         }
+        // 鏌ヨ瀹℃壒浜哄悕绉�
+        if (driverInfo.getAuditUser() != null) {
+            try {
+                SystemUser auditUser = systemUserService.findById(driverInfo.getAuditUser());
+                if (auditUser != null) {
+                    driverInfo.setAuditUserName(auditUser.getRealname());
+                }
+            } catch (Exception e) {
+                // 瀹℃壒浜哄凡鍒犻櫎绛夊紓甯稿拷鐣�
+            }
+        }
         return driverInfo;
     }
 
@@ -812,6 +822,7 @@
         vo.setCarCode(driver.getCarCode());
         vo.setScore(driver.getScore() != null ? driver.getScore().toPlainString() : "0");
         vo.setDriverLevel(driver.getDriverLevel());
+        vo.setDriverLevelName(Constants.getDriverLevelName(driver.getDriverLevel()));
         vo.setAuditStatus(driver.getAuditStatus());
         vo.setAuditRemark(driver.getAuditRemark());
         vo.setBalance(driver.getBalance() != null ? driver.getBalance() : 0L);
@@ -823,7 +834,7 @@
             vo.setFullImgUrl(imgPrefix + driver.getImgurl());
         }
 
-        // 浠婃棩棰勮浣i噾锛歳evenue琛ㄤ腑浠婂ぉ鐨勬敹鍏ヨ褰曢噾棰濅箣鍜�
+        // 浠婃棩棰勮浣i噾锛氫粖鏃ユ帴鍗曠殑鍙告満浣i噾 + 骞冲彴濂栧姳閲�
         Date now = new Date();
         Calendar cal = Calendar.getInstance();
         cal.setTime(now);
@@ -833,16 +844,16 @@
         cal.set(Calendar.MILLISECOND, 0);
         Date todayStart = cal.getTime();
 
-        QueryWrapper<Revenue> revenueWrapper = new QueryWrapper<>();
-        revenueWrapper.lambda()
-                .eq(Revenue::getMemberId, memberId)
-                .eq(Revenue::getMemberType, Constants.ONE)
-                .eq(Revenue::getOptType, Constants.ONE)
-                .eq(Revenue::getDeleted, Constants.ZERO)
-                .ge(Revenue::getCreateTime, todayStart);
-        revenueWrapper.select("IFNULL(SUM(AMOUNT),0) as amount");
-        Revenue sumResult = revenueMapper.selectOne(revenueWrapper);
-        vo.setTodayCommission(sumResult != null && sumResult.getAmount() != null ? sumResult.getAmount() : 0L);
+        QueryWrapper<Orders> commissionWrapper = new QueryWrapper<>();
+        commissionWrapper.lambda()
+                .eq(Orders::getAcceptDriver, driver.getId())
+                .eq(Orders::getDeleted, Constants.ZERO)
+                .ge(Orders::getAcceptTime, todayStart);
+        commissionWrapper.select("IFNULL(SUM(DRIVER_FEE),0) as driverFee", "IFNULL(SUM(PLATFORM_REWARD_AMOUNT),0) as platformRewardAmount");
+        Orders commissionResult = ordersMapper.selectOne(commissionWrapper);
+        long driverFee = commissionResult != null && commissionResult.getDriverFee() != null ? commissionResult.getDriverFee() : 0L;
+        long rewardAmount = commissionResult != null && commissionResult.getPlatformRewardAmount() != null ? commissionResult.getPlatformRewardAmount() : 0L;
+        vo.setTodayCommission(driverFee + rewardAmount);
 
         // 浠婃棩鎺ュ崟鏁帮細浠婂ぉ瀹屾垚鐨勮鍗曟暟锛坅cceptDriver=鍙告満涓婚敭锛岀姸鎬�=宸插畬鎴愶級
         Long todayOrderCount = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda()
@@ -966,7 +977,7 @@
                 .select("c2.other_field as c2OtherField")
                 .select("c2.name as goodLevelName")
                 // 鏄惁瀛樺湪鐗瑰ぇ灏哄
-                .select("IF(EXISTS(SELECT 1 FROM orders_detail od JOIN category c3 ON c3.id = od.LUGGAGE_ID AND c3.TYPE = 4 AND c3.OTHER_FIELD = '1' WHERE od.ORDER_ID = t.ID AND od.DELETED = 0), 1, 0) as hasOversized")
+                .select("IF(EXISTS(SELECT 1 FROM orders_detail od JOIN category c3 ON c3.id = od.LUGGAGE_ID AND c3.TYPE = 4 AND c3.detail = '1' WHERE od.ORDER_ID = t.ID AND od.DELETED = 0), 1, 0) as hasOversized")
                 // JOIN
                 .leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID and s1.DELETED = 0")
                 .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID and s2.DELETED = 0")
@@ -1418,6 +1429,7 @@
 
         // 7. 閫氱煡浼氬憳锛氬徃鏈哄凡鎶㈠崟
         sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.WAIT_PICKUP_GRABBED, orderId,
+                "orderNo", order.getCode(),
                 "driverName", driver.getName());
 
         // 閫氱煡瀛樹欢闂ㄥ簵锛氳鍗曞凡鎶㈠崟寰呭彇浠�
@@ -1804,19 +1816,16 @@
             for (int i = 0; i < paramPairs.length - 1; i += 2) {
                 templateParam.put(paramPairs[i], paramPairs[i + 1]);
             }
-            boolean result = AliSmsService.sendSms(phone, smsNotify.getTemplateCode(),
+            String error = AliSmsService.sendSms(phone, smsNotify.getTemplateCode(),
                     templateParam.toJSONString());
-            if (result) {
-                log.info("鐭俊鍙戦�佹垚鍔�: phone={}, template={}", phone, smsNotify.name());
-            } else {
-                log.warn("鐭俊鍙戦�佸け璐�: phone={}, template={}", phone, smsNotify.name());
-            }
-            // 瀛樺偍鐭俊璁板綍
             Smsrecord record = new Smsrecord();
             record.setPhone(phone);
             record.setContent(content);
-            record.setType(Constants.ONE); // 1=璁㈠崟閫氱煡
-            record.setStatus(result ? Constants.ONE : Constants.ZERO);
+            record.setType(Constants.ONE);
+            record.setStatus(error == null ? Constants.ONE : Constants.ZERO);
+            if (error != null) {
+                record.setRemark(error);
+            }
             record.setCreateTime(new Date());
             record.setDeleted(Constants.ZERO);
             smsrecordMapper.insert(record);
@@ -1828,6 +1837,7 @@
                 record.setContent(content);
                 record.setType(Constants.ONE);
                 record.setStatus(Constants.ZERO);
+                record.setRemark(e.getMessage());
                 record.setCreateTime(new Date());
                 record.setDeleted(Constants.ZERO);
                 smsrecordMapper.insert(record);
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 6b5c5cc..415462e 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
@@ -519,13 +519,7 @@
                 queryWrapper.lambda().le(Member::getCreateTime, Utils.Date.getEnd(query.getEndTime()));
             }
         }
-        for (PageWrap.SortData sortData : pageWrap.getSorts()) {
-            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
-                queryWrapper.orderByDesc(sortData.getProperty());
-            } else {
-                queryWrapper.orderByAsc(sortData.getProperty());
-            }
-        }
+        queryWrapper.lambda().orderByDesc(Member::getId);
         IPage<Member> memberPage = memberMapper.selectPage(page, queryWrapper);
         IPage<MemberListVO> voPage = memberPage.convert(this::toListVO);
         return PageData.from(voPage);
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
index aec4757..f087f1c 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
@@ -222,8 +222,8 @@
         queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getDepositShopName()), "s1.name", pageWrap.getModel().getDepositShopName());
         queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getTakeShopName()),  "s2.name",  pageWrap.getModel().getTakeShopName());
         queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getGoodsInfo()), Orders::getGoodsInfo, pageWrap.getModel().getGoodsInfo());
-        queryWrapper.ge(pageWrap.getModel().getCreateStartTime() != null, Orders::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateStartTime()));
-        queryWrapper.le(pageWrap.getModel().getCreateEndTime() != null, Orders::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateEndTime()));
+        queryWrapper.ge(pageWrap.getModel().getCreateStartTime() != null, Orders::getCreateTime, pageWrap.getModel().getCreateStartTime());
+        queryWrapper.le(pageWrap.getModel().getCreateEndTime() != null, Orders::getCreateTime, pageWrap.getModel().getCreateEndTime());
         queryWrapper.eq(pageWrap.getModel().getDepositShopId() != null, Orders::getDepositShopId, pageWrap.getModel().getDepositShopId());
         queryWrapper.eq(pageWrap.getModel().getType() != null, Orders::getType, pageWrap.getModel().getType());
         queryWrapper.eq(pageWrap.getModel().getStatus() != null, Orders::getStatus, pageWrap.getModel().getStatus());
@@ -231,6 +231,9 @@
         queryWrapper.and(pageWrap.getModel().getDriverKeyword() != null, i->i.like(DriverInfo::getName, pageWrap.getModel().getDriverKeyword())
                 .or().like(DriverInfo::getTelephone, pageWrap.getModel().getDriverKeyword()));
         queryWrapper.eq(pageWrap.getModel().getSettlementStatus() != null, Orders::getSettlementStatus, pageWrap.getModel().getSettlementStatus());
+        queryWrapper.eq(pageWrap.getModel().getAcceptDriver() != null, Orders::getAcceptDriver, pageWrap.getModel().getAcceptDriver());
+        queryWrapper.and(pageWrap.getModel().getShopId() != null, i -> i.eq(Orders::getDepositShopId, pageWrap.getModel().getShopId())
+                .or().eq(Orders::getTakeShopId, pageWrap.getModel().getShopId()));
         for (PageWrap.SortData sortData : pageWrap.getSorts()) {
             if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                 queryWrapper.orderByDesc(sortData.getProperty());
@@ -263,8 +266,8 @@
         queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getDepositShopName()), "s1.name", pageWrap.getModel().getDepositShopName());
         queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getTakeShopName()),  "s2.name",  pageWrap.getModel().getTakeShopName());
         queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getGoodsInfo()), Orders::getGoodsInfo, pageWrap.getModel().getGoodsInfo());
-        queryWrapper.ge(pageWrap.getModel().getCreateStartTime() != null, Orders::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateStartTime()));
-        queryWrapper.le(pageWrap.getModel().getCreateEndTime() != null, Orders::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateEndTime()));
+        queryWrapper.ge(pageWrap.getModel().getCreateStartTime() != null, Orders::getCreateTime, pageWrap.getModel().getCreateStartTime());
+        queryWrapper.le(pageWrap.getModel().getCreateEndTime() != null, Orders::getCreateTime, pageWrap.getModel().getCreateEndTime());
         queryWrapper.eq(pageWrap.getModel().getDepositShopId() != null, Orders::getDepositShopId, pageWrap.getModel().getDepositShopId());
         queryWrapper.eq(pageWrap.getModel().getType() != null, Orders::getType, pageWrap.getModel().getType());
         queryWrapper.eq(pageWrap.getModel().getStatus() != null, Orders::getStatus, pageWrap.getModel().getStatus());
@@ -272,6 +275,9 @@
         queryWrapper.and(pageWrap.getModel().getDriverKeyword() != null, i->i.like(DriverInfo::getName, pageWrap.getModel().getDriverKeyword())
                 .or().like(DriverInfo::getTelephone, pageWrap.getModel().getDriverKeyword()));
         queryWrapper.eq(pageWrap.getModel().getSettlementStatus() != null, Orders::getSettlementStatus, pageWrap.getModel().getSettlementStatus());
+        queryWrapper.eq(pageWrap.getModel().getAcceptDriver() != null, Orders::getAcceptDriver, pageWrap.getModel().getAcceptDriver());
+        queryWrapper.and(pageWrap.getModel().getShopId() != null, i -> i.eq(Orders::getDepositShopId, pageWrap.getModel().getShopId())
+                .or().eq(Orders::getTakeShopId, pageWrap.getModel().getShopId()));
 
         queryWrapper.select(
                 "IFNULL(SUM(t.total_amount), 0) as total_amount_sum",
@@ -544,18 +550,26 @@
             insuranceFeeFen = insuranceFeeYuan.multiply(new BigDecimal(100)).longValue();
         }
 
-        // 5. 鍔犳�ヨ垂鐢細鐗╁搧浠锋牸 脳 鍔犳�ョ郴鏁�(瀛楀吀 URGENT_COEFFICIENT)
+        // 5. 鍔犳�ヨ垂鐢細鐗╁搧浠锋牸 脳 (鍔犳�ョ郴鏁�-1)锛屽150%琛ㄧず澧炲姞50%
         long urgentFeeFen = 0L;
         String urgentRateStr = systemDictDataBiz.queryByCode(
                 Constants.OPERATION_CONFIG, Constants.OP_URGENT_COEFFICIENT).getCode();
         BigDecimal urgentRate = new BigDecimal(urgentRateStr);
-        urgentFeeFen = new BigDecimal(itemPriceTotal).multiply(urgentRate)
+        BigDecimal urgentIncreaseRate = urgentRate.subtract(BigDecimal.ONE);
+        urgentFeeFen = new BigDecimal(itemPriceTotal).multiply(urgentIncreaseRate)
                 .setScale(0, RoundingMode.HALF_UP).longValue();
 
         // 6. 鎬讳环鏍� = 鐗╁搧浠锋牸 + 淇濅环璐圭敤 + 鍔犳�ヨ垂鐢紙鍔犳�ユ椂鎵嶅寘鍚姞鎬ヨ垂锛�
         long totalPrice = itemPriceTotal + insuranceFeeFen;
         if (Boolean.TRUE.equals(dto.getUrgent())) {
             totalPrice += urgentFeeFen;
+            // 鍔犳�ユ椂鏇存柊鐗╁搧鏄庣粏鍗曚环鍜屽皬璁�
+            for (ItemPriceVO vo : itemList) {
+                long adjustedUnitPrice = new BigDecimal(vo.getUnitPrice()).multiply(urgentRate)
+                        .setScale(0, RoundingMode.HALF_UP).longValue();
+                vo.setUnitPrice(adjustedUnitPrice);
+                vo.setSubtotal(adjustedUnitPrice * vo.getQuantity());
+            }
         }
 
         PriceCalculateVO result = new PriceCalculateVO();
@@ -830,6 +844,12 @@
         orders.setEstimatedAmount(priceResult.getTotalPrice());
         orders.setTotalAmount(priceResult.getTotalPrice());
         orders.setUrgentAmount(priceResult.getUrgentFee());
+        // 瀛樺偍鍔犳�ョ郴鏁�
+        if (Constants.ONE.equals(dto.getType()) && Constants.ONE.equals(dto.getIsUrgent())) {
+            String urgentRateStr = systemDictDataBiz.queryByCode(
+                    Constants.OPERATION_CONFIG, Constants.OP_URGENT_COEFFICIENT).getCode();
+            orders.setUrgentRata(new BigDecimal(urgentRateStr));
+        }
         if (dto.getDeclaredAmount() != null && dto.getDeclaredAmount().compareTo(BigDecimal.ZERO) > 0) {
             orders.setDeclaredAmount(dto.getDeclaredAmount().multiply(new BigDecimal(100)).longValue());
         } else {
@@ -861,6 +881,13 @@
         orderLogService.create(createLog);
 
         // ========== 7. 鍒涘缓璁㈠崟鏄庣粏 ==========
+        // 寮傚湴瀵勫瓨鏋侀�熻揪鏃讹紝鎸夊姞鎬ユ瘮渚嬭绠楁槑缁嗚鍗曚环
+        BigDecimal urgentIncreaseRate = null;
+        if (Constants.ONE.equals(dto.getType()) && Constants.ONE.equals(dto.getIsUrgent())) {
+            String urgentRateStr = systemDictDataBiz.queryByCode(
+                    Constants.OPERATION_CONFIG, Constants.OP_URGENT_COEFFICIENT).getCode();
+            urgentIncreaseRate = new BigDecimal(urgentRateStr).subtract(BigDecimal.ONE);
+        }
         for (ItemPriceVO itemVO : priceResult.getItemList()) {
             OrdersDetail detail = new OrdersDetail();
             detail.setOrderId(orderId);
@@ -868,11 +895,29 @@
             detail.setLuggageName(itemVO.getCategoryName());
             detail.setLuggageDetail(itemVO.getDetail());
             detail.setNum(itemVO.getQuantity());
-            detail.setUnitPrice(itemVO.getUnitPrice());
+            long detailUnitPrice = itemVO.getUnitPrice();
+            if (urgentIncreaseRate != null) {
+                detailUnitPrice = new BigDecimal(detailUnitPrice)
+                        .multiply(BigDecimal.ONE.add(urgentIncreaseRate))
+                        .setScale(0, RoundingMode.HALF_UP).longValue();
+            }
+            detail.setUnitPrice(detailUnitPrice);
             detail.setStartDistance(itemVO.getStartDistance());
-            detail.setStartPrice(itemVO.getStartPrice());
+            if (urgentIncreaseRate != null && itemVO.getStartPrice() != null) {
+                detail.setStartPrice(new BigDecimal(itemVO.getStartPrice())
+                        .multiply(BigDecimal.ONE.add(urgentIncreaseRate))
+                        .setScale(0, RoundingMode.HALF_UP).longValue());
+            } else {
+                detail.setStartPrice(itemVO.getStartPrice());
+            }
             detail.setExtraDistance(itemVO.getExtraDistance());
-            detail.setExtraPrice(itemVO.getExtraPrice());
+            if (urgentIncreaseRate != null && itemVO.getExtraPrice() != null) {
+                detail.setExtraPrice(new BigDecimal(itemVO.getExtraPrice())
+                        .multiply(BigDecimal.ONE.add(urgentIncreaseRate))
+                        .setScale(0, RoundingMode.HALF_UP).longValue());
+            } else {
+                detail.setExtraPrice(itemVO.getExtraPrice());
+            }
             detail.setLocallyPrice(itemVO.getLocallyPrice());
             detail.setDeleted(Constants.ZERO);
             detail.setCreateTime(now);
@@ -1816,46 +1861,17 @@
             vo.setMemberVerifyCode(order.getMemberVerifyCode());
         }
 
-        // 寮傚湴瀵勫瓨缁忕含搴︼紙灏卞湴瀵勫瓨涓嶈繑鍥烇級
-        if (Constants.ONE.equals(order.getType())) {
-            // status=3(宸叉帴鍗�)锛氳繑鍥炲瓨浠堕棬搴楃粡绾害 + 鍙告満缁忕含搴�
-            if (Constants.equalsInteger(status, Constants.OrderStatus.accepted.getStatus())) {
-                ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId());
-                if (depositShop != null) {
-                    vo.setDepositShopLng(depositShop.getLongitude());
-                    vo.setDepositShopLat(depositShop.getLatitude());
-                }
-                if (order.getAcceptDriver() != null) {
-                    DriverInfo driver = driverInfoMapper.selectById(order.getAcceptDriver());
-                    if (driver != null) {
-                        vo.setDriverLng(driver.getLongitude());
-                        vo.setDriverLat(driver.getLatitude());
-                    }
-                }
-            }
-            // status=4(閰嶉�佷腑)锛氳繑鍥炲彇浠剁偣缁忕含搴� + 鍙告満缁忕含搴�
-            if (Constants.equalsInteger(status, Constants.OrderStatus.delivering.getStatus())) {
-                // 鍙栦欢鐐圭粡绾害锛堜紭鍏堝彇浠堕棬搴楋紝鍚﹀垯璁㈠崟涓婄殑鍙栦欢鍧愭爣锛�
-                if (order.getTakeShopId() != null) {
-                    ShopInfo takeShop = shopInfoMapper.selectById(order.getTakeShopId());
-                    if (takeShop != null) {
-                        vo.setTakeLng(takeShop.getLongitude());
-                        vo.setTakeLat(takeShop.getLatitude());
-                    }
-                } else if (order.getTakeLgt() != null && order.getTakeLat() != null) {
-                    vo.setTakeLng(order.getTakeLgt().doubleValue());
-                    vo.setTakeLat(order.getTakeLat().doubleValue());
-                }
-                if (order.getAcceptDriver() != null) {
-                    DriverInfo driver = driverInfoMapper.selectById(order.getAcceptDriver());
-                    if (driver != null) {
-                        vo.setDriverLng(driver.getLongitude());
-                        vo.setDriverLat(driver.getLatitude());
-                    }
-                }
-            }
+        vo.setDepositShopLng(order.getDepositLgt().doubleValue());
+        vo.setDepositShopLat(order.getDepositLat().doubleValue());
+        // 鍙栦欢鐐圭粡绾害
+        vo.setTakeLng(order.getTakeLgt().doubleValue());
+        vo.setTakeLat(order.getTakeLat().doubleValue());
+        //鍙告満缁忕含搴�
+        DriverInfo driver = driverInfoMapper.selectById(order.getAcceptDriver());
+        if (driver != null) {
+            vo.setDriverLng(driver.getLongitude());
+            vo.setDriverLat(driver.getLatitude());
         }
-
         // 璇勪环淇℃伅
         vo.setCommentStatus(order.getCommentStatus());
         if (Constants.equalsInteger(order.getCommentStatus(), Constants.ONE)) {
@@ -2308,6 +2324,7 @@
     public PayResponse payShopDeposit(Integer memberId) {
         // 1. 鏌ヨ闂ㄥ簵淇℃伅
         ShopInfo shopInfo = shopInfoMapper.selectOne(new QueryWrapper<ShopInfo>().lambda()
+                .eq(ShopInfo::getDeleted,Constants.ZERO)
                 .eq(ShopInfo::getRegionMemberId,memberId));
         if (shopInfo == null) {
             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "闂ㄥ簵涓嶅瓨鍦�");
@@ -2393,14 +2410,13 @@
         sendSmsNotify(shopInfo.getTelephone(),
                 Constants.SmsNotify.SHOP_AUTH_SUCCESS,
                 "storeName", shopInfo.getName(),
-                "phone", shopInfo.getTelephone() != null ? shopInfo.getTelephone() : "",
                 "password", rawPassword);
 
         // 6. 鎶奸噾鏀粯瀹屾垚鍚庯紝鑻ュ煄甯傛湭寮�閫氬垯鑷姩寮�閫�
         if (shopInfo.getAreaId() != null) {
-            Areas shopArea = areasBiz.resolveArea(shopInfo.getAreaId());
+            Areas shopArea = areasService.getById(shopInfo.getAreaId());
             if (shopArea != null && shopArea.getParentId() != null) {
-                Areas cityArea = areasBiz.resolveArea(shopArea.getParentId());
+                Areas cityArea = areasService.getById(shopArea.getParentId());
                 if (cityArea != null && !Constants.equalsInteger(cityArea.getStatus(), Constants.ONE)) {
                     cityArea.setStatus(Constants.ONE);
                     cityArea.setEditDate(now);
@@ -2430,7 +2446,8 @@
                 .eq(Orders::getDeleted, Constants.ZERO)
                 .eq(Orders::getStatus, Constants.OrderStatus.finished.getStatus())
                 .eq(Orders::getSettlementStatus, Constants.ZERO)
-                .le(Orders::getFinishTime, deadline));
+                .le(Orders::getFinishTime, deadline)
+        );
         if (ordersList == null || ordersList.isEmpty()) {
             return;
         }
@@ -2475,7 +2492,7 @@
                 } else if (Constants.equalsInteger(revenue.getMemberType(), Constants.TWO)) {
                     // 闂ㄥ簵锛氶�氳繃 memberId 鏌� ShopInfo(regionMemberId)锛屾洿鏂� balance / totalBalance
                     ShopInfo shop = shopInfoMapper.selectOne(new QueryWrapper<ShopInfo>().lambda()
-                            .eq(ShopInfo::getRegionMemberId, revenue.getMemberId())
+                            .eq(ShopInfo::getId, revenue.getMemberId())
                             .eq(ShopInfo::getDeleted, Constants.ZERO)
                             .last("limit 1"));
                     if (shop != null) {
@@ -3182,8 +3199,8 @@
         // 瀛樹欢闂ㄥ簵鏀剁泭
         if (depositShopFee > 0 && order.getDepositShopId() != null) {
             ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId());
-            if (depositShop != null && depositShop.getRegionMemberId() != null) {
-                revenueMapper.insert(buildRevenue(depositShop.getRegionMemberId(), Constants.TWO,
+            if (depositShop != null && depositShop.getId() != null) {
+                revenueMapper.insert(buildRevenue(depositShop.getId(), Constants.TWO,
                         depositShopFee, orderId, order.getCode()));
             }
         }
@@ -3191,8 +3208,8 @@
         // 鍙栦欢闂ㄥ簵鏀剁泭锛堝紓鍦板瘎瀛樹笖鏈夊彇浠堕棬搴楋級
         if (takeShopFee > 0 && order.getTakeShopId() != null) {
             ShopInfo takeShop = shopInfoMapper.selectById(order.getTakeShopId());
-            if (takeShop != null && takeShop.getRegionMemberId() != null) {
-                revenueMapper.insert(buildRevenue(takeShop.getRegionMemberId(), Constants.TWO,
+            if (takeShop != null && takeShop.getId() != null) {
+                revenueMapper.insert(buildRevenue(takeShop.getId(), Constants.TWO,
                         takeShopFee, orderId, order.getCode()));
             }
         }
@@ -3729,7 +3746,7 @@
         QueryWrapper<Orders> wrapper = new QueryWrapper<>();
         wrapper.eq("MEMBER_ID", memberId)
                 .in("STATUS", 0, 1, 2, 3, 4, 5)
-                .orderByDesc("CREATE_TIME")
+                .orderByAsc("CREATE_TIME")
                 .last("LIMIT 1");
         Orders order = ordersMapper.selectOne(wrapper);
         if (order == null) {
@@ -4061,31 +4078,28 @@
             for (int i = 0; i < paramPairs.length - 1; i += 2) {
                 templateParam.put(paramPairs[i], paramPairs[i + 1]);
             }
-            boolean result = AliSmsService.sendSms(phone, smsNotify.getTemplateCode(),
+            String error = AliSmsService.sendSms(phone, smsNotify.getTemplateCode(),
                     templateParam.toJSONString());
-            if (result) {
-                log.info("鐭俊鍙戦�佹垚鍔�: phone={}, template={}", phone, smsNotify.name());
-            } else {
-                log.warn("鐭俊鍙戦�佸け璐�: phone={}, template={}", phone, smsNotify.name());
-            }
-            // 瀛樺偍鐭俊璁板綍
             Smsrecord record = new Smsrecord();
             record.setPhone(phone);
             record.setContent(content);
-            record.setType(Constants.ONE); // 1=璁㈠崟閫氱煡
-            record.setStatus(result ? Constants.ONE : Constants.ZERO); // 1=宸插彂閫�, 0=鍙戦�佸け璐�
+            record.setType(Constants.ONE);
+            record.setStatus(error == null ? Constants.ONE : Constants.ZERO);
+            if (error != null) {
+                record.setRemark(error);
+            }
             record.setCreateTime(new Date());
             record.setDeleted(Constants.ZERO);
             smsrecordMapper.insert(record);
         } catch (Exception e) {
             log.error("鐭俊鍙戦�佸紓甯�: phone={}, template={}, error={}", phone, smsNotify.name(), e.getMessage());
-            // 寮傚父涔熻褰�
             try {
                 Smsrecord record = new Smsrecord();
                 record.setPhone(phone);
                 record.setContent(content);
                 record.setType(Constants.ONE);
-                record.setStatus(Constants.ZERO); // 鍙戦�佸け璐�
+                record.setStatus(Constants.ZERO);
+                record.setRemark(e.getMessage());
                 record.setCreateTime(new Date());
                 record.setDeleted(Constants.ZERO);
                 smsrecordMapper.insert(record);
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/PrinterInfoServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/PrinterInfoServiceImpl.java
new file mode 100644
index 0000000..05fb6e2
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/service/business/impl/PrinterInfoServiceImpl.java
@@ -0,0 +1,118 @@
+package com.doumee.service.business.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.doumee.core.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.xpyun.XpyunPrintService;
+import com.doumee.core.utils.xpyun.XpyunResponse;
+import com.doumee.dao.business.PrinterInfoMapper;
+import com.doumee.dao.business.model.PrinterInfo;
+import com.doumee.service.business.PrinterInfoService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 鎵撳嵃鏈轰俊鎭疭ervice瀹炵幇
+ * @author rk
+ * @date 2026/04/28
+ */
+@Service
+public class PrinterInfoServiceImpl implements PrinterInfoService {
+
+    @Autowired
+    private PrinterInfoMapper printerInfoMapper;
+
+    @Autowired
+    private XpyunPrintService xpyunPrintService;
+
+    @Override
+    public Integer create(PrinterInfo printerInfo) {
+        if (StringUtils.isBlank(printerInfo.getSn())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鎵撳嵃鏈篠N涓嶈兘涓虹┖");
+        }
+        if (StringUtils.isBlank(printerInfo.getName())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鎵撳嵃鏈哄悕绉颁笉鑳戒负绌�");
+        }
+        XpyunResponse response = xpyunPrintService.addPrinter(printerInfo.getSn(), printerInfo.getName());
+        if (response.getCode() != 0) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鑺儴浜戞坊鍔犳墦鍗版満澶辫触锛�" + response.getMsg());
+        }
+        printerInfoMapper.insert(printerInfo);
+        return printerInfo.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        printerInfoMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(PrinterInfo printerInfo) {
+        printerInfoMapper.delete(new QueryWrapper<>(printerInfo));
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        printerInfoMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(PrinterInfo printerInfo) {
+        printerInfoMapper.updateById(printerInfo);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<PrinterInfo> printerInfos) {
+        if (CollectionUtils.isEmpty(printerInfos)) {
+            return;
+        }
+        for (PrinterInfo printerInfo : printerInfos) {
+            this.updateById(printerInfo);
+        }
+    }
+
+    @Override
+    public PrinterInfo findById(Integer id) {
+        return printerInfoMapper.selectById(id);
+    }
+
+    @Override
+    public PrinterInfo findOne(PrinterInfo printerInfo) {
+        return printerInfoMapper.selectOne(new QueryWrapper<>(printerInfo));
+    }
+
+    @Override
+    public List<PrinterInfo> findList(PrinterInfo printerInfo) {
+        return printerInfoMapper.selectList(new QueryWrapper<>(printerInfo));
+    }
+
+    @Override
+    public PageData<PrinterInfo> findPage(PageWrap<PrinterInfo> pageWrap) {
+        IPage<PrinterInfo> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<PrinterInfo> wrapper = new QueryWrapper<>(pageWrap.getModel());
+        for (PageWrap.SortData sortData : pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                wrapper.orderByDesc(sortData.getProperty());
+            } else {
+                wrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(printerInfoMapper.selectPage(page, wrapper));
+    }
+
+    @Override
+    public long count(PrinterInfo printerInfo) {
+        return printerInfoMapper.selectCount(new QueryWrapper<>(printerInfo));
+    }
+}
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java
index d87fa92..cf7f782 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java
@@ -229,13 +229,7 @@
         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());
-            }
-        }
+        queryWrapper.lambda().orderByDesc(ShopInfo::getId);
         return PageData.from(shopInfoMapper.selectPage(page, queryWrapper));
     }
 
@@ -1094,6 +1088,7 @@
         // 鍙栦欢闂ㄥ簵
         List<Orders> takeSalesOrders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda()
                 .eq(Orders::getDeleted, Constants.ZERO)
+                .eq(Orders::getType,Constants.ONE)
                 .ge(Orders::getCreateTime, startTime)
                 .lt(Orders::getCreateTime, endTime)
                 .eq(Orders::getTakeShopId, shopId));
@@ -1124,19 +1119,27 @@
         vo.setSettlementProfit(depositFee + takeFee);
 
         // 3. 鍦ㄥ簱璁㈠崟鏁�
-        // 3.1 瀛樹欢闂ㄥ簵=鏈棬搴楋紝status in (2宸插瘎瀛�, 5寰呭彇浠�)
-        Long depositStorageCount = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda()
+        // 3.1 灏卞湴璁㈠崟锛氬瓨浠堕棬搴�=鏈棬搴楋紝type=0锛宻tatus in (2宸插瘎瀛�, 5寰呭彇浠�)
+        Long localStorageCount = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda()
                 .eq(Orders::getDeleted, Constants.ZERO)
                 .eq(Orders::getDepositShopId, shopId)
+                .eq(Orders::getType, Constants.ZERO)
                 .in(Orders::getStatus,
                         Constants.OrderStatus.deposited.getStatus(),
                         Constants.OrderStatus.arrived.getStatus()));
-        // 3.2 鍙栦欢闂ㄥ簵=鏈棬搴楋紝status = 5寰呭彇浠�
+        // 3.2 寮傚湴璁㈠崟锛氬瓨浠堕棬搴�=鏈棬搴楋紝type=1锛宻tatus=2宸插瘎瀛�
+        Long remoteStorageCount = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda()
+                .eq(Orders::getDeleted, Constants.ZERO)
+                .eq(Orders::getDepositShopId, shopId)
+                .eq(Orders::getType, Constants.ONE)
+                .eq(Orders::getStatus, Constants.OrderStatus.deposited.getStatus()));
+        // 3.3 鍙栦欢闂ㄥ簵=鏈棬搴楋紝寮傚湴璁㈠崟锛宻tatus = 5寰呭彇浠�
         Long takeStorageCount = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda()
                 .eq(Orders::getDeleted, Constants.ZERO)
+                .eq(Orders::getType,Constants.ONE)
                 .eq(Orders::getTakeShopId, shopId)
                 .eq(Orders::getStatus, Constants.OrderStatus.arrived.getStatus()));
-        vo.setStorageCount(depositStorageCount.intValue() + takeStorageCount.intValue());
+        vo.setStorageCount(localStorageCount.intValue() + remoteStorageCount.intValue() + takeStorageCount.intValue());
 
         return vo;
     }
@@ -1327,10 +1330,12 @@
         if (shopInfo.getCompanyType() == null) {
             return;
         }
+        Areas areas = areasService.findById(shopInfo.getAreaId());
         PricingRule pricingRule = pricingRuleMapper.selectOne(new QueryWrapper<PricingRule>().lambda()
                 .eq(PricingRule::getDeleted, Constants.ZERO)
                 .eq(PricingRule::getType, Constants.THREE)
-                .eq(PricingRule::getFieldA, String.valueOf(shopInfo.getCompanyType()))
+                .eq(PricingRule::getFieldA, String.valueOf(Constants.equalsInteger(shopInfo.getCompanyType(),Constants.ZERO)?Constants.ONE:Constants.ZERO))
+                .eq(PricingRule::getCityId, areas.getParentId())
                 .last("limit 1"));
         if (pricingRule != null && StringUtils.isNotBlank(pricingRule.getFieldB())) {
             shopInfo.setDepositAmount(Long.parseLong(pricingRule.getFieldB()));
@@ -1360,19 +1365,16 @@
             for (int i = 0; i < paramPairs.length - 1; i += 2) {
                 templateParam.put(paramPairs[i], paramPairs[i + 1]);
             }
-            boolean result = AliSmsService.sendSms(phone, smsNotify.getTemplateCode(),
+            String error = AliSmsService.sendSms(phone, smsNotify.getTemplateCode(),
                     templateParam.toJSONString());
-            if (result) {
-                log.info("鐭俊鍙戦�佹垚鍔�: phone={}, template={}", phone, smsNotify.name());
-            } else {
-                log.warn("鐭俊鍙戦�佸け璐�: phone={}, template={}", phone, smsNotify.name());
-            }
-            // 瀛樺偍鐭俊璁板綍
             Smsrecord smsRecord = new Smsrecord();
             smsRecord.setPhone(phone);
             smsRecord.setContent(content);
             smsRecord.setType(Constants.ONE);
-            smsRecord.setStatus(result ? Constants.ONE : Constants.ZERO);
+            smsRecord.setStatus(error == null ? Constants.ONE : Constants.ZERO);
+            if (error != null) {
+                smsRecord.setRemark(error);
+            }
             smsRecord.setCreateTime(new Date());
             smsRecord.setDeleted(Constants.ZERO);
             smsrecordMapper.insert(smsRecord);
@@ -1416,4 +1418,56 @@
         }
     }
 
+    @Autowired
+    private com.doumee.core.utils.xpyun.XpyunPrintService xpyunPrintService;
+
+    @Override
+    public void bindPrinter(com.doumee.dao.dto.PrinterBindDTO dto) {
+        ShopInfo shop = shopInfoMapper.selectById(dto.getShopId());
+        if (shop == null || Constants.equalsInteger(shop.getDeleted(), Constants.ONE)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        // 璋冪敤鑺儴浜戞敞鍐屾墦鍗版満
+        com.doumee.core.utils.xpyun.XpyunResponse resp = xpyunPrintService.addPrinter(
+                dto.getPrinterSn(), shop.getName());
+        if (resp.getCode() != null && resp.getCode() == 0) {
+            log.info("鑺儴浜戞墦鍗版満娉ㄥ唽鎴愬姛: sn={}", dto.getPrinterSn());
+        } else {
+            log.warn("鑺儴浜戞墦鍗版満娉ㄥ唽杩斿洖闈�0: sn={}, code={}, msg={}",
+                    dto.getPrinterSn(), resp.getCode(), resp.getMsg());
+        }
+        // 鏃犺浜戠鏄惁鎴愬姛锛岄兘缁戝畾鍒伴棬搴楋紙鍙悗缁噸璇曚簯绔敞鍐岋級
+        ShopInfo update = new ShopInfo();
+        update.setId(dto.getShopId());
+        update.setPrinterSn(dto.getPrinterSn());
+        shopInfoMapper.updateById(update);
+    }
+
+    @Override
+    public void unbindPrinter(Integer shopId) {
+        ShopInfo shop = shopInfoMapper.selectById(shopId);
+        if (shop == null || Constants.equalsInteger(shop.getDeleted(), Constants.ONE)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        if (StringUtils.isNotBlank(shop.getPrinterSn())) {
+            xpyunPrintService.deletePrinter(shop.getPrinterSn());
+        }
+        ShopInfo update = new ShopInfo();
+        update.setId(shopId);
+        update.setPrinterSn(null);
+        shopInfoMapper.updateById(update);
+    }
+
+    @Override
+    public Object queryPrinterStatus(Integer shopId) {
+        ShopInfo shop = shopInfoMapper.selectById(shopId);
+        if (shop == null || Constants.equalsInteger(shop.getDeleted(), Constants.ONE)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        if (StringUtils.isBlank(shop.getPrinterSn())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ラ棬搴楁湭缁戝畾鎵撳嵃鏈�");
+        }
+        return xpyunPrintService.queryPrinterStatus(shop.getPrinterSn());
+    }
+
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/SmsrecordServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/SmsrecordServiceImpl.java
index 182169c..018e9df 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/SmsrecordServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/SmsrecordServiceImpl.java
@@ -178,8 +178,8 @@
         String digits = Strings.randomNumeric(4);
         //鍙戦�侀獙璇佺爜
         String templateParam = "{\"code\":\"" + digits + "\"}";
-        Boolean result = AliSmsService.sendSms(phone, "SMS_491325122", templateParam);
-        if (!result) {
+        String error = AliSmsService.sendSms(phone, Constants.SmsNotify.VERIFY_CODE.getTemplateCode(), templateParam);
+        if (error != null) {
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "鐭俊鍙戦�佸け璐ワ紝璇风◢鍚庨噸璇�");
         }
         //瀛樺偍鐭俊楠岃瘉鐮�
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java
index cb33c0e..c6e4822 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/WithdrawalOrdersServiceImpl.java
@@ -191,13 +191,8 @@
         if (StringUtils.isNotBlank(pageWrap.getModel().getMemberName())) {
             queryWrapper.like(DriverInfo::getName, pageWrap.getModel().getMemberName());
         }
-        for (PageWrap.SortData sortData : pageWrap.getSorts()) {
-            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
-                queryWrapper.orderByDesc(sortData.getProperty());
-            } else {
-                queryWrapper.orderByAsc(sortData.getProperty());
-            }
-        }
+
+        queryWrapper.orderByDesc(WithdrawalOrders::getId);
         return PageData.from(withdrawalOrdersMapper.selectJoinPage(page, WithdrawalOrders.class, queryWrapper));
     }
 
@@ -285,7 +280,7 @@
                     }
                 } else if (Constants.equalsInteger(order.getMemberType(), Constants.TWO)) {
                     ShopInfo shop = shopInfoMapper.selectOne(new QueryWrapper<ShopInfo>().lambda()
-                            .eq(ShopInfo::getRegionMemberId, order.getMemberId())
+                            .eq(ShopInfo::getId, order.getMemberId())
                             .eq(ShopInfo::getDeleted, Constants.ZERO)
                             .last("limit 1"));
                     if (shop != null) {
@@ -305,7 +300,7 @@
                     }
                 } else if (Constants.equalsInteger(order.getMemberType(), Constants.TWO)) {
                     ShopInfo shop = shopInfoMapper.selectOne(new QueryWrapper<ShopInfo>().lambda()
-                            .eq(ShopInfo::getRegionMemberId, order.getMemberId())
+                            .eq(ShopInfo::getId, order.getMemberId())
                             .eq(ShopInfo::getDeleted, Constants.ZERO)
                             .last("limit 1"));
                     if (shop != null) {
@@ -390,7 +385,7 @@
                 } else if (Constants.equalsInteger(order.getMemberType(), Constants.TWO)) {
                     // 闂ㄥ簵锛氶�氳繃 memberId 鏌� ShopInfo锛岄��鍥� balance
                     ShopInfo shop = shopInfoMapper.selectOne(new QueryWrapper<ShopInfo>().lambda()
-                            .eq(ShopInfo::getRegionMemberId, order.getMemberId())
+                            .eq(ShopInfo::getId, order.getMemberId())
                             .eq(ShopInfo::getDeleted, Constants.ZERO)
                             .last("limit 1"));
                     if (shop != null) {
@@ -490,12 +485,22 @@
         order.setType(Constants.ZERO);
         order.setOutBillNo(billNo);
         order.setAliAccount(dto.getAliAccount());
-        order.setAliName(driver.getAliName());
+        order.setAliName(dto.getAliName());
         order.setDeleted(Constants.ZERO);
         order.setCreateTime(now);
         order.setUpdateTime(now);
         order.setCreateUser(memberId);
         withdrawalOrdersMapper.insert(order);
+        // 鏀粯瀹濊处鎴锋垨濮撳悕鏈夊彉鍖栨椂鏇存柊鍙告満淇℃伅
+        boolean aliChanged = !dto.getAliAccount().equals(driver.getAliAccount())
+                || (dto.getAliName() != null && !dto.getAliName().equals(driver.getAliName()));
+        if (aliChanged) {
+            DriverInfo update = new DriverInfo();
+            update.setId(driver.getId());
+            update.setAliAccount(dto.getAliAccount());
+            update.setAliName(dto.getAliName());
+            driverInfoMapper.updateById(update);
+        }
         // 鍒涘缓鏀嚭 Revenue 璁板綍
         Revenue revenue = new Revenue();
         revenue.setMemberId(memberId);
@@ -535,22 +540,32 @@
                 .eq(ShopInfo::getId, shopId));
         // 鍒涘缓鎻愮幇璁板綍
         WithdrawalOrders order = new WithdrawalOrders();
-        order.setMemberId(shop.getRegionMemberId());
+        order.setMemberId(shop.getId());
         order.setMemberType(Constants.TWO);
         order.setAmount(amountFen);
         order.setStatus(Constants.ZERO);
         order.setType(Constants.ZERO);
         order.setOutBillNo(billNo);
         order.setAliAccount(dto.getAliAccount());
-        order.setAliName(shop.getAliName());
+        order.setAliName(dto.getAliName());
         order.setDeleted(Constants.ZERO);
         order.setCreateTime(now);
         order.setUpdateTime(now);
         order.setCreateUser(shop.getRegionMemberId());
         withdrawalOrdersMapper.insert(order);
+        // 鏀粯瀹濊处鎴锋垨濮撳悕鏈夊彉鍖栨椂鏇存柊闂ㄥ簵淇℃伅
+        boolean aliChanged = !dto.getAliAccount().equals(shop.getAliAccount())
+                || (dto.getAliName() != null && !dto.getAliName().equals(shop.getAliName()));
+        if (aliChanged) {
+            ShopInfo update = new ShopInfo();
+            update.setId(shopId);
+            update.setAliAccount(dto.getAliAccount());
+            update.setAliName(dto.getAliName());
+            shopInfoMapper.updateById(update);
+        }
         // 鍒涘缓鏀嚭 Revenue 璁板綍
         Revenue revenue = new Revenue();
-        revenue.setMemberId(shop.getRegionMemberId());
+        revenue.setMemberId(shop.getId());
         revenue.setMemberType(Constants.TWO);
         revenue.setType(Constants.ONE); // 1=鎻愮幇鏀嚭
         revenue.setOptType(-Constants.ONE); // -1=鏀嚭
diff --git a/server/web/src/main/java/com/doumee/api/web/ConfigApi.java b/server/web/src/main/java/com/doumee/api/web/ConfigApi.java
index 3aef431..cadd02a 100644
--- a/server/web/src/main/java/com/doumee/api/web/ConfigApi.java
+++ b/server/web/src/main/java/com/doumee/api/web/ConfigApi.java
@@ -1,5 +1,6 @@
 package com.doumee.api.web;
 
+import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.core.annotation.LoginDriverRequired;
 import com.doumee.core.annotation.LoginRequired;
 import com.doumee.core.annotation.LoginShopRequired;
@@ -12,6 +13,7 @@
 import com.doumee.dao.business.model.Areas;
 import com.doumee.dao.business.model.Banner;
 import com.doumee.dao.business.model.Category;
+import com.doumee.dao.business.model.AppVersion;
 import com.doumee.dao.business.model.Notice;
 import com.alibaba.fastjson.JSONObject;
 import com.doumee.dao.dto.AreasDto;
@@ -67,6 +69,12 @@
     @Autowired
     private NoticeService noticeService;
 
+    @Autowired
+    private AppVersionService appVersionService;
+
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+
     @ApiOperation("鍏ㄩ儴鍖哄垝鏍戝舰鏌ヨ")
     @PostMapping("/treeList")
     public ApiResponse<List<Areas>> treeList (@RequestBody AreasDto pageWrap) {
@@ -98,6 +106,15 @@
     })
     public ApiResponse<List<Banner>> getBannerList(@RequestParam Integer position) {
         return ApiResponse.success("鎿嶄綔鎴愬姛", bannerService.findListByPosition(position));
+    }
+
+    @ApiOperation(value = "鑾峰彇杞挱鍥捐鎯�", notes = "鏍规嵁ID杩斿洖杞挱鍥捐鎯咃紝鍚浘鐗囧叏璺緞")
+    @GetMapping("/getBannerDetail")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "id", value = "杞挱鍥句富閿�", required = true)
+    })
+    public ApiResponse<Banner> getBannerDetail(@RequestParam Integer id) {
+        return ApiResponse.success("鏌ヨ鎴愬姛", bannerService.findById(id));
     }
 
     @ApiOperation(value = "鑾峰彇鍩庡競宸插紑閫氱墿鍝佸昂瀵�", notes = "鏍规嵁鍩庡競涓婚敭鏌ヨ宸插紑閫氱殑鐗╁搧灏哄(category type=4)")
@@ -168,7 +185,9 @@
         }
         pageWrap.getModel().setUserId(this.getMemberId());
         pageWrap.getModel().setUserType(Constants.ZERO);
-        return ApiResponse.success("鏌ヨ鎴愬姛", noticeService.findPage(pageWrap));
+        PageData<Notice> pageData = noticeService.findPage(pageWrap);
+        noticeService.readAllNotice(0, this.getMemberId());
+        return ApiResponse.success("鏌ヨ鎴愬姛", pageData);
     }
 
 
@@ -184,7 +203,9 @@
         }
         pageWrap.getModel().setUserId(this.getShopId());
         pageWrap.getModel().setUserType(Constants.TWO);
-        return ApiResponse.success("鏌ヨ鎴愬姛", noticeService.findPage(pageWrap));
+        PageData<Notice> pageData = noticeService.findPage(pageWrap);
+        noticeService.readAllNotice(Constants.TWO, this.getShopId());
+        return ApiResponse.success("鏌ヨ鎴愬姛", pageData);
     }
 
     @LoginShopRequired
@@ -235,7 +256,9 @@
         }
         pageWrap.getModel().setUserId(this.getDriverId());
         pageWrap.getModel().setUserType(Constants.ONE);
-        return ApiResponse.success("鏌ヨ鎴愬姛", noticeService.findPage(pageWrap));
+        PageData<Notice> pageData = noticeService.findPage(pageWrap);
+        noticeService.readAllNotice(Constants.ONE, this.getDriverId());
+        return ApiResponse.success("鏌ヨ鎴愬姛", pageData);
     }
 
     @LoginDriverRequired
@@ -256,5 +279,16 @@
         return ApiResponse.success("鎿嶄綔鎴愬姛");
     }
 
+    @ApiOperation(value = "鑾峰彇鏈�鏂癆PP鐗堟湰")
+    @GetMapping("/getApiVersion")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "type", value = "骞冲彴绫诲瀷 0=Android 1=IOS", required = true)
+    })
+    public ApiResponse<AppVersion> getApiVersion(@RequestParam Integer type) {
+        AppVersion appVersion = appVersionService.getLatestVersion(type);
+        appVersion.setFileUrl("http://llfc.lmpro.cn/apkversion/gtxljc.apk");
+        return ApiResponse.success("鏌ヨ鎴愬姛", appVersion);
+    }
+
 
 }
diff --git a/server/web/src/main/java/com/doumee/api/web/DriverInfoApi.java b/server/web/src/main/java/com/doumee/api/web/DriverInfoApi.java
index b2ffbf2..77ec3a9 100644
--- a/server/web/src/main/java/com/doumee/api/web/DriverInfoApi.java
+++ b/server/web/src/main/java/com/doumee/api/web/DriverInfoApi.java
@@ -18,6 +18,7 @@
 import com.doumee.dao.dto.DriverVerifyRequest;
 import com.doumee.dao.vo.AccountResponse;
 import com.doumee.dao.dto.CancelOrderDTO;
+import com.doumee.dao.dto.ChangePasswordDTO;
 import com.doumee.dao.vo.DriverActiveOrderCountVO;
 import com.doumee.dao.vo.DriverCancelLimitVO;
 import com.doumee.dao.vo.DriverCenterVO;
@@ -237,10 +238,9 @@
     @ApiImplicitParams({
             @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
     })
-    public ApiResponse changePassword(@RequestParam String oldPassword,
-                                       @RequestParam String newPassword) {
+    public ApiResponse changePassword(@RequestBody @Valid ChangePasswordDTO dto) {
         String token = this.getRequest().getHeader(JwtTokenUtil.HEADER_KEY);
-        driverInfoService.changePassword(this.getDriverId(), oldPassword, newPassword, token);
+        driverInfoService.changePassword(this.getDriverId(), dto.getOldPassword(), dto.getNewPassword(), token);
         return ApiResponse.success("瀵嗙爜淇敼鎴愬姛锛岃閲嶆柊鐧诲綍");
     }
 
diff --git a/server/web/src/main/java/com/doumee/api/web/PaymentCallback.java b/server/web/src/main/java/com/doumee/api/web/PaymentCallback.java
index 54eb454..c26dbaa 100644
--- a/server/web/src/main/java/com/doumee/api/web/PaymentCallback.java
+++ b/server/web/src/main/java/com/doumee/api/web/PaymentCallback.java
@@ -231,10 +231,10 @@
                                     templateParam.put("orderNo", refundOrder.getCode());
                                     templateParam.put("money", String.valueOf(Constants.getFormatMoney(
                                             refundOrder.getRefundAmount() != null ? refundOrder.getRefundAmount() : 0L)));
-                                    boolean smsResult = AliSmsService.sendSms(refundMember.getTelephone(),
+                                    String smsError = AliSmsService.sendSms(refundMember.getTelephone(),
                                             Constants.SmsNotify.MEMBER_REFUNDED.getTemplateCode(),
                                             templateParam.toJSONString());
-                                    if (smsResult) {
+                                    if (smsError == null) {
                                         log.info("閫�娆剧煭淇″彂閫佹垚鍔�: phone={}", refundMember.getTelephone());
                                     } else {
                                         log.warn("閫�娆剧煭淇″彂閫佸け璐�: phone={}", refundMember.getTelephone());
@@ -244,7 +244,10 @@
                                     smsRecord.setPhone(refundMember.getTelephone());
                                     smsRecord.setContent(smsContent);
                                     smsRecord.setType(Constants.ONE);
-                                    smsRecord.setStatus(smsResult ? Constants.ONE : Constants.ZERO);
+                                    smsRecord.setStatus(smsError == null ? Constants.ONE : Constants.ZERO);
+                                    if (smsError != null) {
+                                        smsRecord.setRemark(smsError);
+                                    }
                                     smsRecord.setCreateTime(new java.util.Date());
                                     smsRecord.setDeleted(Constants.ZERO);
                                     smsrecordMapper.insert(smsRecord);
diff --git a/server/web/src/main/java/com/doumee/api/web/ShopInfoApi.java b/server/web/src/main/java/com/doumee/api/web/ShopInfoApi.java
index 061d0bb..6087e89 100644
--- a/server/web/src/main/java/com/doumee/api/web/ShopInfoApi.java
+++ b/server/web/src/main/java/com/doumee/api/web/ShopInfoApi.java
@@ -8,6 +8,7 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.Member;
+import com.doumee.dao.dto.ChangePasswordDTO;
 import com.doumee.dao.dto.ShopApplyDTO;
 import com.doumee.dao.dto.ShopDetailQueryDTO;
 import com.doumee.dao.dto.ShopInfoMaintainDTO;
@@ -25,6 +26,7 @@
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import javax.validation.Valid;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -136,10 +138,9 @@
     @ApiImplicitParams({
             @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "闂ㄥ簵token鍊�", required = true),
     })
-    public ApiResponse changePassword(@RequestParam String oldPassword,
-                                       @RequestParam String newPassword) {
+    public ApiResponse changePassword(@RequestBody @Valid ChangePasswordDTO dto) {
         String token = this.getRequest().getHeader(JwtTokenUtil.HEADER_KEY);
-        shopInfoService.changePassword(this.getShopId(), oldPassword, newPassword, token);
+        shopInfoService.changePassword(this.getShopId(), dto.getOldPassword(), dto.getNewPassword(), token);
         return ApiResponse.success("瀵嗙爜淇敼鎴愬姛锛岃閲嶆柊鐧诲綍");
     }
 

--
Gitblit v1.9.3