diff --git a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/rewardconfig/constant/RewardTypeEnum.java b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/rewardconfig/constant/RewardTypeEnum.java index f2b951e..701e694 100644 --- a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/rewardconfig/constant/RewardTypeEnum.java +++ b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/rewardconfig/constant/RewardTypeEnum.java @@ -86,6 +86,8 @@ public enum RewardTypeEnum { WITHDRAW_SERVICE_FEE(205, "提现手续费"), + SITE_ACTIVITY_INVITE_FEE(206, "活动邀约佣金"), + // 3** 招亲榜 MarriageBounty //低消 MARRIAGE_BOUNTY_MEETING_MIN_AMOUNT(301,"招亲榜-见面低消"), 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 ff8c7e0..e5caba8 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 @@ -22,6 +22,8 @@ public enum TradeTypeEnum { RAFFLE_PRIZE_ACTIVITY_WINNING(106, "抽奖活动奖励"), + SITE_ACTIVITY_INVITE_FEE(107, "活动邀约佣金"), + PLATFORM_SERVICE_FEE(201, "平台服务费"), WITHDRAW(202, "提现"); diff --git a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/revenuereward/valueobj/RevenueRewardRecord.java b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/revenuereward/valueobj/RevenueRewardRecord.java index 14be3e3..5982c7d 100644 --- a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/revenuereward/valueobj/RevenueRewardRecord.java +++ b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/revenuereward/valueobj/RevenueRewardRecord.java @@ -78,6 +78,8 @@ public class RevenueRewardRecord extends ValueObject { content = StrUtil.format("推荐红娘{}入驻平台", elements.toArray()); } else if (TradeTypeEnum.MARRIAGE_BOUNTY_MEETING_FEE.equals(tradeType)) { content = StrUtil.format("推荐嘉宾{}见面", elements.toArray()); + } else if (TradeTypeEnum.SITE_ACTIVITY_INVITE_FEE.equals(tradeType)) { + content = StrUtil.format("推荐{}参与{}", elements.toArray()); } } } \ No newline at end of file diff --git a/dating-agency-mall-event/src/main/java/com/qniao/dam/domian/aggregate/siteactivity/event/SiteActivityParticipantSettledMQ.java b/dating-agency-mall-event/src/main/java/com/qniao/dam/domian/aggregate/siteactivity/event/SiteActivityParticipantSettledMQ.java new file mode 100644 index 0000000..cbdeea8 --- /dev/null +++ b/dating-agency-mall-event/src/main/java/com/qniao/dam/domian/aggregate/siteactivity/event/SiteActivityParticipantSettledMQ.java @@ -0,0 +1,31 @@ +package com.qniao.dam.domian.aggregate.siteactivity.event; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class SiteActivityParticipantSettledMQ implements Serializable { + + + @ApiModelProperty("线下活动id") + private Long siteActivityId; + + @ApiModelProperty("线下活动名称") + private String siteActivityName; + + @ApiModelProperty("征婚资料id") + private Long receiveMiId; + + @ApiModelProperty("资料用户id") + private Long receiveUserId; + + @ApiModelProperty("发起邀请红娘ID") + private Long inviteMatchmakerId; + +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/externalorder/ExternalOrderEventHandler.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/externalorder/ExternalOrderEventHandler.java index 26f1d08..1d5be67 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/externalorder/ExternalOrderEventHandler.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/externalorder/ExternalOrderEventHandler.java @@ -52,7 +52,7 @@ public class ExternalOrderEventHandler extends BaseApplicationService { try { log.error("接收到线下活动订单取消事件:{}", event); //社群活动允许退款 - ExternalOrderRel externalOrderRel = externalOrderRelDao.queryCompletedBy(event.getExternalId(), event.getUserId(), ExternalOrderTypeEnum.SITE_ACTIVITY); + ExternalOrderRel externalOrderRel = externalOrderRelDao.queryCompletedBy(event.getExternalId(), event.getUserId(), event.getMiId(), ExternalOrderTypeEnum.SITE_ACTIVITY); if (Objects.nonNull(externalOrderRel)) { externalOrderRel.setStatus(ExternalOrderRelStatus.CANCELED); externalOrderRelAggregate.save(externalOrderRel); diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/siteactivity/SiteActivityEventHandler.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/siteactivity/SiteActivityEventHandler.java new file mode 100644 index 0000000..7d8948a --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/siteactivity/SiteActivityEventHandler.java @@ -0,0 +1,108 @@ +package com.qniao.dam.application.handler.siteactivity; + +import cn.hutool.core.collection.CollUtil; +import com.qniao.dam.domain.aggregate.externalorder.entity.ExternalOrderRel; +import com.qniao.dam.domain.aggregate.order.entity.Order; +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.rewardconfig.entity.RewardConfig; +import com.qniao.dam.domain.aggregate.walletaccount.entity.WalletAccount; +import com.qniao.dam.domain.aggregate.walletaccount.valueobj.WalletAccountRecord; +import com.qniao.dam.domain.service.revenuereward.AcquireRevenueRewardDomainService; +import com.qniao.dam.domian.aggregate.externalorder.constant.ExternalOrderTypeEnum; +import com.qniao.dam.domian.aggregate.rewardconfig.constant.RewardTypeEnum; +import com.qniao.dam.domian.aggregate.siteactivity.event.SiteActivityParticipantSettledMQ; +import com.qniao.dam.domian.aggregate.walletaccount.constant.IdentityTypeEnum; +import com.qniao.dam.domian.aggregate.walletaccount.constant.TradeSceneEnum; +import com.qniao.dam.domian.aggregate.walletaccount.constant.TradeTypeEnum; +import com.qniao.dam.infrastructure.constant.MqExchange; +import com.qniao.dam.infrastructure.constant.MqQueue; +import com.qniao.dam.infrastructure.persistent.dao.domain.ExternalOrderRelDao; +import com.qniao.dam.infrastructure.persistent.dao.domain.MarriageInformationDao; +import com.qniao.dam.infrastructure.persistent.dao.domain.MatchmakerDao; +import com.qniao.dam.infrastructure.persistent.dao.domain.OrderDao; +import com.qniao.dam.query.revenuereward.RevenueRewardQueryService; +import com.qniao.dam.query.rewardconfig.RewardConfigQueryService; +import com.qniao.dam.query.walletaccount.WalletAccountQueryService; +import com.qniao.das.domian.aggregate.marriageinformation.MarriageInformation; +import com.qniao.dau.domain.aggregate.matchmaker.entity.Matchmaker; +import com.qniao.domain.BaseApplicationService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.core.ExchangeTypes; +import org.springframework.amqp.rabbit.annotation.Exchange; +import org.springframework.amqp.rabbit.annotation.Queue; +import org.springframework.amqp.rabbit.annotation.QueueBinding; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.*; + +@Component +@Slf4j +public class SiteActivityEventHandler extends BaseApplicationService { + + @Resource + private ExternalOrderRelDao externalOrderRelDao; + @Resource + private RewardConfigQueryService rewardConfigQueryService; + @Resource + private RevenueRewardQueryService revenueRewardQueryService; + @Resource + private OrderDao orderDao; + @Resource + private MatchmakerDao matchmakerDao; + @Resource + private MarriageInformationDao marriageInformationDao; + @Resource + private WalletAccountQueryService walletAccountQueryService; + @Resource + private AcquireRevenueRewardDomainService acquireRevenueRewardDomainService; + + @RabbitListener(bindings = @QueueBinding(value = @Queue(MqQueue.SITE_ACTIVITY_PARTICIPANT_SETTLED), + exchange = @Exchange(value = MqExchange.SITE_ACTIVITY_PARTICIPANT_SETTLED, + type = ExchangeTypes.FANOUT))) + public void handle(SiteActivityParticipantSettledMQ mq) { + try { + //线下活动参入结算事件 + ExternalOrderRel externalOrderRel = externalOrderRelDao.queryCompletedBy(mq.getSiteActivityId(), mq.getReceiveUserId(), + mq.getReceiveMiId(), ExternalOrderTypeEnum.SITE_ACTIVITY); + if (Objects.nonNull(externalOrderRel)) { + Order order = orderDao.selectById(externalOrderRel.getOrderId()); + RewardConfig rewardConfig = rewardConfigQueryService.queryByRewardType(RewardTypeEnum.PLATFORM_SERVICE_FEE); + if (Objects.nonNull(rewardConfig)) { + Matchmaker matchmaker = matchmakerDao.selectById(mq.getInviteMatchmakerId()); + MarriageInformation marriageInformation = marriageInformationDao.selectById(mq.getReceiveMiId()); + //收益信息 + RevenueReward revenueReward = revenueRewardQueryService.queryByUserId(matchmaker.getUserId()); + if (Objects.isNull(revenueReward)) { + revenueReward = RevenueReward.initUser(matchmaker.getUserId()); + } + //营收额 + BigDecimal earnings = rewardConfig.calculateReward(order.getSettlementAmount()); + + RevenueRewardRecord revenueRewardRecord = RevenueRewardRecord.build(TradeTypeEnum.SITE_ACTIVITY_INVITE_FEE, TradeSceneEnum.ONLINE, + earnings, new BigDecimal(rewardConfig.getValue()), BigDecimal.ZERO, earnings, order.getSettlementAmount()); + revenueRewardRecord.handleContent(Arrays.asList(marriageInformation.getNickName(), mq.getSiteActivityName())); + RevenueRewardAssociateOrderRecord associateOrderRecord = RevenueRewardAssociateOrderRecord.build(order.getId(), order.getSettlementAmount()); + revenueRewardRecord.setAssociateOrderRecordList(Collections.singletonList(associateOrderRecord)); + revenueReward.setRecordList(Collections.singletonList(revenueRewardRecord)); + + //钱包 + WalletAccount walletAccount = walletAccountQueryService.queryByType(matchmaker.getUserId(), IdentityTypeEnum.INDIVIDUAL); + BigDecimal originalBalance = walletAccount.getTotalBalance(); + walletAccount.setAvailableBalance(walletAccount.getAvailableBalance().add(earnings)); + walletAccount.setTotalBalance(walletAccount.getAvailableBalance().add(walletAccount.getFrozenBalance())); + WalletAccountRecord walletAccountRecord = WalletAccountRecord.build(TradeTypeEnum.SITE_ACTIVITY_INVITE_FEE, earnings, true, originalBalance, walletAccount.getTotalBalance()); + walletAccount.setRecordList(Collections.singletonList(walletAccountRecord)); + acquireRevenueRewardDomainService.handle(revenueReward, walletAccount); + } + } + } catch (Exception e) { + log.error("线下活动参入结算事件处理异常", e); + } + } + +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/constant/MqExchange.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/constant/MqExchange.java index 9c99dc3..41b65a1 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/constant/MqExchange.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/constant/MqExchange.java @@ -21,4 +21,7 @@ public interface MqExchange { String POINT_REWARD_CREATED = "fanout.pointRewardCreated"; String MATCHMAKER_POINT_UPGRADE_EXCHANGED = "fanout.matchmakerPointUpgradeExchanged"; + + String SITE_ACTIVITY_PARTICIPANT_SETTLED = "fanout.siteActivityParticipantSettled"; + } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/constant/MqQueue.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/constant/MqQueue.java index d43663a..c75bb9c 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/constant/MqQueue.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/constant/MqQueue.java @@ -17,4 +17,6 @@ public interface MqQueue { String CANCEL_SITE_ACTIVITY = MqExchange.CANCEL_SITE_ACTIVITY + serviceName; String POINT_REWARD_CREATED = MqExchange.POINT_REWARD_CREATED + serviceName; + + String SITE_ACTIVITY_PARTICIPANT_SETTLED = MqExchange.SITE_ACTIVITY_PARTICIPANT_SETTLED + serviceName; } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/ExternalOrderRelDao.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/ExternalOrderRelDao.java index 37374cf..cf483df 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/ExternalOrderRelDao.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/ExternalOrderRelDao.java @@ -8,5 +8,6 @@ import org.apache.ibatis.annotations.Param; public interface ExternalOrderRelDao extends BaseMapper { ExternalOrderRel queryCompletedBy(@Param("externalId") Long externalId, @Param("userId") Long userId, + @Param("miId") Long miId, @Param("type") ExternalOrderTypeEnum type); } diff --git a/dating-agency-mall-server/src/main/resources/mapper/externalorder/ExternalOrderRelMapper.xml b/dating-agency-mall-server/src/main/resources/mapper/externalorder/ExternalOrderRelMapper.xml index cd79b66..471bdcc 100644 --- a/dating-agency-mall-server/src/main/resources/mapper/externalorder/ExternalOrderRelMapper.xml +++ b/dating-agency-mall-server/src/main/resources/mapper/externalorder/ExternalOrderRelMapper.xml @@ -10,7 +10,7 @@ deor.order_id, deor.type from da_external_order_rel as deor - INNER JOIN da_order as dao on deor.order_id = dao.id and dao.`status` = 5 and dao.user_id = #{userId} + INNER JOIN da_order as dao on deor.order_id = dao.id and dao.`status` = 5 and dao.user_id = #{userId} and dao.mi_id = #{miId} where deor.is_delete = 0 and deor.status = 2 and deor.external_id = #{externalId}