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 6a3446b..e3444ba 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 @@ -18,6 +18,8 @@ public enum TradeTypeEnum { MATCHMAKER_JOIN_RECOMMEND_FEE(104, "红娘入驻推荐"), + MARRIAGE_BOUNTY_MEETING_FEE(105, "悬赏招亲见面费用"), + PLATFORM_SERVICE_FEE(201, "平台服务费"); @EnumValue diff --git a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/entity/MarriageBountyOrderReward.java b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/entity/MarriageBountyOrderReward.java index d73a229..e0010fc 100644 --- a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/entity/MarriageBountyOrderReward.java +++ b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/entity/MarriageBountyOrderReward.java @@ -22,6 +22,9 @@ public class MarriageBountyOrderReward extends Entity @ApiModelProperty("悬赏招亲订单标识") private Long marriageBountyOrderId; + @ApiModelProperty("见面嘉宾标识") + private Long meetingMiId; + @ApiModelProperty("奖励分类") private ProductSubCategoryEnum rewardCategory; diff --git a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/valueobj/MarriageBountyOrderRewardReceiveRecord.java b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/valueobj/MarriageBountyOrderRewardReceiveRecord.java index 13c1271..db35643 100644 --- a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/valueobj/MarriageBountyOrderRewardReceiveRecord.java +++ b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/valueobj/MarriageBountyOrderRewardReceiveRecord.java @@ -26,4 +26,11 @@ public class MarriageBountyOrderRewardReceiveRecord extends ValueObject orderIdRelList; + +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/reward/user/RewardUserCommandController.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/reward/user/RewardUserCommandController.java index 229d236..a97c33a 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/reward/user/RewardUserCommandController.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/reward/user/RewardUserCommandController.java @@ -1,5 +1,6 @@ package com.qniao.dam.api.command.reward.user; +import com.qniao.dam.api.command.reward.user.request.AcquireMatchmakerConfirmMeetingRewardDto; import com.qniao.dam.api.command.reward.user.request.UserAcquireMatchmakerJoinRecommendRewardDto; import com.qniao.dam.application.service.reward.RewardApplicationService; import com.qniao.framework.annotation.IgnoreResponseAdvice; @@ -28,5 +29,9 @@ public class RewardUserCommandController { rewardApplicationService.acquireMatchmakerJoinRecommendReward(dto); } - + @ApiOperation("红娘获得悬赏招亲见面奖励") + @PostMapping("acquire/matchmaker-confirm-meeting/reward/") + public void acquireMatchmakerConfirmMeetingReward(@RequestBody @Valid AcquireMatchmakerConfirmMeetingRewardDto dto) { + rewardApplicationService.acquireMatchmakerConfirmMeetingReward(dto); + } } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/reward/user/request/AcquireMatchmakerConfirmMeetingRewardDto.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/reward/user/request/AcquireMatchmakerConfirmMeetingRewardDto.java new file mode 100644 index 0000000..ad918bd --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/reward/user/request/AcquireMatchmakerConfirmMeetingRewardDto.java @@ -0,0 +1,26 @@ +package com.qniao.dam.api.command.reward.user.request; + +import com.qniao.dam.domian.aggregate.rewardconfig.constant.RewardTypeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +@Data +public class AcquireMatchmakerConfirmMeetingRewardDto { + + @ApiModelProperty("奖励类型") + private RewardTypeEnum rewardType; + + @ApiModelProperty("见面嘉宾标识") + private Long meetingMiId; + + @ApiModelProperty("领取人标识") + private Long receiver; + + @ApiModelProperty("领取金额") + private BigDecimal receivedAmount; + + private List orderIdRelList; +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/marriagebounty/MarriageBountyOrderEventHandle.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/marriagebounty/MarriageBountyOrderEventHandle.java index cf64815..d6ee784 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/marriagebounty/MarriageBountyOrderEventHandle.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/marriagebounty/MarriageBountyOrderEventHandle.java @@ -1,6 +1,9 @@ package com.qniao.dam.application.handler.marriagebounty; import com.google.common.eventbus.Subscribe; +import com.qniao.dam.api.command.reward.user.request.AcquireMatchmakerConfirmMeetingRewardDto; +import com.qniao.dam.application.service.reward.RewardApplicationService; +import com.qniao.dam.domian.aggregate.marriagebounty.event.MarriageBountyOrderConfirmedMeetingEvent; import com.qniao.dam.domian.aggregate.marriagebounty.event.MarriageBountyOrderCreatedEvent; import com.qniao.dam.domian.aggregate.marriagebounty.event.MarriageBountyOrderCreatedMQ; import com.qniao.dam.infrastructure.constant.MqExchange; @@ -11,6 +14,7 @@ import org.springframework.amqp.core.AmqpTemplate; import org.springframework.stereotype.Component; import javax.annotation.Resource; +import java.util.Objects; @Component @Slf4j @@ -18,6 +22,8 @@ public class MarriageBountyOrderEventHandle extends BaseApplicationService { @Resource private AmqpTemplate amqpTemplate; + @Resource + private RewardApplicationService rewardApplicationService; @Subscribe public void handle(MarriageBountyOrderCreatedEvent event) { @@ -31,4 +37,17 @@ public class MarriageBountyOrderEventHandle extends BaseApplicationService { } } + @Subscribe + public void handle(MarriageBountyOrderConfirmedMeetingEvent event) { + try { + //红娘获取奖励 + if (Objects.nonNull(event.getMarriageBountyOrderRewardId())) { + AcquireMatchmakerConfirmMeetingRewardDto confirmMeetingRewardDto = TypeConvertUtils.convert(event, AcquireMatchmakerConfirmMeetingRewardDto.class); + rewardApplicationService.acquireMatchmakerConfirmMeetingReward(confirmMeetingRewardDto); + } + } catch (Exception e) { + log.error("悬赏招亲订单确认见面事件处理异常", e); + } + } + } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/marriagebounty/MarriageBountyOrderApplicationService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/marriagebounty/MarriageBountyOrderApplicationService.java index 2cf3384..d43b2bf 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/marriagebounty/MarriageBountyOrderApplicationService.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/marriagebounty/MarriageBountyOrderApplicationService.java @@ -10,6 +10,7 @@ import com.qniao.dam.domain.aggregate.marriagebounty.repository.MarriageBountyOr import com.qniao.dam.domain.aggregate.marriagebounty.valueobj.MarriageBountyOrderProductRecord; import com.qniao.dam.domain.aggregate.marriagebounty.valueobj.MarriageBountyOrderProductSpecRecord; import com.qniao.dam.domain.aggregate.marriagebounty.valueobj.MarriageBountyOrderRel; +import com.qniao.dam.domain.aggregate.marriagebounty.valueobj.MarriageBountyOrderRewardReceiveRecord; import com.qniao.dam.domain.aggregate.order.entity.Order; import com.qniao.dam.domain.aggregate.order.entity.OrderItem; import com.qniao.dam.domain.aggregate.order.repository.OrderRepository; @@ -21,6 +22,7 @@ import com.qniao.dam.domian.aggregate.marriagebount.constant.MarriageBountyOrder import com.qniao.dam.domian.aggregate.marriagebount.constant.MarriageBountyOrderStatusEnum; import com.qniao.dam.domian.aggregate.paymentorder.constant.PaymentOrderStatusEnum; import com.qniao.dam.domian.aggregate.product.constant.ProductSubCategoryEnum; +import com.qniao.dam.domian.aggregate.rewardconfig.constant.RewardTypeEnum; import com.qniao.dam.infrastructure.persistent.dao.domain.ProductSpecDao; import com.qniao.dam.query.marriagebounty.MarriageBountyOrderQueryService; import com.qniao.dam.query.paymentchannelorder.PaymentChannelOrderQueryService; @@ -154,10 +156,13 @@ public class MarriageBountyOrderApplicationService extends BaseApplicationServic /** * 悬赏招亲 确认见面 领取奖励 */ - public void confirmMeeting(Long marriageBountyOrderId, Long receiver) { + public void confirmMeeting(Long marriageBountyOrderId, Long receiver, Long meetingMiId) { MarriageBountyOrder existMarriageBountyOrder = marriageBountyOrderRepository.load(marriageBountyOrderId); if (Objects.nonNull(existMarriageBountyOrder) && MarriageBountyOrderStatusEnum.MATCHMAKING.equals(existMarriageBountyOrder.getStatus())) { - if (CollUtil.isNotEmpty(existMarriageBountyOrder.getOrderRewardList())) { + MarriageBountyOrder marriageBountyOrder = new MarriageBountyOrder(); + marriageBountyOrder.setId(marriageBountyOrderId); + if (CollUtil.isNotEmpty(existMarriageBountyOrder.getOrderRewardList()) && + existMarriageBountyOrder.getOrderRewardList().stream().noneMatch(orderReward -> meetingMiId.equals(orderReward.getMeetingMiId()))) { MarriageBountyOrderReward marriageBountyOrderReward = null; for (MarriageBountyOrderReward orderReward : existMarriageBountyOrder.getOrderRewardList()) { if (ProductSubCategoryEnum.MARRIAGE_BOUNTY_MEETING_FEE.equals(orderReward.getRewardCategory())) { @@ -168,9 +173,16 @@ public class MarriageBountyOrderApplicationService extends BaseApplicationServic } } if (Objects.nonNull(marriageBountyOrderReward)) { - + marriageBountyOrderReward.setIsReceive(true); + marriageBountyOrderReward.setMeetingMiId(meetingMiId); + MarriageBountyOrderRewardReceiveRecord rewardReceiveRecord = MarriageBountyOrderRewardReceiveRecord.build( + RewardTypeEnum.MARRIAGE_BOUNTY_MEETING_FEE, receiver, marriageBountyOrderReward.getRewardAmount()); + marriageBountyOrderReward.setRewardReceiveRecordList(Collections.singletonList(rewardReceiveRecord)); + marriageBountyOrder.setUpdateOrderRewardList(Collections.singletonList(marriageBountyOrderReward)); } } + BaseDomainEvent event = marriageBountyOrderAggregate.confirmMeeting(marriageBountyOrder, existMarriageBountyOrder.getOrderRelList()); + this.sendEvent(event); } } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/reward/RewardApplicationService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/reward/RewardApplicationService.java index a882e12..5461c90 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/reward/RewardApplicationService.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/reward/RewardApplicationService.java @@ -1,7 +1,11 @@ package com.qniao.dam.application.service.reward; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; +import com.qniao.dam.api.command.reward.user.request.AcquireMatchmakerConfirmMeetingRewardDto; import com.qniao.dam.api.command.reward.user.request.UserAcquireMatchmakerJoinRecommendRewardDto; +import com.qniao.dam.infrastructure.persistent.dao.domain.MarriageInformationDao; +import com.qniao.dam.infrastructure.persistent.dao.domain.OrderDao; import com.qniao.dam.query.walletaccount.WalletAccountQueryService; import com.qniao.dam.domain.aggregate.order.entity.Order; import com.qniao.dam.domain.aggregate.rewardconfig.entity.RewardConfig; @@ -15,11 +19,15 @@ import com.qniao.dam.domian.aggregate.rewardconfig.constant.RewardTypeEnum; import com.qniao.dam.domian.aggregate.walletaccount.constant.TradeTypeEnum; import com.qniao.dam.query.order.OrderQueryService; import com.qniao.dam.query.rewardconfig.RewardConfigQueryService; +import com.qniao.das.domian.aggregate.marriageinformation.MarriageInformation; +import com.qniao.das.domian.aggregate.marriageinformation.constant.GenderEnum; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.Collections; +import java.util.List; import java.util.Objects; @Service @@ -33,9 +41,13 @@ public class RewardApplicationService { private WalletAccountAggregate walletAccountAggregate; @Resource private OrderQueryService orderQueryService; + @Resource + private MarriageInformationDao marriageInformationDao; + @Resource + private OrderDao orderDao; /** - * todo 财务入账 + * 获得红娘推荐奖励 */ public void acquireMatchmakerJoinRecommendReward(UserAcquireMatchmakerJoinRecommendRewardDto dto) { synchronized (dto.getInitiatorUserId().toString().intern()) { @@ -59,4 +71,37 @@ public class RewardApplicationService { } } } + + /** + * 获得红娘推荐奖励 + */ + public void acquireMatchmakerConfirmMeetingReward(AcquireMatchmakerConfirmMeetingRewardDto dto) { + synchronized (dto.getReceiver().toString().intern()) { + WalletAccount walletAccount = walletAccountQueryService.queryByUserId(dto.getReceiver()); + if (Objects.isNull(walletAccount)) { + walletAccount = WalletAccount.init(dto.getReceiver()); + } + BigDecimal rewardAmount = dto.getReceivedAmount(); + MarriageInformation meetingMi = marriageInformationDao.selectById(dto.getMeetingMiId()); + String content = "推荐嘉宾" + meetingMi.getNickName() + StrUtil.SPACE + meetingMi.getGenderValue() + "见面"; + + walletAccount.setAvailableBalance(walletAccount.getAvailableBalance().add(rewardAmount)); + walletAccount.setTotalBalance(walletAccount.getAvailableBalance().add(walletAccount.getFrozenBalance())); + + WalletAccountRecord record = WalletAccountRecord.build(TradeTypeEnum.MARRIAGE_BOUNTY_MEETING_FEE, + rewardAmount, true, content, TradeTypeEnum.MARRIAGE_BOUNTY_MEETING_FEE.getDesc()); + if (CollUtil.isNotEmpty(dto.getOrderIdRelList())) { + List associateOrderRecordList = new ArrayList<>(); + for (Long associateOrderId : dto.getOrderIdRelList()) { + Order associateOrder = orderDao.selectById(associateOrderId); + WalletAccountAssociateOrderRecord associateOrderRecord = WalletAccountAssociateOrderRecord.build(associateOrder.getId(), associateOrder.getSettlementAmount()); + associateOrderRecordList.add(associateOrderRecord); + } + record.setAssociateOrderRecordList(associateOrderRecordList); + + } + walletAccount.setRecordList(Collections.singletonList(record)); + walletAccountAggregate.save(walletAccount); + } + } } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/MarriageBountyOrderAggregate.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/MarriageBountyOrderAggregate.java index 302fa5e..fe72658 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/MarriageBountyOrderAggregate.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/MarriageBountyOrderAggregate.java @@ -1,15 +1,22 @@ package com.qniao.dam.domain.aggregate.marriagebounty; +import cn.hutool.core.collection.CollUtil; import com.qniao.dam.domain.aggregate.marriagebounty.entity.MarriageBountyOrder; +import com.qniao.dam.domain.aggregate.marriagebounty.entity.MarriageBountyOrderReward; import com.qniao.dam.domain.aggregate.marriagebounty.repository.MarriageBountyOrderRepository; +import com.qniao.dam.domain.aggregate.marriagebounty.valueobj.MarriageBountyOrderRel; +import com.qniao.dam.domain.aggregate.marriagebounty.valueobj.MarriageBountyOrderRewardReceiveRecord; import com.qniao.dam.domian.aggregate.marriagebount.constant.MarriageBountyOrderPaymentStatusEnum; import com.qniao.dam.domian.aggregate.marriagebount.constant.MarriageBountyOrderStatusEnum; +import com.qniao.dam.domian.aggregate.marriagebounty.event.MarriageBountyOrderConfirmedMeetingEvent; import com.qniao.dam.domian.aggregate.marriagebounty.event.MarriageBountyOrderCreatedEvent; import com.qniao.domain.BaseDomainEvent; import com.qniao.framework.utils.TypeConvertUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; @Service public class MarriageBountyOrderAggregate { @@ -34,7 +41,23 @@ public class MarriageBountyOrderAggregate { } public void refund(MarriageBountyOrder marriageBountyOrder) { + marriageBountyOrder.setStatus(MarriageBountyOrderStatusEnum.MATCH_FAIl); marriageBountyOrder.setPaymentStatus(MarriageBountyOrderPaymentStatusEnum.REFUNDED); marriageBountyOrderRepository.save(marriageBountyOrder); } + + public BaseDomainEvent confirmMeeting(MarriageBountyOrder marriageBountyOrder, List orderRelList) { + marriageBountyOrderRepository.save(marriageBountyOrder); + MarriageBountyOrderConfirmedMeetingEvent event = new MarriageBountyOrderConfirmedMeetingEvent(); + event.setId(marriageBountyOrder.getId()); + MarriageBountyOrderReward marriageBountyOrderReward = marriageBountyOrder.getUpdateOrderRewardList().get(0); + MarriageBountyOrderRewardReceiveRecord rewardReceiveRecord = marriageBountyOrderReward.getRewardReceiveRecordList().get(0); + event.setMarriageBountyOrderRewardId(rewardReceiveRecord.getMarriageBountyOrderRewardId()); + event.setMeetingMiId(marriageBountyOrderReward.getMeetingMiId()); + event.setRewardType(rewardReceiveRecord.getRewardType()); + event.setReceiver(rewardReceiveRecord.getReceiver()); + event.setReceivedAmount(rewardReceiveRecord.getReceivedAmount()); + event.setOrderIdRelList(orderRelList.stream().map(MarriageBountyOrderRel::getOrderId).collect(Collectors.toList())); + return event; + } }