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