diff --git a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/virtualaccount/constant/VirtualAccountTradeTypeEnum.java b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/virtualaccount/constant/VirtualAccountTradeTypeEnum.java index a845a4a..bffc2b7 100644 --- a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/virtualaccount/constant/VirtualAccountTradeTypeEnum.java +++ b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/virtualaccount/constant/VirtualAccountTradeTypeEnum.java @@ -17,7 +17,11 @@ public enum VirtualAccountTradeTypeEnum { GIFT(202, "礼物"), - CONNECT_CHANNEL(203, "连麦"); + CONNECT_CHANNEL(203, "连麦"), + + ONE_ON_ONE_VOICE(204, "1V1语音"), + + ONE_ON_ONE_VIDEO(205, "1V1视频"); @EnumValue @JsonValue diff --git a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/walletaccount/constant/TradeTypeEnum.java b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/walletaccount/constant/TradeTypeEnum.java index 1a5db82..b65ca6b 100644 --- a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/walletaccount/constant/TradeTypeEnum.java +++ b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/walletaccount/constant/TradeTypeEnum.java @@ -36,6 +36,10 @@ public enum TradeTypeEnum { RECOMMEND_GIFT_REWARD(113, "邀请分成"), + ONE_ON_ONE_VOICE(114, "1V1语音"), + + ONE_ON_ONE_VIDEO(115, "1V1视频"), + PLATFORM_SERVICE_FEE(201, "平台服务费"), WITHDRAW(202, "提现"); 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 90894b6..73b23a7 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 @@ -73,5 +73,7 @@ public interface MallServerApplicationService { @IgnoreResponseAdvice QueryOneOnOneRtcConsumeBySdkVo queryOneOnOneRtcConsumeBySdk(@RequestBody QueryOneOnOneRtcConsumeBySdkDto dto); - + @PostMapping("/user/settle/one-on-one-rtc/by/sdk") + @IgnoreResponseAdvice + SettleOneOnOneRtcBySdkVo settleOneOnOneRtcBySdk(@RequestBody SettleOneOnOneRtcBySdkDto dto); } diff --git a/dating-agency-mall-sdk/src/main/java/com/qniao/dam/application/request/SettleOneOnOneRtcBySdkDto.java b/dating-agency-mall-sdk/src/main/java/com/qniao/dam/application/request/SettleOneOnOneRtcBySdkDto.java new file mode 100644 index 0000000..8e907dd --- /dev/null +++ b/dating-agency-mall-sdk/src/main/java/com/qniao/dam/application/request/SettleOneOnOneRtcBySdkDto.java @@ -0,0 +1,20 @@ +package com.qniao.dam.application.request; + +import com.qniao.daca.domian.aggregate.rtcchannel.constant.RtcChannelTypeEnum; +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class SettleOneOnOneRtcBySdkDto { + + private RtcChannelTypeEnum rtcChannelType; + + private Long payerUserId; + + private Long profitUserId; + + private Integer consumeBalance; + + private Integer consumeCount; +} diff --git a/dating-agency-mall-sdk/src/main/java/com/qniao/dam/application/response/SettleOneOnOneRtcBySdkVo.java b/dating-agency-mall-sdk/src/main/java/com/qniao/dam/application/response/SettleOneOnOneRtcBySdkVo.java new file mode 100644 index 0000000..02bb41b --- /dev/null +++ b/dating-agency-mall-sdk/src/main/java/com/qniao/dam/application/response/SettleOneOnOneRtcBySdkVo.java @@ -0,0 +1,10 @@ +package com.qniao.dam.application.response; + +import lombok.Data; + +@Data +public class SettleOneOnOneRtcBySdkVo { + + private Boolean flag; + +} 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 44f7c2f..87a4da4 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 @@ -56,4 +56,9 @@ public class VirtualAccountUserCommandController { return virtualAccountApplicationService.queryOneOnOneRtcConsume(dto.getUserId(), dto.getRtcChannelType()); } + @PostMapping("/settle/one-on-one-rtc/by/sdk") + @IgnoreResponseAdvice + public SettleOneOnOneRtcVo settleOneOnOneRtcBySdk(@RequestBody SettleOneOnOneRtcDto dto) { + return virtualAccountApplicationService.settleOneOnOneRtc(dto); + } } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/request/SettleOneOnOneRtcDto.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/request/SettleOneOnOneRtcDto.java new file mode 100644 index 0000000..4bb9d6c --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/request/SettleOneOnOneRtcDto.java @@ -0,0 +1,19 @@ +package com.qniao.dam.api.command.virtualaccount.user.request; + +import com.qniao.daca.domian.aggregate.rtcchannel.constant.RtcChannelTypeEnum; +import lombok.Data; + +@Data +public class SettleOneOnOneRtcDto { + + private RtcChannelTypeEnum rtcChannelType; + + private Long payerUserId; + + private Long profitUserId; + + private Integer consumeBalance; + + private Integer consumeCount; + +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/response/SettleOneOnOneRtcVo.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/response/SettleOneOnOneRtcVo.java new file mode 100644 index 0000000..832af15 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/response/SettleOneOnOneRtcVo.java @@ -0,0 +1,10 @@ +package com.qniao.dam.api.command.virtualaccount.user.response; + +import lombok.Data; + +@Data +public class SettleOneOnOneRtcVo { + + private Boolean flag = 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 6be7c7c..e98340a 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,6 +1,7 @@ package com.qniao.dam.application.service.virtualaccount; import com.qniao.daca.domian.aggregate.rtcchannel.constant.RtcChannelTypeEnum; +import com.qniao.dam.api.command.virtualaccount.user.request.SettleOneOnOneRtcDto; 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; @@ -15,10 +16,12 @@ import com.qniao.dam.domain.aggregate.revenuereward.entity.RevenueReward; 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.WalletAccountAggregate; 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.CostGiftRewardDomainService; +import com.qniao.dam.domain.service.virtualaccount.SettleOneOnOneRtcDomainService; 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; @@ -31,11 +34,14 @@ import com.qniao.dam.domian.aggregate.walletaccount.constant.TradeTypeEnum; import com.qniao.dam.infrastructure.persistent.dao.domain.ProductDao; import com.qniao.dam.infrastructure.persistent.dao.domain.ProductSpecDao; import com.qniao.dam.infrastructure.utils.SnowFlakeUtil; +import com.qniao.dam.query.marriageinformation.MarriageInformationQueryService; import com.qniao.dam.query.product.ProductQueryService; import com.qniao.dam.query.revenuereward.RevenueRewardQueryService; import com.qniao.dam.query.rewardconfig.RewardConfigQueryService; +import com.qniao.dam.query.usermarriageinformation.UserMarriageInformationQueryService; import com.qniao.dam.query.virtualaccount.VirtualAccountQueryService; import com.qniao.dam.query.walletaccount.WalletAccountQueryService; +import com.qniao.das.domian.aggregate.marriageinformation.MarriageInformation; import com.qniao.domain.BaseApplicationService; import com.qniao.domain.BaseDomainEvent; import org.springframework.stereotype.Service; @@ -59,6 +65,8 @@ public class VirtualAccountApplicationService extends BaseApplicationService { @Resource private WalletAccountQueryService walletAccountQueryService; @Resource + private WalletAccountAggregate walletAccountAggregate; + @Resource private RevenueRewardQueryService revenueRewardQueryService; @Resource private ProductDao productDao; @@ -74,6 +82,10 @@ public class VirtualAccountApplicationService extends BaseApplicationService { private ProductQueryService productQueryService; @Resource private RewardConfigQueryService rewardConfigQueryService; + @Resource + private MarriageInformationQueryService marriageInformationQueryService; + @Resource + private SettleOneOnOneRtcDomainService settleOneOnOneRtcDomainService; public void create(VirtualAccount virtualAccount) { virtualAccountAggregate.create(virtualAccount); @@ -415,4 +427,37 @@ public class VirtualAccountApplicationService extends BaseApplicationService { } return vo; } + + /** + * 结算 1V1 语音视频费用 + * + * @param dto + * @return + */ + public SettleOneOnOneRtcVo settleOneOnOneRtc(SettleOneOnOneRtcDto dto) { + SettleOneOnOneRtcVo vo = new SettleOneOnOneRtcVo(); + synchronized (dto.getPayerUserId().toString().intern()) { + VirtualAccount virtualAccount = virtualAccountQueryService.queryBy(dto.getPayerUserId()); + if (Objects.nonNull(virtualAccount) && virtualAccount.getFrozenBalance() >= dto.getConsumeBalance()) { + MarriageInformation payerMarriageInformation = marriageInformationQueryService.queryByUserId(dto.getPayerUserId()); + MarriageInformation profitMarriageInformation = marriageInformationQueryService.queryByUserId(dto.getProfitUserId()); + if (RtcChannelTypeEnum.ONE_ON_ONE_VOICE.equals(dto.getRtcChannelType())) { + virtualAccountAggregate.handleFrozenData(virtualAccount, dto.getConsumeBalance(), VirtualAccountTradeTypeEnum.ONE_ON_ONE_VOICE, "与" + profitMarriageInformation.getNickName() + "1V1语音"); + } else { + virtualAccountAggregate.handleFrozenData(virtualAccount, dto.getConsumeBalance(), VirtualAccountTradeTypeEnum.ONE_ON_ONE_VIDEO, "与" + profitMarriageInformation.getNickName() + "1V1视频"); + } + + WalletAccount walletAccount = walletAccountQueryService.queryByType(dto.getProfitUserId(), IdentityTypeEnum.INDIVIDUAL); + BigDecimal income = BigDecimal.valueOf(1.5).multiply(BigDecimal.valueOf(dto.getConsumeCount())); + if (RtcChannelTypeEnum.ONE_ON_ONE_VOICE.equals(dto.getRtcChannelType())) { + walletAccountAggregate.handleIncomeData(walletAccount, income, TradeTypeEnum.ONE_ON_ONE_VOICE, "与" + payerMarriageInformation.getNickName() + "1V1语音"); + } else { + walletAccountAggregate.handleIncomeData(walletAccount, income, TradeTypeEnum.ONE_ON_ONE_VIDEO, "与" + payerMarriageInformation.getNickName() + "1V1视频"); + } + settleOneOnOneRtcDomainService.handle(virtualAccount, walletAccount); + vo.setFlag(true); + } + } + return vo; + } } \ No newline at end of file diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/virtualaccount/VirtualAccountAggregate.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/virtualaccount/VirtualAccountAggregate.java index 5dc5db6..771987c 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/virtualaccount/VirtualAccountAggregate.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/virtualaccount/VirtualAccountAggregate.java @@ -43,14 +43,14 @@ public class VirtualAccountAggregate { Integer tradeBalance, VirtualAccountTradeTypeEnum tradeType, String remark) { - Integer originalBalance = virtualAccount.getBalance(); + Integer originalBalance = virtualAccount.getTotalBalance(); virtualAccount.setTotalBalance(virtualAccount.getTotalBalance() - tradeBalance); virtualAccount.setBalance(originalBalance - tradeBalance); VirtualAccountRecord record = new VirtualAccountRecord(); record.setTradeType(tradeType); record.setTradeBalance(-tradeBalance); record.setOriginalBalance(originalBalance); - record.setCurrentBalance(virtualAccount.getBalance()); + record.setCurrentBalance(virtualAccount.getTotalBalance()); record.setRemark(remark); virtualAccount.setRecordList(Collections.singletonList(record)); } @@ -58,14 +58,31 @@ public class VirtualAccountAggregate { public void handleRechargeData(VirtualAccount virtualAccount, Integer tradeBalance, VirtualAccountTradeTypeEnum tradeType) { - Integer originalBalance = virtualAccount.getBalance(); + Integer originalBalance = virtualAccount.getTotalBalance(); virtualAccount.setTotalBalance(virtualAccount.getTotalBalance() + tradeBalance); virtualAccount.setBalance(originalBalance + tradeBalance); VirtualAccountRecord record = new VirtualAccountRecord(); record.setTradeType(tradeType); record.setTradeBalance(tradeBalance); record.setOriginalBalance(originalBalance); - record.setCurrentBalance(virtualAccount.getBalance()); + record.setCurrentBalance(virtualAccount.getTotalBalance()); virtualAccount.setRecordList(Collections.singletonList(record)); } + + public void handleFrozenData(VirtualAccount virtualAccount, + Integer tradeBalance, + VirtualAccountTradeTypeEnum tradeType, + String remark) { + Integer originalBalance = virtualAccount.getTotalBalance(); + virtualAccount.setTotalBalance(virtualAccount.getTotalBalance() - tradeBalance); + virtualAccount.setFrozenBalance(virtualAccount.getFrozenBalance() - tradeBalance); + VirtualAccountRecord record = new VirtualAccountRecord(); + record.setTradeType(tradeType); + record.setTradeBalance(-tradeBalance); + record.setOriginalBalance(originalBalance); + record.setCurrentBalance(virtualAccount.getTotalBalance()); + record.setRemark(remark); + virtualAccount.setRecordList(Collections.singletonList(record)); + } + } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/walletaccount/WalletAccountAggregate.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/walletaccount/WalletAccountAggregate.java index 18e4076..b82967c 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/walletaccount/WalletAccountAggregate.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/walletaccount/WalletAccountAggregate.java @@ -2,9 +2,13 @@ package com.qniao.dam.domain.aggregate.walletaccount; import com.qniao.dam.domain.aggregate.walletaccount.entity.WalletAccount; import com.qniao.dam.domain.aggregate.walletaccount.repository.WalletAccountRepository; +import com.qniao.dam.domain.aggregate.walletaccount.valueobj.WalletAccountRecord; +import com.qniao.dam.domian.aggregate.walletaccount.constant.TradeTypeEnum; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.Collections; @Service public class WalletAccountAggregate { @@ -15,4 +19,15 @@ public class WalletAccountAggregate { public void save(WalletAccount walletAccount) { walletAccountRepository.save(walletAccount); } + + public void handleIncomeData(WalletAccount walletAccount, + BigDecimal income, + TradeTypeEnum tradeType, + String remark) { + BigDecimal originalBalance = walletAccount.getTotalBalance(); + walletAccount.setAvailableBalance(walletAccount.getAvailableBalance().add(income)); + walletAccount.setTotalBalance(walletAccount.getAvailableBalance().add(walletAccount.getFrozenBalance())); + WalletAccountRecord record = WalletAccountRecord.build(tradeType, income, true, originalBalance, walletAccount.getTotalBalance()); + walletAccount.setRecordList(Collections.singletonList(record)); + } } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/virtualaccount/SettleOneOnOneRtcDomainService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/virtualaccount/SettleOneOnOneRtcDomainService.java new file mode 100644 index 0000000..d40ca3a --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/virtualaccount/SettleOneOnOneRtcDomainService.java @@ -0,0 +1,26 @@ +package com.qniao.dam.domain.service.virtualaccount; + +import com.qniao.dam.domain.aggregate.virtualaccount.VirtualAccountAggregate; +import com.qniao.dam.domain.aggregate.virtualaccount.entity.VirtualAccount; +import com.qniao.dam.domain.aggregate.walletaccount.WalletAccountAggregate; +import com.qniao.dam.domain.aggregate.walletaccount.entity.WalletAccount; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; + +@Service +public class SettleOneOnOneRtcDomainService { + + @Resource + private VirtualAccountAggregate virtualAccountAggregate; + @Resource + private WalletAccountAggregate walletAccountAggregate; + + @Transactional(rollbackFor = Exception.class) + public void handle(VirtualAccount virtualAccount, + WalletAccount walletAccount) { + virtualAccountAggregate.edit(virtualAccount); + walletAccountAggregate.save(walletAccount); + } +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/marriageinformation/MarriageInformationQueryService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/marriageinformation/MarriageInformationQueryService.java new file mode 100644 index 0000000..35b3a4b --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/marriageinformation/MarriageInformationQueryService.java @@ -0,0 +1,9 @@ +package com.qniao.dam.query.marriageinformation; + +import com.qniao.das.domian.aggregate.marriageinformation.MarriageInformation; + +public interface MarriageInformationQueryService { + + MarriageInformation queryByUserId(Long userId); + +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/marriageinformation/impl/MarriageInformationQueryServiceImpl.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/marriageinformation/impl/MarriageInformationQueryServiceImpl.java new file mode 100644 index 0000000..573c8b1 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/marriageinformation/impl/MarriageInformationQueryServiceImpl.java @@ -0,0 +1,25 @@ +package com.qniao.dam.query.marriageinformation.impl; + +import com.qniao.dam.infrastructure.persistent.dao.domain.MarriageInformationDao; +import com.qniao.dam.query.marriageinformation.MarriageInformationQueryService; +import com.qniao.dam.query.usermarriageinformation.UserMarriageInformationQueryService; +import com.qniao.das.domian.aggregate.marriageinformation.MarriageInformation; +import com.qniao.das.domian.aggregate.marriageinformation.UserMarriageInformation; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +@Service +public class MarriageInformationQueryServiceImpl implements MarriageInformationQueryService { + + @Resource + private UserMarriageInformationQueryService userMarriageInformationQueryService; + @Resource + private MarriageInformationDao marriageInformationDao; + + @Override + public MarriageInformation queryByUserId(Long userId) { + UserMarriageInformation userMarriageInformation = userMarriageInformationQueryService.queryByOwn(userId); + return marriageInformationDao.selectById(userMarriageInformation.getMiId()); + } +}