From 7c0f44f8a5ce0dda553d7c73d8bb850c19a4c142 Mon Sep 17 00:00:00 2001 From: tianfeng <769204422@qq.com> Date: Tue, 6 Jan 2026 12:00:08 +0800 Subject: [PATCH] =?UTF-8?q?mq=E6=B6=88=E6=81=AF=E9=87=8D=E8=AF=95=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E8=B0=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/MessageSenderService.java | 2 + .../other/app/scheduler/GiftMqRetryTask.java | 16 ++- .../src/test/java/AnchorTargetTest.java | 131 ++++++++++++++++++ 3 files changed, 143 insertions(+), 6 deletions(-) create mode 100644 rc-service/rc-service-other/other-start/src/test/java/AnchorTargetTest.java diff --git a/rc-common-business/common-business-mq/business-rocketmq/src/main/java/com/red/circle/mq/rocket/business/service/MessageSenderService.java b/rc-common-business/common-business-mq/business-rocketmq/src/main/java/com/red/circle/mq/rocket/business/service/MessageSenderService.java index 7e58aa92..71b0b322 100644 --- a/rc-common-business/common-business-mq/business-rocketmq/src/main/java/com/red/circle/mq/rocket/business/service/MessageSenderService.java +++ b/rc-common-business/common-business-mq/business-rocketmq/src/main/java/com/red/circle/mq/rocket/business/service/MessageSenderService.java @@ -11,6 +11,7 @@ import com.red.circle.tool.core.text.StringUtils; import java.nio.charset.StandardCharsets; import java.util.Objects; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; /** @@ -27,6 +28,7 @@ public class MessageSenderService { public MessageSenderService( ManagedRocketMQProducer managedRocketMQProducer, + @Qualifier("rocketMqSenderFailServiceRedisImpl") RocketMqSenderFailService rocketMqSenderFailService) { this.managedRocketMQProducer = managedRocketMQProducer; this.rocketMqSenderFailService = rocketMqSenderFailService; diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/scheduler/GiftMqRetryTask.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/scheduler/GiftMqRetryTask.java index 7873107b..8e6d93f4 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/scheduler/GiftMqRetryTask.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/scheduler/GiftMqRetryTask.java @@ -38,7 +38,7 @@ public class GiftMqRetryTask { * 每分钟重试赠送礼物消息 */ @Scheduled(cron = "0 */1 * * * ?") - @TaskCacheLock(key = "GIFT_MQ_RETRY_TASK_GIVE_GIFT", expireSecond = 60) + @TaskCacheLock(key = "GIFT_MQ_RETRY_TASK_GIVE_GIFT", expireSecond = 55) public void retryGiveGiftMessages() { try { List messages = queryService.getPendingMessagesByTag( @@ -63,7 +63,7 @@ public class GiftMqRetryTask { * 每分钟重试离线统计礼物消息 */ @Scheduled(cron = "0 */1 * * * ?") - @TaskCacheLock(key = "GIFT_MQ_RETRY_TASK_OFFLINE_PROCESS", expireSecond = 60) + @TaskCacheLock(key = "GIFT_MQ_RETRY_TASK_OFFLINE_PROCESS", expireSecond = 55) public void retryOfflineProcessGiftMessages() { try { List messages = queryService.getPendingMessagesByTag( @@ -142,13 +142,17 @@ public class GiftMqRetryTask { } } - private GiveAwayGiftBatchEvent parseGiveGiftEvent( - String body) { + private GiveAwayGiftBatchEvent parseGiveGiftEvent(String body) { + if (body.startsWith("\"") && body.endsWith("\"")) { + body = JSON.parseObject(body, String.class); + } return JSON.parseObject(body, GiveAwayGiftBatchEvent.class); } - private OfflineProcessGiftEvent parseOfflineProcessEvent( - String body) { + private OfflineProcessGiftEvent parseOfflineProcessEvent(String body) { + if (body.startsWith("\"") && body.endsWith("\"")) { + body = JSON.parseObject(body, String.class); + } return JSON.parseObject(body, OfflineProcessGiftEvent.class); } } diff --git a/rc-service/rc-service-other/other-start/src/test/java/AnchorTargetTest.java b/rc-service/rc-service-other/other-start/src/test/java/AnchorTargetTest.java new file mode 100644 index 00000000..4e83b023 --- /dev/null +++ b/rc-service/rc-service-other/other-start/src/test/java/AnchorTargetTest.java @@ -0,0 +1,131 @@ +import com.red.circle.OtherServiceApplication; +import com.red.circle.other.infra.common.team.decay.ListMemberWorkDecay; +import com.red.circle.other.infra.database.mongo.entity.team.team.TeamMemberTarget; +import com.red.circle.other.infra.database.mongo.service.team.team.TeamMemberTargetService; +import com.red.circle.other.inner.model.cmd.team.TeamMemberWorkQryCmd; +import com.red.circle.other.inner.model.dto.agency.agency.TeamMemberWorkDTO; +import com.red.circle.other.inner.model.dto.agency.agency.TeamMemberWorkDailyTargetDTO; +import com.red.circle.tool.core.date.TimestampUtils; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.core.query.Update; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.List; +import java.util.stream.Collectors; + +@SpringBootTest(classes = OtherServiceApplication.class) +@RunWith(SpringRunner.class) +public class AnchorTargetTest { + + @Autowired + private TeamMemberTargetService teamMemberTargetService; + @Autowired + private ListMemberWorkDecay listMemberWorkDecay; + @Autowired + private MongoTemplate mongoTemplate; + + + /** + * 扣除主播目标 + */ + @Test + public void AnchorTargetTest(){ + Long userId = 1987522531364773890L; + Long deductValue = 300000L; // 要扣除的目标值 + + TeamMemberWorkQryCmd cmd = new TeamMemberWorkQryCmd(); + cmd.setMemberUserId(userId); + cmd.setSysOrigin("LIKEI"); + List execute = listMemberWorkDecay.execute(cmd); + + // 1. 筛选 billStatus = UNPAID 的数据 + List unpaidList = execute.stream() + .filter(work -> "UNPAID".equals(work.getBillStatus())) + .limit(1) + .toList(); + + System.out.println("未结算的工单数量: " + unpaidList.size()); + + for (TeamMemberWorkDTO work : unpaidList) { + // 2. 统计 dailyTargets 的 acceptGiftValue 的和 + Long totalAcceptGiftValue = work.getTarget().getDailyTargets().stream() + .mapToLong(TeamMemberWorkDailyTargetDTO::getAcceptGiftValue) + .sum(); + + System.out.println("工单ID: " + work.getId() + ", 总收礼物价值: " + totalAcceptGiftValue); + + // 3. 检查目标值够不够扣 + if (totalAcceptGiftValue < deductValue) { + System.out.println("目标值不足,无法扣除。需要: " + deductValue + ", 当前: " + totalAcceptGiftValue); + continue; + } + + // 4. 从第一天开始扣除 + Long remainingDeduct = deductValue; + List dailyTargets = work.getTarget().getDailyTargets(); + boolean hasModified = false; // 标记是否有修改 + + for (int i = 0; i < dailyTargets.size(); i++) { + TeamMemberWorkDailyTargetDTO dailyTarget = dailyTargets.get(i); + Long currentValue = dailyTarget.getAcceptGiftValue(); + + if (remainingDeduct <= 0) { + break; + } + + if (currentValue > 0) { // 只有当前值大于0时才可能修改 + hasModified = true; // 标记为已修改 + + if (currentValue >= remainingDeduct) { + // 当前天的值足够扣除剩余部分 + dailyTarget.setAcceptGiftValue(currentValue - remainingDeduct); + System.out.println("日期 " + dailyTarget.getDateNumber() + " 扣除: " + remainingDeduct + ", 剩余: " + (currentValue - remainingDeduct)); + remainingDeduct = 0L; + } else { + // 当前天的值不够,全部扣除 + dailyTarget.setAcceptGiftValue(0L); + remainingDeduct -= currentValue; + System.out.println("日期 " + dailyTarget.getDateNumber() + " 扣除: " + currentValue + ", 剩余需扣除: " + remainingDeduct); + } + } + } + + // 5. 只有当有修改时才更新 MongoDB + if (hasModified) { + updateTeamMemberTarget(work.getId(), dailyTargets); + System.out.println("工单 " + work.getId() + " 扣除完成,已更新到MongoDB"); + } else { + System.out.println("工单 " + work.getId() + " 无需修改,跳过更新"); + } + } + } + + /** + * 更新 MongoDB 中的 TeamMemberTarget + * @param timeId 工单ID + * @param dailyTargets 更新后的每日目标列表 + */ + private void updateTeamMemberTarget(Long timeId, List dailyTargets) { + Query query = new Query(Criteria.where("timeId").is(timeId)); + + // 更新 target.dailyTargets 数组 + for (int i = 0; i < dailyTargets.size(); i++) { + TeamMemberWorkDailyTargetDTO dailyTarget = dailyTargets.get(i); + + mongoTemplate.updateFirst(query, + new Update() + .set("updateTime", TimestampUtils.now()) + .set("dailyTargets.$[i].acceptGiftValue", dailyTarget.getAcceptGiftValue()) + .set("dailyTargets.$[i].updateTime", TimestampUtils.now()) + .filterArray(Criteria.where("i.dateNumber").is(dailyTarget.getDateNumber())), + TeamMemberTarget.class); + } + } + +}