From 74b0af6814b96378201ea27d205e054bf01d0306 Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期二, 21 四月 2026 14:20:22 +0800
Subject: [PATCH] 代码生成

---
 server/services/src/main/java/com/doumee/service/business/impl/PricingRuleServiceImpl.java |    9 
 server/services/src/main/java/com/doumee/service/business/NoticeService.java               |   15 +
 server/services/src/main/java/com/doumee/api/common/PublicCloudController.java             |   33 ++
 server/services/src/main/java/com/doumee/service/business/impl/NoticeServiceImpl.java      |   58 ++--
 server/services/src/main/java/com/doumee/dao/vo/ActiveOrderTipVO.java                      |   30 ++
 server/services/src/main/resources/application-dev.yml                                     |    2 
 server/web/src/main/java/com/doumee/api/web/ConfigApi.java                                 |   46 ++++
 server/web/src/main/java/com/doumee/api/web/AddrApi.java                                   |    7 
 server/services/src/main/java/com/doumee/core/utils/ImageWatermarkUtil.java                |  117 ++++++++++
 server/services/src/main/java/com/doumee/dao/business/model/PricingRule.java               |    2 
 server/services/src/main/java/com/doumee/service/business/impl/AddrServiceImpl.java        |   12 
 server/services/src/main/java/com/doumee/core/constants/Constants.java                     |   35 +++
 server/services/src/main/java/com/doumee/service/business/AddrService.java                 |    4 
 server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java      |    2 
 server/services/src/main/java/com/doumee/service/business/OrdersService.java               |   19 
 server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java      |   88 +++++++
 server/services/src/main/java/com/doumee/config/alipay/AlipayFundTransUniTransfer.java     |  167 +++++++++++++--
 17 files changed, 561 insertions(+), 85 deletions(-)

diff --git a/server/services/src/main/java/com/doumee/api/common/PublicCloudController.java b/server/services/src/main/java/com/doumee/api/common/PublicCloudController.java
index c5608f0..06ecde2 100644
--- a/server/services/src/main/java/com/doumee/api/common/PublicCloudController.java
+++ b/server/services/src/main/java/com/doumee/api/common/PublicCloudController.java
@@ -11,7 +11,9 @@
 import com.doumee.core.model.ApiResponse;
 import com.doumee.core.utils.DateUtil;
 import com.doumee.core.utils.FtpUtil;
+import com.doumee.core.utils.ImageWatermarkUtil;
 import com.doumee.core.utils.aliyun.ALiYunUtil;
+import com.doumee.core.utils.geocode.MapUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -47,14 +49,18 @@
     @Autowired
     private SystemDictDataBiz systemDictDataBiz;
 
-    @ApiOperation(value = "涓婁紶OBS", notes = "涓婁紶OBS", httpMethod = "POST", position = 6)
+    @ApiOperation(value = "涓婁紶OSS", notes = "涓婁紶OSS锛屽彲浼犲叆缁忕含搴﹁嚜鍔ㄦ坊鍔犳椂闂�+鍦板潃姘村嵃", httpMethod = "POST", position = 6)
     @ApiImplicitParams({
             @ApiImplicitParam(name = "folder", value = "鏂囦欢澶�", required = true, paramType = "query", dataType = "String", dataTypeClass = String.class),
-            @ApiImplicitParam(name = "file", value = "鏂囦欢澶�", required = true, paramType = "query", dataType = "String", dataTypeClass = String.class),
+            @ApiImplicitParam(name = "file", value = "鏂囦欢", required = true, paramType = "query", dataType = "String", dataTypeClass = String.class),
+            @ApiImplicitParam(name = "latitude", value = "绾害锛堥潪蹇呭~锛屼紶鍏ユ椂娣诲姞姘村嵃锛�", paramType = "query", dataType = "Double"),
+            @ApiImplicitParam(name = "longitude", value = "缁忓害锛堥潪蹇呭~锛屼紶鍏ユ椂娣诲姞姘村嵃锛�", paramType = "query", dataType = "Double"),
     })
     @PostMapping(value = "/upload", headers = "content-type=multipart/form-data")
     @ResponseBody
-    public void upload(HttpServletRequest request, HttpServletResponse response, String folder,String flag) throws Exception {
+    public void upload(HttpServletRequest request, HttpServletResponse response, String folder, String flag,
+                       @RequestParam(required = false) Double latitude,
+                       @RequestParam(required = false) Double longitude) throws Exception {
         Date d1 = new Date();
         log.error("鎬诲緱涓婁紶鏂囦欢鎴愬姛=============寮�濮�========="+DateUtil.getPlusTime2(d1));
         if(Objects.isNull(folder)){
@@ -75,6 +81,23 @@
                     System.out.println(file.getSize());
                     String originname = file.getOriginalFilename();
                     is = file.getInputStream();
+
+                    // 缁忕含搴︽按鍗板鐞�
+                    InputStream uploadStream = is;
+                    if (latitude != null && longitude != null) {
+                        try {
+                            JSONObject geoResult = MapUtil.reverseGeocode(latitude, longitude);
+                            String address = geoResult != null ? geoResult.getString("formatted_addresses") : "";
+                            String timeText = DateUtil.getPlusTime2(new Date());
+                            uploadStream = ImageWatermarkUtil.addWatermark(is, timeText, address, latitude, longitude);
+                            log.info("鍥剧墖姘村嵃娣诲姞鎴愬姛: time={}, address={}", timeText, address);
+                        } catch (Exception e) {
+                            log.warn("姘村嵃澶勭悊澶辫触锛屼娇鐢ㄥ師鍥句笂浼�: {}", e.getMessage());
+                            try { is.reset(); } catch (Exception ignored) {}
+                            uploadStream = is;
+                        }
+                    }
+
                     String endType = ".jpg";
                     if(originname.indexOf(".")>0){
                         endType=originname.substring(originname.lastIndexOf("."),originname.length());
@@ -87,14 +110,12 @@
                     ALiYunUtil obs = new ALiYunUtil(systemDictDataBiz.queryByCode(Constants.OSS,Constants.ENDPOINT).getCode(),systemDictDataBiz.queryByCode(Constants.OSS,Constants.ACCESS_ID).getCode(),
                             systemDictDataBiz.queryByCode(Constants.OSS,Constants.ACCESS_KEY).getCode());
 
-                    r = obs.uploadOnlineObject(file.getInputStream(),systemDictDataBiz.queryByCode(Constants.OSS,Constants.BUCKETNAME).getCode(), fileName,null);
+                    r = obs.uploadOnlineObject(uploadStream,systemDictDataBiz.queryByCode(Constants.OSS,Constants.BUCKETNAME).getCode(), fileName,null);
                     if(r){
                         context.put("success", true);
                         context.put("code", 200);
                         context.put("errno",0);
                         JSONObject fileJSON = new JSONObject();
-//                        fileJSON.put("prefixPath", prefixPath);
-//                        fileJSON.put("folder", folder);
                         fileJSON.put("url", prefixPath+fileName);
                         fileJSON.put("imgaddr", fName);
                         fileJSON.put("imgname", fileName);
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 b182a56..be51792 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
@@ -7,15 +7,57 @@
 import com.alipay.v3.Configuration;
 import com.alipay.v3.api.AlipayFundTransUniApi;
 import com.alipay.v3.model.*;
+import com.doumee.config.mybatis.SpringUtils;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.dao.dto.AlipayTransferDTO;
 import com.wechat.pay.java.core.RSAAutoCertificateConfig;
 import lombok.extern.slf4j.Slf4j;
 import okhttp3.OkHttpClient;
 import com.wechat.pay.java.core.http.*;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import javax.annotation.PostConstruct;
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
 
 @Slf4j
+@org.springframework.context.annotation.Configuration
 public class AlipayFundTransUniTransfer {
+
+    @Autowired
+    private AlipayProperties alipayProperties;
+
+    private static AlipayConfig alipayConfig;
+
+    public static AlipayFundTransUniTransfer me() {
+        return SpringUtils.get().getBean(AlipayFundTransUniTransfer.class);
+    }
+
+    @PostConstruct
+    void init() {
+        this.loadAlipayConfig();
+    }
+
+    public void loadAlipayConfig() {
+        try {
+            AlipayConfig config = new AlipayConfig();
+            config.setServerUrl("https://openapi.alipay.com");
+            config.setAppId("2021006147660139");
+            String privateKey  = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDEeqqkZztBHfK+vpyBi6ejgDTHZuZ3yiuXds+lRBbMo/g24F5trH+oLHW0gMhSxihFfQBBIpVBXDsPQK4ZkhDWTaOBktnU1UMRoOEiaaZU6EiWy10ePFUmpdXpkCQEp7rc88OwI90p58S3+L+Ckak60WqNwJBdB5YGBaUunryBA78U4zW1KNY7JvoRnZDcFMQiczikwUzhO7EAi0yVrVpsVsc9s87mcS4uOJKx4qb2E83r9RJ1z30db+cIIZRiLP2oNZBLYzgKpOouE+uIgxhQzlh6cOASNZQulXuUjoT/+Y9w4njfl4TmKIXWcJFKIMc6kMiux9tTncpp0TqRwk1tAgMBAAECggEALkSYtJheusnbpRFr95G0i2sggqh3s1PXihZ/dXKgT9Z5GCsj8X3Cng7CNRxykBN73kk+axhCv56Bhej8Vqcv8ddcnqG/TEBgR+Fzws/QTIRau6/uILWic7RvuE2qPbJl7aw1s9/uL/UVPSGFr7CvgltYVUM4e7/Sk1529JCK4XJfoXP5tKJ3OaXssvaFnCKEU8IGQkjRG+lUZJhAHVtClGHtgrhevgRhy2zre5wp2qSa8d/MqrPruSYS02hn9b5Nl6i2PlUS6dGlJ4lrxYTG22ukYYoxAPNPS7gnvmveXonWP7b5tPhKRpZjnoySojz3WECUlhz/v8wM1cDrpq+GQQKBgQDsc7y2rlx4f77a7ORfb5/qWHCOJs1cIzggj0kJ7TgFGe71kbCQ5nywD/Fe5V9OwbW+DCxOME+SrrHeiK4axWiu5si/1JlurJoxNy+4k4ywk3ZA3Nv2aBhlPqfkwDhJ0z7Mgsq2c/YgnVddmSvKZoC39wA77ovks4GDxaBOt8N7PQKBgQDUuPGgzkwcgb60UdaxfMbacrPsW26vDxaE4ceuXo2m8KDiCIqkF2y9r6AdWMTgGGSJwOsk7+FP+21VdRivCg9HcOLWngveUc6xDIuqKHVpemMo3SdCF4Wqf96rRc3VOBr5cfIdWxeorZf5umMyKnIAjAFETOOrK7eLTTmjyLD98QKBgB82S+Plcklpu3zUpnS+nGJn2Du7fYI7F+6cW2zXBn0N5lA+Mgt+kVkAUcFQD9uqkF4M51BO6kIXk10nt6vLAT2NM1S3MKW+XQBAI6l+uKSaYpK/VL3bEdVThwAYK5X7L5/5Z97bwdKeUmkFjhVCoJ0oGrzOiWLgGymUzct2UHSVAoGBAMb+7Cs+Ub0pMrmFBY6r52pbey1Uq0pglvRgMmhQU7sjx50r2GaA81zPer15WVM5/nNPYaoALYqg7jrPe/PjOT/fvpR+7SNg7DZ8QftANfYiY7jKifst/gDt9ePLPS6FedZ4XcJQgOVu34jicAFx64vPbS/zrddm4iEScSVijRBBAoGAXCheERsx8+n16Us/DttXFUa1nc7+D8WR6buM1QMZgQCVF2qp3XtM+FusCKL4+q1+dtag8svLjJFp9QbaAXqX8Zk7rn8wUHbDloPTPy9XWgrPowyL9MPU+e/Rq8Hr6TWPDBd4TU64YzIEfBQYpJXfZbXhVYmK3o7xHXKB1x4vvEM=";
+            config.setPrivateKey(privateKey);
+            config.setAppCertPath("pay/pro/appCertPublicKey.crt");
+            config.setAlipayPublicCertPath("pay/pro/alipayCertPublicKey_RSA2.crt");
+            config.setRootCertPath("pay/pro/alipayRootCert.crt");
+            alipayConfig = config;
+            log.info("鏀粯瀹濋厤缃垵濮嬪寲鎴愬姛, appId={}", config.getAppId());
+        } catch (Exception e) {
+            log.error("鏀粯瀹濋厤缃垵濮嬪寲澶辫触: {}", e.getMessage(), e);
+        }
+    }
+
 
     public static void main(String[] args) throws ApiException  {
         downLoadCertificates();
@@ -60,45 +102,120 @@
         }
     }
 
-    public static void testTransger( ) throws ApiException  {
+//    public static void testTransger( ) throws ApiException  {
+//
+//        // 鍒濆鍖朣DK
+//        ApiClient defaultClient = Configuration.getDefaultApiClient();
+//        // 鍒濆鍖朼lipay鍙傛暟锛堝叏灞�璁剧疆涓�娆★級
+//        defaultClient.setAlipayConfig(getAlipayConfig());
+//        // 鏋勯�犺姹傚弬鏁颁互璋冪敤鎺ュ彛
+//        AlipayFundTransUniApi api = new AlipayFundTransUniApi();
+//        AlipayFundTransUniTransferModel data = new AlipayFundTransUniTransferModel();
+//        // 璁剧疆鍟嗗渚у敮涓�璁㈠崟鍙�
+//        data.setOutBizNo("202606300001");
+//        // 璁剧疆璁㈠崟鎬婚噾棰�
+//        data.setTransAmount("1");
+//        // 璁剧疆鎻忚堪鐗瑰畾鐨勪笟鍔″満鏅�
+//        data.setBizScene("DIRECT_TRANSFER");
+//        // 璁剧疆涓氬姟浜у搧鐮�
+//        data.setProductCode("TRANS_ACCOUNT_NO_PWD");
+//        // 璁剧疆杞处涓氬姟鐨勬爣棰�
+//        data.setOrderTitle("201905浠e彂");
+//        // 璁剧疆鍘熸敮浠樺疂涓氬姟鍗曞彿
+//        data.setOriginalOrderId("20190620110075000006640000063056");
+//        // 璁剧疆鏀舵鏂逛俊鎭�
+//        Participant payeeInfo = new Participant();
+//        payeeInfo.setIdentity("15345690849");
+//        payeeInfo.setName("姹熻悕");
+//        payeeInfo.setIdentityType("ALIPAY_LOGON_ID");
+//        data.setPayeeInfo(payeeInfo);
+//        // 璁剧疆涓氬姟澶囨敞
+//        data.setRemark("201905浠e彂");
+//        // 璁剧疆杞处鍦烘櫙鍚嶇О
+//        data.setTransferSceneName("浣i噾鎶ラ叕");
+//
+//        // 璁剧疆杞处鍦烘櫙涓婃姤淇℃伅
+//        List<TransferSceneReportInfo> transferSceneReportInfos = new ArrayList<TransferSceneReportInfo>();
+//        TransferSceneReportInfo transferSceneReportInfos0 = new TransferSceneReportInfo();
+//        transferSceneReportInfos0.setInfoType("浣i噾鎶ラ叕璇存槑");
+//        transferSceneReportInfos0.setInfoContent("3鏈堝鏀挎湇鍔℃姤閰�");
+//        transferSceneReportInfos.add(transferSceneReportInfos0);
+//        data.setTransferSceneReportInfos(transferSceneReportInfos);
+//
+//        // 璁剧疆杞处涓氬姟璇锋眰鐨勬墿灞曞弬鏁�
+//        data.setBusinessParams("{\"payer_show_name_use_alias\":\"true\"}");
+//
+//       /* // 璁剧疆绛惧悕淇℃伅
+//        SignData signData = new SignData();
+//        signData.setOriSign("EqHFP0z4a9iaQ1ep==");
+//        signData.setPartnerId("绛惧悕琚巿鏉冩柟鏀粯瀹濊处鍙稩D");
+//        signData.setOriAppId("2021000185629012");
+//        signData.setOriOutBizNo("鍟嗘埛璁㈠崟鍙�");
+//        signData.setOriSignType("RSA2");
+//        signData.setOriCharSet("UTF-8");
+//        data.setSignData(signData);
+//*/
+//        try {
+//            AlipayFundTransUniTransferResponseModel response = api.transfer(data);
+//        } catch (ApiException e) {
+//            AlipayFundTransUniTransferDefaultResponse errorObject = (AlipayFundTransUniTransferDefaultResponse) e.getErrorObject();
+//            System.out.println("璋冪敤澶辫触:" + errorObject);
+//        }
+//    }
 
-        // 鍒濆鍖朣DK
+    /**
+     * 鍗曠瑪杞处鍒版敮浠樺疂璐︽埛
+     *
+     * @param dto 杞处鍙傛暟
+     * @return 鏀粯瀹濊浆璐﹀崟鍙�
+     */
+    public static String transfer(AlipayTransferDTO dto) throws ApiException {
         ApiClient defaultClient = Configuration.getDefaultApiClient();
-        // 鍒濆鍖朼lipay鍙傛暟锛堝叏灞�璁剧疆涓�娆★級
-        defaultClient.setAlipayConfig(getAlipayConfig());
         // 鏋勯�犺姹傚弬鏁颁互璋冪敤鎺ュ彛
+        defaultClient.setAlipayConfig(alipayConfig);
         AlipayFundTransUniApi api = new AlipayFundTransUniApi();
         AlipayFundTransUniTransferModel data = new AlipayFundTransUniTransferModel();
         // 璁剧疆鍟嗗渚у敮涓�璁㈠崟鍙�
-        data.setOutBizNo("202606300001");
+        data.setOutBizNo(dto.getOutBizNo());
         // 璁剧疆璁㈠崟鎬婚噾棰�
         data.setTransAmount("1");
         // 璁剧疆鎻忚堪鐗瑰畾鐨勪笟鍔″満鏅�
+        data.setOutBizNo(dto.getOutBizNo());
+        data.setTransAmount(dto.getTransAmount().setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
         data.setBizScene("DIRECT_TRANSFER");
         // 璁剧疆涓氬姟浜у搧鐮�
         data.setProductCode("TRANS_ACCOUNT_NO_PWD");
         // 璁剧疆杞处涓氬姟鐨勬爣棰�
-        data.setOrderTitle("201905浠e彂");
+        data.setOrderTitle("浣i噾鎶ラ叕");
         // 璁剧疆鍘熸敮浠樺疂涓氬姟鍗曞彿
         data.setOriginalOrderId("20190620110075000006640000063056");
         // 璁剧疆鏀舵鏂逛俊鎭�
+        data.setOrderTitle("浣i噾鎶ラ叕");
         Participant payeeInfo = new Participant();
-        payeeInfo.setIdentity("15345690849");
-        payeeInfo.setName("姹熻悕");
+        payeeInfo.setIdentity(dto.getPayeeAccount());
+        payeeInfo.setName(dto.getPayeeName());
+        payeeInfo.setIdentity(dto.getPayeeAccount());
+        payeeInfo.setName(dto.getPayeeName());
         payeeInfo.setIdentityType("ALIPAY_LOGON_ID");
         data.setPayeeInfo(payeeInfo);
         // 璁剧疆涓氬姟澶囨敞
-        data.setRemark("201905浠e彂");
+        data.setRemark("浣i噾鎶ラ叕");
         // 璁剧疆杞处鍦烘櫙鍚嶇О
+        data.setRemark(dto.getRemark());
         data.setTransferSceneName("浣i噾鎶ラ叕");
-
         // 璁剧疆杞处鍦烘櫙涓婃姤淇℃伅
         List<TransferSceneReportInfo> transferSceneReportInfos = new ArrayList<TransferSceneReportInfo>();
         TransferSceneReportInfo transferSceneReportInfos0 = new TransferSceneReportInfo();
         transferSceneReportInfos0.setInfoType("浣i噾鎶ラ叕璇存槑");
-        transferSceneReportInfos0.setInfoContent("3鏈堝鏀挎湇鍔℃姤閰�");
+        transferSceneReportInfos0.setInfoContent("浣i噾鎶ラ叕");
         transferSceneReportInfos.add(transferSceneReportInfos0);
         data.setTransferSceneReportInfos(transferSceneReportInfos);
+        List<TransferSceneReportInfo> reportInfos = new ArrayList<>();
+        TransferSceneReportInfo reportInfo = new TransferSceneReportInfo();
+        reportInfo.setInfoType("浣i噾鎶ラ叕璇存槑");
+        reportInfo.setInfoContent("浣i噾鎶ラ叕");
+        reportInfos.add(reportInfo);
+        data.setTransferSceneReportInfos(reportInfos);
 
         // 璁剧疆杞处涓氬姟璇锋眰鐨勬墿灞曞弬鏁�
         data.setBusinessParams("{\"payer_show_name_use_alias\":\"true\"}");
@@ -115,22 +232,28 @@
 */
         try {
             AlipayFundTransUniTransferResponseModel response = api.transfer(data);
+            log.info("鏀粯瀹濊浆璐︽垚鍔�, outBizNo={}, orderId={}", dto.getOutBizNo(), response.getOrderId());
+            return response.getOrderId();
         } catch (ApiException e) {
             AlipayFundTransUniTransferDefaultResponse errorObject = (AlipayFundTransUniTransferDefaultResponse) e.getErrorObject();
             System.out.println("璋冪敤澶辫触:" + errorObject);
+            log.error("鏀粯瀹濊浆璐﹀け璐�, outBizNo={}, error={}", dto.getOutBizNo(), errorObject);
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),
+                    "杞处澶辫触锛�" + (errorObject != null ? errorObject.toString() : e.getMessage()));
         }
     }
 
-    private static AlipayConfig getAlipayConfig() {
-        AlipayConfig alipayConfig = new AlipayConfig();
-        alipayConfig.setServerUrl("https://openapi.alipay.com");
-        alipayConfig.setAppId("2021006147660139");
-        String privateKey  = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDEeqqkZztBHfK+vpyBi6ejgDTHZuZ3yiuXds+lRBbMo/g24F5trH+oLHW0gMhSxihFfQBBIpVBXDsPQK4ZkhDWTaOBktnU1UMRoOEiaaZU6EiWy10ePFUmpdXpkCQEp7rc88OwI90p58S3+L+Ckak60WqNwJBdB5YGBaUunryBA78U4zW1KNY7JvoRnZDcFMQiczikwUzhO7EAi0yVrVpsVsc9s87mcS4uOJKx4qb2E83r9RJ1z30db+cIIZRiLP2oNZBLYzgKpOouE+uIgxhQzlh6cOASNZQulXuUjoT/+Y9w4njfl4TmKIXWcJFKIMc6kMiux9tTncpp0TqRwk1tAgMBAAECggEALkSYtJheusnbpRFr95G0i2sggqh3s1PXihZ/dXKgT9Z5GCsj8X3Cng7CNRxykBN73kk+axhCv56Bhej8Vqcv8ddcnqG/TEBgR+Fzws/QTIRau6/uILWic7RvuE2qPbJl7aw1s9/uL/UVPSGFr7CvgltYVUM4e7/Sk1529JCK4XJfoXP5tKJ3OaXssvaFnCKEU8IGQkjRG+lUZJhAHVtClGHtgrhevgRhy2zre5wp2qSa8d/MqrPruSYS02hn9b5Nl6i2PlUS6dGlJ4lrxYTG22ukYYoxAPNPS7gnvmveXonWP7b5tPhKRpZjnoySojz3WECUlhz/v8wM1cDrpq+GQQKBgQDsc7y2rlx4f77a7ORfb5/qWHCOJs1cIzggj0kJ7TgFGe71kbCQ5nywD/Fe5V9OwbW+DCxOME+SrrHeiK4axWiu5si/1JlurJoxNy+4k4ywk3ZA3Nv2aBhlPqfkwDhJ0z7Mgsq2c/YgnVddmSvKZoC39wA77ovks4GDxaBOt8N7PQKBgQDUuPGgzkwcgb60UdaxfMbacrPsW26vDxaE4ceuXo2m8KDiCIqkF2y9r6AdWMTgGGSJwOsk7+FP+21VdRivCg9HcOLWngveUc6xDIuqKHVpemMo3SdCF4Wqf96rRc3VOBr5cfIdWxeorZf5umMyKnIAjAFETOOrK7eLTTmjyLD98QKBgB82S+Plcklpu3zUpnS+nGJn2Du7fYI7F+6cW2zXBn0N5lA+Mgt+kVkAUcFQD9uqkF4M51BO6kIXk10nt6vLAT2NM1S3MKW+XQBAI6l+uKSaYpK/VL3bEdVThwAYK5X7L5/5Z97bwdKeUmkFjhVCoJ0oGrzOiWLgGymUzct2UHSVAoGBAMb+7Cs+Ub0pMrmFBY6r52pbey1Uq0pglvRgMmhQU7sjx50r2GaA81zPer15WVM5/nNPYaoALYqg7jrPe/PjOT/fvpR+7SNg7DZ8QftANfYiY7jKifst/gDt9ePLPS6FedZ4XcJQgOVu34jicAFx64vPbS/zrddm4iEScSVijRBBAoGAXCheERsx8+n16Us/DttXFUa1nc7+D8WR6buM1QMZgQCVF2qp3XtM+FusCKL4+q1+dtag8svLjJFp9QbaAXqX8Zk7rn8wUHbDloPTPy9XWgrPowyL9MPU+e/Rq8Hr6TWPDBd4TU64YzIEfBQYpJXfZbXhVYmK3o7xHXKB1x4vvEM=";
-        alipayConfig.setPrivateKey(privateKey);
-        alipayConfig.setAppCertPath("pay/pro/appCertPublicKey.crt");
-        alipayConfig.setAlipayPublicCertPath("pay/pro/alipayCertPublicKey_RSA2.crt");
-        alipayConfig.setRootCertPath("pay/pro/alipayRootCert.crt");
 
-        return alipayConfig;
-    }
+//    private static AlipayConfig getAlipayConfig() {
+//        AlipayConfig alipayConfig = new AlipayConfig();
+//        alipayConfig.setServerUrl("https://openapi.alipay.com");
+//        alipayConfig.setAppId("2021006147660139");
+//        String privateKey  = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDEeqqkZztBHfK+vpyBi6ejgDTHZuZ3yiuXds+lRBbMo/g24F5trH+oLHW0gMhSxihFfQBBIpVBXDsPQK4ZkhDWTaOBktnU1UMRoOEiaaZU6EiWy10ePFUmpdXpkCQEp7rc88OwI90p58S3+L+Ckak60WqNwJBdB5YGBaUunryBA78U4zW1KNY7JvoRnZDcFMQiczikwUzhO7EAi0yVrVpsVsc9s87mcS4uOJKx4qb2E83r9RJ1z30db+cIIZRiLP2oNZBLYzgKpOouE+uIgxhQzlh6cOASNZQulXuUjoT/+Y9w4njfl4TmKIXWcJFKIMc6kMiux9tTncpp0TqRwk1tAgMBAAECggEALkSYtJheusnbpRFr95G0i2sggqh3s1PXihZ/dXKgT9Z5GCsj8X3Cng7CNRxykBN73kk+axhCv56Bhej8Vqcv8ddcnqG/TEBgR+Fzws/QTIRau6/uILWic7RvuE2qPbJl7aw1s9/uL/UVPSGFr7CvgltYVUM4e7/Sk1529JCK4XJfoXP5tKJ3OaXssvaFnCKEU8IGQkjRG+lUZJhAHVtClGHtgrhevgRhy2zre5wp2qSa8d/MqrPruSYS02hn9b5Nl6i2PlUS6dGlJ4lrxYTG22ukYYoxAPNPS7gnvmveXonWP7b5tPhKRpZjnoySojz3WECUlhz/v8wM1cDrpq+GQQKBgQDsc7y2rlx4f77a7ORfb5/qWHCOJs1cIzggj0kJ7TgFGe71kbCQ5nywD/Fe5V9OwbW+DCxOME+SrrHeiK4axWiu5si/1JlurJoxNy+4k4ywk3ZA3Nv2aBhlPqfkwDhJ0z7Mgsq2c/YgnVddmSvKZoC39wA77ovks4GDxaBOt8N7PQKBgQDUuPGgzkwcgb60UdaxfMbacrPsW26vDxaE4ceuXo2m8KDiCIqkF2y9r6AdWMTgGGSJwOsk7+FP+21VdRivCg9HcOLWngveUc6xDIuqKHVpemMo3SdCF4Wqf96rRc3VOBr5cfIdWxeorZf5umMyKnIAjAFETOOrK7eLTTmjyLD98QKBgB82S+Plcklpu3zUpnS+nGJn2Du7fYI7F+6cW2zXBn0N5lA+Mgt+kVkAUcFQD9uqkF4M51BO6kIXk10nt6vLAT2NM1S3MKW+XQBAI6l+uKSaYpK/VL3bEdVThwAYK5X7L5/5Z97bwdKeUmkFjhVCoJ0oGrzOiWLgGymUzct2UHSVAoGBAMb+7Cs+Ub0pMrmFBY6r52pbey1Uq0pglvRgMmhQU7sjx50r2GaA81zPer15WVM5/nNPYaoALYqg7jrPe/PjOT/fvpR+7SNg7DZ8QftANfYiY7jKifst/gDt9ePLPS6FedZ4XcJQgOVu34jicAFx64vPbS/zrddm4iEScSVijRBBAoGAXCheERsx8+n16Us/DttXFUa1nc7+D8WR6buM1QMZgQCVF2qp3XtM+FusCKL4+q1+dtag8svLjJFp9QbaAXqX8Zk7rn8wUHbDloPTPy9XWgrPowyL9MPU+e/Rq8Hr6TWPDBd4TU64YzIEfBQYpJXfZbXhVYmK3o7xHXKB1x4vvEM=";
+//        alipayConfig.setPrivateKey(privateKey);
+//        alipayConfig.setAppCertPath("pay/pro/appCertPublicKey.crt");
+//        alipayConfig.setAlipayPublicCertPath("pay/pro/alipayCertPublicKey_RSA2.crt");
+//        alipayConfig.setRootCertPath("pay/pro/alipayRootCert.crt");
+//
+//        return alipayConfig;
+//    }
 }
\ No newline at end of file
diff --git a/server/services/src/main/java/com/doumee/core/constants/Constants.java b/server/services/src/main/java/com/doumee/core/constants/Constants.java
index ac995a0..e9e0622 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
@@ -390,7 +390,9 @@
         waitDeliver(2, "寰呴厤閫�", new int[]{OrderStatus.accepted.status}),
         waitReceive(3, "寰呮敹璐�", new int[]{ OrderStatus.delivering.status, OrderStatus.arrived.status}),
         finished(4, "宸插畬鎴�", new int[]{OrderStatus.finished.status}),
-        refund(5, "閫�娆�", new int[]{OrderStatus.closed.status, OrderStatus.cancelling.status})
+        refund(5, "閫�娆�", new int[]{OrderStatus.closed.status, OrderStatus.cancelling.status}),
+        home(6, "棣栭〉鏌ヨ", new int[]{OrderStatus.waitPay.status, OrderStatus.waitDeposit.status, OrderStatus.deposited.status
+                , OrderStatus.accepted.status, OrderStatus.delivering.status, OrderStatus.arrived.status})
         ;
         private final int key;
         private final String desc;
@@ -407,6 +409,37 @@
     }
 
     /**
+     * 棣栭〉璁㈠崟鐘舵�佹彁绀烘灇涓�
+     * status: 璁㈠崟鐘舵�佸��
+     * desc: 鐘舵�佹弿杩�
+     * tipTemplate: 鎻愮ず鏂囨妯℃澘锛屽崰浣嶇鐢� {xxx} 琛ㄧず
+     */
+    @Getter
+    @AllArgsConstructor
+    public enum OrderStatusTip {
+        waitPay(0, "寰呮敮浠�", "璇峰湪{timeout}鍒嗛挓鍐呭畬鎴愭敮浠橈紝瓒呮椂璁㈠崟灏嗚嚜鍔ㄥ彇娑�"),
+        waitDeposit(1, "寰呭瘎瀛�", "璁㈠崟宸叉敮浠橈紝璇峰墠寰�闂ㄥ簵瀵勫瓨"),
+        deposited(2, "宸插瘎瀛�", null), // 灏卞湴/寮傚湴鏂囨涓嶅悓锛屽姩鎬佸鐞�
+        accepted(3, "宸叉帴鍗�", "宸叉湁鍙告満鎶㈠崟锛屾鍓嶅線鍙栦欢鍦扮偣"),
+        delivering(4, "娲鹃�佷腑", "鍙告満宸插彇浠讹紝姝h繍寰�鐩殑鍦�"),
+        arrived(5, "寰呭彇浠�", null), // 灏卞湴/寮傚湴/鏈夋棤鍙栦欢闂ㄥ簵鏂囨涓嶅悓锛屽姩鎬佸鐞�
+        ;
+
+        private final int status;
+        private final String desc;
+        private final String tipTemplate;
+
+        public static OrderStatusTip getByStatus(int status) {
+            for (OrderStatusTip t : OrderStatusTip.values()) {
+                if (t.status == status) {
+                    return t;
+                }
+            }
+            return null;
+        }
+    }
+
+    /**
      * 璁㈠崟绔欏唴淇¢�氱煡鏋氫妇
      * title: 閫氱煡鏍囬
      * content: 閫氱煡鏂囨妯℃澘锛屽崰浣嶇鐢� {xxx} 琛ㄧず
diff --git a/server/services/src/main/java/com/doumee/core/utils/ImageWatermarkUtil.java b/server/services/src/main/java/com/doumee/core/utils/ImageWatermarkUtil.java
new file mode 100644
index 0000000..468f256
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/core/utils/ImageWatermarkUtil.java
@@ -0,0 +1,117 @@
+package com.doumee.core.utils;
+
+import lombok.extern.slf4j.Slf4j;
+
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * 鍥剧墖姘村嵃宸ュ叿绫�
+ * 鍦ㄥ浘鐗囧乏涓嬭鍙犲姞鏃堕棿 + 鍦板潃姘村嵃
+ *
+ * @author rk
+ * @date 2026/04/21
+ */
+@Slf4j
+public class ImageWatermarkUtil {
+
+    /**
+     * 涓哄浘鐗囨坊鍔犳按鍗帮紙鏃堕棿 + 鍦板潃 + 缁忕含搴︼級
+     *
+     * @param imageInput  鍘熷浘杈撳叆娴�
+     * @param timeText    鏃堕棿鏂囨锛堝 "2026-04-21 14:30:00"锛�
+     * @param addressText 鍦板潃鏂囨锛堝 "鍖椾含甯傛捣娣�鍖簒xx璺�"锛�
+     * @param latitude    绾害
+     * @param longitude   缁忓害
+     * @return 娣诲姞姘村嵃鍚庣殑杈撳叆娴侊紝姘村嵃澶辫触鏃惰繑鍥炲師鍥�
+     */
+    public static InputStream addWatermark(InputStream imageInput, String timeText, String addressText,
+                                           Double latitude, Double longitude) {
+        try {
+            BufferedImage srcImage = ImageIO.read(imageInput);
+            if (srcImage == null) {
+                log.warn("姘村嵃: 鏃犳硶璇诲彇鍥剧墖锛岃烦杩囨按鍗板鐞�");
+                imageInput.reset();
+                return imageInput;
+            }
+
+            int srcWidth = srcImage.getWidth();
+            int srcHeight = srcImage.getHeight();
+
+            // 瀛椾綋澶у皬鎸夊浘鐗囧搴﹁嚜閫傚簲锛堢害3%锛夛紝鏈�灏�16px
+            int fontSize = Math.max(16, srcWidth * 3 / 100);
+            int padding = fontSize;
+            int lineHeight = fontSize + fontSize / 3;
+
+            // 缁忕含搴﹁
+            String locationText = "";
+            if (latitude != null && longitude != null) {
+                locationText = String.format("缁忓害:%.6f 绾害:%.6f", longitude, latitude);
+            }
+            int lineCount = 2 + (locationText.isEmpty() ? 0 : 1);
+
+            // 璁$畻姘村嵃鍖哄煙鑳屾櫙楂樺害
+            int bgHeight = lineHeight * lineCount + padding;
+
+            // 鍒涘缓鍥剧墖
+            BufferedImage destImage = new BufferedImage(srcWidth, srcHeight, BufferedImage.TYPE_INT_RGB);
+            Graphics2D g2d = destImage.createGraphics();
+
+            // 缁樺埗鍘熷浘
+            g2d.drawImage(srcImage, 0, 0, null);
+
+            // 缁樺埗鍗婇�忔槑鑳屾櫙锛堝乏涓嬭锛�
+            g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));
+            g2d.setColor(Color.BLACK);
+            g2d.fillRect(0, srcHeight - bgHeight, srcWidth, bgHeight);
+
+            // 缁樺埗姘村嵃鏂囧瓧
+            g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.9f));
+            g2d.setColor(Color.WHITE);
+            Font font = new Font(Font.SANS_SERIF, Font.PLAIN, fontSize);
+            g2d.setFont(font);
+
+            // 寮�鍚姉閿娇
+            g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
+
+            int textX = padding;
+            int textY = srcHeight - bgHeight + padding + fontSize;
+            FontMetrics fm = g2d.getFontMetrics();
+            int maxTextWidth = srcWidth - padding * 2;
+
+            // 绗竴琛岋細鏃堕棿
+            g2d.drawString(timeText, textX, textY);
+
+            // 绗簩琛岋細鍦板潃锛堝湴鍧�杩囬暱鏃舵埅鏂級
+            String displayAddr = addressText;
+            while (fm.stringWidth(displayAddr) > maxTextWidth && displayAddr.length() > 0) {
+                displayAddr = displayAddr.substring(0, displayAddr.length() - 1);
+            }
+            g2d.drawString(displayAddr, textX, textY + lineHeight);
+
+            // 绗笁琛岋細缁忕含搴�
+            if (!locationText.isEmpty()) {
+                g2d.drawString(locationText, textX, textY + lineHeight * 2);
+            }
+
+            g2d.dispose();
+
+            // 杈撳嚭涓哄瓧鑺傛祦
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            ImageIO.write(destImage, "jpg", baos);
+            return new ByteArrayInputStream(baos.toByteArray());
+        } catch (Exception e) {
+            log.error("娣诲姞姘村嵃澶辫触锛岃繑鍥炲師鍥�", e);
+            try {
+                imageInput.reset();
+            } catch (Exception ignored) {}
+            return imageInput;
+        }
+    }
+}
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/PricingRule.java b/server/services/src/main/java/com/doumee/dao/business/model/PricingRule.java
index dd30250..fa3ba0e 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/PricingRule.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/PricingRule.java
@@ -58,7 +58,7 @@
     @ApiModelProperty(value = "鍙傛暟2锛歵ype 锛�0锛�=  鏀惰垂鍗曚环 ;type 锛�1锛�= 閰嶉�佽捣姝ラ噷绋嬪叕閲屾暟 锛泃ype 锛�2锛�= 璧烽�侀噷绋� km 锛� type (3)  = 鎶奸噾锛泃ype (4) = 鍦扮偣绫诲瀷锛堝瘎浠剁偣/鍙栦欢鐐�/鍒嗘垚姣斾緥锛�")
     private String fieldB;
 
-    @ApiModelProperty(value = "鍙傛暟3锛歵ype 锛�1锛�= 閰嶉�佽捣姝ラ噷绋嬫瘡鍏噷鍗曚环 锛泃ype (2)  = 璧烽�佹椂闀匡紱 type (3)  = 鎶奸噾锛泃ype (4) = 鍒嗘垚姣斾緥")
+    @ApiModelProperty(value = "鍙傛暟3锛歵ype 锛�1锛�= 閰嶉�佽捣姝ラ噷绋嬫瘡鍏噷鍗曚环 锛泃ype (2)  = 璧烽�佹椂闀匡紱")
     private String fieldC;
 
     @ApiModelProperty(value = "鍙傛暟4锛歵ype=1  瓒呭嚭棣栧崟閲岀▼鍏噷鏁� 锛� type =2  缁�侀噷绋� km锛�")
diff --git a/server/services/src/main/java/com/doumee/dao/vo/ActiveOrderTipVO.java b/server/services/src/main/java/com/doumee/dao/vo/ActiveOrderTipVO.java
new file mode 100644
index 0000000..0bb3995
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/vo/ActiveOrderTipVO.java
@@ -0,0 +1,30 @@
+package com.doumee.dao.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 棣栭〉杩涜涓渶鏂拌鍗曟彁绀篤O
+ * @author rk
+ * @date 2026/04/21
+ */
+@Data
+@ApiModel("棣栭〉杩涜涓渶鏂拌鍗曟彁绀�")
+public class ActiveOrderTipVO implements Serializable {
+
+    @ApiModelProperty(value = "璁㈠崟涓婚敭")
+    private Integer orderId;
+
+    @ApiModelProperty(value = "璁㈠崟鐘舵��")
+    private Integer status;
+
+    @ApiModelProperty(value = "鐘舵�佹彁绀烘枃妗�")
+    private String tip;
+
+    @ApiModelProperty(value = "鏀粯鍊掕鏃舵绉掞紙浠卻tatus=0鏃惰繑鍥烇紝-1琛ㄧず宸茶秴鏃讹級")
+    private Long payCountdown;
+
+}
diff --git a/server/services/src/main/java/com/doumee/service/business/AddrService.java b/server/services/src/main/java/com/doumee/service/business/AddrService.java
index 5668ada..f1dc748 100644
--- a/server/services/src/main/java/com/doumee/service/business/AddrService.java
+++ b/server/services/src/main/java/com/doumee/service/business/AddrService.java
@@ -39,8 +39,10 @@
 
     /**
      * 鏌ヨ浼氬憳鍦板潃鍒楄〃锛堝惈鐪佸競鍖轰俊鎭級
+     * @param memberId 浼氬憳涓婚敭
+     * @param keyword 妯$硦鎼滅储鍏抽敭璇嶏紙鍖归厤鍦板潃/鍚嶇О/鎵嬫満鍙凤級锛屽彲涓簄ull
      */
-    List<Addr> findListWithArea(Integer memberId);
+    List<Addr> findListWithArea(Integer memberId, String keyword);
 
     /**
      * 鏍规嵁ID鏌ヨ鍦板潃锛堝惈鐪佸競鍖轰俊鎭級
diff --git a/server/services/src/main/java/com/doumee/service/business/NoticeService.java b/server/services/src/main/java/com/doumee/service/business/NoticeService.java
index d89d0a8..2b25539 100644
--- a/server/services/src/main/java/com/doumee/service/business/NoticeService.java
+++ b/server/services/src/main/java/com/doumee/service/business/NoticeService.java
@@ -34,4 +34,19 @@
     PageData<Notice> findPage(PageWrap<Notice> pageWrap);
 
     long count(Notice notice);
+
+    /**
+     * 鏍囪閫氱煡涓哄凡璇�
+     * @param id 閫氱煡涓婚敭
+     * @param userId 鐢ㄦ埛涓婚敭锛堟牎楠屽綊灞烇級
+     */
+    void readNotice(Integer id, Integer userId);
+
+    /**
+     * 鏍囪璇ョ敤鎴锋墍鏈夐�氱煡涓哄凡璇�
+     * @param userType 鐢ㄦ埛绫诲瀷
+     * @param userId 鐢ㄦ埛涓婚敭
+     */
+    void readAllNotice(Integer userType, Integer userId);
+
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/OrdersService.java b/server/services/src/main/java/com/doumee/service/business/OrdersService.java
index 48daf2e..3a9df6a 100644
--- a/server/services/src/main/java/com/doumee/service/business/OrdersService.java
+++ b/server/services/src/main/java/com/doumee/service/business/OrdersService.java
@@ -9,15 +9,7 @@
 import com.doumee.dao.dto.DispatchDTO;
 import com.doumee.dao.dto.CommentOrderDTO;
 import com.doumee.dao.dto.MyOrderDTO;
-import com.doumee.dao.vo.MyOrderDetailVO;
-import com.doumee.dao.vo.MyOrderVO;
-import com.doumee.dao.vo.OrderDetailVO;
-import com.doumee.dao.vo.OrderDispatchVO;
-import com.doumee.dao.vo.OrderSummaryVO;
-import com.doumee.dao.vo.OverdueFeeVO;
-import com.doumee.dao.vo.PayResponse;
-import com.doumee.dao.vo.PriceCalculateVO;
-import com.doumee.dao.vo.EstimatedDeliveryResultVO;
+import com.doumee.dao.vo.*;
 
 import java.math.BigDecimal;
 import java.util.List;
@@ -380,4 +372,13 @@
                                                          Double fromLat, Double fromLng,
                                                          Double toLat, Double toLng);
 
+    /**
+     * 鏌ヨ浼氬憳棣栭〉杩涜涓渶鏂拌鍗曟彁绀�
+     * 鏌ヨstatus in (0,1,2,3,4,5)鐨勮鍗曪紝鎸夊垱寤烘椂闂村�掑簭鍙栫涓�鏉�
+     *
+     * @param memberId 浼氬憳涓婚敭
+     * @return 鏈�鏂拌繘琛屼腑璁㈠崟鎻愮ず锛屾棤璁㈠崟杩斿洖null
+     */
+    ActiveOrderTipVO getActiveOrderTip(Integer memberId);
+
 }
\ No newline at end of file
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/AddrServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/AddrServiceImpl.java
index ef347b1..e5d284e 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/AddrServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/AddrServiceImpl.java
@@ -171,7 +171,7 @@
     }
 
     @Override
-    public List<Addr> findListWithArea(Integer memberId) {
+    public List<Addr> findListWithArea(Integer memberId, String keyword) {
         MPJLambdaWrapper<Addr> wrapper = new MPJLambdaWrapper<Addr>()
                 .selectAll(Addr.class)
                 .select("a3.name", Addr::getDistrictName)
@@ -186,8 +186,14 @@
                 .leftJoin("areas a2 on a2.id = a3.PARENT_ID")
                 .leftJoin("areas a1 on a1.id = a2.PARENT_ID")
                 .eq(Addr::getDeleted, Constants.ZERO)
-                .eq(Addr::getMemberId, memberId)
-                .orderByDesc(Addr::getIsDefault)
+                .eq(Addr::getMemberId, memberId);
+        if (StringUtils.isNotBlank(keyword)) {
+            wrapper.and(w -> w
+                    .like(Addr::getAddr, keyword)
+                    .or().like(Addr::getName, keyword)
+                    .or().like(Addr::getPhone, keyword));
+        }
+        wrapper.orderByDesc(Addr::getIsDefault)
                 .orderByDesc(Addr::getCreateTime);
         return addrMapper.selectJoinList(Addr.class, wrapper);
     }
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 b73f56c..cbd6691 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
@@ -332,7 +332,7 @@
                 member.setReceiveNum(Constants.ZERO.longValue());
                 member.setPublishNum(Constants.ZERO.longValue());
                 member.setAutoReceiveStatus(Constants.ONE);
-                member.setUseIdentity(Constants.ZERO);
+                member.setUserType(Constants.ZERO);
                 memberMapper.insert(member);
             }
             String token = JwtTokenUtil.generateTokenForRedis(member.getId(), Constants.ZERO, JSONObject.toJSONString(member), redisTemplate);
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/NoticeServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/NoticeServiceImpl.java
index b5a458a..5b9bcb0 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/NoticeServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/NoticeServiceImpl.java
@@ -1,8 +1,10 @@
 package com.doumee.service.business.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.doumee.core.constants.Constants;
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.NoticeMapper;
@@ -12,6 +14,7 @@
 import org.springframework.stereotype.Service;
 
 import java.util.List;
+import java.util.Objects;
 
 /**
  * 娑堟伅閫氱煡淇℃伅Service瀹炵幇
@@ -86,35 +89,12 @@
         IPage<Notice> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
         QueryWrapper<Notice> queryWrapper = new QueryWrapper<>();
         if (pageWrap.getModel() != null) {
-            if (pageWrap.getModel().getIsdeleted() != null) {
-                queryWrapper.lambda().eq(Notice::getIsdeleted, pageWrap.getModel().getIsdeleted());
-            }
-            if (pageWrap.getModel().getUserType() != null) {
-                queryWrapper.lambda().eq(Notice::getUserType, pageWrap.getModel().getUserType());
-            }
-            if (pageWrap.getModel().getUserId() != null) {
-                queryWrapper.lambda().eq(Notice::getUserId, pageWrap.getModel().getUserId());
-            }
-            if (pageWrap.getModel().getObjType() != null) {
-                queryWrapper.lambda().eq(Notice::getObjType, pageWrap.getModel().getObjType());
-            }
-            if (pageWrap.getModel().getStatus() != null) {
-                queryWrapper.lambda().eq(Notice::getStatus, pageWrap.getModel().getStatus());
-            }
-            if (pageWrap.getModel().getTitle() != null) {
-                queryWrapper.lambda().like(Notice::getTitle, pageWrap.getModel().getTitle());
-            }
-            if (pageWrap.getModel().getCreateDate() != null) {
-                queryWrapper.lambda().ge(Notice::getCreateDate, pageWrap.getModel().getCreateDate());
-            }
+            Notice model = pageWrap.getModel();
+            queryWrapper.lambda().eq(Notice::getIsdeleted,Constants.ZERO);
+            queryWrapper.lambda().eq(Objects.nonNull(model.getUserId()),Notice::getUserId,model.getUserId());
+            queryWrapper.lambda().eq(Objects.nonNull(model.getUserType()),Notice::getUserType,model.getUserType());
         }
-        for (PageWrap.SortData sortData : pageWrap.getSorts()) {
-            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
-                queryWrapper.orderByDesc(sortData.getProperty());
-            } else {
-                queryWrapper.orderByAsc(sortData.getProperty());
-            }
-        }
+        queryWrapper.lambda().orderByAsc(Notice::getStatus).orderByDesc(Notice::getCreateDate);
         return PageData.from(noticeMapper.selectPage(page, queryWrapper));
     }
 
@@ -123,4 +103,26 @@
         QueryWrapper<Notice> wrapper = new QueryWrapper<>(notice);
         return noticeMapper.selectCount(wrapper);
     }
+
+    @Override
+    public void readNotice(Integer id, Integer userId) {
+        Notice notice = noticeMapper.selectById(id);
+        if (notice != null && notice.getUserId().equals(userId)) {
+            notice.setStatus(Constants.ONE);
+            notice.setEditDate(new java.util.Date());
+            noticeMapper.updateById(notice);
+        }
+    }
+
+    @Override
+    public void readAllNotice(Integer userType, Integer userId) {
+        noticeMapper.update(new UpdateWrapper<Notice>().lambda()
+                .set(Notice::getStatus, Constants.ONE)
+                .set(Notice::getEditDate, new java.util.Date())
+                .eq(Notice::getUserType, userType)
+                .eq(Notice::getUserId, userId)
+                .eq(Notice::getStatus, Constants.ZERO)
+                .eq(Notice::getIsdeleted, Constants.ZERO));
+    }
+
 }
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 5098a38..e4f0227 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
@@ -420,8 +420,11 @@
         String to = dto.getToLat() + "," + dto.getToLgt();
         JSONObject distanceResult = MapUtil.direction("driving", from, to);
         BigDecimal distance = distanceResult.getBigDecimal("distance");
-        // distance 鍗曚綅涓虹背锛岃浆涓哄叕閲�
+        // distance 鍗曚綅涓虹背锛岃浆涓哄叕閲岋紙涓嶈冻1鍏噷鎸�1鍏噷璁$畻锛�
         BigDecimal distanceKm = distance.divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP);
+        if (distanceKm.compareTo(BigDecimal.ONE) < 0) {
+            distanceKm = BigDecimal.ONE;
+        }
 
         // 鏀堕泦鎵�鏈夌墿鍝佺被鍨婭D
         List<Integer> categoryIds = new ArrayList<>();
@@ -645,8 +648,11 @@
 
         // ========== 3. 鏌ヨ瀵勪欢搴楅摵淇℃伅 ==========
         ShopInfo depositShop = shopInfoMapper.selectById(dto.getDepositShopId());
-        if (depositShop == null) {
+        if (depositShop == null || Constants.equalsInteger(depositShop.getDeleted(), Constants.ONE)) {
             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵勪欢搴楅摵涓嶅瓨鍦�");
+        }
+        if (depositShop.getStatus() == null || !Constants.equalsInteger(depositShop.getStatus(), Constants.ZERO)) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵勪欢搴楅摵宸插仠涓氾紝璇烽�夋嫨鍏朵粬闂ㄥ簵");
         }
 
         // ========== 4. 璁$畻璐圭敤 ==========
@@ -663,9 +669,15 @@
             }
             // 鍙栦欢鐐癸細搴楅摵 or 鑷�夌偣锛岃嚦灏戞彁渚涗竴缁�
             if (dto.getTakeShopId() != null) {
+                if (dto.getTakeShopId().equals(dto.getDepositShopId())) {
+                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "寮傚湴瀵勫瓨璁㈠崟瀛樹欢闂ㄥ簵鍜屽彇浠堕棬搴椾笉鑳界浉鍚�");
+                }
                 takeShop = shopInfoMapper.selectById(dto.getTakeShopId());
-                if (takeShop == null) {
+                if (takeShop == null || Constants.equalsInteger(takeShop.getDeleted(), Constants.ONE)) {
                     throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鍙栦欢搴楅摵涓嶅瓨鍦�");
+                }
+                if (takeShop.getStatus() == null || !Constants.equalsInteger(takeShop.getStatus(), Constants.ONE)) {
+                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鍙栦欢搴楅摵宸插仠涓氾紝璇烽�夋嫨鍏朵粬闂ㄥ簵");
                 }
                 takeLat = BigDecimal.valueOf(takeShop.getLatitude());
                 takeLgt = BigDecimal.valueOf(takeShop.getLongitude());
@@ -764,6 +776,7 @@
             orders.setTakeLat(takeLat);
             orders.setTakeLgt(takeLgt);
             orders.setIsUrgent(dto.getIsUrgent());
+            orders.setDistance(priceResult.getDistance());
         } else {
             // 灏卞湴锛氬彇浠剁偣鍚屽瘎浠跺簵閾�
             orders.setTakeShopId(dto.getDepositShopId());
@@ -775,7 +788,12 @@
 
         // 鐗╁搧淇℃伅
         orders.setGoodType(dto.getGoodType());
-        orders.setGoodLevel(goodTypeCategory.getRelationId());
+        // 鏌ヨ鐗╁搧绾у埆 type = 3
+        Category levelCategory = categoryMapper.selectById(goodTypeCategory.getRelationId());
+        if(Objects.isNull(levelCategory)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌鐗╁搧绛夌骇淇℃伅锛歿}"+goodTypeCategory.getName());
+        }
+        orders.setGoodLevel(Integer.valueOf(levelCategory.getDetail()));
         // 鎷兼帴鐗╁搧淇℃伅锛氱墿鍝佺被鍨嬪悕绉般�佸昂瀵稿悕绉�*鏁伴噺锛堟暟缁勫瓧绗︿覆锛�
         List<String> goodsParts = new ArrayList<>();
         for (ItemPriceVO itemVO : priceResult.getItemList()) {
@@ -797,7 +815,6 @@
         }
         orders.setDeclaredFee(priceResult.getInsuranceFee());
         orders.setPrice(priceResult.getItemPrice());
-
         // 钖叕璁$畻涓庡崰姣斿瓨鍌�
         calculateAndSetFeeAllocation(orders, depositShop, takeShop);
 
@@ -1307,8 +1324,9 @@
                 .eq(PricingRule::getCityId, cityId)
                 .eq(PricingRule::getFieldA, String.valueOf(fieldA))
                 .last("limit 1"));
-        if (rule != null && StringUtils.isNotBlank(rule.getFieldC())) {
-            return new BigDecimal(rule.getFieldC());
+        if (rule != null && StringUtils.isNotBlank(rule.getFieldB())) {
+            // fieldB 瀛樺偍鐨勬槸鐧惧垎姣旀暣鏁帮紙濡�15琛ㄧず15%锛夛紝杞崲涓哄皬鏁版瘮渚嬶紙0.15锛�
+            return new BigDecimal(rule.getFieldB()).divide(new BigDecimal("100"), 4, BigDecimal.ROUND_HALF_UP);
         }
         return BigDecimal.ZERO;
     }
@@ -1836,6 +1854,7 @@
         order.setPayStatus(Constants.ONE); // 宸叉敮浠�
         order.setPayTime(now);
         order.setWxExternalNo(wxTradeNo);
+        order.setPayAmount(order.getTotalAmount());
         order.setUpdateTime(now);
         // 鐢熸垚浼氬憳鏍搁攢鐮�
         order.setMemberVerifyCode(generateVerifyCode());
@@ -3122,6 +3141,61 @@
     }
 
     @Override
+    public ActiveOrderTipVO getActiveOrderTip(Integer memberId) {
+        // 鏌ヨ鐘舵�佷负 0~5 鐨勬渶鏂颁竴鏉¤鍗�
+        QueryWrapper<Orders> wrapper = new QueryWrapper<>();
+        wrapper.eq("MEMBER_ID", memberId)
+                .in("STATUS", 0, 1, 2, 3, 4, 5)
+                .orderByDesc("CREATE_TIME")
+                .last("LIMIT 1");
+        Orders order = ordersMapper.selectOne(wrapper);
+        if (order == null) {
+            return null;
+        }
+
+        ActiveOrderTipVO vo = new ActiveOrderTipVO();
+        vo.setOrderId(order.getId());
+        vo.setStatus(order.getStatus());
+
+        // 鏋勫缓鎻愮ず鏂囨
+        boolean isLocal = Constants.equalsInteger(order.getType(), Constants.ZERO);
+        Integer status = order.getStatus();
+        String tip = null;
+
+        if (Constants.equalsInteger(status, Constants.OrderStatus.waitPay.getStatus())) {
+            // 寰呮敮浠橈細鎻愮ず鏀粯鍊掕鏃�
+            String minutes = "";
+            try {
+                minutes = operationConfigBiz.getConfig().getAutoCancelTime();
+            } catch (Exception ignored) {}
+            tip = "璇峰湪" + (StringUtils.isNotBlank(minutes) ? minutes : "") + "鍒嗛挓鍐呭畬鎴愭敮浠橈紝瓒呮椂璁㈠崟灏嗚嚜鍔ㄥ彇娑�";
+
+            // 璁$畻鏀粯鍊掕鏃�
+            if (StringUtils.isNotBlank(minutes) && order.getCreateTime() != null) {
+                long timeoutMs = Long.parseLong(minutes) * 60 * 1000;
+                long deadline = order.getCreateTime().getTime() + timeoutMs;
+                long remain = deadline - System.currentTimeMillis();
+                vo.setPayCountdown(remain > 0 ? remain : -1L);
+            } else {
+                vo.setPayCountdown(-1L);
+            }
+        } else if (Constants.equalsInteger(status, Constants.OrderStatus.waitDeposit.getStatus())) {
+            tip = "璁㈠崟宸叉敮浠橈紝璇峰墠寰�闂ㄥ簵瀵勫瓨";
+        } else if (Constants.equalsInteger(status, Constants.OrderStatus.deposited.getStatus())) {
+            tip = isLocal ? "琛屾潕宸插瘎瀛橈紝璇峰嚟鍙栦欢鐮佸墠寰�鎸囧畾闂ㄥ簵鍙栦欢" : "闂ㄥ簵宸叉帴鍗曪紝姝e湪涓烘偍瀹夋帓鍙栦欢鍙告満";
+        } else if (Constants.equalsInteger(status, Constants.OrderStatus.accepted.getStatus())) {
+            tip = isLocal ? "琛屾潕宸插瘎瀛橈紝璇峰嚟鍙栦欢鐮佸墠寰�鎸囧畾闂ㄥ簵鍙栦欢" : "宸叉湁鍙告満鎶㈠崟锛屾鍓嶅線鍙栦欢鍦扮偣";
+        } else if (Constants.equalsInteger(status, Constants.OrderStatus.delivering.getStatus())) {
+            tip = "鍙告満宸插彇浠讹紝姝h繍寰�鐩殑鍦�";
+        } else if (Constants.equalsInteger(status, Constants.OrderStatus.arrived.getStatus())) {
+            tip = "琛屾潕宸查�佽揪鏈嶅姟鐐癸紝璇峰強鏃跺墠寰�鍙栦欢";
+        }
+
+        vo.setTip(tip);
+        return vo;
+    }
+
+    @Override
     public EstimatedDeliveryResultVO calculateEstimatedDelivery(Integer cityId,
                                                                 Double fromLat, Double fromLng,
                                                                 Double toLat, Double toLng) {
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/PricingRuleServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/PricingRuleServiceImpl.java
index 189a914..370418f 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/PricingRuleServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/PricingRuleServiceImpl.java
@@ -508,6 +508,11 @@
 
         Date now = new Date();
         for (StoreDepositItemDTO item : request.getItems()) {
+            // 鍏冭浆鍒�
+            String depositFen = String.valueOf(new BigDecimal(item.getDepositAmount())
+                    .multiply(new BigDecimal("100"))
+                    .setScale(0, BigDecimal.ROUND_HALF_UP)
+                    .longValue());
             QueryWrapper<PricingRule> qw = new QueryWrapper<>();
             qw.lambda()
                     .eq(PricingRule::getType, Constants.THREE)
@@ -518,14 +523,14 @@
             PricingRule existing = pricingRuleMapper.selectOne(qw);
 
             if (existing != null) {
-                existing.setFieldB(item.getDepositAmount());
+                existing.setFieldB(depositFen);
                 existing.setUpdateTime(now);
                 pricingRuleMapper.updateById(existing);
             } else {
                 PricingRule rule = new PricingRule();
                 rule.setType(Constants.THREE);
                 rule.setFieldA(String.valueOf(item.getFieldType()));
-                rule.setFieldB(item.getDepositAmount());
+                rule.setFieldB(depositFen);
                 rule.setCityId(request.getCityId());
                 rule.setDeleted(Constants.ZERO);
                 rule.setCreateTime(now);
diff --git a/server/services/src/main/resources/application-dev.yml b/server/services/src/main/resources/application-dev.yml
index 368cafd..6292a33 100644
--- a/server/services/src/main/resources/application-dev.yml
+++ b/server/services/src/main/resources/application-dev.yml
@@ -127,7 +127,7 @@
 tencent_key: WE3BZ-HN6WS-ONDOH-62QCV-MNL6F-5NFNE
 
 # 楂樺痉鍦板浘apikey
-geocode_map_key: 9a62636d82d6c7c2372e57d80f99287c
+geocode_map_key: 9a6c1f0eff2e5aa91989ca9d4c21e262
 
 
 
diff --git a/server/web/src/main/java/com/doumee/api/web/AddrApi.java b/server/web/src/main/java/com/doumee/api/web/AddrApi.java
index 9a047fd..dff8c87 100644
--- a/server/web/src/main/java/com/doumee/api/web/AddrApi.java
+++ b/server/web/src/main/java/com/doumee/api/web/AddrApi.java
@@ -27,13 +27,14 @@
     private AddrService addrService;
 
     @LoginRequired
-    @ApiOperation(value = "鏌ヨ鎴戠殑鍦板潃鍒楄〃", notes = "灏忕▼搴忕")
+    @ApiOperation(value = "鏌ヨ鎴戠殑鍦板潃鍒楄〃", notes = "灏忕▼搴忕锛屾敮鎸佹寜鍦板潃/鍚嶇О/鎵嬫満鍙锋ā绯婃悳绱�")
     @GetMapping("/list")
     @ApiImplicitParams({
             @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+            @ApiImplicitParam(paramType = "query", dataType = "String", name = "keyword", value = "鎼滅储鍏抽敭璇嶏紙鍦板潃/鍚嶇О/鎵嬫満鍙凤級"),
     })
-    public ApiResponse<List<Addr>> list() {
-        return ApiResponse.success("鏌ヨ鎴愬姛", addrService.findListWithArea(getMemberId()));
+    public ApiResponse<List<Addr>> list(@RequestParam(required = false) String keyword) {
+        return ApiResponse.success("鏌ヨ鎴愬姛", addrService.findListWithArea(getMemberId(), keyword));
     }
 
     @LoginRequired
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 deb2560..42e0df5 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
@@ -2,16 +2,21 @@
 
 import com.doumee.core.annotation.LoginRequired;
 import com.doumee.core.annotation.trace.Trace;
+import com.doumee.core.constants.Constants;
 import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.geocode.MapUtil;
 import com.doumee.dao.business.model.Areas;
 import com.doumee.dao.business.model.Banner;
 import com.doumee.dao.business.model.Category;
+import com.doumee.dao.business.model.Notice;
 import com.doumee.dao.dto.AreasDto;
 import com.doumee.dao.dto.CalculateLocalPriceDTO;
 import com.doumee.dao.dto.CalculateRemotePriceDTO;
 import com.doumee.dao.dto.SameCityCheckDTO;
 import com.doumee.dao.vo.PriceCalculateVO;
+import com.doumee.dao.vo.ActiveOrderTipVO;
 import com.doumee.dao.vo.PlatformAboutVO;
 import com.doumee.service.business.*;
 import io.swagger.annotations.Api;
@@ -54,6 +59,9 @@
 
     @Autowired
     private MemberService memberService;
+
+    @Autowired
+    private NoticeService noticeService;
 
     @ApiOperation("鍏ㄩ儴鍖哄垝鏍戝舰鏌ヨ")
     @PostMapping("/treeList")
@@ -144,5 +152,43 @@
         return ApiResponse.success("鏌ヨ鎴愬姛", areasService.getOpenedCityByName(cityName));
     }
 
+    @LoginRequired
+    @ApiOperation(value = "浼氬憳閫氱煡娑堟伅鍒嗛〉", notes = "鏈浼樺厛锛屾椂闂村�掑簭")
+    @PostMapping("/memberNoticePage")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true)
+    })
+    public ApiResponse<PageData<Notice>> memberNoticePage(@RequestBody PageWrap<Notice> pageWrap) {
+        if (pageWrap.getModel() == null) {
+            pageWrap.setModel(new Notice());
+        }
+        pageWrap.getModel().setUserId(this.getMemberId());
+        pageWrap.getModel().setUserType(Constants.ZERO);
+        return ApiResponse.success("鏌ヨ鎴愬姛", noticeService.findPage(pageWrap));
+    }
+
+
+    @LoginRequired
+    @ApiOperation(value = "棣栭〉杩涜涓鍗曟彁绀�", notes = "杩斿洖鏈�鏂颁竴鏉¤繘琛屼腑璁㈠崟鐨勭姸鎬佸拰鎻愮ず鏂囨锛屾棤璁㈠崟杩斿洖null")
+    @GetMapping("/getActiveOrderTip")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true)
+    })
+    public ApiResponse<ActiveOrderTipVO> getActiveOrderTip() {
+        return ApiResponse.success("鏌ヨ鎴愬姛", ordersService.getActiveOrderTip(this.getMemberId()));
+    }
+
+
+    @LoginRequired
+    @ApiOperation(value = "浼氬憳鏍囪鍏ㄩ儴宸茶", notes = "鏍囪褰撳墠鐢ㄦ埛鎵�鏈夋湭璇婚�氱煡涓哄凡璇�")
+    @PostMapping("/memberReadAllNotice")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true)
+    })
+    public ApiResponse readAllNotice() {
+        noticeService.readAllNotice(0, this.getMemberId());
+        return ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
+
 
 }

--
Gitblit v1.9.3