From 211f59cd7548f9e0fdc88af1734c68a82e0122a4 Mon Sep 17 00:00:00 2001 From: Derran Date: Wed, 28 Jan 2026 16:54:54 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9B=B4=E6=92=AD=E7=BA=A2=E5=A8=98=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../walletaccount/constant/TradeTypeEnum.java | 2 + .../event/UserTaskCompleteCommittedEvent.java | 19 ++++++ .../utc/UserTaskCompleteEventHandler.java | 68 ++++++++++++++++++- .../utc/UserTaskCompleteAggregate.java | 7 ++ ...CompleteUserTaskCompleteDomainService.java | 32 +++++++++ .../impl/UserTaskCompleteRepositoryImpl.java | 9 ++- 6 files changed, 133 insertions(+), 4 deletions(-) create mode 100644 dating-agency-mall-event/src/main/java/com/qniao/dam/domian/aggregate/utc/event/UserTaskCompleteCommittedEvent.java create mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/utc/CompleteUserTaskCompleteDomainService.java 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 78bcdf9..80f36ad 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 @@ -42,6 +42,8 @@ public enum TradeTypeEnum { LINK_MIC_REWARD(116, "连麦收益"), + TASK_REWARD(117, "任务奖励"), + PLATFORM_SERVICE_FEE(201, "平台服务费"), WITHDRAW(202, "提现"); diff --git a/dating-agency-mall-event/src/main/java/com/qniao/dam/domian/aggregate/utc/event/UserTaskCompleteCommittedEvent.java b/dating-agency-mall-event/src/main/java/com/qniao/dam/domian/aggregate/utc/event/UserTaskCompleteCommittedEvent.java new file mode 100644 index 0000000..2497d27 --- /dev/null +++ b/dating-agency-mall-event/src/main/java/com/qniao/dam/domian/aggregate/utc/event/UserTaskCompleteCommittedEvent.java @@ -0,0 +1,19 @@ +package com.qniao.dam.domian.aggregate.utc.event; + +import com.qniao.domain.BaseDomainEvent; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UserTaskCompleteCommittedEvent extends BaseDomainEvent { + + private Long id; + + private Long userId; + + private Boolean subTaskCompleteStatus; + +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/utc/UserTaskCompleteEventHandler.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/utc/UserTaskCompleteEventHandler.java index b3f6a27..8be1ab9 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/utc/UserTaskCompleteEventHandler.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/utc/UserTaskCompleteEventHandler.java @@ -1,11 +1,16 @@ package com.qniao.dam.application.handler.utc; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Tuple; +import com.google.common.eventbus.Subscribe; import com.qniao.dam.domain.aggregate.tasktemplate.entity.SubTaskTemplate; import com.qniao.dam.domain.aggregate.tasktemplate.entity.TaskTemplate; import com.qniao.dam.domain.aggregate.utc.UserTaskCompleteAggregate; import com.qniao.dam.domain.aggregate.utc.entity.UserSubTaskComplete; import com.qniao.dam.domain.aggregate.utc.entity.UserTaskComplete; +import com.qniao.dam.domain.aggregate.walletaccount.entity.WalletAccount; +import com.qniao.dam.domain.aggregate.walletaccount.valueobj.WalletAccountRecord; +import com.qniao.dam.domain.service.utc.CompleteUserTaskCompleteDomainService; import com.qniao.dam.domian.aggregate.tasktemplate.constant.SubTaskTypeEnum; import com.qniao.dam.domian.aggregate.tasktemplate.constant.TaskGroupEnum; import com.qniao.dam.domian.aggregate.tasktemplate.constant.TaskStageEnum; @@ -13,22 +18,31 @@ import com.qniao.dam.domian.aggregate.tasktemplate.constant.TaskTypeEnum; import com.qniao.dam.domian.aggregate.utc.event.EffectiveBlindDateCountCommittedMQ; import com.qniao.dam.domian.aggregate.utc.event.UserEffectiveLiveDurationCommittedMQ; import com.qniao.dam.domian.aggregate.utc.event.UserLiveRoomCheckInUserCountCommittedMQ; +import com.qniao.dam.domian.aggregate.utc.event.UserTaskCompleteCommittedEvent; +import com.qniao.dam.domian.aggregate.walletaccount.constant.IdentityTypeEnum; +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.tasktemplate.TaskTemplateDao; +import com.qniao.dam.infrastructure.persistent.dao.utc.UserTaskCompleteDao; import com.qniao.dam.query.livematchmaker.LiveMatchmakerQueryService; import com.qniao.dam.query.tasktemplate.TaskTemplateQueryService; import com.qniao.dam.query.utc.UserTaskCompleteQueryService; +import com.qniao.dam.query.walletaccount.WalletAccountQueryService; import com.qniao.dau.domain.aggregate.livematchmaker.entity.LiveMatchmaker; import com.qniao.domain.BaseApplicationService; +import com.qniao.domain.BaseDomainEvent; 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.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.Resource; +import java.math.BigDecimal; import java.util.Collections; import java.util.List; import java.util.Objects; @@ -45,6 +59,14 @@ public class UserTaskCompleteEventHandler extends BaseApplicationService { private UserTaskCompleteQueryService userTaskCompleteQueryService; @Resource private UserTaskCompleteAggregate userTaskCompleteAggregate; + @Resource + private WalletAccountQueryService walletAccountQueryService; + @Resource + private UserTaskCompleteDao userTaskCompleteDao; + @Resource + private TaskTemplateDao taskTemplateDao; + @Resource + private CompleteUserTaskCompleteDomainService completeUserTaskCompleteDomainService; @RabbitListener(bindings = @QueueBinding(value = @Queue(MqQueue.EFFECTIVE_LIVE_DURATION_COMMITTED), exchange = @Exchange(value = MqExchange.EFFECTIVE_LIVE_DURATION_COMMITTED, @@ -101,14 +123,15 @@ public class UserTaskCompleteEventHandler extends BaseApplicationService { //存在子任务 Tuple tuple = taskTemplateQueryService.getTaskDate(TaskTypeEnum.DAILY_TASK); UserTaskComplete userTaskComplete = userTaskCompleteQueryService.queryBy(userId, taskTemplate.getId(), tuple.get(0), tuple.get(1)); + UserSubTaskComplete userSubTaskComplete = null; if (Objects.isNull(userTaskComplete)) { userTaskComplete = UserTaskComplete.init(userId, taskTemplate.getId(), tuple.get(0), tuple.get(1)); - UserSubTaskComplete userSubTaskComplete = UserSubTaskComplete.init(subTaskTemplate.getId()); + userSubTaskComplete = UserSubTaskComplete.init(subTaskTemplate.getId()); userSubTaskComplete.commit(commitCount, subTaskTemplate.getRequiredCount()); userTaskComplete.setInsertSubList(Collections.singletonList(userSubTaskComplete)); } else { if (!userTaskComplete.getCompleteStatus()) { - UserSubTaskComplete userSubTaskComplete = userTaskCompleteQueryService.querySubBy(userTaskComplete.getId(), subTaskTemplate.getId()); + userSubTaskComplete = userTaskCompleteQueryService.querySubBy(userTaskComplete.getId(), subTaskTemplate.getId()); if (Objects.isNull(userSubTaskComplete)) { userSubTaskComplete = UserSubTaskComplete.init(subTaskTemplate.getId()); userSubTaskComplete.commit(commitCount, subTaskTemplate.getRequiredCount()); @@ -121,7 +144,10 @@ public class UserTaskCompleteEventHandler extends BaseApplicationService { } } } - userTaskCompleteAggregate.edit(userTaskComplete); + if (Objects.nonNull(userSubTaskComplete)) { + BaseDomainEvent event = userTaskCompleteAggregate.commit(userTaskComplete, userSubTaskComplete.getCompleteStatus()); + this.sendEvent(event); + } break; } } @@ -130,4 +156,40 @@ public class UserTaskCompleteEventHandler extends BaseApplicationService { } + @Subscribe + private void handle(UserTaskCompleteCommittedEvent event) { + try { + if (event.getSubTaskCompleteStatus()) { + synchronized (event.getUserId().toString().intern()) { + UserTaskComplete userTaskComplete = userTaskCompleteDao.selectById(event.getId()); + if (!userTaskComplete.getCompleteStatus()) { + List subTaskTemplateList = taskTemplateQueryService.getSubList(userTaskComplete.getTaskTemplateId()); + if (CollUtil.isNotEmpty(subTaskTemplateList)) { + boolean completeStatus = true; + for (SubTaskTemplate subTaskTemplate : subTaskTemplateList) { + UserSubTaskComplete userSubTaskComplete = userTaskCompleteQueryService.querySubBy(userTaskComplete.getId(), subTaskTemplate.getId()); + if (Objects.isNull(userSubTaskComplete) || !userSubTaskComplete.getCompleteStatus()) { + completeStatus = false; + break; + } + } + if (completeStatus) { + TaskTemplate taskTemplate = taskTemplateDao.selectById(userTaskComplete.getTaskTemplateId()); + BigDecimal revenue = new BigDecimal(taskTemplate.getRewardValue()); + WalletAccount walletAccount = walletAccountQueryService.queryByType(userTaskComplete.getUserId(), IdentityTypeEnum.INDIVIDUAL); + BigDecimal originalBalance = walletAccount.getTotalBalance(); + walletAccount.setAvailableBalance(walletAccount.getAvailableBalance().add(revenue)); + walletAccount.setTotalBalance(walletAccount.getAvailableBalance().add(walletAccount.getFrozenBalance())); + WalletAccountRecord walletAccountRecord = WalletAccountRecord.build(TradeTypeEnum.TASK_REWARD, revenue, true, originalBalance, walletAccount.getTotalBalance()); + walletAccount.setRecordList(Collections.singletonList(walletAccountRecord)); + completeUserTaskCompleteDomainService.handle(userTaskComplete,walletAccount); + } + } + } + } + } + } catch (Exception e) { + log.error("用户任务提交事件处理异常", e); + } + } } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/utc/UserTaskCompleteAggregate.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/utc/UserTaskCompleteAggregate.java index a3fcb4a..e6265e0 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/utc/UserTaskCompleteAggregate.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/utc/UserTaskCompleteAggregate.java @@ -2,6 +2,8 @@ package com.qniao.dam.domain.aggregate.utc; import com.qniao.dam.domain.aggregate.utc.entity.UserTaskComplete; import com.qniao.dam.domain.aggregate.utc.repository.UserTaskCompleteRepository; +import com.qniao.dam.domian.aggregate.utc.event.UserTaskCompleteCommittedEvent; +import com.qniao.domain.BaseDomainEvent; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -28,4 +30,9 @@ public class UserTaskCompleteAggregate { public void delete(Long id) { repository.delete(id); } + + public BaseDomainEvent commit(UserTaskComplete entity,Boolean subTaskCompleteStatus) { + repository.save(entity); + return new UserTaskCompleteCommittedEvent(entity.getId(),entity.getUserId(),subTaskCompleteStatus); + } } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/utc/CompleteUserTaskCompleteDomainService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/utc/CompleteUserTaskCompleteDomainService.java new file mode 100644 index 0000000..fd66fb4 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/utc/CompleteUserTaskCompleteDomainService.java @@ -0,0 +1,32 @@ +package com.qniao.dam.domain.service.utc; + +import com.qniao.dam.domain.aggregate.utc.UserTaskCompleteAggregate; +import com.qniao.dam.domain.aggregate.utc.entity.UserTaskComplete; +import com.qniao.dam.domain.aggregate.walletaccount.WalletAccountAggregate; +import com.qniao.dam.domain.aggregate.walletaccount.entity.WalletAccount; +import com.qniao.dam.domian.aggregate.utc.constant.UserTaskCompleteRewardReceiveStatusEnum; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.time.LocalDateTime; + +@Service +public class CompleteUserTaskCompleteDomainService { + + @Resource + private UserTaskCompleteAggregate userTaskCompleteAggregate; + @Resource + private WalletAccountAggregate walletAccountAggregate; + + @Transactional(rollbackFor = Exception.class) + public void handle(UserTaskComplete userTaskComplete, + WalletAccount walletAccount) { + userTaskComplete.setCompleteStatus(true); + userTaskComplete.setCompleteTime(LocalDateTime.now()); + userTaskComplete.setRewardReceiveStatus(UserTaskCompleteRewardReceiveStatusEnum.RECEIVED); + userTaskCompleteAggregate.edit(userTaskComplete); + + walletAccountAggregate.save(walletAccount); + } +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/repository/impl/UserTaskCompleteRepositoryImpl.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/repository/impl/UserTaskCompleteRepositoryImpl.java index 90bfaed..b8a8567 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/repository/impl/UserTaskCompleteRepositoryImpl.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/repository/impl/UserTaskCompleteRepositoryImpl.java @@ -1,6 +1,8 @@ package com.qniao.dam.infrastructure.persistent.repository.impl; import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qniao.dam.domain.aggregate.utc.entity.UserSubTaskComplete; import com.qniao.dam.domain.aggregate.utc.entity.UserTaskComplete; import com.qniao.dam.domain.aggregate.utc.repository.UserTaskCompleteRepository; import com.qniao.dam.infrastructure.persistent.dao.utc.UserSubTaskCompleteDao; @@ -26,7 +28,12 @@ public class UserTaskCompleteRepositoryImpl implements UserTaskCompleteRepositor @Override public UserTaskComplete load(Long id) { - return dao.selectById(id); + UserTaskComplete userTaskComplete = dao.selectById(id); + if (Objects.nonNull(userTaskComplete)) { + userTaskComplete.setSubList(userSubTaskCompleteDao.selectList(new LambdaQueryWrapper() + .eq(UserSubTaskComplete::getUserTaskCompleteId, id))); + } + return userTaskComplete; } @Override