Commit d5168b1f authored by 宋新宇's avatar 宋新宇

Merge branch 'release_20240411' into 'main'

Release 20240411

See merge request !52
parents ccfedbac ba1f79fd
......@@ -78,7 +78,9 @@ public class UniversalProcess {
public long incrby(String key, int increment) {
return redisTemplate.opsForValue().increment(key,increment);
}
public void del(String key) {
redisTemplate.delete(key);
}
/******************************************** INNER CLASS ******************************************************/
......
......@@ -14,7 +14,7 @@ public class CheckerDyVideoFirstFlow extends NodeFlow<StoryNovelAction> {
@Override
public void process(StoryNovelAction action) {
if(up.exists(up.getFirstCheckerKey(action))){
if(up.exists(up.getFirstCheckerKey(action)) && !"lotto".equals(action.getVideoUpload().getSource())){
action.stop(true);
}
}
......
package com.lwby.marketing.att.dyvideo.handle;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.lwby.marketing.att.AttributionStatus;
import com.lwby.marketing.att.BehavoirType;
......@@ -63,23 +64,11 @@ public class DyvideoBehaviorFlow extends NodeSwitchFlow<StoryNovelAction> {
public void process(StoryNovelAction action) {
VideoUpload videoUpload = action.getVideoUpload();
long userId = action.getUserId();
int platformId = action.getPlatformId();
Long channelId = action.getChannelId();
long activeTime = videoUpload.getActiveTime();
long currentTime = System.currentTimeMillis();
DeliveryDeviceInfo deliveryDeviceInfo = action.getDeliveryDeviceInfo();
long hour = TimeUnit.MILLISECONDS.toHours(currentTime - activeTime);
if (hour > 6) {
DYVIDEO_SYS_LOG.info("DyvideoBehaviorFlow expeed six hour ,videoUpload={},userId={}",JSON.toJSONString(videoUpload),userId);
return;
}
int platformId = action.getPlatformId();
Long channelId = action.getChannelId();
AppChannelVO appChannel = up.getAppChannelByPlatformAndChannel(platformId,channelId);
//处理关键行为上报
String openId = action.getOpenId();
JSONObject dyMarketPlatformAppIdJson = JSON.parseObject(
"{\n"
+ " \"400\": \"ttf2f6844b6dc9702901_d4ac08a22f80f73256836fdd9655dbb0b6e6de7c\",\n"
......@@ -89,18 +78,61 @@ public class DyvideoBehaviorFlow extends NodeSwitchFlow<StoryNovelAction> {
//走平台
String dyMarketPlatformAppId = dyMarketPlatformAppIdJson.getString(platformKey);
List<String> dyMarketPlatformAppIdList = new ArrayList<>();
String tokenDy = "";
ThirdAccountDy thirdAccountDy = null;
if (dyMarketPlatformAppId != null) {
dyMarketPlatformAppIdList = Arrays.asList(dyMarketPlatformAppId.split("_"));
String tokenDy = "token_dy_" + dyMarketPlatformAppIdList.get(0);
ThirdAccountDy thirdAccountDy = null;
DYVIDEO_SYS_LOG.info("thirdAccountDy url={}",Objects.equals(env.getActiveProfiles()[0],"prod") ? tokenDyProdUrl : tokenDyDevUrl);
if (up.existsOld(tokenDy)) {
thirdAccountDy = up.getOld(ThirdAccountDy.class, tokenDy);
tokenDy = "token_dy_" + dyMarketPlatformAppIdList.get(0);
DYVIDEO_SYS_LOG.info("thirdAccountDy url={}",
Objects.equals(env.getActiveProfiles()[0], "prod") ? tokenDyProdUrl : tokenDyDevUrl);
if (up.exists(tokenDy)) {
thirdAccountDy = up.get(ThirdAccountDy.class, tokenDy);
} else {
thirdAccountDy = up.getDyAccessToken(dyMarketPlatformAppIdList.get(0), dyMarketPlatformAppIdList.get(1),
Objects.equals(env.getActiveProfiles()[0],"prod") ? tokenDyProdUrl : tokenDyDevUrl);
Objects.equals(env.getActiveProfiles()[0], "prod") ? tokenDyProdUrl : tokenDyDevUrl);
}
}
//这里通过source字段 给乐途上报广告信息
if (Objects.equals(action.getVideoUpload().getSource(),"lotto")) {
if (thirdAccountDy != null) {
LocalDateTime now = LocalDateTime.now(); // 获取当前日期时间
LocalTime two = LocalTime.of(2, 0, 0); // 获取当天6点的时间
Date date = new Date();
JSONArray jsonArray = new JSONArray();
if (now.toLocalTime().isBefore(two)) {
//当天2点之前,查两天,先查昨天的ecpm指标
Calendar calendar = Calendar.getInstance(); // 获取日历对象
calendar.setTime(date); // 设置时间
calendar.add(Calendar.DAY_OF_MONTH, -1); // 将时间减去一天
Date day = calendar.getTime();
jsonArray = up.getUploadAdsInfo(jsonArray,day,action, thirdAccountDy.getAccessToken(),tokenDy, dyMarketPlatformAppIdList,env);
}
jsonArray = up.getUploadAdsInfo(jsonArray,date,action, thirdAccountDy.getAccessToken(),tokenDy, dyMarketPlatformAppIdList,env);
if (jsonArray.size()>0) {
up.uploadCallbackAdsInfo(action,jsonArray.toJSONString());
}
}
return;
}
long hour = TimeUnit.MILLISECONDS.toHours(currentTime - activeTime);
if (hour > 6) {
DYVIDEO_SYS_LOG.info("DyvideoBehaviorFlow expeed six hour ,videoUpload={},userId={}",JSON.toJSONString(videoUpload),userId);
return;
}
AppChannelVO appChannel = up.getAppChannelByPlatformAndChannel(platformId,channelId);
//处理关键行为上报
String openId = action.getOpenId();
if (thirdAccountDy != null) {
//平均ecpm次数
Integer ecpmAvgCount = 0;
......@@ -168,7 +200,7 @@ public class DyvideoBehaviorFlow extends NodeSwitchFlow<StoryNovelAction> {
if (motivateCount < behavoirVal.intValue()) {
DYVIDEO_SYS_LOG.info("motivate not up to the standard,motivateCount={},motivateModelCount={},djChanel={},userId={}",motivateCount,behavoirVal,channelId,userId);
action.stop(true);
break;
return;
}
deliveryDeviceInfo.setMotivateCount(String.valueOf(motivateCount));
continue;
......@@ -177,7 +209,7 @@ public class DyvideoBehaviorFlow extends NodeSwitchFlow<StoryNovelAction> {
if (ecpmAvgCount < behavoirVal.intValue()) {
DYVIDEO_SYS_LOG.info("ecpm not up to the standard,ecpmAvgCount={},ecpmAvgModelCount={},djChanel={},userId={}",ecpmAvgCount,behavoirVal,channelId,userId);
action.stop(true);
break;
return;
}
deliveryDeviceInfo.setEcpmAvgCount(String.valueOf(ecpmAvgCount));
continue;
......@@ -186,7 +218,7 @@ public class DyvideoBehaviorFlow extends NodeSwitchFlow<StoryNovelAction> {
if (pecpmCount < BehavoirType.MOTIVATEMODELCOUNT.getBehavoirType(appChannel).intValue()) {
DYVIDEO_SYS_LOG.info("pecpmCount not up to the standard,pecpmModelCount={},pecpmCount={},motivateModelCount={},motivateCount={},djChanel={},userId={}",behavoirVal,pecpmCount,BehavoirType.MOTIVATEMODELCOUNT.getBehavoirType(appChannel),motivateCount,channelId,userId);
action.stop(true);
break;
return;
}
deliveryDeviceInfo.setPecpmCount(String.valueOf(behavoirVal));
......@@ -203,7 +235,7 @@ public class DyvideoBehaviorFlow extends NodeSwitchFlow<StoryNovelAction> {
//等于空 或 100直接回传
if (sprDedu == null || sprDedu == 100) {
action.getMedia().notify(action);
up.notifyResult(action, type.getTopic()+"_test",type.getStatus());
up.notifyResult(action, type.getTopic(),type.getStatus());
up.set(up.getFirstCheckerKey(action),up.getExpire(action),"1");
return;
}
......@@ -222,13 +254,13 @@ public class DyvideoBehaviorFlow extends NodeSwitchFlow<StoryNovelAction> {
//回传,回传个数 + 1
up.incrby(channelCallback, 1);
action.getMedia().notify(action);
up.notifyResult(action, type.getTopic()+"_test",type.getStatus());
up.notifyResult(action, type.getTopic(),type.getStatus());
up.set(up.getFirstCheckerKey(action),up.getExpire(action),"1");
DYVIDEO_SYS_LOG.info(
"ChannelAttributionFlow.process0.deduction doing dynamic, platformId = {}, channel = {}, planId={}, sprDedu = {}, channelTotalCount = {}, channelCallbackCount = {}, v = {}",
action.getPlatformId(), action.getChannelId(),action.getPlanId(), sprDedu, channelTotalCount, channelCallbackCount, 1);
} else {
up.notifyResult(action,"ocpc_behavior_test", AttributionStatus.NORMAL_DEDUCTION_CALLBACK);
up.notifyResult(action,type.getTopic(), AttributionStatus.NORMAL_DEDUCTION_CALLBACK);
up.set(up.getFirstCheckerKey(action), up.getExpire(action), "1");
DYVIDEO_SYS_LOG.info(
"ChannelAttributionFlow.process0.deduction doing dynamic, platformId = {}, channel = {}, planId={}, sprDedu = {}, channelTotalCount = {}, channelCallbackCount = {}, v = {}",
......@@ -236,7 +268,6 @@ public class DyvideoBehaviorFlow extends NodeSwitchFlow<StoryNovelAction> {
}
}
}
}
......
......@@ -20,7 +20,7 @@ public class StoreDyVideoAttributionFlow extends NodeFlow<StoryNovelAction> {
//商店归因通知
if(Objects.isNull(action.getDeliveryDeviceInfo())){
if (action.getType().equals(CallBackType.active.getType())) {
up.notifyResult(action,"ocpc_result_test", AttributionStatus.STORE_CALLBACK);
up.notifyResult(action,"ocpc_result", AttributionStatus.STORE_CALLBACK);
}
action.stop(true); //结束后面所有执行流程
}
......
package com.lwby.marketing.att.dyvideo.handle;
import com.alibaba.fastjson.JSON;
import com.lwby.marketing.att.CallBackType;
import com.lwby.marketing.att.dyvideo.DyVideoUniversalProcess;
import com.lwby.marketing.flow.NodeFlow;
......@@ -7,6 +8,7 @@ import com.lwby.marketing.vo.StoryNovelAction;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Objects;
/**
* @author songxinyu
......@@ -24,8 +26,14 @@ public class UploadDyVideoCallFlow extends NodeFlow<StoryNovelAction> {
boolean success = action.getMedia().notify(action);
if (success) {
//根据source判断是否给指定外包上报
if (Objects.equals(action.getVideoUpload().getSource(),"lotto")) {
up.uploadCallbackUserInfo(action);
action.getDeliveryDeviceInfo().setSrc(action.getVideoUpload().getSource());
}
action.getVideoUpload().setActiveTime(System.currentTimeMillis());
up.notifyResult(action, type.getTopic()+"_test",type.getStatus());
up.set(String.format("video:upload:%s", action.getOpenId()),60 * 60 * 24 * 7, JSON.toJSONString(action.getVideoUpload()));
up.notifyResult(action, type.getTopic(),type.getStatus());
up.set(up.getFirstCheckerKey(action),up.getExpire(action),"1");
}
}
......
......@@ -50,7 +50,7 @@ public class ParameterSetupVideoAppFlow extends NodeFlow<NovelAction> {
//匹配设备ID
for(DeviceVideoType type: DeviceVideoType.values()){
deviceIdKey = type.getDeviceId(clientInfo);
if(null != deviceIdKey && null != (deliveryDeviceInfo = up.getOldMarket(DeliveryDeviceInfo.class,assembleKey(deviceIdKey,platformId)))){
if(null != deviceIdKey && null != (deliveryDeviceInfo = up.get(DeliveryDeviceInfo.class,assembleKey(deviceIdKey,platformId)))){
clientInfo.setOaid(deliveryDeviceInfo.getOaid()); //回补OAID
action.setDeliveryDeviceInfo(deliveryDeviceInfo);
action.setDeviceVideoType(type);
......
......@@ -25,19 +25,19 @@ import java.util.Map;
@EnableKafka
public class DyVideoActiveKafkaConsumerConfig {
@Value("${spring.kafka2.bootstrap-servers}")
@Value("${spring.kafka.bootstrap-servers}")
private String servers;
@Value("${spring.kafka2.consumer.enable-auto-commit}")
@Value("${spring.kafka.consumer.enable-auto-commit}")
private boolean enableAutoCommit;
@Value("${spring.kafka2.consumer.auto-offset-reset}")
@Value("${spring.kafka.consumer.auto-offset-reset}")
private String autoOffsetReset;
@Value("${system.consumer.dyvideo.active.group_id}")
private String groupId;
@Value("${spring.kafka2.consumer.max-poll-records}")
@Value("${spring.kafka.consumer.max-poll-records}")
private int maxPollRecordsConfig;
......
......@@ -24,19 +24,19 @@ import java.util.Map;
@EnableKafka
public class DyVideoBehavoirKafkaConsumerConfig {
@Value("${spring.kafka2.bootstrap-servers}")
@Value("${spring.kafka.bootstrap-servers}")
private String servers;
@Value("${spring.kafka2.consumer.enable-auto-commit}")
@Value("${spring.kafka.consumer.enable-auto-commit}")
private boolean enableAutoCommit;
@Value("${spring.kafka2.consumer.auto-offset-reset}")
@Value("${spring.kafka.consumer.auto-offset-reset}")
private String autoOffsetReset;
@Value("${system.consumer.dyvideo.behavoir.group_id}")
private String groupId;
@Value("${spring.kafka2.consumer.max-poll-records}")
@Value("${spring.kafka.consumer.max-poll-records}")
private int maxPollRecordsConfig;
......
......@@ -25,19 +25,19 @@ import java.util.Map;
@EnableKafka
public class KafkaConsumerConfig {
@Value("${spring.kafka2.bootstrap-servers}")
@Value("${spring.kafka.bootstrap-servers}")
private String servers;
@Value("${spring.kafka2.consumer.enable-auto-commit}")
@Value("${spring.kafka.consumer.enable-auto-commit}")
private boolean enableAutoCommit;
@Value("${spring.kafka2.consumer.auto-offset-reset}")
@Value("${spring.kafka.consumer.auto-offset-reset}")
private String autoOffsetReset;
@Value("${system.consumer.novel.active.group_id}")
private String groupId;
@Value("${spring.kafka2.consumer.max-poll-records}")
@Value("${spring.kafka.consumer.max-poll-records}")
private int maxPollRecordsConfig;
......
......@@ -25,19 +25,19 @@ import java.util.Map;
@EnableKafka
public class KafkaStoreConsumerConfig {
@Value("${spring.kafka2.bootstrap-servers}")
@Value("${spring.kafka.bootstrap-servers}")
private String servers;
@Value("${spring.kafka2.consumer.enable-auto-commit}")
@Value("${spring.kafka.consumer.enable-auto-commit}")
private boolean enableAutoCommit;
@Value("${spring.kafka2.consumer.auto-offset-reset}")
@Value("${spring.kafka.consumer.auto-offset-reset}")
private String autoOffsetReset;
@Value("${system.consumer.novel.storeActive.group_id}")
private String groupId;
@Value("${spring.kafka2.consumer.max-poll-records}")
@Value("${spring.kafka.consumer.max-poll-records}")
private int maxPollRecordsConfig;
......
......@@ -24,19 +24,19 @@ import java.util.Map;
@EnableKafka
public class VideoAppActiveKafkaConsumerConfig {
@Value("${spring.kafka2.bootstrap-servers}")
@Value("${spring.kafka.bootstrap-servers}")
private String servers;
@Value("${spring.kafka2.consumer.enable-auto-commit}")
@Value("${spring.kafka.consumer.enable-auto-commit}")
private boolean enableAutoCommit;
@Value("${spring.kafka2.consumer.auto-offset-reset}")
@Value("${spring.kafka.consumer.auto-offset-reset}")
private String autoOffsetReset;
@Value("${system.consumer.videoapp.active.group_id}")
private String groupId;
@Value("${spring.kafka2.consumer.max-poll-records}")
@Value("${spring.kafka.consumer.max-poll-records}")
private int maxPollRecordsConfig;
......
......@@ -25,19 +25,19 @@ import java.util.Map;
@EnableKafka
public class VideoAppBehavoirKafkaConsumerConfig {
@Value("${spring.kafka2.bootstrap-servers}")
@Value("${spring.kafka.bootstrap-servers}")
private String servers;
@Value("${spring.kafka2.consumer.enable-auto-commit}")
@Value("${spring.kafka.consumer.enable-auto-commit}")
private boolean enableAutoCommit;
@Value("${spring.kafka2.consumer.auto-offset-reset}")
@Value("${spring.kafka.consumer.auto-offset-reset}")
private String autoOffsetReset;
@Value("${system.consumer.videoapp.behavoir.group_id}")
private String groupId;
@Value("${spring.kafka2.consumer.max-poll-records}")
@Value("${spring.kafka.consumer.max-poll-records}")
private int maxPollRecordsConfig;
......
package com.lwby.marketing.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.lwby.marketing.att.dyvideo.DyVideoUniversalProcess;
import com.lwby.marketing.notify.media.jrtt.dto.JrttAttributeRequest;
import com.lwby.marketing.po.DyVideoUpload;
import com.lwby.marketing.po.VideoUpload;
import com.lwby.marketing.util.HttpUtil;
import com.lwby.marketing.util.ResultConstant;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
* @author songxinyu
* @version DyVideoController.java, v 0.1 2024年04月10日 11:27 songxinyu Exp $
*/
@RestController
@Slf4j
@RequestMapping(value = "/market_attr")
public class DyVideoController {
public static final String ATTRIBUTE_URL = "https://analytics.oceanengine.com/api/v2/conversion";
private static final Logger DYVIDEO_SYS_LOG = LoggerFactory.getLogger("dyvideo.sys");
private static final Logger DYVIDEO_ERROR_LOG = LoggerFactory.getLogger("dyvideo.error");
@Resource
DyVideoUniversalProcess up;
@RequestMapping("uploadBehavoir")
public String uploadBehavoirByDyVideo(@RequestParam("openId") String openId) {
Map map = new HashMap();
String result = "";
VideoUpload videoUpload = up.get(VideoUpload.class,assembleKey(openId));
if (Objects.nonNull(videoUpload)) {
Integer platformId = videoUpload.getPlatformId();
String uploadKey = String.format("dv_%s_%d_%s", openId, platformId,videoUpload.getMedia());
if (up.exists(uploadKey)) {
map.put("code", ResultConstant.CALL_BACK_UPED_FAIL);
map.put("message",ResultConstant.CALL_BACK_UPED_MESSAGE);
result = JSONObject.toJSONString(map);
DYVIDEO_SYS_LOG.error("DyVideoController uploadBehavoir uped,uploadKey={}",uploadKey);
return result;
}
JrttAttributeRequest.Ad ad = new JrttAttributeRequest.Ad();
ad.setCallback(videoUpload.getClickId());
JrttAttributeRequest.Context context = new JrttAttributeRequest.Context();
context.setAd(ad);
JrttAttributeRequest request = JrttAttributeRequest.builder().context(context).event_type("game_addiction").timestamp(
System.currentTimeMillis()).build();
String userJson = JSONObject.toJSONString(request);
try {
String ret = HttpUtil.post(ATTRIBUTE_URL, userJson);
Integer resultCode = (Integer) JSON.parseObject(ret).get("code");
if (resultCode == 0) {
map.put("code", ResultConstant.CALL_BACK_SUCCESS);
map.put("message",ResultConstant.CALL_BACK_SUCCESS_MESSAGE);
result = JSONObject.toJSONString(map) ;
//给bi发消息
up.notifyResult(openId,videoUpload);
up.set(uploadKey,60 * 60 * 24 * 7,"1");
} else {
map.put("code", ResultConstant.CALL_BACK_FAIL);
map.put("message",ResultConstant.CALL_BACK_FAIL_MESSAGE);
result = JSONObject.toJSONString(map) ;
DYVIDEO_SYS_LOG.error("DyVideoController uploadBehavoir send back fail,uploadKey={},code={}",uploadKey,resultCode);
}
} catch (Exception e) {
map.put("code", ResultConstant.CALL_BACK_FAIL);
map.put("message",ResultConstant.CALL_BACK_FAIL_MESSAGE);
result = JSONObject.toJSONString(map) ;
DYVIDEO_ERROR_LOG.error("DyVideoController uploadBehavoir exception,uploadKey={}",uploadKey,e);
return result;
}
} else {
map.put("code", ResultConstant.CALL_BACK_NOCACHE_FAIL);
map.put("message",ResultConstant.CALL_BACK_NOCACHE_MESSAGE);
result = JSONObject.toJSONString(map) ;
DYVIDEO_SYS_LOG.error("DyVideoController uploadBehavoir no cache,videoUpload={}",JSONObject.toJSONString(videoUpload));
}
return result;
}
public String assembleKey(String openId) {
return String.format("video:upload:%s", openId);
}
}
package com.lwby.marketing.controller;
import cn.hutool.crypto.SecureUtil;
import org.apache.commons.lang3.StringUtils;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
public class ServiceHelper {
public String emptyIsNull(String params){
return StringUtils.defaultIfEmpty(params,null);
}
public String encode(String params){
try {
return URLEncoder.encode(params,"utf-8");
} catch (UnsupportedEncodingException e) {
return null;
}
}
public Integer parseInt(String params){
try {
return Integer.valueOf(params);
}catch (Exception e){
return null;
}
}
public String getModelByUa(String ua) {
String uasplit = ua.split("Build")[0];
String model = null;
try {
if (ua.startsWith("com.")) {
String[] split = uasplit.split(";");
model = split[4].trim();
} else {
if (uasplit.split(";").length >= 3 && StringUtils.isNotEmpty(uasplit.split(";")[2].trim())) {
model = uasplit.substring(uasplit.lastIndexOf(";") + 2, uasplit.length() - 1);
model = URLEncoder.encode(model, "utf-8");
}
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return model;
}
}
package com.lwby.marketing.factory;
import com.google.common.collect.ArrayListMultimap;
import com.lwby.marketing.notify.Media;
import com.lwby.marketing.service.MediaClick;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.List;
import java.util.Map;
@Service
@Slf4j
public class MediaClickFactory {
@Autowired
ApplicationContext applicationContext;
ArrayListMultimap<Media, MediaClick> multimap = ArrayListMultimap.create();
/**
* @return
*/
/**
*
* @return
*/
public MediaClick getMediaClickFacade(Media mediaEnum) {
List<MediaClick> mediaClickFacade = multimap.get(mediaEnum);
return mediaClickFacade.get(0);
}
/**
*
*/
@PostConstruct
public void init() {
Map<String, MediaClick> type = applicationContext.getBeansOfType(MediaClick.class);
for (Map.Entry<String, MediaClick> item : type.entrySet()) {
multimap.put(item.getValue().getMedia(), item.getValue());
}
}
}
......@@ -21,7 +21,7 @@ public enum Media {
DY_VIDEO_JRTT("jrtt", Platform.DY_VIDEO, "今日头条",new DyVideoJRTTNotify()),
VIDEOAPP_JRTT("jrtt_freevideo", Platform.VIDEO, "今日头条",new VideoAppJRTTNotify());
final String name;
public final String name;
final Platform platform;
final String desc;
final BaseNotiry baseNotify;
......
......@@ -46,12 +46,10 @@ public class DyVideoJRTTNotify extends DYNotify {
String userJson = JSONObject.toJSONString(request);
try {
//TODO;测试不执行
//String result = HttpUtil.post(ATTRIBUTE_URL, userJson);
//Integer resultCode = (Integer) JSON.parseObject(result).get("code");
//return resultCode == 0;
DYVIDEO_SYS_LOG.info("DyVideoJRTTNotify.video.{}.upload,userId={},channel={},platform={}",eventType,na.getUserId(),na.getChannelId(),na.getPlatformId());
return true;
String result = HttpUtil.post(ATTRIBUTE_URL, userJson);
Integer resultCode = (Integer) JSON.parseObject(result).get("code");
DYVIDEO_SYS_LOG.info("DyVideoJRTTNotify.video.{}.upload,userId={},channel={},platform={},code={}",eventType,na.getUserId(),na.getChannelId(),na.getPlatformId(),resultCode);
return resultCode == 0;
} catch (Exception e) {
return false;
}
......
package com.lwby.marketing.po;
import lombok.Data;
/**
* @author songxinyu
* @version DyVideoUpload.java, v 0.1 2024年04月10日 17:06 songxinyu Exp $
*/
@Data
public class DyVideoUpload {
String openId;
Integer platformId;
}
......@@ -25,4 +25,9 @@ public class VideoUpload {
private String perecpmSize;
private long activeTime;
private long clickTime;
private Integer platformId;
private Long userId;
//来源
private String source;
}
package com.lwby.marketing.service;
import com.lwby.marketing.notify.Media;
import java.util.Map;
/**
* @author songxinyu
* @version MediaClick.java, v 0.1 2024年04月10日 14:11 songxinyu Exp $
*/
public interface MediaClick {
String click(String s, Map<String, String> params);
Media getMedia();
}
package com.lwby.marketing.util;
import org.apache.commons.lang3.StringUtils;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
......@@ -13,6 +17,17 @@ public class CacheKeyUtils {
static SimpleDateFormat df = new SimpleDateFormat("MMdd");//设置日期格式
private static final String CACHE_BOOK_PREFIX = "getBookId";
private static final String CACHE_PART_PREFIX = "getPartId";
private static final String CHANNEL_PREFIX_KEY = "getChannelBy";
private static final String CACHE_VRID_PRE = "vr:";
private static final String CACHE_VID_PRE = "vi:";
public static String getBehavoirKey(Long userId) {
return CACHE_BEHAVIOR_PREFIX + userId + "_" + df.format(new Date()) + "_fv";
}
......@@ -20,4 +35,51 @@ public class CacheKeyUtils {
public static String getVideoBehavoirKey(Long userId) {
return CACHE_BEHAVIOR_PREFIX + userId + "_fv";
}
public static String getClickKeyByIdfaAndPlatformId(String idfa, String platformId) {
return "getClickByIdfaAndPlatformId" + "_" + idfa + "_" + platformId;
}
public static String getClickKey(String idfa, String platformId) {
return "mck" + ":" + idfa + ":" + platformId;
}
public static String getDeliveryBookIdCacheKey(String deviceKey, String platformId) {
return CACHE_BOOK_PREFIX + "_" + deviceKey + "_" + platformId;
}
public static String getDeliveryPartIdCacheKey(String deviceKey, String platformId) {
return CACHE_PART_PREFIX + "_" + deviceKey + "_" + platformId;
}
public static String getChannelByDeviceIdKeyAndPlatformId(String deviceIdKey, String platformId) {
return CHANNEL_PREFIX_KEY + deviceIdKey + platformId;
}
public static String getModelByUa(String ua) {
String uasplit = ua.split("Build")[0];
String model = null;
try {
if (ua.startsWith("com.")) {
String[] split = uasplit.split(";");
model = split[4].trim();
} else {
if (uasplit.split(";").length >= 3 && StringUtils.isNotEmpty(uasplit.split(";")[2].trim())) {
model = uasplit.substring(uasplit.lastIndexOf(";") + 2, uasplit.length() - 1);
model = URLEncoder.encode(model, "utf-8");
}
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return model;
}
public static String getDeliveryVRIdCacheKey(String deviceKey, String platformId) {
return CACHE_VRID_PRE + deviceKey + ":" + platformId;
}
public static String getDeliveryVIIdCacheKey(String deviceKey, String platformId) {
return CACHE_VID_PRE + deviceKey + ":" + platformId;
}
}
......@@ -28,6 +28,14 @@ public class DateTimUtils {
return DATE_BOTTOM_FORMAT.format(new Date());
}
public static String getCurrentTimeString(){
return DATE_TIME_FORMAT.format(new Date());
}
public static String getCurrentTimeString(Date date){
return DATE_TIME_FORMAT.format(date);
}
/**
* 时间是否大于7天
*
......
package com.lwby.marketing.util;
public class ResultConstant {
public final static Integer CALL_BACK_SUCCESS = 0;
public final static Integer CALL_BACK_FAIL = 1;
public final static Integer CALL_BACK_UPED_FAIL = 2;
public final static Integer CALL_BACK_NOCACHE_FAIL = 3;
public final static String CALL_BACK_SUCCESS_MESSAGE = "上报成功";
public final static String CALL_BACK_FAIL_MESSAGE = "上报失败";
public final static String CALL_BACK_UPED_MESSAGE = "已上报一次";
public final static String CALL_BACK_NOCACHE_MESSAGE = "无点击缓存,用户超过7天";
}
package com.lwby.marketing.util;
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;
public enum Stats {
HTTP_MG_JRTT("HTTP接口jrtt", "http_mg_jrtt"),
HTTP_MG_WECHAT("HTTP接口jrtt", "http_mg_wechat"),
HTTP_MG_KUAISHOU("HTTP接口jrtt", "http_mg_kuaishou"),
HTTP_MG_YOUDAO("HTTP接口jrtt", "http_mg_kuaishou"),
HTTP_MG_XIAOMI("HTTP接口jrtt", "http_mg_xiaomi");
private String name;
private Counter counter;
private String indicator;
Stats(String name, String indicator) {
this.name = name;
this.indicator = indicator;
}
public void add() {
counter.increment();
}
public void add(long count) {
counter.increment(count);
}
public String getName() {
return this.name;
}
public long getCount() {
return (long) counter.count();
}
public void bind(MeterRegistry registry) {
this.counter = registry.counter(indicator);
}
}
\ No newline at end of file
......@@ -125,4 +125,6 @@ public class DeliveryDeviceInfo {
private String openId;
private String src;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment