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 com.yeshi.buwan.vo.ad.AdConfigTypeVO; import net.sf.json.JSONArray; 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; } // 获取广告配置信息 private void loadAdConfig(AcceptData acceptData, Map map, String ip, boolean isDPUser,JSONObject data) { Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); Map shieldMap = new HashMap<>(); // 获取区域屏蔽信息 String shieldInfo = map.get("ad_shield_province_rules"); if (!StringUtil.isNullOrEmpty(shieldInfo)) { JSONObject json = JSONObject.fromObject(shieldInfo); //获取渠道需要屏蔽的城市 JSONObject shieldProvinceRules = json.optJSONObject(acceptData.getChannel().toLowerCase()); if (shieldProvinceRules != null) { IPUtil.IPInfo ipInfo = null; try { ipInfo = ipManager.getIPInfo(ip); } catch (Exception e) { e.printStackTrace(); logger.error("IP地址位置信息获取失败:" + ip); } if (ipInfo != null) { //获取是否需要屏蔽开屏 for (AdConfigTypeVO adType : AdConfigTypeVO.values()) { JSONArray splashProvinces = shieldProvinceRules.optJSONArray(adType.getSettingKey()); if (splashProvinces != null) { for (int i = 0; i < splashProvinces.size(); i++) { String p = splashProvinces.optString(i); if (p.equalsIgnoreCase(ipInfo.getProvince())) { shieldMap.put(adType.getSettingKey(), true); break; } } } } } } } JSONObject adNew = new JSONObject(); JSONObject ad = new JSONObject(); for (AdConfigTypeVO adType: AdConfigTypeVO.values()){ ADConfig adConfig = getAdShowType(adType.getDbKey(), acceptData.getChannel(), acceptData.getVersion(), map); if (shieldMap.get(adType.getSettingKey())!=null&&shieldMap.get(adType.getSettingKey())) { //屏蔽广告 adConfig = null; } ad.put(adType.getVoKey(), adConfig == null ? "" : adConfig.getType()); adNew.put(adType.getVoKey(), 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); } 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(); String ip = IPUtil.getRemotIP(request); //会员链接 String vipLink = map.get("vip_link"); data.put("vipLink", vipLink); //是否为内容阅读用户 boolean isDPUser = false; try { isDPUser = userDPContentWatchStatisticService.isDPUser(acceptData); } catch (Exception e) { } // 加载广告配置 loadAdConfig(acceptData,map,ip,isDPUser,data); //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); String aidao = map.get("ai_dao_mode"); if ("1".equalsIgnoreCase((aidao + "").trim())) { data.put("aiDaoMode", true); } else { data.put("aiDaoMode", false); } 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; } } }