فهرست منبع

小程序投流 计划列表 Excel 导出补字段: 视频id + rootSourceId(列序紧跟人群包之后,便于按ID检索)。仅导出 VO 加列,XcxPlanItemVO 不动 → /xcx/list 接口透出不变。generateXcxPlanExcelFile 改为直接消费 ContentPlatformXcxPlan PO,内部一次性 join plan_video 拼装 ExportVO(避开 buildXcxPlanItemVOList 这条 list 共用链路)。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
刘立冬 11 ساعت پیش
والد
کامیت
2d7c6de3e5

+ 6 - 0
api-module/src/main/java/com/tzld/piaoquan/api/model/vo/contentplatform/XcxPlanItemExportVO.java

@@ -19,6 +19,12 @@ public class XcxPlanItemExportVO {
     @ExcelProperty("人群包")
     private String audiencePackage;
 
+    @ExcelProperty("视频id")
+    private Long videoId;
+
+    @ExcelProperty("rootSourceId")
+    private String rootSourceId;
+
     @ExcelProperty("视频标题")
     private String title;
 

+ 23 - 12
api-module/src/main/java/com/tzld/piaoquan/api/service/contentplatform/impl/ContentPlatformPlanServiceImpl.java

@@ -2086,22 +2086,33 @@ public class ContentPlatformPlanServiceImpl implements ContentPlatformPlanServic
         ContentPlatformAccount loginAccount = LoginUserContext.getUser();
         List<ContentPlatformXcxPlan> planList = planMapperExt.getXcxPlanList(param,
                 loginAccount.getId(), 0, param.getPageSize());
-        List<XcxPlanItemVO> list = buildXcxPlanItemVOList(planList);
-        return generateXcxPlanExcelFile(list);
+        return generateXcxPlanExcelFile(planList);
     }
 
-    private String generateXcxPlanExcelFile(List<XcxPlanItemVO> dataList) {
+    private String generateXcxPlanExcelFile(List<ContentPlatformXcxPlan> planList) {
         List<XcxPlanItemExportVO> list = new ArrayList<>();
-        if (CollectionUtils.isNotEmpty(dataList)) {
-            for (XcxPlanItemVO data : dataList) {
+        if (CollectionUtils.isNotEmpty(planList)) {
+            List<Long> planIds = planList.stream().map(ContentPlatformXcxPlan::getId).collect(Collectors.toList());
+            ContentPlatformXcxPlanVideoExample videoExample = new ContentPlatformXcxPlanVideoExample();
+            videoExample.createCriteria().andPlanIdIn(planIds);
+            List<ContentPlatformXcxPlanVideo> videoList = xcxPlanVideoMapper.selectByExample(videoExample);
+            Map<Long, ContentPlatformXcxPlanVideo> videoMap = videoList.stream()
+                    .collect(Collectors.toMap(ContentPlatformXcxPlanVideo::getPlanId, Function.identity()));
+            for (ContentPlatformXcxPlan plan : planList) {
                 XcxPlanItemExportVO vo = new XcxPlanItemExportVO();
-                vo.setAudiencePackage(data.getAudiencePackage());
-                vo.setTitle(data.getTitle());
-                vo.setCover(data.getShareCover() != null ? data.getShareCover() : data.getCover());
-                vo.setPageUrl(data.getPageUrl());
-                vo.setRemark(data.getRemark());
-                if (Objects.nonNull(data.getCreateTimestamp())) {
-                    vo.setCreateTime(DateUtil.getDateString(data.getCreateTimestamp(), "yyyy-MM-dd HH:mm:ss"));
+                vo.setAudiencePackage(plan.getAudiencePackage());
+                vo.setRootSourceId(plan.getRootSourceId());
+                vo.setPageUrl(plan.getPageUrl());
+                vo.setRemark(plan.getRemark());
+                if (Objects.nonNull(plan.getCreateTimestamp())) {
+                    vo.setCreateTime(DateUtil.getDateString(plan.getCreateTimestamp(), "yyyy-MM-dd HH:mm:ss"));
+                }
+                ContentPlatformXcxPlanVideo videoItem = videoMap.get(plan.getId());
+                if (Objects.nonNull(videoItem)) {
+                    vo.setVideoId(videoItem.getVideoId());
+                    vo.setTitle(videoItem.getTitle());
+                    String shareCover = getShareCover(null, videoItem.getCover());
+                    vo.setCover(StringUtils.hasText(shareCover) ? shareCover : videoItem.getCover());
                 }
                 list.add(vo);
             }