(function(){ angular.module("app.collect") .controller("retentionCtrl",["$rootScope","$scope","HttpService","ToolService","UtilService","$timeout","$q","$stateParams",retentionCtrl]); function retentionCtrl($rootScope,$scope,HttpService,ToolService,UtilService,$timeout,$q,$stateParams){ var rmd = new Date().getTime(); var fid = $stateParams.pageid; $scope.queryInfoByApp = function(flag,dID){ if(angular.isUndefined(flag) || flag==5){ //app下所有事件 var eventPM = HttpService.getInfo($scope.appid+"/event/find"); eventPM.then(function(data){ $scope.eventListAll = data; $scope.eventList = $scope.eventListAll.filter(function(item){ return item.eventName != 'install'; }); }); //通用属性 var profilePM = HttpService.getInfo($scope.appid+"/event/find/allAttr"); $scope.dimenId = "-all"; profilePM.then(function(data){ data.unshift({"dimensionType":"whole",id:"-all",name:"总体",type:"string"}); for(var i=0; i< data.length; i++){ if(data[i].dimensionType == 'population' || data[i].dimensionType == 'source'){ data[i].dimensionType = 'eventlist'; } } $scope.dimensionList = data; }); } var definePM = HttpService.getInfo("mng/retention/find/"+$scope.appid); definePM.then(function(data){ $scope.seatxt = ""; $scope.defineList = data; $scope.isEditInfo = 1; if(flag==2){ //修改自定义事件 for(var i=0;i<$scope.defineList.length;i++){ if($scope.defineList[i].id == dID){ $scope.define = $scope.defineList[i]; break; } } $scope.defineFlag = ++rmd; } if(data.length>0){ if(!UtilService.isNullStr(fid)){ for(var i=0;i<$scope.defineList.length;i++){ if($scope.defineList[i].id == fid){ $scope.define = $scope.defineList[i]; break; } } $scope.clickDefine($scope.define); fid = null; } else if(flag==1 || (flag == 3 && $scope.define && $scope.define.id == dID)){ $scope.clickDefine($scope.defineList[0]); } } else{ $scope.clickType($scope.typeList[1]); } if(flag == 5){ $scope.dimenRmd = ++rmd; } }); } //选择按设备或者按用户 /*$scope.deviceList = ToolService.getDeviceTypeList(); $scope.deviceInit = $scope.deviceList[0].id; $scope.$on("deviceId",function(e,msg){ $scope.seeFlag = msg.info.id; });*/ $scope.deviceId = false; $scope.dimensionname = "维度对比"; $scope.usergroupid = -1; $scope.$on("dimensionId",function(e,msg){ $scope.dimenId = msg.info.id; $scope.dimenObj = msg.info; $scope.dimenEventType = msg.info.eventType; if($scope.dimenId == 'usergroup' && $scope.usergroupid == -1){ $scope.lengedNames = ["整体"]; $scope.dimenugkeys = UtilService.cloneJSON(msg.info.key); $scope.dimenugkeys.unshift("all"); msg.info.value.filter(function(item){ $scope.lengedNames.push(item); }); $scope.usergroupid = msg.info.key[0]; $scope.userIndex = 1; } else{ $scope.usergroupid = -1; } }); $scope.showDemistion = function(){ return $scope.define && $scope.define.id>0 || $scope.isShowCache; } //已保存的事件 $scope.definename = "请选择模板"; $scope.clickDefine = function(m){ $scope.define = m; $scope.typesign = 'define'; $scope.typesname = m.name; $scope.ename = m.name; $scope.defineFlag = ++rmd; $scope.showEventWin = false; $scope.helpname = "自定义留存"; $rootScope.thirdtab = m.name; } $scope.deleteDefine = function(d){ $scope.delDefine = d; ToolService.showAlp(); ToolService.showLoading(); var validPM = HttpService.getInfo("custommenu/delete/valid/"+d.id+"?type=retention"); validPM.then(function(data){ ToolService.hideLoading(); $scope.wantDelete = true; $scope.custommenus = angular.isArray(data) && data.length>0?data:false; }); } $scope.doDelete = function(){ $scope.closeWin(); ToolService.showLoading(); var deletePM = HttpService.deleteInfo("mng/retention/delete/"+$scope.delDefine.id); deletePM.then(function(){ ToolService.showTips("删除成功"); $scope.queryInfoByApp(3,$scope.delDefine.id); ToolService.hideLoading(); }); } $scope.date = ToolService.getLastDays(-7); $scope.disTimeFlag = []; $scope.rangday = -1; $scope.changeTimeFlag = function(flag){ if($scope.disTimeFlag.indexOf(flag)>-1){return false;} // if(flag == 'day'){ // $scope.rangday = 15; // } // else{ // $scope.rangday = -1; // } $scope.timeFlag = flag; } $scope.changeTimeFlag("day"); $scope.$on("dateCustos",function(e,msg){ var days = diffDate(msg.startDate,msg.endDate); if(days>=15 || days>=60){ $scope.disTimeFlag = ["day"]; if($scope.timeFlag == 'day'){ if(days>=60){ $scope.timeFlag = 'month'; } else{ $scope.timeFlag = 'week'; } } } else{ if(msg.startDate == msg.endDate){ $scope.disTimeFlag = ["week","month"]; $scope.timeFlag = 'day'; } else{ $scope.disTimeFlag = []; } } $scope.date = msg; }); $scope.$watch("date",function(){ if(angular.isDefined($scope.date)){ $scope.datestr = $scope.date.startDate + "至" + $scope.date.endDate; } }); $scope.typeList = [ {id:'define',name:"新建自定义留存"}, {id:'install',name:"新增留存"}, {id:'dau',name:"活跃留存"} ]; if(!$scope.hasEditPower()){ $scope.typeList = $scope.typeList.slice(1); } $scope.clickType = function(obj){ $scope.typesign = obj.id; $scope.typesname = obj.name; $scope.helpname = obj.name; $scope.define = {id:0}; if(obj.id == 'define'){ $scope.addModel(0); $scope.helpname = "自定义留存"; } else{ $scope.defineFlag = ++rmd; $scope.showEventWin = false; $scope.isShowCache = false; $rootScope.thirdtab = obj.name; } } $scope.eventInfo = []; $scope.dimenInit = $scope.dimenId = "-all"; $scope.$watch("appid",function(n){ if(angular.isDefined(n)){ $scope.dimenId = "-all"; $scope.lengedNames = []; $scope.queryInfoByApp(5); $scope.clickType($scope.typeList[1]); } }); $scope.initEventInfo = function(flag,cache){ $scope.eventInfo.filter(function(item){ item.show = false; }); if(flag==1 || cache) {//编辑 $scope.isShowCache = flag == 0 || $scope.typesname=="新建自定义留存"; ToolService.showLoading(); var eventInfo = $scope.isShowCache?JSON.parse(JSON.parse(cache)):JSON.parse($scope.define.eventInfo),evts = [],evtvals = []; eventInfo.filter(function(item){ var temp = {event:item.event,param:[]}; var pppm = UtilService.cloneJSON(item.params); pppm.filter(function(pm){ temp.param.push(pm.attr); }); evts.push(item.event); evtvals.push(temp); }); var evtprofilePM = HttpService.getInfo($scope.appid+"/event/find/param?names="+evts.join(",")+"¶ms="+JSON.stringify(evtvals)); evtprofilePM.then(function(pros){ pros.filter(function(evt){ for(var i=0;i<$scope.eventList.length;i++){ if(evt.eventName == $scope.eventList[i].eventName){ $scope.eventList[i].profiles = evt.profiles; break; } } }); eventInfo.filter(function(e){ e.oldparams = UtilService.cloneJSON(e.params); delete e.params; $scope.addEvent(e); }); ToolService.hideLoading(); }); } else{ $scope.addEvent(); $scope.addEvent(); } } $scope.changeRel = function(obj){ obj.relation = obj.relation == 'and' ? "or" : 'and'; } $scope.changeSeeFlag = function(flag){ $scope.seeFlag = flag; } var rmd = new Date().getTime(); $scope.eventinitname = "请选择事件"; $scope.addEvent = function(obj){ rmd ++; var temp = {id:"evt_"+rmd,eventid:"event_"+rmd,relation:"and",show:true}; if(obj){ for(var k in obj){ temp[k] = obj[k]; } temp.eventinit = obj.event; } (function(temp){ $scope.$on(temp.eventid,function(e,msg){ temp.params = []; temp.event = msg.info.eventName; temp.nullevent = false; var setparams = function(){ temp.paramsList = msg.info.profiles; if(temp.oldparams){ temp.oldparams.filter(function(item){ $scope.addEventParams(temp,item); }); delete temp.oldparams; } } if(angular.isArray(msg.info.profiles)){ setparams(msg.info.profiles); } else{ var proPM = HttpService.getInfo($scope.appid+"/event/find/param?names="+temp.event); proPM.then(function(data){ msg.info.profiles = data[0].profiles; setparams(); }); } }); })(temp); if($scope.eventInfo.length % 2 == 0){ temp.title = "初始行为"; temp.zidx = 2; }else{ temp.zidx = 1; temp.title = "回访行为"; } $scope.eventInfo.push(temp); } $scope.closeAddWin = function(flag){ $scope.showEventWin = false; if(flag == 1 && $scope.isEditInfo == 2){ $scope.clickType($scope.typeList[1]); } $scope.isEditInfo = 1; } $scope.getEventParamsNum = function(event){ if(!event || !event.params){return 5;} var eps = event.params.filter(function(item){ return item.show!=false; }); return eps.length; } $scope.addEventParams = function(event,obj){ if(!event.params || $scope.getEventParamsNum(event)>=3){return false;}; rmd ++; var tempparam = {id:"pam_"+rmd,pid:event.id}; if(obj){ for(var k in obj){ tempparam[k] = obj[k]; } } event.params.push(tempparam); } $scope.removeEventParams = function(event,param){ for(var i=0;i<event.params.length;i++){ if(event.params[i].id == param.id){ event.params[i].show = false; break; } } } $scope.initCondition = function(){ if(!$scope.canSave()){return false;} $scope.initEventInfo(); } $scope.$on("event",function(e,msg){ for(var i=0;i<$scope.eventInfo.length;i++){ if($scope.eventInfo[i].id == msg.pid){ var params = $scope.eventInfo[i].params; for(var j=0;j<params.length;j++){ if(params[j].id == msg.id){ params[j] = msg; break; } } } } }); $scope.canSave = function(){ if(!$scope.eventInfo || $scope.eventInfo.length == 0){return false;} var can = false; for(var i=0;i<$scope.eventInfo.length;i++){ var temp = $scope.eventInfo[i]; if(temp.show == true && temp.event){ can = true; break; } } return can; } $scope.nowiptEvents = ""; $scope.getEventCrm = function(islook){ var hasNull = false; var eventInfo = [],myEvents = [],isnull = false; $scope.nowiptEvents = ""; $scope.eventInfo.filter(function(item){ if(item.show!=false){ var temp = {event:item.event,relation:item.relation,params:[]}; if(UtilService.isNullStr(item.event)){ item.nullevent = true; hasNull = true; } else{ item.nullevent = false; if(angular.isUndefined(item.params)){ isnull = true; } else{ item.params.filter(function(pm){ if(pm.show!=false){ var pms = {}; for(var k in pm){ if(k!='id' && k!='pid'){ if(k!='value'){ pms[k] = pm[k]; }else{ pms[k] = pm[k].join(","); } if(UtilService.isNullStr(pm[k])){ $scope.$broadcast(pm.id, "null"); hasNull = true; } } } temp.params.push(pms); } }); } } eventInfo.push(temp); myEvents.push(item.event); } }); if(isnull){ return false; }else{ if(hasNull){ if(islook){ ToolService.showTips($scope.formTipMsg); } } else{ $scope.nowiptEvents = JSON.stringify(eventInfo); } } } $scope.isEditInfo = 1; $scope.addModel = function(flag){ var cache = UtilService.getItem("retention_"+$scope.appid); if(flag){ if($scope.typesign=="install" || $scope.typesign=="dau" || ($scope.define && $scope.define.id == 0 && !cache)){return false;} $scope.isEditInfo = 3; }else{ $scope.isEditInfo = 2; } $scope.initEventInfo(flag,cache); $scope.showEventWin = true; } $scope.nameWin = function(flag){ $scope.getEventCrm(); if($scope.nowiptEvents==''){ ToolService.hideLoading(); ToolService.showTips($scope.formTipMsg); return false; } ToolService.showAlp(); $scope.wantSave = true; $scope.currentDefine = {}; $scope.ename = ""; if(angular.isDefined(flag)){ //编辑 $scope.currentDefine = $scope.define; $scope.define = {id:0}; } } $scope.lookReport = function(){ if(!$scope.canSave()){return false;} $scope.getEventCrm(true); if($scope.nowiptEvents!=''){ $scope.showEventWin = false; $scope.query(true); } } $scope.closeWin = function(flag){ $scope.wantSave = false; $scope.wantDelete = false; if(flag){ if(flag == 1){ $scope.showEventWin = false; } if(flag == 2 && $scope.isEditInfo == 3){ $scope.define = $scope.currentDefine; } } $scope.isEditInfo = 1; ToolService.hideAlp(); } $scope.save = function(){ $scope.getEventCrm(); if($scope.nowiptEvents==''){return false;} var doSave = function(){ var par = { app : $scope.appid, eventInfo: $scope.nowiptEvents, name : $scope.ename } var savePM = null,txtTips = "添加成功",flag=1; if($scope.define.id>0){ par.id = $scope.define.id; savePM = HttpService.putInfo("mng/retention/update",par); txtTips = "修改成功"; flag = 2; }else{ savePM = HttpService.postInfo("mng/retention/create",par); } ToolService.showLoading(); savePM.then(function(data){ $scope.closeWin(1); ToolService.hideLoading(); ToolService.showTips(txtTips); $scope.queryInfoByApp(flag,par.id); if($scope.isShowCache){ localStorage.removeItem("retention_"+$scope.appid); $scope.isShowCache = false; } }); } if($scope.define.id == 0){ var verPar = { name: { key: 'spcname', val: $scope.ename } }; $scope.tip = formJudge(verPar); if(UtilService.isNullStr($scope.ename) || $scope.tip.succ != true){ ToolService.showTips("请输入20个汉字以内名称,允许字符为中英文数字_-"); return false; } else{ ToolService.showLoading(); var existPM = HttpService.getInfo("mng/retention/valid/"+$scope.appid,{name:$scope.ename}); existPM.then(function(data){ if(data==true){ ToolService.hideLoading(); ToolService.showTips("名称已存在"); } else{ doSave(); } }); } }else{ doSave(); } } var getParams = function(){ var params = { reportview:$scope.timeFlag, retentiontype:$scope.typesign, appid : $scope.appid }; if($scope.isTempLook || $scope.isShowCache){ $scope.getEventCrm(); if($scope.nowiptEvents==''){return -1;} params.eventinfo = $scope.nowiptEvents; UtilService.setItem("retention_"+$scope.appid,JSON.stringify($scope.nowiptEvents)); $scope.isShowCache = true; } else if($scope.define && $scope.define.id>0){ params.eventinfo = $scope.define.eventInfo; } else if($scope.typesign == 'define'){ return -2; } params.startdate = $scope.date.startDate; params.enddate = $scope.date.endDate; params.datatype = "list"; params.eventType = $scope.dimenEventType; return params; } $scope.retetionConfig = {color:ToolService.getTenColors(),ispercent:true,legend:false}; var maxRet = 0,maxDetailRet = 0; $scope.query = function(istemp){ if(istemp){ $scope.isTempLook = true; } else{ $scope.isTempLook = false; } var params = getParams(); if(params == -1){return false;} if(params == -2){ $scope.clickType($scope.typeList[1]); return false; } params.datatype = "list"; /*if($scope.dimenId && $scope.dimenId!='-all' && $scope.showDemistion()){ params.dimention = $scope.dimenId; if(params.dimention == 'usergroup'){ if($scope.usergroupid==-1){return false;} params.usergroupid = $scope.usergroupid; } }*/ params.dimention = $scope.dimenId; if(params.dimention == 'usergroup'){ if($scope.usergroupid==-1){return false;} params.usergroupid = $scope.usergroupid; } params.isdevice = $scope.seeFlag == 'device'; params.eventType = $scope.dimenEventType; var retetionPM = null, areport = "", expType = "", ddID = "", ddName = ($scope.define.name || $scope.typesname) + "的留存趋势详情"; if($scope.define && $scope.define.id>0){ ddID = $scope.define.id; } var view = 'ds'; if($scope.timeFlag != 'day'){ view = $scope.timeFlag; } var myreport = "retention/report/"+$scope.appid; areport = myreport; expType = "customretention"; if($scope.typesign!='define' && $scope.typesign != 'dau'){ //新增留存 params.eventinfo = "payment,loggedin,reged"; } else if($scope.typesign=='dau'){ params.retentiontype = 'active'; }else{ //自定义 } retetionPM = HttpService.getInfo(myreport,params); $scope.retetionLoading = true; $scope.showDetail = false; $scope.infolistLoading = true; retetionPM.then(function(data){ $scope.infolist = data; if(params.dimention){ $scope.infolist.name[0] = $scope.dimenObj.name; } var infoVal = data.val; $scope.infolistLoading = false; var chartData = { name:[], key:[], val:[], rmd: ++rmd }; if(infoVal.length>0){ chartData.key = data.key.slice(1); var columns = data.columnkey; infoVal.filter(function(item){ chartData.name.push(item[columns[0]]); var linedata = []; for(var i=2;i<columns.length;i++){ linedata.push(item['rate_'+columns[i]]); } chartData.val.push(linedata); }); } else{ if($scope.dimenId == 'usergroup' && $scope.lengedNames && $scope.lengedNames.length>1){ chartData.name = ['整体',$scope.lengedNames[$scope.userIndex]]; } } $scope.eventChartData = chartData; if(params.dimention != 'usergroup'){ $scope.lengedNames = chartData.name; } var max = 5; if(chartData.name.length > max){ $scope.myChartData = { name:chartData.name.slice(0,max), key:chartData.key, val:chartData.val.slice(0,max), rmd: ++rmd }; } else{ $scope.myChartData = UtilService.cloneJSON(chartData); } maxRet = 0; var k = data.columnkey[2]; data.val.filter(function(item){ if(item[k] > maxRet){ maxRet = item['rate_'+k]; } }); $scope.retetionLoading = false; $scope.myChartDataCondition = ToolService.getChartConditions(ddName,areport,params,expType,ddID); },function(data){ // $scope.errorBack(data.message); $scope.myChartData = ToolService.noDataChart(); $scope.infolist = {}; $scope.retetionLoading = false; $scope.infolistLoading = false; }); } var lengedMax = 10; $scope.changeChartData = function(n){ if(!$scope.myChartData){return false;} if($scope.dimenId == 'usergroup'){ var idx = $scope.lengedNames.indexOf(n); if(idx > 0 && $scope.dimenugkeys.indexOf($scope.usergroupid) != idx){ $scope.usergroupid = $scope.dimenugkeys[idx]; $scope.userIndex = idx; return false; } else if(idx == 0){ ToolService.showTips("整体不可取消"); return false; } } var namelen = $scope.myChartData.name.length,idx = $scope.myChartData.name.indexOf(n); if(idx>-1){ //删除该线 var tempData = UtilService.cloneJSON($scope.myChartData); tempData.name.splice(idx,1); tempData.val.splice(idx,1); tempData.rmd = ++rmd; $scope.myChartData = tempData; } if(namelen < lengedMax && idx == -1){ //加入 var pidx = $scope.eventChartData.name.indexOf(n); var tempData = UtilService.cloneJSON($scope.myChartData); tempData.name.push(n); tempData.val.push($scope.eventChartData.val[pidx]); tempData.rmd = ++rmd; $scope.myChartData = tempData; } } $scope.lengedBgStyle = function(n){ var idx = $scope.myChartData.name.indexOf(n); if(idx>-1){ return {"background-color":$scope.retetionConfig.color[idx],"border-color":"transparent"}; } else{ return {}; } } $scope.lengedClass = function(n){ if(!$scope.myChartData){return "";} var namelen = $scope.myChartData.name.length,idx = $scope.myChartData.name.indexOf(n); if(namelen>=lengedMax && idx==-1){ return 'disable'; } else{ return ""; } } $scope.getBgColor = function(opa,idx,flag){ if(idx<1){return {};} if(flag == 1 && maxRet > 0){ opa = Number((opa/maxRet).toFixed(2))*0.8; } else if(flag == 2 && maxDetailRet > 0){ opa = Number((opa/maxDetailRet).toFixed(2))*0.8; } else{ opa = 0; } var color = "rgba(109,199,190,"+opa+")"; return {'background-color':color}; } $scope.subDetail = function(info,idx){ if(idx>0){return false;} var nk = $scope.infolist.columnkey[0]; $scope.detailInfoTitle = info[nk]; $scope.detailInfoLoading = true; $scope.showDetail = true; var params = getParams(); var detailPM = null; $scope.detailInfo = []; params.isdevice = $scope.seeFlag == 'device'; var myreport = "",expType = "",ddID = ""; expType = "detailcustomretention"; if($scope.typesign!='define' && $scope.typesign != 'dau'){ var view = 'ds'; if($scope.timeFlag != 'day'){ view = $scope.timeFlag; } params.isdetail = true; /*myreport = "retention_" + $scope.typesign + "_dau_by" + view; 整体*/ myreport = "reportdetail/"+$scope.appid; }else if($scope.typesign == 'dau'){ params.retentiontype = "active"; } else{ if($scope.define && $scope.define.id>0){ ddID = $scope.define.id; } } //第一个整体不传参数 if($scope.detailInfoTitle != '整体'){ if($scope.dimenId && $scope.dimenId!='-all'){ if($scope.dimenId == 'usergroup'){ params.usergroupid = $scope.usergroupid; } else{ var json = {}; json[$scope.dimenId] = info[$scope.dimenId+"_key"]; json.type = $scope.dimenObj.type; params.dimention = JSON.stringify(json); } } } var areport = ""; if($scope.typesign!='define' && $scope.typesign != 'dau'){ areport = myreport; params.eventinfo = "payment,loggedin,reged"; detailPM = HttpService.getInfo('retention/'+myreport,params); }else if($scope.typesign == 'dau'){ areport = "retention/reportdetail/"+$scope.appid; params.eventinfo = "payment,loggedin,reged"; detailPM = HttpService.getInfo(areport,params); } else{ areport = "retention/reportdetail/"+$scope.appid; detailPM = HttpService.getInfo(areport,params); } params.eventType = $scope.dimenEventType; detailPM.then(function(data){ $scope.detailInfo = data; $scope.detailInfoLoading = false; maxDetailRet = 0; var k = data.columnkey[2]; data.val.filter(function(item){ if(item[k] > maxDetailRet){ maxDetailRet = item['rate_'+k]; } }); $scope.detailInfoCondition = ToolService.getChartConditions(($scope.define.name || $scope.typesname)+"的留存明细",areport,params,expType,ddID); },function(data){ // $scope.errorBack(data.message); $scope.detailInfoLoading = false; }); } $scope.$watch("appid+date.startDate+date.endDate+seeFlag+timeFlag+dimenId+defineFlag+usergroupid",function(){ if(angular.isDefined($scope.appid) && angular.isDefined($scope.date) && angular.isDefined($scope.typesign)){ $scope.query(); } }); } })();