package com.yeshi.buwan.controller.parser; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.annotations.Expose; import com.google.gson.reflect.TypeToken; import com.yeshi.buwan.domain.recommend.FloatAD; import com.yeshi.buwan.domain.system.DetailSystem; import com.yeshi.buwan.dto.config.ADShieldIPConfig; import com.yeshi.buwan.dto.log.BaseLog; import com.yeshi.buwan.log.LogHelper; import com.yeshi.buwan.service.imp.DetailSystemConfigService; import com.yeshi.buwan.service.imp.SystemService; import com.yeshi.buwan.service.inter.ad.FloatADService; import com.yeshi.buwan.service.inter.system.SystemConfigService; import com.yeshi.buwan.service.inter.user.UserDPContentWatchStatisticService; import com.yeshi.buwan.service.manager.APPManager; import com.yeshi.buwan.service.manager.IPManager; import com.yeshi.buwan.util.IPUtil; import com.yeshi.buwan.util.JsonUtil; import com.yeshi.buwan.util.StringUtil; import com.yeshi.buwan.util.log.LoggerUtil; import com.yeshi.buwan.util.log.UserActiveLogFactory; import com.yeshi.buwan.vo.AcceptData; import net.sf.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.io.PrintWriter; import java.lang.reflect.Type; import java.math.BigDecimal; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; @Controller public class ConfigParser { Logger logger = LoggerFactory.getLogger(ConfigParser.class); @Resource private DetailSystemConfigService configService; @Resource private SystemService systemService; @Resource private FloatADService floatADService; @Resource private IPManager ipManager; @Resource private SystemConfigService systemConfigService; @Resource private UserDPContentWatchStatisticService userDPContentWatchStatisticService; @Resource private APPManager appManager; public ADConfig getAdShowType(String key, String channel, int version, Map map) { String splash = map.get(key); JSONObject jsonObject = JSONObject.fromObject(splash); if (jsonObject == null || jsonObject.isEmpty()) return null; ADConfig adConfig = null; channel = channel.toLowerCase(); if (jsonObject == null || jsonObject.optJSONObject(channel) == null) { // 默认为应用宝 channel = "qq"; } JSONObject channelAd = jsonObject.optJSONObject(channel); adConfig = new Gson().fromJson(channelAd.toString(), ADConfig.class); if (version >= adConfig.getVersion()) { adConfig = null; } //格式如下: //{"typeProperties":{"csj":{"weight":1,"pid":"123123"},"gdt":{"weight":1,"pid":"123123"}}} if (adConfig != null && channelAd.optJSONObject("typeProbability") != null) { JSONObject properties = channelAd.optJSONObject("typeProbability"); BigDecimal total = new BigDecimal(0); for (Iterator its = properties.keys(); its.hasNext(); ) { String k = its.next(); total = total.add(new BigDecimal(properties.optJSONObject(k).optString("weight"))); } BigDecimal random = total.multiply(new BigDecimal(Math.random())); total = new BigDecimal(0); for (Iterator its = properties.keys(); its.hasNext(); ) { String k = its.next(); total = total.add(new BigDecimal(properties.optJSONObject(k).optString("weight"))); if (random.compareTo(total) < 0) { adConfig.setPid(properties.optJSONObject(k).optString("pid")); adConfig.setType(k); break; } } } return adConfig; } /** * 屏蔽所有的广告 * * @param channel * @param version * @param shieldInfo * @param ip * @return */ private boolean shieldAllAd(String channel, Integer version, String shieldInfo, String ip) { if (StringUtil.isNullOrEmpty(shieldInfo)) { return false; } Type type = new TypeToken>() { }.getType(); List list = new Gson().fromJson(shieldInfo, type); Map map = new HashMap<>(); for (ADShieldIPConfig config : list) { map.put(config.getChannel().toLowerCase(), config.getRule()); } if (map.get(channel.toLowerCase()) != null) { ADShieldIPConfig.IPShieldRule rule = map.get(channel.toLowerCase()); if (version >= rule.getVersion()) { //请求 IPUtil.IPInfo ipInfo = null; try { ipInfo = ipManager.getIPInfo(ip); } catch (Exception e) { e.printStackTrace(); } if (ipInfo != null) { //先判断省 if (!StringUtil.isNullOrEmpty(rule.getProvince())) { if (ipInfo.getProvince() != null && ipInfo.getProvince().contains(rule.getProvince())) { if (!StringUtil.isNullOrEmpty(rule.getCity())) {//同时判断省和市 if (ipInfo.getCity() != null && ipInfo.getCity().contains(rule.getCity())) { return true; } } else { //只判断省 return true; } } } else if (!StringUtil.isNullOrEmpty(rule.getCity())) { //只判断市 if (ipInfo.getCity() != null && ipInfo.getCity().contains(rule.getCity())) { return true; } } } } } return false; } public void getConfig(AcceptData acceptData, HttpServletRequest request, PrintWriter out) { LoggerUtil.getUserActiveLogger().info(UserActiveLogFactory.createAppSplash(new BaseLog(acceptData, ""))); DetailSystem detailSystem = systemService.getDetailSystemByPackage(acceptData.getPackageName()); Map map = configService.getConfigAsMap(acceptData.getChildDetailSystem(), acceptData.getVersion()); JSONObject data = new JSONObject(); JSONObject ad = new JSONObject(); JSONObject adNew = new JSONObject(); String ip = IPUtil.getRemotIP(request); //会员链接 String vipLink = map.get("vip_link"); data.put("vipLink", vipLink); ADConfig splashConfig = getAdShowType("ad_splash_config", acceptData.getChannel(), acceptData.getVersion(), map); //开屏的地区屏蔽规则 String shieldInfo = map.get("shield_province"); boolean hiddenSplash = false; if (!StringUtil.isNullOrEmpty(shieldInfo)) { JSONObject json = JSONObject.fromObject(shieldInfo); //获取渠道需要屏蔽的城市 String province = json.optString(acceptData.getChannel().toLowerCase()); if (splashConfig != null && !StringUtil.isNullOrEmpty(province)) { IPUtil.IPInfo ipInfo = null; try { ipInfo = ipManager.getIPInfo(ip); } catch (Exception e) { e.printStackTrace(); } if (ipInfo != null && ipInfo.getProvince().contains(province)) {//屏蔽IP hiddenSplash = true; LogHelper.print("城市屏蔽:" + province); } } } //是否为内容阅读用户 boolean isDPUser = false; try { isDPUser = userDPContentWatchStatisticService.isDPUser(acceptData); } catch (Exception e) { } //广告全部屏蔽区域 String shieldAdLocationInfo = map.get("shield_ad_ip_location"); boolean hiddenAll = shieldAllAd(acceptData.getChannel(), acceptData.getVersion(), shieldAdLocationInfo, ip); if (hiddenSplash) splashConfig = null; String splash = ""; if (splashConfig != null) splash = splashConfig.getType(); Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); if (hiddenAll) splashConfig = null; //开屏 ad.put("splash", splash); if (!isDPUser) adNew.put("splash", gson.toJson(splashConfig)); ADConfig adConfig = null; //视频前贴 adConfig = getAdShowType("ad_play_video_pre", acceptData.getChannel(), acceptData.getVersion(), map); if (hiddenAll) adConfig = null; ad.put("videoPlayPre", adConfig == null ? "" : adConfig.getType()); adNew.put("videoPlayPre", gson.toJson(adConfig)); //APP退出 adConfig = getAdShowType("ad_exit_app", acceptData.getChannel(), acceptData.getVersion(), map); if (hiddenAll) adConfig = null; ad.put("exitApp", adConfig == null ? "" : adConfig.getType()); if (!isDPUser) adNew.put("exitApp", gson.toJson(adConfig)); //全屏广告控制 adConfig = getAdShowType("ad_video_detail_full_video", acceptData.getChannel(), acceptData.getVersion(), map); if (hiddenAll) adConfig = null; ad.put("videoDetailFullVideo", adConfig == null ? "" : adConfig.getType()); if (!isDPUser) adNew.put("videoDetailFullVideo", gson.toJson(adConfig)); //搜索页广告控制 adConfig = getAdShowType("ad_video_search", acceptData.getChannel(), acceptData.getVersion(), map); if (hiddenAll) adConfig = null; ad.put("videoSearch", adConfig == null ? "" : adConfig.getType()); adNew.put("videoSearch", gson.toJson(adConfig)); //pptv免广告激励视频 adConfig = getAdShowType("pptv_no_ad_reward", acceptData.getChannel(), acceptData.getVersion(), map); if (hiddenAll) adConfig = null; adNew.put("pptvNoAdReward", gson.toJson(adConfig)); //热启动开屏 adConfig = getAdShowType("ad_splash_hot_start", acceptData.getChannel(), acceptData.getVersion(), map); if (hiddenAll) adConfig = null; adNew.put("splashHotStart", gson.toJson(adConfig)); //首页插屏 adConfig = getAdShowType("home_ad_interstitial", acceptData.getChannel(), acceptData.getVersion(), map); if (hiddenAll) adConfig = null; if (!isDPUser) adNew.put("homeInterstitial", gson.toJson(adConfig)); //应用退出全屏 adConfig = getAdShowType("ad_exit_app_fullvideo", acceptData.getChannel(), acceptData.getVersion(), map); if (hiddenAll) adConfig = null; if (!isDPUser) adNew.put("exitAppFullvideo", gson.toJson(adConfig)); //其他广告 adConfig = getAdShowType("ad_other", acceptData.getChannel(), acceptData.getVersion(), map); if (hiddenAll) adConfig = null; adNew.put("other", gson.toJson(adConfig)); //广告ID if (!StringUtil.isNullOrEmpty(map.get("gdt_app_id"))) { adNew.put("gdtAppId", map.get("gdt_app_id")); } if (!StringUtil.isNullOrEmpty(map.get("csj_app_id"))) { adNew.put("csjAppId", map.get("csj_app_id")); } data.put("ad", ad); data.put("adNew", adNew); //PPTV免广告权益时长,暂时设置为3小时 data.put("pptvNoAdRewardHour", 3); //设置网页加速域名 data.put("webSpeedUpHost", map.get("web_speed_up_host")); //我的页面banner data.put("minePageBanner", map.get("mine_page_banner")); //播放页外跳协议白名单 data.put("jumpAppProtocolPrefix", map.get("player_out_jump_protocol_prefix")); //获取购买记录链接 data.put("buyRecordUrl", systemConfigService.getConfigValueByKeyCache("buyRecordUrl")); //联系我们 data.put("contactUsLink", map.get("contact_us_link")); //注销 data.put("unRegisterLink", map.get("unregister_link")); //关于我们链接 data.put("aboutUsLink", map.get("about_us_link")); //反馈链接 data.put("feedBackLink", map.get("feed_back_link")); //帮助链接 data.put("helpLink", map.get("help_link")); //应用链接 data.put("appLink", map.get("app_link")); //是否正在上线 boolean onLine = false; try { onLine = appManager.isOnline(acceptData.getDetailSystem().getId(), acceptData.getVersion(), acceptData.getChannel()); } catch (Exception e) { } data.put("onLining", onLine); out.print(JsonUtil.loadTrueJson(data.toString())); } /** * 获取首页配置信息 * * @param acceptData * @param request * @param out */ public void getHomeConfig(AcceptData acceptData, HttpServletRequest request, PrintWriter out) { LoggerUtil.getUserActiveLogger().info(UserActiveLogFactory.createAppMainPage(new BaseLog(acceptData, ""))); List adList = floatADService.listShowAD(1, 1); Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); JSONObject data = new JSONObject(); if (adList != null && adList.size() > 0) { FloatAD ad = adList.get(0); data.put("floatAD", gson.toJson(ad)); } out.print(JsonUtil.loadTrueJson(data.toString())); } class ADConfig { int version; @Expose String type; @Expose String pid; public int getVersion() { return version; } public void setVersion(int version) { this.version = version; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getPid() { return pid; } public void setPid(String pid) { this.pid = pid; } } }