ad_welfare.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. function ad_welfare(local_AD_data,pagecode) {
  2. //三期最终有效福利广告广告计划、材料数据集合
  3. var ad_welfare_data = {};
  4. var welfare_plans = local_AD_data.welfare_plans || '';
  5. var welfare_materials = local_AD_data.welfare_materials || '';
  6. //福利广告点击次数的缓存;
  7. var clickcount = localStorage.getItem('clickcounts') || 0;
  8. localStorage.setItem('clickcounts',clickcount);
  9. //用户奇偶性广告计划为空不渲染福利广告判断;
  10. if(typeof Array.isArray != "function") {
  11. Array.isArray = function(obj){
  12. return Object.prototype.toString.call(obj) == "[object Array]";
  13. }
  14. }
  15. if(!welfare_plans||!welfare_materials||Array.isArray(welfare_plans)||Array.isArray(welfare_materials)){
  16. return ;
  17. }
  18. var nowTime = parseInt(new Date().getTime()/1000);
  19. var Welfare_PLANS = Welfare_PLANSobj(welfare_plans,nowTime);
  20. //随机广告计划
  21. var lastWelfare_plans = roundwelfare(Welfare_PLANS);
  22. //lastWelfare_plans 最终执行的随机广告计划合并到ad_welfare_data.welfare_PLANS中
  23. ad_welfare_data["welfare_PLANS"] = lastWelfare_plans;
  24. //todaymaterial 已渲染的素材对象 {id:{id:{}}}
  25. var todaymaterial =JSON.parse(localStorage.getItem('todaymaterial'))||{};
  26. // var nowwelfare_materials = [{……},{……}]; 无渲染的素材数组;
  27. var nowwelfare_materials = norepeat_materials_arr(welfare_materials,todaymaterial,nowTime);
  28. //有效期内素材数组按照权重值高到低排序
  29. nowwelfare_materials.sort(HsortL);
  30. //广告计划和素材在ad_welfare_data的welfare_plans和welfare_materials属性中
  31. ad_welfare_data["welfare_MATERIALS"] = HL_materials(ad_welfare_data,nowwelfare_materials);
  32. var ad_welfare_dataplanskey = Object.keys(ad_welfare_data.welfare_PLANS)[0];
  33. var plans_obj = ad_welfare_data.welfare_PLANS;
  34. //每天点击过一次福利广告发的时间戳;
  35. var onlyclicktime = localStorage.getItem('onlyclicktime')||0;
  36. //记录有效广告素材的个数
  37. var Welfare_PLANS_length = nowwelfare_materials.length+Object.keys(todaymaterial).length;
  38. //当下发次数大于素材个数时,缓存的素材个数达到素材个数,清空缓存;
  39. if(Object.keys(todaymaterial).length==Welfare_PLANS_length){
  40. localStorage.removeItem('todaymaterial');
  41. var local_AD_data = JSON.parse(localStorage.getItem('local_AD_data'));
  42. ad_welfare(local_AD_data,pagecode);
  43. }
  44. var plans_id = Object.keys(plans_obj)[0];
  45. //后台需要5次容错率
  46. if(clickcount >=parseInt(plans_obj[plans_id].day_receive_num)+5 ){
  47. return ;
  48. }
  49. // plans_obj[plans_id].day_receive_num+5
  50. //渲染广告素材
  51. welfareshow(ad_welfare_data,pagecode, plans_obj,onlyclicktime,todaymaterial,clickcount,Welfare_PLANS_length);
  52. }
  53. function Welfare_PLANSobj(welfare_plans,nowTime){
  54. //对比有效时间和权重值,筛选当前执行的广告计划
  55. var welfare_plansIndex = Object.keys(welfare_plans);
  56. var nowWelfare_plans = {};
  57. var nowWeight = 0;
  58. for(var i = 0;i<welfare_plansIndex.length;i++){
  59. var welfare_plansKey = welfare_plansIndex[i];
  60. if(welfare_plans[welfare_plansKey].show_starttime<nowTime&&nowTime<welfare_plans[welfare_plansKey].show_endtime){
  61. //有效期内的广告计划
  62. var objstore = {};
  63. objstore[welfare_plansKey] = welfare_plans[welfare_plansKey];
  64. $.extend(nowWelfare_plans,objstore);
  65. if(welfare_plans[welfare_plansKey].weight>nowWeight){
  66. //权重值最大的数值
  67. nowWeight = welfare_plans[welfare_plansKey].weight;
  68. }
  69. }else{
  70. continue;
  71. }
  72. }
  73. //没有有效广告结束函数执行
  74. var nowWelfare_planskeys = Object.keys(nowWelfare_plans);
  75. if(nowWelfare_planskeys.length==0){
  76. return ;
  77. }
  78. //权重值都最高的广告计划有可能多个;
  79. //当nowWelfare_plans中有1个或以的上广告计划
  80. if(nowWelfare_planskeys.length!=0){
  81. var Welfare_PLANSobj = {};
  82. for(var j=0;j<nowWelfare_planskeys.length;j++){
  83. var nowWelfare_plansname = nowWelfare_planskeys[j];
  84. if( nowWelfare_plans[nowWelfare_plansname].weight==nowWeight){
  85. var objs = {};
  86. objs[nowWelfare_plansname] = nowWelfare_plans[nowWelfare_plansname];
  87. $.extend(Welfare_PLANSobj,objs);
  88. }
  89. }
  90. }
  91. return Welfare_PLANSobj;
  92. }
  93. //过滤掉每天渲染过的素材对象
  94. function norepeat_materials_arr(welfare_materials,todaymaterial,nowTime){
  95. var materials_arr = [];
  96. var welfare_materialskeys = Object.keys(welfare_materials);
  97. for(var j=0; j<welfare_materialskeys.length;j++){
  98. var materialskeysname = welfare_materialskeys[j]
  99. if(welfare_materials[materialskeysname].show_starttime<nowTime&&nowTime<welfare_materials[materialskeysname].show_endtime){
  100. var objs = {};
  101. objs[materialskeysname] = welfare_materials[materialskeysname];
  102. if( materialskeysname in todaymaterial){
  103. continue;
  104. }else{
  105. materials_arr.push(objs);
  106. }
  107. }else{
  108. continue;
  109. }
  110. }
  111. return materials_arr;
  112. }
  113. //根据有效广告素材数组->得出按权重值建字典数组;
  114. function HL_materials(ad_welfare_data,nowwelfare_materials){
  115. var sort_welfare_materials = {};
  116. for(var k=0;k<nowwelfare_materials.length;k++){
  117. var itemindexname= Object.keys(nowwelfare_materials[k])[0];
  118. var weightkey = nowwelfare_materials[k][itemindexname].weight;
  119. if(weightkey in sort_welfare_materials){
  120. sort_welfare_materials[weightkey].push(nowwelfare_materials[k]);
  121. }else{
  122. sort_welfare_materials[weightkey] = [];
  123. sort_welfare_materials[weightkey].push(nowwelfare_materials[k]);
  124. }
  125. }
  126. return sort_welfare_materials;
  127. }
  128. function welfareshow(ad_welfare_data,pagecode, plans_obj,onlyclicktime,todaymaterial,clickcount,Welfare_PLANS_length){
  129. //判断是否当天内渲染素材,不是当天内渲染清除之前的
  130. //每天最后一次下发福利广告的时间戳;
  131. var lastshowtime;
  132. if(Boolean(localStorage.getItem("lastshowtime"))){
  133. lastshowtime = localStorage.getItem("lastshowtime");
  134. }else{
  135. localStorage.setItem("lastshowtime",new Date().getTime());
  136. lastshowtime = localStorage.setItem("lastshowtime",new Date().getTime());
  137. }
  138. if(lastshowtime>new Date(new Date().toLocaleDateString()).getTime()){
  139. localStorage.setItem("lastshowtime",new Date().getTime());
  140. lastshowtime = localStorage.getItem("lastshowtime");
  141. }else{
  142. localStorage.removeItem('todaymaterial');
  143. var local_AD_data = localStorage.getItem('local_AD_data');
  144. ad_welfare(local_AD_data,pagecode);
  145. }
  146. //此时渲染的目标素材
  147. var TagMaterial = roundmaterial(ad_welfare_data.welfare_MATERIALS);
  148. if(Object.keys(TagMaterial)<1){
  149. return ;
  150. }
  151. var plans_id = Object.keys(plans_obj)[0];
  152. var materal_id = Object.keys(TagMaterial)[0];
  153. var link_url = TagMaterial[materal_id].link_game;
  154. if(lastshowtime>new Date(new Date().toLocaleDateString()).getTime()){
  155. if(clickcount >parseInt(plans_obj[plans_id].day_receive_num)+5 || materal_id in todaymaterial ){
  156. return ;
  157. }
  158. }
  159. switch(pagecode){
  160. //最近阅读
  161. case 'recent_read':read_render(plans_obj,TagMaterial,plans_id,materal_id,link_url,onlyclicktime,clickcount,Welfare_PLANS_length);break;
  162. //签到
  163. case 'my':my_sign(plans_obj,TagMaterial,plans_id,materal_id,link_url,onlyclicktime,clickcount,Welfare_PLANS_length);break;
  164. //章节页
  165. case 'book_reading':reading_book(plans_obj,TagMaterial,plans_id,materal_id,link_url,onlyclicktime,clickcount,Welfare_PLANS_length);break;
  166. //充值
  167. case 'charge':changepay(plans_obj,TagMaterial,plans_id,materal_id,link_url,onlyclicktime,clickcount,Welfare_PLANS_length);break;
  168. }
  169. }
  170. function read_render(plans_obj,TagMaterial,plans_id,materal_id,link_url,onlyclicktime,clickcount,Welfare_PLANS_length){
  171. //根据具体广告素材渲染【最近阅读页】
  172. var readposition = 26;
  173. $(".ad_welfare").show();
  174. _sendLogShow(plans_id,readposition,materal_id);
  175. $('.ad_welfare').unbind().bind('click',function(e){
  176. e.stopPropagation();
  177. $(this).hide();
  178. welfare_after(TagMaterial,plans_obj,plans_id,materal_id,readposition,onlyclicktime,link_url,clickcount,Welfare_PLANS_length);
  179. })
  180. }
  181. function my_sign (plans_obj,TagMaterial,plans_id,materal_id,link_url,onlyclicktime,clickcount,Welfare_PLANS_length){
  182. //根据具体广告素材渲染【签到页面】
  183. var readposition = 24;
  184. $(".ad_welfare").hide().show();
  185. _sendLogShow(plans_id,readposition,materal_id);
  186. $('.ad_welfare').unbind().bind('click',function(e){
  187. e.stopPropagation();
  188. $(".ad_welfare").hide();
  189. welfare_after(TagMaterial,plans_obj,plans_id,materal_id,readposition,onlyclicktime,link_url,clickcount,Welfare_PLANS_length)
  190. })
  191. }
  192. //点击后执行……(toast显示,)
  193. function welfare_after(TagMaterial,plans_obj,plans_id,materal_id,readposition,onlyclicktime,link_url,clickcount,Welfare_PLANS_length){
  194. //点击次数增1;
  195. // debugger;
  196. ++clickcount;
  197. localStorage.removeItem('clickcounts',clickcount);
  198. localStorage.setItem('clickcounts',clickcount);
  199. $(".ad_welfare_toast").text("参与互动活动后,可自动领取"+plans_obj[Object.keys(plans_obj)[0]].give_kandian+"书币");
  200. $(".ad_welfare_toast").show();
  201. _sendLogClick(plans_id,readposition,materal_id);
  202. todaymaterialupdate(TagMaterial,plans_obj,plans_id,materal_id,clickcount,Welfare_PLANS_length);
  203. onlyclickajax(onlyclicktime);
  204. setTimeout(function(){
  205. $(".ad_welfare_toast").hide();
  206. location.href = link_url + "?uid=" + simpleAD.userId + "&channel_id=" + simpleAD.channelId + "&ad_plan=" + plans_id;
  207. },3000);
  208. }
  209. function reading_book(plans_obj,TagMaterial,plans_id,materal_id,link_url,onlyclicktime,clickcount,Welfare_PLANS_length){
  210. //根据具体广告素材渲染【章节页】
  211. if(parseInt(window.ad_chapter_index)<parseInt(plans_obj[Object.keys(plans_obj)[0]].float_pop_chapter_num)){
  212. return ;
  213. }
  214. var readposition = 23;
  215. var imgsrc =plans_obj[plans_id].float_pop_icon || '' ;
  216. if(!imgsrc){
  217. return ;
  218. }
  219. $('.ad_welfare_float_pop')[0].src = imgsrc;
  220. var bannertime = new Date().getTime();
  221. var lastbantime = localStorage.getItem("bannerouttime")||0;
  222. //测试环境改为5分钟后显示,产品需求15分钟
  223. if(bannertime-lastbantime>15*60*1000){
  224. $(".ad_welfare").hide().show();
  225. }else{
  226. return ;
  227. }
  228. //10秒后关闭弹窗
  229. var timeout = setTimeout(function(){
  230. $(".ad_welfare").hide();
  231. //记录关闭后的banner时间戳
  232. localStorage.removeItem("bannerouttime");
  233. localStorage.setItem("bannerouttime",new Date().getTime());
  234. },10000);
  235. _sendLogShow(plans_id,readposition,materal_id);
  236. $('.ad_welfareclick,.ad_welfare').unbind().bind('click',function(e){
  237. e.stopPropagation();
  238. localStorage.removeItem("bannerouttime");
  239. localStorage.setItem("bannerouttime",new Date().getTime());
  240. $('.ad_welfare').hide();
  241. welfare_after(TagMaterial,plans_obj,plans_id,materal_id,readposition,onlyclicktime,link_url,clickcount,Welfare_PLANS_length)
  242. })
  243. }
  244. function changepay (plans_obj,TagMaterial,plans_id,materal_id,link_url,onlyclicktime,clickcount,Welfare_PLANS_length){
  245. //根据具体广告素材渲染【充值页面】
  246. var readposition = 25;
  247. var imgsr = plans_obj[plans_id].recharge_pop_icon || '';
  248. if(!imgsr){
  249. $(".ad_welfaregload").hide();
  250. return ;
  251. }
  252. $(".ad_welfaregload").hide().show();
  253. $('.ad_welfareclick')[0].src =imgsr;
  254. _sendLogShow(plans_id,readposition,materal_id);
  255. $(".closealert").unbind().bind('click',function(e){
  256. e.stopPropagation();
  257. $(".ad_welfaregload").hide();
  258. })
  259. $('.ad_welfareclick').unbind().bind('click',function(e){
  260. e.stopPropagation();
  261. $(".ad_welfaregload").hide();
  262. welfare_after(TagMaterial,plans_obj,plans_id,materal_id,readposition,onlyclicktime,link_url,clickcount,Welfare_PLANS_length)
  263. })
  264. }
  265. //一天内上报第一次点击福利广告的uid、channel_id;
  266. function onlyclickajax(onlyclicktime){
  267. if(onlyclicktime>new Date(new Date().toLocaleDateString()).getTime()){
  268. return ;
  269. }else{
  270. //判断来到第二天福利广告的点击次数清零,以及发送一次请求报点;
  271. localStorage.removeItem('clickcounts');
  272. localStorage.setItem('clickcounts',1);
  273. $.ajax({
  274. type: 'POST',
  275. url: "/api/aduserapi/welfaredot",
  276. data: {
  277. uid: simpleAD.userId,
  278. channel_id: simpleAD.channelId
  279. },
  280. success: function (res) {
  281. if(res.code == 1 ){
  282. localStorage.removeItem("onlyclicktime");
  283. localStorage.setItem("onlyclicktime",new Date().getTime());
  284. }
  285. },
  286. error: function (error) {
  287. }
  288. })
  289. }
  290. }
  291. //一天内展示不重复的素材次数
  292. function todaymaterialupdate(TagMaterial,plans_obj,plans_id,materal_id,clickcount,Welfare_PLANS_length){
  293. var todaymaterial =JSON.parse(localStorage.getItem('todaymaterial')) || {} ;
  294. if(Object.keys(todaymaterial).length<=0){
  295. $.extend(todaymaterial,TagMaterial);
  296. localStorage.setItem("todaymaterial",JSON.stringify(todaymaterial));
  297. localStorage.removeItem('lastshowtime');
  298. localStorage.setItem('lastshowtime',new Date().getTime());
  299. }
  300. // Object.keys(todaymaterial).length<plans_obj[plans_id].day_receive_num
  301. // clickcount<plans_obj[plans_id].day_receive_num+5
  302. if( todaymaterial && clickcount<parseInt(plans_obj[plans_id].day_receive_num)+5 ){
  303. if(materal_id in todaymaterial){
  304. return ;
  305. }else{
  306. $.extend(todaymaterial,TagMaterial);
  307. localStorage.setItem("todaymaterial",JSON.stringify(todaymaterial));
  308. localStorage.removeItem('lastshowtime');
  309. localStorage.setItem('lastshowtime',new Date().getTime());
  310. }
  311. }
  312. }
  313. //筛选目标素材函数
  314. // var TagMaterial = roundmaterial(ad_welfare_data.welfare_MATERIALS,showmaterial);
  315. // {0: Array(1), 10: Array(1), 15: Array(1)}
  316. // 0: [{…}]
  317. // 10: [{…}]
  318. // 15: [{…}]
  319. function roundmaterial(welfareObj){
  320. var welfareObjkeys = Object.keys(welfareObj).sort((a,b)=>{return b-a});
  321. var targetmaterial = {}
  322. for(var i=0;i<welfareObjkeys.length;i++){
  323. var roundN = Math.floor(Math.random()*welfareObj[welfareObjkeys[i]].length);
  324. var targetmaterial = welfareObj[welfareObjkeys[i]][roundN];
  325. break;
  326. }
  327. return targetmaterial;
  328. }
  329. //比较函数
  330. function HsortL(n1,n2) {
  331. var n1name = Object.keys(n1)[0];
  332. var n2name = Object.keys(n2)[0];
  333. return n2[n2name].weight-n1[n1name].weight;
  334. }
  335. //在某一对象中随机返回一键值对
  336. function roundwelfare(obj){
  337. var objkeys = Object.keys(obj);
  338. var objkeylength = objkeys.length;
  339. var roundIndex = Math.floor(Math.random()*objkeylength);
  340. var objkeyname = objkeys[roundIndex];
  341. var objs = {}
  342. objs[objkeyname] = obj[objkeyname];
  343. return objs;
  344. }
  345. function _sendLogShow(adIds,position,mId){
  346. cpslog([702, {
  347. map: {
  348. ad_ids:parseInt(adIds),
  349. position:position,
  350. material_id:mId,
  351. ad_type:'welfare',
  352. channel_id: simpleAD.channelId,
  353. user_id:simpleAD.userId
  354. }
  355. }, 'ad_sys_show']);
  356. }
  357. function _sendLogClick(adIds,position,mId){
  358. cpslog([702, {
  359. map: {
  360. ad_ids:parseInt(adIds),
  361. position:position,
  362. material_id:mId,
  363. ad_type:'welfare',
  364. channel_id: simpleAD.channelId,
  365. user_id:simpleAD.userId
  366. }
  367. }, 'ad_sys_click']);
  368. }