diff --git a/dating-agency-mall-sdk/src/main/java/com/qniao/dam/application/MallServerApplicationService.java b/dating-agency-mall-sdk/src/main/java/com/qniao/dam/application/MallServerApplicationService.java index 731653e..b1e763f 100644 --- a/dating-agency-mall-sdk/src/main/java/com/qniao/dam/application/MallServerApplicationService.java +++ b/dating-agency-mall-sdk/src/main/java/com/qniao/dam/application/MallServerApplicationService.java @@ -2,7 +2,7 @@ package com.qniao.dam.application; import com.qniao.dam.application.request.*; import com.qniao.dam.application.response.ConsumeVirtualAccountVo; -import com.qniao.dam.application.response.CostIMGiftVo; +import com.qniao.dam.application.response.CostGiftVo; import com.qniao.dam.application.response.UserCheckEnableRightBySdkVo; import com.qniao.dam.application.response.UserConsumeRightBySdkVo; import com.qniao.framework.annotation.IgnoreResponseAdvice; @@ -58,5 +58,10 @@ public interface MallServerApplicationService { @PostMapping("/user/cost/im-gift/by/sdk") @IgnoreResponseAdvice - CostIMGiftVo userCostIMGiftBySdk(@RequestBody UserCostIMGiftSdkDto dto); + CostGiftVo userCostIMGiftBySdk(@RequestBody UserCostIMGiftSdkDto dto); + + @PostMapping("/user/cost/channel-gift/by/sdk") + @IgnoreResponseAdvice + CostGiftVo userCostChannelGiftBySdk(@RequestBody UserCostChannelGiftSdkDto dto); + } diff --git a/dating-agency-mall-sdk/src/main/java/com/qniao/dam/application/request/UserCostChannelGiftSdkDto.java b/dating-agency-mall-sdk/src/main/java/com/qniao/dam/application/request/UserCostChannelGiftSdkDto.java new file mode 100644 index 0000000..8341024 --- /dev/null +++ b/dating-agency-mall-sdk/src/main/java/com/qniao/dam/application/request/UserCostChannelGiftSdkDto.java @@ -0,0 +1,26 @@ +package com.qniao.dam.application.request; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UserCostChannelGiftSdkDto { + + private Long fromUserId; + + private Long channelId; + + private Integer direction; + + private Long toUserId; + + private Long channelCreatorId; + + private Long productSpecId; + + private Integer quantity; + +} diff --git a/dating-agency-mall-sdk/src/main/java/com/qniao/dam/application/response/CostIMGiftVo.java b/dating-agency-mall-sdk/src/main/java/com/qniao/dam/application/response/CostGiftVo.java similarity index 83% rename from dating-agency-mall-sdk/src/main/java/com/qniao/dam/application/response/CostIMGiftVo.java rename to dating-agency-mall-sdk/src/main/java/com/qniao/dam/application/response/CostGiftVo.java index c2172a0..da99921 100644 --- a/dating-agency-mall-sdk/src/main/java/com/qniao/dam/application/response/CostIMGiftVo.java +++ b/dating-agency-mall-sdk/src/main/java/com/qniao/dam/application/response/CostGiftVo.java @@ -3,7 +3,7 @@ package com.qniao.dam.application.response; import lombok.Data; @Data -public class CostIMGiftVo { +public class CostGiftVo { private Boolean success = false; diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/VirtualAccountUserCommandController.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/VirtualAccountUserCommandController.java index 17b6d8b..a993f7e 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/VirtualAccountUserCommandController.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/VirtualAccountUserCommandController.java @@ -1,8 +1,9 @@ package com.qniao.dam.api.command.virtualaccount.user; import com.qniao.dam.api.command.virtualaccount.user.request.UserConsumeVirtualAccountDto; +import com.qniao.dam.api.command.virtualaccount.user.request.UserCostChannelGiftDto; import com.qniao.dam.api.command.virtualaccount.user.request.UserCostIMGiftDto; -import com.qniao.dam.api.command.virtualaccount.user.response.CostIMGiftVo; +import com.qniao.dam.api.command.virtualaccount.user.response.CostGiftVo; import com.qniao.dam.api.command.virtualaccount.user.response.UserConsumeVirtualAccountVo; import com.qniao.dam.application.service.virtualaccount.VirtualAccountApplicationService; import com.qniao.framework.annotation.IgnoreResponseAdvice; @@ -30,8 +31,13 @@ public class VirtualAccountUserCommandController { @PostMapping("/cost/im-gift/by/sdk") @IgnoreResponseAdvice - public CostIMGiftVo userCostIMGiftBySdk(@RequestBody UserCostIMGiftDto dto) { + public CostGiftVo userCostIMGiftBySdk(@RequestBody UserCostIMGiftDto dto) { return virtualAccountApplicationService.costIMGift(dto); } + @PostMapping("/user/cost/channel-gift/by/sdk") + @IgnoreResponseAdvice + public CostGiftVo userCostChannelGiftBySdk(@RequestBody UserCostChannelGiftDto dto) { + return virtualAccountApplicationService.costChannelGift(dto); + } } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/request/UserCostChannelGiftDto.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/request/UserCostChannelGiftDto.java new file mode 100644 index 0000000..a4b34b5 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/request/UserCostChannelGiftDto.java @@ -0,0 +1,22 @@ +package com.qniao.dam.api.command.virtualaccount.user.request; + +import lombok.Data; + +@Data +public class UserCostChannelGiftDto { + + private Long fromUserId; + + private Long channelId; + + private Integer direction; + + private Long toUserId; + + private Long channelCreatorId; + + private Long productSpecId; + + private Integer quantity; + +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/response/CostIMGiftVo.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/response/CostGiftVo.java similarity index 85% rename from dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/response/CostIMGiftVo.java rename to dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/response/CostGiftVo.java index 560e858..cf43b5e 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/response/CostIMGiftVo.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/response/CostGiftVo.java @@ -3,7 +3,7 @@ package com.qniao.dam.api.command.virtualaccount.user.response; import lombok.Data; @Data -public class CostIMGiftVo { +public class CostGiftVo { private Boolean success = false; diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/virtualaccount/VirtualAccountApplicationService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/virtualaccount/VirtualAccountApplicationService.java index e0875e4..d76d038 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/virtualaccount/VirtualAccountApplicationService.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/virtualaccount/VirtualAccountApplicationService.java @@ -1,22 +1,22 @@ package com.qniao.dam.application.service.virtualaccount; import com.qniao.dam.api.command.virtualaccount.user.request.UserConsumeVirtualAccountDto; +import com.qniao.dam.api.command.virtualaccount.user.request.UserCostChannelGiftDto; import com.qniao.dam.api.command.virtualaccount.user.request.UserCostIMGiftDto; -import com.qniao.dam.api.command.virtualaccount.user.response.CostIMGiftVo; +import com.qniao.dam.api.command.virtualaccount.user.response.CostGiftVo; import com.qniao.dam.api.command.virtualaccount.user.response.UserConsumeVirtualAccountVo; import com.qniao.dam.domain.aggregate.order.entity.Order; import com.qniao.dam.domain.aggregate.order.entity.OrderItem; import com.qniao.dam.domain.aggregate.product.entity.Product; import com.qniao.dam.domain.aggregate.productspec.entity.ProductSpec; import com.qniao.dam.domain.aggregate.revenuereward.entity.RevenueReward; -import com.qniao.dam.domain.aggregate.revenuereward.valueobj.RevenueRewardAssociateOrderRecord; import com.qniao.dam.domain.aggregate.revenuereward.valueobj.RevenueRewardRecord; import com.qniao.dam.domain.aggregate.virtualaccount.VirtualAccountAggregate; import com.qniao.dam.domain.aggregate.virtualaccount.entity.VirtualAccount; import com.qniao.dam.domain.aggregate.walletaccount.entity.WalletAccount; import com.qniao.dam.domain.aggregate.walletaccount.valueobj.WalletAccountRecord; import com.qniao.dam.domain.service.virtualaccount.ConsumeVirtualAccountDomainService; -import com.qniao.dam.domain.service.virtualaccount.CostIMGiftRewardDomainService; +import com.qniao.dam.domain.service.virtualaccount.CostGiftRewardDomainService; import com.qniao.dam.domian.aggregate.order.constant.OrderBelongingEnum; import com.qniao.dam.domian.aggregate.order.constant.OrderStatusEnum; import com.qniao.dam.domian.aggregate.order.constant.OrderTypeEnum; @@ -35,6 +35,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; +import java.math.RoundingMode; import java.time.LocalDateTime; import java.util.Collections; import java.util.Objects; @@ -59,7 +60,7 @@ public class VirtualAccountApplicationService { @Resource private ConsumeVirtualAccountDomainService consumeVirtualAccountDomainService; @Resource - private CostIMGiftRewardDomainService costIMGiftRewardDomainService; + private CostGiftRewardDomainService costGiftRewardDomainService; public void create(VirtualAccount virtualAccount) { virtualAccountAggregate.create(virtualAccount); @@ -130,9 +131,9 @@ public class VirtualAccountApplicationService { * @param dto * @return */ - public CostIMGiftVo costIMGift(UserCostIMGiftDto dto) { + public CostGiftVo costIMGift(UserCostIMGiftDto dto) { //判断虚拟账户余额 - CostIMGiftVo vo = new CostIMGiftVo(); + CostGiftVo vo = new CostGiftVo(); synchronized (dto.getFromUserId().toString().intern()) { VirtualAccount virtualAccount = virtualAccountQueryService.queryBy(dto.getFromUserId()); //找到对应产品 @@ -146,13 +147,13 @@ public class VirtualAccountApplicationService { } @Transactional(rollbackFor = Exception.class) - public CostIMGiftVo handleIMGiftReward(VirtualAccount virtualAccount, - Long fromUserId, - Long toUserId, - ProductSpec productSpec, - Integer costBalance, - Integer quantity) { - CostIMGiftVo vo = new CostIMGiftVo(); + public CostGiftVo handleIMGiftReward(VirtualAccount virtualAccount, + Long fromUserId, + Long toUserId, + ProductSpec productSpec, + Integer costBalance, + Integer quantity) { + CostGiftVo vo = new CostGiftVo(); //余额充足 创建消费订单+扣除余额 Order order = handleOrder(fromUserId, productSpec, quantity); //虚拟账户处理 @@ -164,7 +165,7 @@ public class VirtualAccountApplicationService { revenueReward = RevenueReward.initUser(toUserId); } //营收额 - BigDecimal revenue = BigDecimal.valueOf(costBalance).multiply(BigDecimal.valueOf(0.1428)).multiply(BigDecimal.valueOf(0.4)); + BigDecimal revenue = BigDecimal.valueOf(costBalance).multiply(BigDecimal.valueOf(0.1428)).multiply(BigDecimal.valueOf(0.4)).setScale(2, RoundingMode.HALF_UP); RevenueRewardRecord revenueRewardRecord = RevenueRewardRecord.build(TradeTypeEnum.GIFT_REWARD, TradeSceneEnum.ONLINE, revenue, BigDecimal.valueOf(100), BigDecimal.ZERO, revenue, BigDecimal.valueOf(costBalance)); @@ -180,9 +181,132 @@ public class VirtualAccountApplicationService { WalletAccountRecord walletAccountRecord = WalletAccountRecord.build(TradeTypeEnum.GIFT_REWARD, revenue, true, originalBalance, walletAccount.getTotalBalance()); walletAccount.setRecordList(Collections.singletonList(walletAccountRecord)); - costIMGiftRewardDomainService.handle(order, virtualAccount, revenueReward, walletAccount); + costGiftRewardDomainService.handle(order, virtualAccount, revenueReward, walletAccount); vo.setSuccess(true); return vo; } + public CostGiftVo costChannelGift(UserCostChannelGiftDto dto) { + CostGiftVo vo = new CostGiftVo(); + + VirtualAccount virtualAccount = virtualAccountQueryService.queryBy(dto.getFromUserId()); + //找到对应产品 + ProductSpec productSpec = productSpecDao.selectById(dto.getProductSpecId()); + Integer costBalance = productSpec.getUnitSellingPrice().intValue() * dto.getQuantity(); + if (virtualAccount != null && virtualAccount.getBalance() >= costBalance) { + if (dto.getDirection() == 1) { + //直接送主播 + vo = handleChannelAnchorGiftReward(virtualAccount, dto.getFromUserId(), dto.getChannelCreatorId(), productSpec, costBalance, dto.getQuantity()); + } else { + //直接送嘉宾 + vo = handleChannelUserGiftReward(virtualAccount, dto.getFromUserId(), dto.getToUserId(), dto.getChannelCreatorId(), productSpec, costBalance, dto.getQuantity()); + } + } + return vo; + } + + /** + * 赠送嘉宾播礼物 + */ + @Transactional(rollbackFor = Exception.class) + public CostGiftVo handleChannelUserGiftReward(VirtualAccount virtualAccount, + Long fromUserId, + Long toUserId, + Long anchorId, + ProductSpec productSpec, + Integer costBalance, + Integer quantity) { + CostGiftVo vo = new CostGiftVo(); + //余额充足 创建消费订单+扣除余额 + Order order = handleOrder(fromUserId, productSpec, quantity); + //虚拟账户处理 + virtualAccountAggregate.handleConsumeData(virtualAccount, order.getSettlementAmount().intValue(), VirtualAccountTradeTypeEnum.GIFT); + + //收益信息 + RevenueReward toRevenueReward = revenueRewardQueryService.queryByUserId(toUserId); + if (Objects.isNull(toRevenueReward)) { + toRevenueReward = RevenueReward.initUser(toUserId); + } + //营收额 todo + BigDecimal toRevenue = BigDecimal.valueOf(costBalance).multiply(BigDecimal.valueOf(0.1428)).multiply(BigDecimal.valueOf(0.1)).setScale(2, RoundingMode.HALF_UP); + RevenueRewardRecord toRevenueRewardRecord = RevenueRewardRecord.build(TradeTypeEnum.GIFT_REWARD, TradeSceneEnum.ONLINE, + toRevenue, BigDecimal.valueOf(100), BigDecimal.ZERO, toRevenue, BigDecimal.valueOf(costBalance)); + //todo + toRevenueRewardRecord.setContent("直播间礼物"); + toRevenueReward.setRecordList(Collections.singletonList(toRevenueRewardRecord)); + //钱包 + WalletAccount toWalletAccount = walletAccountQueryService.queryByType(toUserId, IdentityTypeEnum.INDIVIDUAL); + BigDecimal toOriginalBalance = toWalletAccount.getTotalBalance(); + toWalletAccount.setAvailableBalance(toWalletAccount.getAvailableBalance().add(toRevenue)); + toWalletAccount.setTotalBalance(toWalletAccount.getAvailableBalance().add(toWalletAccount.getFrozenBalance())); + WalletAccountRecord toWalletAccountRecord = WalletAccountRecord.build(TradeTypeEnum.GIFT_REWARD, toRevenue, true, toOriginalBalance, toWalletAccount.getTotalBalance()); + toWalletAccount.setRecordList(Collections.singletonList(toWalletAccountRecord)); + + //收益信息 + RevenueReward anchorRevenueReward = revenueRewardQueryService.queryByUserId(anchorId); + if (Objects.isNull(anchorRevenueReward)) { + anchorRevenueReward = RevenueReward.initUser(anchorId); + } + //营收额 todo + BigDecimal anchorRevenue = BigDecimal.valueOf(costBalance).multiply(BigDecimal.valueOf(0.1428)).multiply(BigDecimal.valueOf(0.3)).setScale(2, RoundingMode.HALF_UP); + RevenueRewardRecord anchorRevenueRewardRecord = RevenueRewardRecord.build(TradeTypeEnum.GIFT_REWARD, TradeSceneEnum.ONLINE, + anchorRevenue, BigDecimal.valueOf(100), BigDecimal.ZERO, anchorRevenue, BigDecimal.valueOf(costBalance)); + //todo + anchorRevenueRewardRecord.setContent("直播间礼物"); + anchorRevenueReward.setRecordList(Collections.singletonList(anchorRevenueRewardRecord)); + //钱包 + WalletAccount anchorWalletAccount = walletAccountQueryService.queryByType(anchorId, IdentityTypeEnum.INDIVIDUAL); + BigDecimal anchorOriginalBalance = anchorWalletAccount.getTotalBalance(); + anchorWalletAccount.setAvailableBalance(anchorWalletAccount.getAvailableBalance().add(anchorRevenue)); + anchorWalletAccount.setTotalBalance(anchorWalletAccount.getAvailableBalance().add(anchorWalletAccount.getFrozenBalance())); + WalletAccountRecord anchorWalletAccountRecord = WalletAccountRecord.build(TradeTypeEnum.GIFT_REWARD, anchorRevenue, true, anchorOriginalBalance, anchorWalletAccount.getTotalBalance()); + anchorWalletAccount.setRecordList(Collections.singletonList(anchorWalletAccountRecord)); + + costGiftRewardDomainService.handle(order, virtualAccount, toRevenueReward, toWalletAccount, anchorRevenueReward, anchorWalletAccount); + vo.setSuccess(true); + return vo; + } + + /** + * 赠送主播礼物 + */ + @Transactional(rollbackFor = Exception.class) + public CostGiftVo handleChannelAnchorGiftReward(VirtualAccount virtualAccount, + Long fromUserId, + Long toUserId, + ProductSpec productSpec, + Integer costBalance, + Integer quantity) { + CostGiftVo vo = new CostGiftVo(); + //余额充足 创建消费订单+扣除余额 + Order order = handleOrder(fromUserId, productSpec, quantity); + //虚拟账户处理 + virtualAccountAggregate.handleConsumeData(virtualAccount, order.getSettlementAmount().intValue(), VirtualAccountTradeTypeEnum.GIFT); + + //收益信息 + RevenueReward revenueReward = revenueRewardQueryService.queryByUserId(toUserId); + if (Objects.isNull(revenueReward)) { + revenueReward = RevenueReward.initUser(toUserId); + } + //营收额 todo + BigDecimal revenue = BigDecimal.valueOf(costBalance).multiply(BigDecimal.valueOf(0.1428)).multiply(BigDecimal.valueOf(0.4)).setScale(2, RoundingMode.HALF_UP); + + RevenueRewardRecord revenueRewardRecord = RevenueRewardRecord.build(TradeTypeEnum.GIFT_REWARD, TradeSceneEnum.ONLINE, + revenue, BigDecimal.valueOf(100), BigDecimal.ZERO, revenue, BigDecimal.valueOf(costBalance)); + //todo + revenueRewardRecord.setContent("直播间礼物"); + + revenueReward.setRecordList(Collections.singletonList(revenueRewardRecord)); + //钱包 + WalletAccount walletAccount = walletAccountQueryService.queryByType(toUserId, IdentityTypeEnum.INDIVIDUAL); + BigDecimal originalBalance = walletAccount.getTotalBalance(); + walletAccount.setAvailableBalance(walletAccount.getAvailableBalance().add(revenue)); + walletAccount.setTotalBalance(walletAccount.getAvailableBalance().add(walletAccount.getFrozenBalance())); + WalletAccountRecord walletAccountRecord = WalletAccountRecord.build(TradeTypeEnum.GIFT_REWARD, revenue, true, originalBalance, walletAccount.getTotalBalance()); + walletAccount.setRecordList(Collections.singletonList(walletAccountRecord)); + + costGiftRewardDomainService.handle(order, virtualAccount, revenueReward, walletAccount); + vo.setSuccess(true); + return vo; + } } \ No newline at end of file diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/virtualaccount/CostIMGiftRewardDomainService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/virtualaccount/CostGiftRewardDomainService.java similarity index 59% rename from dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/virtualaccount/CostIMGiftRewardDomainService.java rename to dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/virtualaccount/CostGiftRewardDomainService.java index 9ba77fc..b1093ac 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/virtualaccount/CostIMGiftRewardDomainService.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/virtualaccount/CostGiftRewardDomainService.java @@ -16,7 +16,7 @@ import javax.annotation.Resource; import java.util.Collections; @Service -public class CostIMGiftRewardDomainService { +public class CostGiftRewardDomainService { @Resource private OrderAggregate orderAggregate; @@ -42,4 +42,28 @@ public class CostIMGiftRewardDomainService { walletAccountAggregate.save(walletAccount); } + + @Transactional(rollbackFor = Exception.class) + public void handle(Order order, + VirtualAccount virtualAccount, + RevenueReward toRevenueReward, + WalletAccount toWalletAccount, + RevenueReward anchorRevenueReward, + WalletAccount anchorWalletAccount) { + orderAggregate.complete(order); + + virtualAccountAggregate.edit(virtualAccount); + + RevenueRewardAssociateOrderRecord toAssociateOrderRecord = RevenueRewardAssociateOrderRecord.build(order.getId(), order.getSettlementAmount()); + toRevenueReward.getRecordList().get(0).setAssociateOrderRecordList(Collections.singletonList(toAssociateOrderRecord)); + revenueRewardAggregate.save(toRevenueReward); + + walletAccountAggregate.save(toWalletAccount); + + RevenueRewardAssociateOrderRecord anchorAssociateOrderRecord = RevenueRewardAssociateOrderRecord.build(order.getId(), order.getSettlementAmount()); + anchorRevenueReward.getRecordList().get(0).setAssociateOrderRecordList(Collections.singletonList(anchorAssociateOrderRecord)); + revenueRewardAggregate.save(anchorRevenueReward); + + walletAccountAggregate.save(anchorWalletAccount); + } }