wangyunpeng 1 день назад
Родитель
Сommit
992002d8b0

+ 61 - 24
api-module/src/main/java/com/tzld/piaoquan/api/service/impl/VideoMultiServiceImpl.java

@@ -17,6 +17,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
+import java.net.URLDecoder;
 import java.net.URLEncoder;
 import java.util.List;
 import java.util.Objects;
@@ -36,29 +37,6 @@ public class VideoMultiServiceImpl implements VideoMultiService {
 
     @Override
     public String setVideoMultiTitleCoverPagePath(Long videoId, String pageUrl, String title, String coverUrl) {
-        // 解析已有的growthExtData,判断是否已包含对应字段
-        if (pageUrl.contains("growthExtData")) {
-            try {
-                String decoded = java.net.URLDecoder.decode(pageUrl, "UTF-8");
-                int idx = decoded.indexOf("growthExtData=");
-                if (idx >= 0) {
-                    String jsonStr = decoded.substring(idx + "growthExtData=".length());
-                    // 截取到下一个&或结尾,避免后续参数干扰JSON解析
-                    int ampIdx = jsonStr.indexOf("&");
-                    if (ampIdx >= 0) {
-                        jsonStr = jsonStr.substring(0, ampIdx);
-                    }
-                    JSONObject existingData = JSONObject.parseObject(jsonStr);
-                    if (existingData != null
-                            && existingData.containsKey("growthTitleId")
-                            && existingData.containsKey("growthCoverId")) {
-                        return pageUrl;
-                    }
-                }
-            } catch (Exception e) {
-                log.error("VideoMultiService parse existing growthExtData error", e);
-            }
-        }
         List<VideoGrowthMultiTitle> multiTitleList = getMultiTitleByVideoId(videoId);
         List<VideoGrowthMultiCover> multiCoverList = getMultiCoverByVideoId(videoId);
         PageUrlExtData extData = new PageUrlExtData();
@@ -143,7 +121,7 @@ public class VideoMultiServiceImpl implements VideoMultiService {
         }
         if (Objects.nonNull(extData.getGrowthTitleId()) || Objects.nonNull(extData.getGrowthCoverId())) {
             try {
-                pageUrl += URLEncoder.encode("&growthExtData=" + JSONObject.toJSONString(extData), "UTF-8");
+                pageUrl = mergeOrAppendGrowthExtData(pageUrl, extData);
             } catch (Exception e) {
                 log.error("VideoMultiService VideoMultiService Error,data:", e);
             }
@@ -151,6 +129,65 @@ public class VideoMultiServiceImpl implements VideoMultiService {
         return pageUrl;
     }
 
+    /**
+     * 将 extData 中的字段合并到 pageUrl 的 growthExtData 中:
+     * - pageUrl 不含 growthExtData:在末尾拼接 URL 编码后的 &growthExtData={...}
+     * - pageUrl 已含 growthExtData:解析出已有 JSON 对象,将新字段合并进去后再替换回原位置
+     */
+    private String mergeOrAppendGrowthExtData(String pageUrl, PageUrlExtData extData) throws Exception {
+        int valueStart = -1;
+        int valueEnd = -1;
+        int gIdx = pageUrl.indexOf("growthExtData");
+        if (gIdx >= 0) {
+            int afterKey = gIdx + "growthExtData".length();
+            if (pageUrl.length() > afterKey && pageUrl.charAt(afterKey) == '=') {
+                valueStart = afterKey + 1;
+            } else if (pageUrl.length() >= afterKey + 3
+                    && pageUrl.substring(afterKey, afterKey + 3).equalsIgnoreCase("%3D")) {
+                valueStart = afterKey + 3;
+            }
+            if (valueStart > 0) {
+                valueEnd = pageUrl.length();
+                int ampIdx = pageUrl.indexOf("&", valueStart);
+                if (ampIdx >= 0 && ampIdx < valueEnd) {
+                    valueEnd = ampIdx;
+                }
+                int encAmpIdx = pageUrl.indexOf("%26", valueStart);
+                if (encAmpIdx >= 0 && encAmpIdx < valueEnd) {
+                    valueEnd = encAmpIdx;
+                }
+            }
+        }
+
+        if (valueStart > 0) {
+            // 已存在 growthExtData:解析出对象,将新字段合并进去
+            String encodedJson = pageUrl.substring(valueStart, valueEnd);
+            JSONObject existing = null;
+            try {
+                String jsonStr = URLDecoder.decode(encodedJson, "UTF-8");
+                existing = JSONObject.parseObject(jsonStr);
+            } catch (Exception e) {
+                log.error("VideoMultiService parse existing growthExtData error", e);
+            }
+            if (existing == null) {
+                existing = new JSONObject();
+            }
+            if (Objects.nonNull(extData.getGrowthTitleId())) {
+                existing.put("growthTitleId", extData.getGrowthTitleId());
+                existing.put("growthTitleSource", extData.getGrowthTitleSource());
+            }
+            if (Objects.nonNull(extData.getGrowthCoverId())) {
+                existing.put("growthCoverId", extData.getGrowthCoverId());
+                existing.put("growthCoverSource", extData.getGrowthCoverSource());
+            }
+            String newEncodedJson = URLEncoder.encode(JSONObject.toJSONString(existing), "UTF-8");
+            return pageUrl.substring(0, valueStart) + newEncodedJson + pageUrl.substring(valueEnd);
+        }
+
+        // pageUrl 中不存在 growthExtData:直接在末尾拼接
+        return pageUrl + URLEncoder.encode("&growthExtData=" + JSONObject.toJSONString(extData), "UTF-8");
+    }
+
     @Override
     public Long saveMultiTitle(Long videoId, String source, String title) {
         VideoGrowthMultiTitle multiTitle = new VideoGrowthMultiTitle();

+ 7 - 0
api-module/src/main/java/com/tzld/piaoquan/api/service/strategy/impl/ThirdPartyPushMessageStrategyV1.java

@@ -360,6 +360,9 @@ public class ThirdPartyPushMessageStrategyV1 implements ReplyStrategyService {
                     String batchId = UUID.randomUUID().toString();
                     int totalSize = bucketDataParam.getMiniPageDatas().size();
                     Map<Long, VideoDetail> videoDetailMap = touLiuHttpClient.getVideoDetailRequest(bucketDataParam.getVideos());
+                    List<ContentPlatformGzhPlanVideo> gzhPlanVideoList = contentPlatformPlanService.getGzhPlanVideoListByCooperateAccountId(bucketDataParam.getGhId());
+                    Map<Long, ContentPlatformGzhPlanVideo> gzhPlanVideoMap = gzhPlanVideoList.stream()
+                            .collect(Collectors.toMap(ContentPlatformGzhPlanVideo::getVideoId, x -> x, (a, b) -> b));
                     for (int i = 0; i < bucketDataParam.getMiniPageDatas().size(); i++) {
                         int sort = i + 1;
                         Long videoId = bucketDataParam.getVideos().get(i);
@@ -385,6 +388,10 @@ public class ThirdPartyPushMessageStrategyV1 implements ReplyStrategyService {
                                         "?x-oss-process=image/resize,m_fill,w_600,h_480,limit_0/format,jpg/watermark,image_eXNoL3BpYy93YXRlcm1hcmtlci9pY29uX3BsYXlfd2hpdGUucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLHdfMTQ0,g_center");
                             }
                         }
+                        ContentPlatformGzhPlanVideo gzhPlanVideo = gzhPlanVideoMap.get(videoId);
+                        if (Objects.nonNull(gzhPlanVideo) && Objects.nonNull(videoDetail)) {
+                            videoTestIdMap.put(gzhPlanVideo.getVideoId(), gzhPlanVideo.getExperimentId());
+                        }
                         cgiReplyBucketData.setTitle(miniPageData.getTitle());
                         cgiReplyBucketData.setMiniPagePath(miniPageData.getPage());
                         cgiReplyBucketData.setMiniAppId(SMALL_APP_Id);