|
|
@@ -112,6 +112,12 @@ public class CoreServiceImpl implements CoreService {
|
|
|
@Autowired
|
|
|
private VectorMatchVideoMapper vectorMatchVideoMapper;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private DemandProduceContentRelationMapper demandProduceContentRelationMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private DemandSearchQueueMapper demandSearchQueueMapper;
|
|
|
+
|
|
|
@ApolloJsonValue("${fwhGhIdList:[]}")
|
|
|
private List<String> fwhGhIdList;
|
|
|
|
|
|
@@ -862,13 +868,17 @@ public class CoreServiceImpl implements CoreService {
|
|
|
if (planAccount.getMiniprogramInsertFlag() == null || planAccount.getMiniprogramInsertFlag() != 1) {
|
|
|
return Collections.emptyList();
|
|
|
}
|
|
|
- //获取小程序
|
|
|
+ // 获取小程序
|
|
|
List<PublishMiniprogram> publishMiniprogramList = publicContentService.getPublishMiniprograms(publishContent);
|
|
|
- //不存在则重新生成
|
|
|
+ // 不存在则重新生成
|
|
|
if (CollectionUtils.isEmpty(publishMiniprogramList)) {
|
|
|
// 如果有experimentId,优先通过queryBySourceId接口获取匹配视频生成小程序卡片
|
|
|
if (StringUtils.isNotEmpty(publishContent.getExperimentId())) {
|
|
|
- publishMiniprogramList = getExperimentMatchMiniprograms(publishContent, planAccount);
|
|
|
+ if (publishContent.getContentPoolType().contains("accountDemandPoolLevel")) {
|
|
|
+ publishMiniprogramList = getDemandExperimentMatchMiniprograms(publishContent, planAccount);
|
|
|
+ } else {
|
|
|
+ publishMiniprogramList = getExperimentMatchMiniprograms(publishContent, planAccount);
|
|
|
+ }
|
|
|
// 开关打开时,同时执行匹配流程获取小程序信息,将标题和封面替换至召回视频
|
|
|
if (!CollectionUtils.isEmpty(publishMiniprogramList)
|
|
|
&& replaceRecallTitleCoverSwitch != null && replaceRecallTitleCoverSwitch) {
|
|
|
@@ -1094,6 +1104,84 @@ public class CoreServiceImpl implements CoreService {
|
|
|
return publishMiniprogramList;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 需求池匹配:通过 demand_produce_content_relation 查询实验ID,
|
|
|
+ * 再通过 demand_search_queue 查询匹配视频ID,生成小程序卡片
|
|
|
+ * 返回 null 表示无匹配结果,调用方应回退到原有流程
|
|
|
+ */
|
|
|
+ private List<PublishMiniprogram> getDemandExperimentMatchMiniprograms(PublishContent publishContent, PlanAccount planAccount) {
|
|
|
+ // Step 1: 通过账号ID和内容sourceId查询实验ID
|
|
|
+ List<String> experimentIds = demandProduceContentRelationMapper.selectExperimentIdsByAccountAndContent(
|
|
|
+ planAccount.getAccountId(), publishContent.getSourceId());
|
|
|
+ if (CollectionUtils.isEmpty(experimentIds)) {
|
|
|
+ log.info("getDemandExperimentMatchMiniprograms no experimentId found, accountId={}, sourceId={}",
|
|
|
+ planAccount.getAccountId(), publishContent.getSourceId());
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ log.info("getDemandExperimentMatchMiniprograms found {} experimentIds, accountId={}, sourceId={}",
|
|
|
+ experimentIds.size(), planAccount.getAccountId(), publishContent.getSourceId());
|
|
|
+
|
|
|
+ // Step 2: 通过账号和实验ID查询 demand_search_queue,获取匹配视频
|
|
|
+ List<DemandSearchQueue> queueRecords = demandSearchQueueMapper.selectByAccountAndExperiments(
|
|
|
+ planAccount.getAccountName(), experimentIds, miniVideoNum);
|
|
|
+ if (CollectionUtils.isEmpty(queueRecords)) {
|
|
|
+ log.info("getDemandExperimentMatchMiniprograms no match video found, account={}, experimentIds={}",
|
|
|
+ planAccount.getAccountName(), experimentIds);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ log.info("getDemandExperimentMatchMiniprograms found {} queue records, account={}, experimentIds={}",
|
|
|
+ queueRecords.size(), planAccount.getAccountName(), experimentIds);
|
|
|
+
|
|
|
+ List<VideoDetail> videoDetails = new ArrayList<>();
|
|
|
+ Map<Long, String> videoExperimentMap = new LinkedHashMap<>();
|
|
|
+ for (DemandSearchQueue record : queueRecords) {
|
|
|
+ if (record.getVideoId() == null || record.getVideoId() == 0) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ VideoDetail videoDetail = VideoUtils.getVideoDetail(record.getVideoId());
|
|
|
+ if (videoDetail == null) {
|
|
|
+ log.warn("getVideoDetail null for videoId={}", record.getVideoId());
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ videoDetail.setSource("piaoquan");
|
|
|
+ videoDetail.setVideoOss(videoDetail.getOssVideoPath());
|
|
|
+ videoDetail.setCoverOss(videoDetail.getShareImgPath());
|
|
|
+ videoDetails.add(videoDetail);
|
|
|
+ videoExperimentMap.put(record.getVideoId(), record.getExperimentId());
|
|
|
+ }
|
|
|
+
|
|
|
+ if (CollectionUtils.isEmpty(videoDetails)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 数量不足时用第一个视频补足,超出则截断(补足的视频复用第一个视频的experimentId)
|
|
|
+ if (videoDetails.size() < miniVideoNum) {
|
|
|
+ VideoDetail first = videoDetails.get(0);
|
|
|
+ int needAddCount = miniVideoNum - videoDetails.size();
|
|
|
+ for (int i = 0; i < needAddCount; i++) {
|
|
|
+ VideoDetail copy = new VideoDetail();
|
|
|
+ BeanUtils.copyProperties(first, copy);
|
|
|
+ videoDetails.add(copy);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (videoDetails.size() > miniVideoNum) {
|
|
|
+ videoDetails = videoDetails.subList(0, miniVideoNum);
|
|
|
+ }
|
|
|
+
|
|
|
+ List<PublishMiniprogram> publishMiniprogramList = cardService.generateCards(videoDetails, planAccount, publishContent);
|
|
|
+ if (!CollectionUtils.isEmpty(publishMiniprogramList)) {
|
|
|
+ // 为每张卡片的 productionPath 拼接对应视频的 growthExtData 参数
|
|
|
+ appendGrowthExtDataToCards(publishMiniprogramList, videoExperimentMap);
|
|
|
+ for (PublishMiniprogram publishMiniprogram : publishMiniprogramList) {
|
|
|
+ rootSourceService.addRootSource(publishMiniprogram, planAccount, publishContent);
|
|
|
+ publishMiniprogramMapper.insertSelective(publishMiniprogram);
|
|
|
+ }
|
|
|
+ log.info("getDemandExperimentMatchMiniprograms success, cards={}, accountId={}, sourceId={}",
|
|
|
+ publishMiniprogramList.size(), planAccount.getAccountId(), publishContent.getSourceId());
|
|
|
+ }
|
|
|
+ return publishMiniprogramList;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 为每张卡片的 productionPath 拼接对应视频的 growthExtData 参数
|
|
|
* 参照 TouLiuHttpClient.sendAdFlowAddRequest 的拼接方式
|