trading-order-admin/src/main/resources/application-dev.yml
@@ -117,8 +117,8 @@ images.dir: /www/wwwroot/img/ admin_url: https://localhost:8080/admin web_url: http://localhost:8080/wap/ images_http: https://img.1mcrypto.com/ api_http: https://api.1mcrypto.com/ images_http: https://img.dpcex.com/ api_http: https://api.dpcex.com/ email: host: smtp.gmail.com username: coinzne.com@gmail.com trading-order-service/src/main/java/com/yami/trading/service/c2c/impl/C2cOrderServiceImpl.java
@@ -34,6 +34,7 @@ import com.yami.trading.service.RealNameAuthRecordService; import com.yami.trading.service.RechargeBlockchainOrderService; import com.yami.trading.service.WalletService; import com.yami.trading.service.notify.WalletTransactionMailNotificationService; import com.yami.trading.service.c2c.C2cAdvertService; import com.yami.trading.service.c2c.C2cOrderService; import com.yami.trading.service.c2c.C2cPaymentMethodService; @@ -100,6 +101,9 @@ @Autowired LogService logService; @Autowired private WalletTransactionMailNotificationService walletTransactionMailNotificationService; @Autowired C2cUserService c2cUserService; @@ -627,6 +631,24 @@ log.setLog(logStr); log.setCreateTime(new Date()); logService.save(log); if (order_user != null) { if ("recharge".equals(c2cOrder.getDirection())) { String sym = StringUtils.isEmptyString(c2cOrder.getSymbol()) ? "USDT" : c2cOrder.getSymbol().toUpperCase(); walletTransactionMailNotificationService.sendRechargeSuccess( order_user, c2cOrder.getOrderNo(), BigDecimal.valueOf(c2cOrder.getCoinAmount()), sym); } else if ("withdraw".equals(c2cOrder.getDirection())) { walletTransactionMailNotificationService.sendWithdrawSuccess( order_user, c2cOrder.getOrderNo(), BigDecimal.valueOf(c2cOrder.getCoinAmount()), BigDecimal.ZERO, "USDT"); } } } /** trading-order-service/src/main/java/com/yami/trading/service/contract/ContractOrderService.java
@@ -775,7 +775,7 @@ if (ObjectUtils.isNotEmpty(syspara) && "1".equals(syspara.getSvalue())) { return closePrice.multiply(closeVolume).multiply(BigDecimal.valueOf(item.getUnitPercentage())) .setScale(8, RoundingMode.HALF_UP); } } return BigDecimal.valueOf(item.getUnitFee()).multiply(closePrice).multiply(closeVolume) .setScale(8, RoundingMode.HALF_UP); } trading-order-service/src/main/java/com/yami/trading/service/impl/RechargeBlockchainOrderServiceImpl.java
@@ -17,6 +17,7 @@ import com.yami.trading.common.util.RandomUtil; import com.yami.trading.dao.user.RechargeBlockchainOrderMapper; import com.yami.trading.service.*; import com.yami.trading.service.notify.WalletTransactionMailNotificationService; import com.yami.trading.service.c2c.C2cOrderService; import com.yami.trading.service.data.DataService; import com.yami.trading.service.syspara.SysparaService; @@ -74,6 +75,9 @@ @Autowired DataService dataService; @Autowired private WalletTransactionMailNotificationService walletTransactionMailNotificationService; @Override @@ -232,6 +236,10 @@ } } userService.updateById(party); BigDecimal mailAmount = BigDecimal.valueOf(amount1); String mailAsset = "usdc".equalsIgnoreCase(recharge.getSymbol()) ? "USDT (from USDC)" : "USDT"; walletTransactionMailNotificationService.sendRechargeSuccess( party, recharge.getOrderNo(), mailAmount, mailAsset); } else { List<Realtime> realtime_list = this.dataService.realtime(recharge.getSymbol()); @@ -351,6 +359,11 @@ } } userService.updateById(party); walletTransactionMailNotificationService.sendRechargeSuccess( party, recharge.getOrderNo(), BigDecimal.valueOf(recharge.getVolume()), recharge.getSymbol().toUpperCase()); } Log log = new Log(); log.setCategory(Constants.LOG_CATEGORY_OPERATION); trading-order-service/src/main/java/com/yami/trading/service/impl/WithdrawServiceImpl.java
@@ -25,6 +25,7 @@ import com.yami.trading.common.util.StringUtils; import com.yami.trading.dao.user.WithdrawMapper; import com.yami.trading.service.*; import com.yami.trading.service.notify.WalletTransactionMailNotificationService; import com.yami.trading.service.syspara.SysparaService; import com.yami.trading.service.system.LogService; import com.yami.trading.service.system.TipService; @@ -72,6 +73,8 @@ WalletLogService walletLogService; @Autowired LogService logService; @Autowired private WalletTransactionMailNotificationService walletTransactionMailNotificationService; @Override public Page listRecord(Page page, String status, String roleName, @@ -117,6 +120,13 @@ log.setLog("通过提现申请。订单号[" + withdraw.getOrderNo() + "]。"); logService.save(log); tipService.deleteTip(withdraw.getUuid().toString()); String asset = symbol.toUpperCase(); walletTransactionMailNotificationService.sendWithdrawSuccess( user, withdraw.getOrderNo(), withdraw.getAmount(), withdraw.getAmountFee(), asset); } } trading-order-service/src/main/java/com/yami/trading/service/notify/WalletTransactionMailNotificationService.java
New file @@ -0,0 +1,82 @@ package com.yami.trading.service.notify; import com.yami.trading.bean.model.User; import com.yami.trading.service.EmailSendService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; /** * Sends English notification emails for successful deposits and withdrawals. * Recipient: {@link User#getUserMail()} if set, otherwise {@link User#getUserName()} when it looks like an email. */ @Service @Slf4j public class WalletTransactionMailNotificationService { @Autowired private EmailSendService emailSendService; public void sendRechargeSuccess(User user, String orderNo, BigDecimal amount, String assetDescription) { String to = resolveRecipientEmail(user); if (to == null) { log.warn("Skip deposit success email: no email for userId={}", user != null ? user.getUserId() : null); return; } String subject = "Deposit successful"; String amt = amount == null ? "-" : amount.stripTrailingZeros().toPlainString(); String asset = assetDescription == null ? "" : assetDescription; String body = "Hello,\n\n" + "Your deposit has been credited successfully.\n\n" + "Order number: " + orderNo + "\n" + "Amount: " + amt + " " + asset + "\n\n" + "If you did not make this transaction, please contact support immediately.\n\n" + "Best regards"; try { emailSendService.sendEmail(to, subject, body); } catch (Exception e) { log.error("Failed to send deposit success email, orderNo={}", orderNo, e); } } public void sendWithdrawSuccess(User user, String orderNo, BigDecimal amount, BigDecimal fee, String assetDescription) { String to = resolveRecipientEmail(user); if (to == null) { log.warn("Skip withdrawal success email: no email for userId={}", user != null ? user.getUserId() : null); return; } String subject = "Withdrawal successful"; String amt = amount == null ? "-" : amount.stripTrailingZeros().toPlainString(); String feeStr = (fee == null || fee.compareTo(BigDecimal.ZERO) == 0) ? "none" : fee.stripTrailingZeros().toPlainString(); String asset = assetDescription == null ? "" : assetDescription; String body = "Hello,\n\n" + "Your withdrawal has been completed successfully.\n\n" + "Order number: " + orderNo + "\n" + "Amount: " + amt + " " + asset + "\n" + "Fee: " + feeStr + "\n\n" + "If you did not request this withdrawal, please contact support immediately.\n\n" + "Best regards"; try { emailSendService.sendEmail(to, subject, body); } catch (Exception e) { log.error("Failed to send withdrawal success email, orderNo={}", orderNo, e); } } private static String resolveRecipientEmail(User user) { if (user == null) { return null; } if (user.getUserMail() != null && !user.getUserMail().trim().isEmpty()) { return user.getUserMail().trim(); } if (user.getUserName() != null && user.getUserName().contains("@")) { return user.getUserName().trim(); } return null; } }