| 
					
				 | 
			
			
				@@ -251,78 +251,88 @@ public class VideoPoolAuditService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @XxlJob("videoPoolAuditQueueJob") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public ReturnT<String> videoPoolAuditQueueJob(String param) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        Long now = System.currentTimeMillis(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        String dateStr = DateUtils.getCurrentDateStr("yyyyMMdd"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        String nextListRedisKey = "video-pool-audit-next-list"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        String auditQueueRedisKey = "video-pool-audit-queue-" + dateStr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // 判断是否审核超时,重新加入待审核队列 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        while (true) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            List<String> nextList = redisTemplate.opsForList().range(nextListRedisKey, 0, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (CollectionUtils.isEmpty(nextList)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String lockKey = "video-pool-audit-queue-job-lock"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String requestId = UUID.randomUUID().toString(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Boolean lockAcquired = redisUtil.tryAcquireLock(lockKey, requestId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (!lockAcquired) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return ReturnT.SUCCESS; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Long now = System.currentTimeMillis(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String dateStr = DateUtils.getCurrentDateStr("yyyyMMdd"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String nextListRedisKey = "video-pool-audit-next-list"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String auditQueueRedisKey = "video-pool-audit-queue-" + dateStr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 判断是否审核超时,重新加入待审核队列 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            while (true) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                List<String> nextList = redisTemplate.opsForList().range(nextListRedisKey, 0, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (CollectionUtils.isEmpty(nextList)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                JSONObject firstObj = JSONObject.parseObject(nextList.get(0)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (now > firstObj.getLong("timestamp")) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    redisTemplate.opsForList().leftPop(nextListRedisKey); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    String id = firstObj.getString("id"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    PublishSingleVideoSource videoAudit = videoSourceRepository.getByContentTraceId(id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ContentPoolEnum poolEnum = ContentPoolEnum.from(videoAudit.getFlowPoolLevel()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    redisTemplate.opsForZSet().add(auditQueueRedisKey, id, poolEnum.getWeight()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            JSONObject firstObj = JSONObject.parseObject(nextList.get(0)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (now > firstObj.getLong("timestamp")) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                redisTemplate.opsForList().leftPop(nextListRedisKey); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                String id = firstObj.getString("id"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                PublishSingleVideoSource videoAudit = videoSourceRepository.getByContentTraceId(id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                ContentPoolEnum poolEnum = ContentPoolEnum.from(videoAudit.getFlowPoolLevel()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                redisTemplate.opsForZSet().add(auditQueueRedisKey, id, poolEnum.getWeight()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            List<String> excludeContentIds = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            List<String> nextList = redisTemplate.opsForList().range(nextListRedisKey, 0, -1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Map<String, List<PublishSingleVideoSource>> nextListPoolCountMap = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (CollectionUtils.isNotEmpty(nextList)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                List<String> nextListIds = nextList.stream().map(item -> JSONObject.parseObject(item).getString("id")).collect(Collectors.toList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                List<PublishSingleVideoSource> auditQueueList = videoSourceRepository.getByContentTraceIdIn(new ArrayList<>(nextListIds)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                nextListPoolCountMap = auditQueueList.stream().collect(Collectors.groupingBy(item -> ContentPoolEnum.from(item.getFlowPoolLevel()).getContentPool())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                excludeContentIds.addAll(nextListIds); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        List<String> excludeContentIds = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        List<String> nextList = redisTemplate.opsForList().range(nextListRedisKey, 0, -1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        Map<String, List<PublishSingleVideoSource>> nextListPoolCountMap = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (CollectionUtils.isNotEmpty(nextList)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            List<String> nextListIds = nextList.stream().map(item -> JSONObject.parseObject(item).getString("id")).collect(Collectors.toList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            List<PublishSingleVideoSource> auditQueueList = videoSourceRepository.getByContentTraceIdIn(new ArrayList<>(nextListIds)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            nextListPoolCountMap = auditQueueList.stream().collect(Collectors.groupingBy(item -> ContentPoolEnum.from(item.getFlowPoolLevel()).getContentPool())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            excludeContentIds.addAll(nextListIds); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        Set<String> auditQueueIds = redisTemplate.opsForZSet().rangeByScore(auditQueueRedisKey, 0, 100); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        Map<String, List<PublishSingleVideoSource>> auditQueuePoolCountMap = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (CollectionUtils.isNotEmpty(auditQueueIds)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            List<PublishSingleVideoSource> auditQueueList = videoSourceRepository.getByContentTraceIdIn(new ArrayList<>(auditQueueIds)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            auditQueuePoolCountMap = auditQueueList.stream().collect(Collectors.groupingBy(item -> ContentPoolEnum.from(item.getFlowPoolLevel()).getContentPool())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            excludeContentIds.addAll(auditQueueIds); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // 每日配置发送量不足添加 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        for (Map.Entry<String, Integer> entry : dailyAuditPoolCount.entrySet()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            ContentPoolEnum poolEnum = ContentPoolEnum.from(entry.getKey()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            String key = "video_audit_count_" + dateStr + "_" + poolEnum.getContentPool(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            int totalCount = Integer.parseInt(Optional.ofNullable(redisTemplate.opsForValue().get(key)).orElse("0")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (totalCount < entry.getValue()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                List<PublishSingleVideoSource> auditQueueList = auditQueuePoolCountMap.getOrDefault(poolEnum.getContentPool(), new ArrayList<>()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                List<PublishSingleVideoSource> nextListPool = nextListPoolCountMap.getOrDefault(poolEnum.getContentPool(), new ArrayList<>()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                int needCount = entry.getValue() - (totalCount + auditQueueList.size() + nextListPool.size()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (needCount > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    List<PublishSingleVideoSource> addList = videoPoolAuditMapper.articleVideoWatingAuditList( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            Arrays.asList(ArticleVideoAuditStatusEnum.WAITING.getCode()), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            Arrays.asList(poolEnum.getValue()), excludeContentIds, needCount); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    if (CollectionUtils.isNotEmpty(addList)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        for (PublishSingleVideoSource item : addList) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            redisTemplate.opsForZSet().add(auditQueueRedisKey, item.getContentTraceId(), poolEnum.getWeight()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            excludeContentIds.add(item.getContentTraceId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Set<String> auditQueueIds = redisTemplate.opsForZSet().rangeByScore(auditQueueRedisKey, 0, 100); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Map<String, List<PublishSingleVideoSource>> auditQueuePoolCountMap = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (CollectionUtils.isNotEmpty(auditQueueIds)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                List<PublishSingleVideoSource> auditQueueList = videoSourceRepository.getByContentTraceIdIn(new ArrayList<>(auditQueueIds)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                auditQueuePoolCountMap = auditQueueList.stream().collect(Collectors.groupingBy(item -> ContentPoolEnum.from(item.getFlowPoolLevel()).getContentPool())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                excludeContentIds.addAll(auditQueueIds); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 每日配置发送量不足添加 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for (Map.Entry<String, Integer> entry : dailyAuditPoolCount.entrySet()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ContentPoolEnum poolEnum = ContentPoolEnum.from(entry.getKey()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                String key = "video_audit_count_" + dateStr + "_" + poolEnum.getContentPool(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                int totalCount = Integer.parseInt(Optional.ofNullable(redisTemplate.opsForValue().get(key)).orElse("0")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (totalCount < entry.getValue()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    List<PublishSingleVideoSource> auditQueueList = auditQueuePoolCountMap.getOrDefault(poolEnum.getContentPool(), new ArrayList<>()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    List<PublishSingleVideoSource> nextListPool = nextListPoolCountMap.getOrDefault(poolEnum.getContentPool(), new ArrayList<>()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    int needCount = entry.getValue() - (totalCount + auditQueueList.size() + nextListPool.size()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (needCount > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        List<PublishSingleVideoSource> addList = videoPoolAuditMapper.articleVideoWatingAuditList( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                Arrays.asList(ArticleVideoAuditStatusEnum.WAITING.getCode()), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                Arrays.asList(poolEnum.getValue()), excludeContentIds, needCount); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (CollectionUtils.isNotEmpty(addList)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            for (PublishSingleVideoSource item : addList) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                redisTemplate.opsForZSet().add(auditQueueRedisKey, item.getContentTraceId(), poolEnum.getWeight()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                excludeContentIds.add(item.getContentTraceId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // 待发布内容不足添加 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        Long auditQueueSize = redisTemplate.opsForZSet().size(auditQueueRedisKey); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (Objects.isNull(auditQueueSize) || auditQueueSize < 20) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            List<PublishSingleVideoSource> list = videoPoolAuditMapper.articleVideoWatingAuditList( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    Arrays.asList(ArticleVideoAuditStatusEnum.WAITING.getCode()), null, excludeContentIds, 40); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (CollectionUtils.isNotEmpty(list)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                for (PublishSingleVideoSource item : list) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    ContentPoolEnum poolEnum = ContentPoolEnum.from(item.getFlowPoolLevel()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    redisTemplate.opsForZSet().add(auditQueueRedisKey, item.getContentTraceId(), poolEnum.getWeight()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 待发布内容不足添加 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Long auditQueueSize = redisTemplate.opsForZSet().size(auditQueueRedisKey); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (Objects.isNull(auditQueueSize) || auditQueueSize < 20) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                List<PublishSingleVideoSource> list = videoPoolAuditMapper.articleVideoWatingAuditList( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        Arrays.asList(ArticleVideoAuditStatusEnum.WAITING.getCode()), null, excludeContentIds, 40); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (CollectionUtils.isNotEmpty(list)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    for (PublishSingleVideoSource item : list) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        ContentPoolEnum poolEnum = ContentPoolEnum.from(item.getFlowPoolLevel()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        redisTemplate.opsForZSet().add(auditQueueRedisKey, item.getContentTraceId(), poolEnum.getWeight()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            redisTemplate.expire(auditQueueRedisKey, 12, TimeUnit.HOURS); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } finally { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            redisUtil.releaseLock(lockKey, requestId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        redisTemplate.expire(auditQueueRedisKey, 12, TimeUnit.HOURS); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return ReturnT.SUCCESS; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |