From cc5fbde0327b90824477b4514742e30d3a374d58 Mon Sep 17 00:00:00 2001 From: tianfeng <769204422@qq.com> Date: Fri, 9 Jan 2026 18:27:15 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=94=A8=E6=88=B7=E7=BA=A2?= =?UTF-8?q?=E5=8C=85=E6=89=8B=E7=BB=AD=E8=B4=B9=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../redpacket/SendUserRedPacketCmdExe.java | 39 +++++++++++++------ .../convertor/UserRedPacketAppConvertor.java | 3 +- .../app/dto/clientobject/UserRedPacketCO.java | 5 +++ .../other/domain/redpacket/UserRedPacket.java | 5 +++ .../convertor/UserRedPacketConvertor.java | 2 + .../rds/entity/UserRedPacketEntity.java | 5 +++ .../dao/redpacket/UserRedPacketDAO.xml | 1 + 7 files changed, 47 insertions(+), 13 deletions(-) diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/redpacket/SendUserRedPacketCmdExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/redpacket/SendUserRedPacketCmdExe.java index 8379e1a7..a49979e3 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/redpacket/SendUserRedPacketCmdExe.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/redpacket/SendUserRedPacketCmdExe.java @@ -5,7 +5,6 @@ import com.red.circle.other.app.convertor.UserRedPacketAppConvertor; import com.red.circle.other.app.dto.clientobject.UserRedPacketCO; import com.red.circle.other.app.dto.cmd.SendUserRedPacketCmd; import com.red.circle.other.domain.gateway.UserRedPacketGateway; -import com.red.circle.other.domain.gateway.user.UserProfileGateway; import com.red.circle.other.domain.redpacket.RoomRedPacketType; import com.red.circle.other.domain.redpacket.UserRedPacket; import com.red.circle.other.domain.redpacket.UserRedPacketStatus; @@ -39,6 +38,11 @@ public class SendUserRedPacketCmdExe { private final UserRedPacketCacheService userRedPacketCacheService; private final WalletGoldClient walletGoldClient; + /** + * 手续费比例:10% + */ + private static final double HANDLING_FEE_RATE = 0.1; + /** * 执行发用户红包 */ @@ -55,36 +59,44 @@ public class SendUserRedPacketCmdExe { LocalDateTime expireTime = LocalDateTime.now().plusHours(24); - UserRedPacket redPacket = buildRedPacket(cmd, senderUserId, receiverUserId, packetId, expireTime); + Long handlingFee = calculateHandlingFee(cmd.getTotalAmount()); + + UserRedPacket redPacket = buildRedPacket(cmd, senderUserId, receiverUserId, packetId, expireTime, handlingFee); userRedPacketGateway.save(redPacket); - deductUserGold(senderUserId, cmd, packetId); + deductUserGold(senderUserId, cmd, packetId, handlingFee); cacheRedPacketData(redPacket); - log.info("发用户红包成功 senderUserId={} receiverUserId={} packetId={} amount={}", - senderUserId, receiverUserId, packetId, cmd.getTotalAmount()); - return UserRedPacketAppConvertor.toCO(redPacket); } + /** + * 计算手续费(10%) + */ + private Long calculateHandlingFee(Long totalAmount) { + return (long) Math.ceil(totalAmount * HANDLING_FEE_RATE); + } + /** * 参数校验 */ private void validateParams(SendUserRedPacketCmd cmd) { - if (cmd.getTotalAmount() < 100 || cmd.getTotalAmount() > 50000) { + if (cmd.getTotalAmount() < 500 || cmd.getTotalAmount() > 250000) { throw new RuntimeException(OtherErrorCode.RED_PACKET_AMOUNT_ERROR.getMessage()); } } /** - * 扣除用户金币 + * 扣除用户金币(红包金额 + 手续费) */ - private void deductUserGold(Long userId, SendUserRedPacketCmd cmd, String packetId) { + private void deductUserGold(Long userId, SendUserRedPacketCmd cmd, String packetId, Long handlingFee) { + Long totalDeduct = cmd.getTotalAmount() + handlingFee; + GoldReceiptCmd build = GoldReceiptCmd.builder() .appExpenditure() .userId(userId) - .amount(PennyAmount.ofDollar(cmd.getTotalAmount())) + .amount(PennyAmount.ofDollar(totalDeduct)) .eventId(packetId) .sysOrigin(cmd.getReqSysOrigin().getOrigin()) .origin(GoldOrigin.USER_RED_PACKET) @@ -93,7 +105,7 @@ public class SendUserRedPacketCmdExe { try { walletGoldClient.changeBalance(build); } catch (Exception e) { - log.error("扣除金币失败 userId={} amount={} packetId={}", userId, cmd.getTotalAmount(), packetId, e); + log.error("扣除金币失败 userId={} totalDeduct={} packetId={}", userId, totalDeduct, packetId, e); ResponseAssert.isTrue(WalletErrorCode.INSUFFICIENT_BALANCE, false); } } @@ -102,13 +114,15 @@ public class SendUserRedPacketCmdExe { * 构建红包对象 */ private UserRedPacket buildRedPacket(SendUserRedPacketCmd cmd, Long senderUserId, - Long receiverUserId, String packetId, LocalDateTime expireTime) { + Long receiverUserId, String packetId, LocalDateTime expireTime, + Long handlingFee) { return UserRedPacket.builder() .packetId(packetId) .senderUserId(senderUserId) .receiverUserId(receiverUserId) .packetType(RoomRedPacketType.FIXED.getCode()) .totalAmount(cmd.getTotalAmount()) + .handlingFee(handlingFee) .expireTime(expireTime) .status(UserRedPacketStatus.PENDING.getCode()) .refundStatus(0) @@ -125,6 +139,7 @@ public class SendUserRedPacketCmdExe { packetData.put("senderUserId", redPacket.getSenderUserId()); packetData.put("receiverUserId", redPacket.getReceiverUserId()); packetData.put("totalAmount", redPacket.getTotalAmount()); + packetData.put("handlingFee", redPacket.getHandlingFee()); packetData.put("expireTime", redPacket.getExpireTime().toString()); packetData.put("status", redPacket.getStatus()); diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/convertor/UserRedPacketAppConvertor.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/convertor/UserRedPacketAppConvertor.java index 1b305057..50af7ddd 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/convertor/UserRedPacketAppConvertor.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/convertor/UserRedPacketAppConvertor.java @@ -5,7 +5,6 @@ import com.red.circle.other.app.dto.clientobject.SimpleUserInfoCO; import com.red.circle.other.app.dto.clientobject.UserRedPacketCO; import com.red.circle.other.domain.redpacket.UserRedPacket; -import java.sql.Time; import java.sql.Timestamp; /** @@ -22,6 +21,7 @@ public class UserRedPacketAppConvertor { .senderUserId(domain.getSenderUserId()) .receiverUserId(domain.getReceiverUserId()) .totalAmount(domain.getTotalAmount()) + .handlingFee(domain.getHandlingFee()) .status(domain.getStatus()) .expireTime(domain.getExpireTime() != null ? Timestamp.valueOf(domain.getExpireTime()) : null) .grabbedAt(domain.getGrabbedAt() != null ? Timestamp.valueOf(domain.getGrabbedAt()) : null) @@ -40,6 +40,7 @@ public class UserRedPacketAppConvertor { .senderInfo(senderInfo) .receiverInfo(receiverInfo) .totalAmount(domain.getTotalAmount()) + .handlingFee(domain.getHandlingFee()) .status(domain.getStatus()) .expireTime(domain.getExpireTime() != null ? Timestamp.valueOf(domain.getExpireTime()) : null) .grabbedAt(domain.getGrabbedAt() != null ? Timestamp.valueOf(domain.getGrabbedAt()) : null) diff --git a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/UserRedPacketCO.java b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/UserRedPacketCO.java index c3509540..d8e57a0d 100644 --- a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/UserRedPacketCO.java +++ b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/UserRedPacketCO.java @@ -47,6 +47,11 @@ public class UserRedPacketCO { */ private Long totalAmount; + /** + * 手续费(金币)10% + */ + private Long handlingFee; + /** * 状态:1-待领取 2-已领取 3-已过期 */ diff --git a/rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/redpacket/UserRedPacket.java b/rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/redpacket/UserRedPacket.java index ece7f335..110b313a 100644 --- a/rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/redpacket/UserRedPacket.java +++ b/rc-service/rc-service-other/other-domain/src/main/java/com/red/circle/other/domain/redpacket/UserRedPacket.java @@ -46,6 +46,11 @@ public class UserRedPacket { */ private Long totalAmount; + /** + * 手续费(分)10% + */ + private Long handlingFee; + /** * 过期时间 */ diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/convertor/UserRedPacketConvertor.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/convertor/UserRedPacketConvertor.java index ac0e0ad9..9dfd7850 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/convertor/UserRedPacketConvertor.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/convertor/UserRedPacketConvertor.java @@ -19,6 +19,7 @@ public class UserRedPacketConvertor { .receiverUserId(entity.getReceiverUserId()) .packetType(entity.getPacketType()) .totalAmount(entity.getTotalAmount()) + .handlingFee(entity.getHandlingFee()) .expireTime(entity.getExpireTime()) .status(entity.getStatus()) .refundStatus(entity.getRefundStatus()) @@ -39,6 +40,7 @@ public class UserRedPacketConvertor { entity.setReceiverUserId(domain.getReceiverUserId()); entity.setPacketType(domain.getPacketType()); entity.setTotalAmount(domain.getTotalAmount()); + entity.setHandlingFee(domain.getHandlingFee()); entity.setExpireTime(domain.getExpireTime()); entity.setStatus(domain.getStatus()); entity.setRefundStatus(domain.getRefundStatus()); diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/entity/UserRedPacketEntity.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/entity/UserRedPacketEntity.java index 609e52f6..c6c8d909 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/entity/UserRedPacketEntity.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/entity/UserRedPacketEntity.java @@ -45,6 +45,11 @@ public class UserRedPacketEntity { */ private Long totalAmount; + /** + * 手续费(分)10% + */ + private Long handlingFee; + /** * 过期时间 */ diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/resources/dao/redpacket/UserRedPacketDAO.xml b/rc-service/rc-service-other/other-infrastructure/src/main/resources/dao/redpacket/UserRedPacketDAO.xml index e8825248..e837df78 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/resources/dao/redpacket/UserRedPacketDAO.xml +++ b/rc-service/rc-service-other/other-infrastructure/src/main/resources/dao/redpacket/UserRedPacketDAO.xml @@ -9,6 +9,7 @@ +