|
|
@@ -3,10 +3,7 @@ package com.fs.live.service.impl;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.time.LocalTime;
|
|
|
import java.time.ZoneId;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.Collections;
|
|
|
-import java.util.Date;
|
|
|
-import java.util.List;
|
|
|
+import java.util.*;
|
|
|
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
@@ -333,6 +330,13 @@ public class LiveAutoTaskServiceImpl implements ILiveAutoTaskService {
|
|
|
@Override
|
|
|
public int deleteLiveAutoTaskByIds(Long[] ids)
|
|
|
{
|
|
|
+ // 先从缓存中删除所有任务
|
|
|
+ for (Long id : ids) {
|
|
|
+ LiveAutoTask task = baseMapper.selectLiveAutoTaskById(id);
|
|
|
+ if (task != null) {
|
|
|
+ removeTaskFromCache(task);
|
|
|
+ }
|
|
|
+ }
|
|
|
return baseMapper.deleteLiveAutoTaskByIds(ids);
|
|
|
}
|
|
|
|
|
|
@@ -345,6 +349,12 @@ public class LiveAutoTaskServiceImpl implements ILiveAutoTaskService {
|
|
|
@Override
|
|
|
public int deleteLiveAutoTaskById(Long id)
|
|
|
{
|
|
|
+ // 先查询任务信息
|
|
|
+ LiveAutoTask task = baseMapper.selectLiveAutoTaskById(id);
|
|
|
+ if (task != null) {
|
|
|
+ // 从缓存中删除
|
|
|
+ removeTaskFromCache(task);
|
|
|
+ }
|
|
|
return baseMapper.deleteLiveAutoTaskById(id);
|
|
|
}
|
|
|
|
|
|
@@ -414,4 +424,232 @@ public class LiveAutoTaskServiceImpl implements ILiveAutoTaskService {
|
|
|
public List<LiveAutoTask> consoleList(Long liveId) {
|
|
|
return baseMapper.consoleList(liveId, DateUtils.getNowDate());
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 删除与优惠券相关的自动化任务(taskType=5)
|
|
|
+ * @param couponId 优惠券ID
|
|
|
+ * @param liveId 直播间ID(可为null,null表示所有直播间)
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void deleteAutoTasksByCouponId(Long couponId, Long liveId) {
|
|
|
+ try {
|
|
|
+ List<LiveAutoTask> allTasks;
|
|
|
+ if (liveId != null) {
|
|
|
+ allTasks = baseMapper.selectLiveAutoTaskByLiveId(liveId);
|
|
|
+ } else {
|
|
|
+ // 查询所有直播间的任务
|
|
|
+ LiveAutoTask queryTask = new LiveAutoTask();
|
|
|
+ queryTask.setTaskType(5L); // 优惠券任务
|
|
|
+ allTasks = baseMapper.selectLiveAutoTaskList(queryTask);
|
|
|
+ }
|
|
|
+
|
|
|
+ List<Long> taskIdsToDelete = new ArrayList<>();
|
|
|
+ for (LiveAutoTask task : allTasks) {
|
|
|
+ if (task.getTaskType() != null && task.getTaskType() == 5L) {
|
|
|
+ try {
|
|
|
+ LiveCoupon liveCoupon = JSON.parseObject(task.getContent(), LiveCoupon.class);
|
|
|
+ if (liveCoupon != null && couponId.equals(liveCoupon.getCouponId())) {
|
|
|
+ taskIdsToDelete.add(task.getId());
|
|
|
+ // 从缓存中删除
|
|
|
+ removeTaskFromCache(task);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("解析自动化任务content失败,taskId: {}, error: {}", task.getId(), e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!taskIdsToDelete.isEmpty()) {
|
|
|
+ Long[] ids = taskIdsToDelete.toArray(new Long[0]);
|
|
|
+ baseMapper.deleteLiveAutoTaskByIds(ids);
|
|
|
+ log.info("删除与优惠券ID {} 相关的自动化任务 {} 个", couponId, taskIdsToDelete.size());
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("删除优惠券相关自动化任务失败,couponId: {}", couponId, e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 删除与红包相关的自动化任务(taskType=2)
|
|
|
+ * @param redId 红包ID
|
|
|
+ * @param liveId 直播间ID
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void deleteAutoTasksByRedId(Long redId, Long liveId) {
|
|
|
+ try {
|
|
|
+ List<LiveAutoTask> allTasks = baseMapper.selectLiveAutoTaskByLiveId(liveId);
|
|
|
+ List<Long> taskIdsToDelete = new ArrayList<>();
|
|
|
+
|
|
|
+ for (LiveAutoTask task : allTasks) {
|
|
|
+ if (task.getTaskType() != null && task.getTaskType() == 2L) {
|
|
|
+ try {
|
|
|
+ LiveRedConf liveRedConf = JSON.parseObject(task.getContent(), LiveRedConf.class);
|
|
|
+ if (liveRedConf != null && redId.equals(liveRedConf.getRedId())) {
|
|
|
+ taskIdsToDelete.add(task.getId());
|
|
|
+ // 从缓存中删除
|
|
|
+ removeTaskFromCache(task);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("解析自动化任务content失败,taskId: {}, error: {}", task.getId(), e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!taskIdsToDelete.isEmpty()) {
|
|
|
+ Long[] ids = taskIdsToDelete.toArray(new Long[0]);
|
|
|
+ baseMapper.deleteLiveAutoTaskByIds(ids);
|
|
|
+ log.info("删除与红包ID {} 相关的自动化任务 {} 个", redId, taskIdsToDelete.size());
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("删除红包相关自动化任务失败,redId: {}, liveId: {}", redId, liveId, e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 删除与抽奖相关的自动化任务(taskType=4)
|
|
|
+ * @param lotteryId 抽奖ID
|
|
|
+ * @param liveId 直播间ID
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void deleteAutoTasksByLotteryId(Long lotteryId, Long liveId) {
|
|
|
+ try {
|
|
|
+ List<LiveAutoTask> allTasks = baseMapper.selectLiveAutoTaskByLiveId(liveId);
|
|
|
+ List<Long> taskIdsToDelete = new ArrayList<>();
|
|
|
+
|
|
|
+ for (LiveAutoTask task : allTasks) {
|
|
|
+ if (task.getTaskType() != null && task.getTaskType() == 4L) {
|
|
|
+ try {
|
|
|
+ LiveLotteryConf liveLotteryConf = JSON.parseObject(task.getContent(), LiveLotteryConf.class);
|
|
|
+ if (liveLotteryConf != null && lotteryId.equals(liveLotteryConf.getLotteryId())) {
|
|
|
+ taskIdsToDelete.add(task.getId());
|
|
|
+ // 从缓存中删除
|
|
|
+ removeTaskFromCache(task);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("解析自动化任务content失败,taskId: {}, error: {}", task.getId(), e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!taskIdsToDelete.isEmpty()) {
|
|
|
+ Long[] ids = taskIdsToDelete.toArray(new Long[0]);
|
|
|
+ baseMapper.deleteLiveAutoTaskByIds(ids);
|
|
|
+ log.info("删除与抽奖ID {} 相关的自动化任务 {} 个", lotteryId, taskIdsToDelete.size());
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("删除抽奖相关自动化任务失败,lotteryId: {}, liveId: {}", lotteryId, liveId, e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 删除与商品相关的自动化任务(taskType=1或6)
|
|
|
+ * @param goodsId 商品ID
|
|
|
+ * @param liveId 直播间ID
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void deleteAutoTasksByGoodsId(Long goodsId, Long liveId) {
|
|
|
+ try {
|
|
|
+ List<LiveAutoTask> allTasks = baseMapper.selectLiveAutoTaskByLiveId(liveId);
|
|
|
+ List<Long> taskIdsToDelete = new ArrayList<>();
|
|
|
+
|
|
|
+ for (LiveAutoTask task : allTasks) {
|
|
|
+ if (task.getTaskType() != null && (task.getTaskType() == 1L || task.getTaskType() == 6L)) {
|
|
|
+ try {
|
|
|
+ if (task.getTaskType() == 1L) {
|
|
|
+ // 商品推荐任务
|
|
|
+ LiveGoodsVo liveGoodsVo = JSON.parseObject(task.getContent(), LiveGoodsVo.class);
|
|
|
+ if (liveGoodsVo != null && goodsId.equals(liveGoodsVo.getGoodsId())) {
|
|
|
+ taskIdsToDelete.add(task.getId());
|
|
|
+ removeTaskFromCache(task);
|
|
|
+ }
|
|
|
+ } else if (task.getTaskType() == 6L) {
|
|
|
+ // 商品上下架任务
|
|
|
+ com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(task.getContent());
|
|
|
+ Long taskGoodsId = jsonObject.getLong("goodsId");
|
|
|
+ if (taskGoodsId != null && goodsId.equals(taskGoodsId)) {
|
|
|
+ taskIdsToDelete.add(task.getId());
|
|
|
+ removeTaskFromCache(task);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("解析自动化任务content失败,taskId: {}, error: {}", task.getId(), e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!taskIdsToDelete.isEmpty()) {
|
|
|
+ Long[] ids = taskIdsToDelete.toArray(new Long[0]);
|
|
|
+ baseMapper.deleteLiveAutoTaskByIds(ids);
|
|
|
+ log.info("删除与商品ID {} 相关的自动化任务 {} 个", goodsId, taskIdsToDelete.size());
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("删除商品相关自动化任务失败,goodsId: {}, liveId: {}", goodsId, liveId, e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 从缓存中删除自动化任务
|
|
|
+ * @param task 自动化任务
|
|
|
+ */
|
|
|
+ private void removeTaskFromCache(LiveAutoTask task) {
|
|
|
+ try {
|
|
|
+ if (task.getLiveId() != null && task.getId() != null) {
|
|
|
+ String cacheKey = "live:auto_task:" + task.getLiveId();
|
|
|
+ // 获取ZSet中的所有任务
|
|
|
+ Set<String> allTasks = redisCache.redisTemplate.opsForZSet().range(cacheKey, 0, -1);
|
|
|
+ if (allTasks != null && !allTasks.isEmpty()) {
|
|
|
+ // 遍历找到匹配的任务ID
|
|
|
+ for (String taskJson : allTasks) {
|
|
|
+ try {
|
|
|
+ LiveAutoTask cachedTask = JSON.parseObject(taskJson, LiveAutoTask.class);
|
|
|
+ if (cachedTask != null && task.getId().equals(cachedTask.getId())) {
|
|
|
+ // 找到匹配的任务,从ZSet中删除
|
|
|
+ redisCache.redisTemplate.opsForZSet().remove(cacheKey, taskJson);
|
|
|
+ log.debug("从缓存中删除自动化任务,liveId: {}, taskId: {}", task.getLiveId(), task.getId());
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("解析缓存中的任务失败,taskJson: {}, error: {}", taskJson, e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("从缓存删除自动化任务失败,taskId: {}, error: {}", task.getId(), e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 删除抽奖缓存
|
|
|
+ * @param lotteryId 抽奖ID
|
|
|
+ * @param liveId 直播间ID
|
|
|
+ */
|
|
|
+ public void deleteLotteryCache(Long lotteryId, Long liveId) {
|
|
|
+ try {
|
|
|
+ String cacheKey = "live:lottery_task:" + liveId;
|
|
|
+ // 从ZSet中删除指定的抽奖ID
|
|
|
+ redisCache.redisTemplate.opsForZSet().remove(cacheKey, String.valueOf(lotteryId));
|
|
|
+ log.info("删除抽奖缓存,lotteryId: {}, liveId: {}", lotteryId, liveId);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("删除抽奖缓存失败,lotteryId: {}, liveId: {}", lotteryId, liveId, e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 删除红包缓存
|
|
|
+ * @param redId 红包ID
|
|
|
+ * @param liveId 直播间ID
|
|
|
+ */
|
|
|
+ public void deleteRedCache(Long redId, Long liveId) {
|
|
|
+ try {
|
|
|
+ String cacheKey = "live:red_task:" + liveId;
|
|
|
+ // 从ZSet中删除指定的红包ID
|
|
|
+ redisCache.redisTemplate.opsForZSet().remove(cacheKey, String.valueOf(redId));
|
|
|
+ // 同时删除剩余红包数的缓存
|
|
|
+ redisCache.deleteObject("live:red:remainingLots:" + redId);
|
|
|
+ log.info("删除红包缓存,redId: {}, liveId: {}", redId, liveId);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("删除红包缓存失败,redId: {}, liveId: {}", redId, liveId, e);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|