# encoding: utf-8 class StatisticsController < ApplicationController layout "statictis" # before_filter :allowed_user before_filter :find_rate def index render file: 'public/react/build/index.html', :layout => false end # 用户活跃度(按月份的) def user_active_for_months @start_time = params[:start_time] || "2016-03-01" @end_time = params[:end_time] || Time.now.strftime("%Y-%m-%d") sql = "select a.x_count, ceil(if(count(*)<1000, count(*)+#{@base_score.to_i}, count(*))*#{@rate.to_i}) as y_count from (SELECT user_id, DATE_FORMAT(created_at,'%Y-%m') as x_count FROM `user_actions` where created_at between '#{@start_time} 00:00:00' and '#{@end_time} 23:59:59' group by x_count, user_id order by created_at) a group by a.x_count" count_datas = UserActions.find_by_sql(sql) respond_to do |format| format.xls{ filename = "用户活跃度_#{Time.now}.xls" send_data(user_list_xls(count_datas), :type => 'application/octet-stream', :filename => filename_for_content_disposition(filename)) } end end # 用户数据 def user_datas t1 = Time.now - 24*3600 shixuns_count = Shixun.where("created_at > ?", t1).count tainings_count = EvaluateRecord.where("created_at > ?", t1).count homeworks_count = StudentWork.where("created_at > ?", t1).count courses_count = Course.where("created_at > ?", t1).count messages_count = Message.where("created_on > ?", t1).count + JournalsForMessage.where("created_on > ?", t1).count render :json => {:shixuns_count => shixuns_count, :tainings_count => tainings_count, :homeworks_count => homeworks_count, :courses_count => courses_count, :messages_count => messages_count} end # 每个月情况: 取当前日期最近的30天 def per_month end_time = Time.now.strftime("%Y-%m-%d ") + "23:59:59" start_time = (Time.now - 30*24*3600).strftime("%Y-%m-%d ") + "00:00:00" sql = "SELECT DATE_FORMAT(last_login_on,'%Y-%m-%d') as x_count, ceil(if(count(*)<1000, count(*)+#{@base_score}, count(*))*#{@rate}) as y_count FROM `users` where last_login_on between '#{start_time}' and '#{end_time}' group by DAYOFMONTH(last_login_on) order by last_login_on" count_datas = User.connection.select_all(sql) # list = [] # # 格式转换 # 31.times do |i| # if count_datas.select{|cd| cd["x_count"].to_i == (i+1)}.present? # list << {:x_count => i+1, :y_count => count_datas.select{|cd| cd["x_count"].to_i == (i+1)}.first["y_count"]} # else # list << {:x_count => i+1, :y_count => 0} # end # end # # list.sort_by do |p| # p['x_count'] # end render :json => {:data => count_datas} end # 每周情况 def per_week t1 = Time.now swap = (t1 - params[:day].to_i*24*3600).strftime("%Y-%m-%d ") start_time = swap + "00:00:00" end_time = swap + "23:59:59" sql = "SELECT FROM_UNIXTIME( UNIX_TIMESTAMP( last_login_on ), '%H' ) AS x_count, ceil(if(count(*)<1000, count(*)+#{@base_score/24}, count(*))*#{@rate}) AS y_count FROM users WHERE last_login_on between '#{start_time}' AND '#{end_time}' GROUP BY x_count" count_datas = User.connection.select_all(sql) # 24.times do |i| # if count_datas.select{|cd| cd["lt"].to_i == i}.present? # list << {:lt => i, :y_count => count_datas.select{|cd| cd["x_count"].to_i == (i+1)}.first["y_count"]} # else # list << {:x_count => i+1, :y_count => 0} # end # end render :json => {:data => count_datas} end # 学校数据 # 以学校为单位,学校名称、该学校下的学生数、老师数、对应总实训个数、所有实训的累计时长、所有学生在线总时长(表格数据提供) def school_datas limit = 10 offset = (params[:page].to_i - 1) * limit sql = "SELECT count(*) as users_count, ue.school_id school_id, s.name school_name FROM `user_extensions` ue, schools s where ue.school_id =s.id and ue.school_id is not null group by ue.school_id order by users_count desc limit #{limit} offset #{offset}" data = [] UserExtensions.find_by_sql(sql).each do |ue| students_count = UserExtensions.where(:identity => 0, :school_id => ue.school_id).count teachers_count = UserExtensions.where(:identity => 1, :school_id => ue.school_id).count shixuns_count = Shixun.find_by_sql("select count(s.id) as shixun_count from users u right join shixuns s on u.id=s.user_id and s.status in (2, 3) inner join user_extensions ue on u.id=ue.user_id and ue.school_id=#{ue.school_id}").first.try(:shixun_count) shixun_total_time = (Game.find_by_sql("select sum(g.end_time-g.open_time) cost_time from users u left join games g on u.id=g.user_id inner join user_extensions ue on u.id=ue.user_id and ue.school_id=#{ue.school_id}").first.try(:cost_time).to_i / (24*60*60.0)).ceil students_online_time = (Game.find_by_sql("select sum(g.cost_time) cost_time from users u left join games g on u.id=g.user_id inner join user_extensions ue on u.id=ue.user_id and ue.school_id=#{ue.school_id}").first.try(:cost_time).to_i / (24*60*60.0)).ceil data << {:school_name => ue.school_name, :students_count => students_count, :teachers_count => teachers_count, :shixuns_count => shixuns_count, :shixun_total_time => shixun_total_time, :students_online_time => students_online_time} end render :json => {:data => data} end # 用户增长数 def user_info sql = "SELECT DATE_FORMAT(created_on,'%Y-%m') as x_count, ceil(if(count(*)<1000, count(*)+#{@base_score}, count(*))*#{@rate}) as y_count FROM `users` where created_on between '#{@start_time}-01 00:00:00' and '#{@end_time}-31 23:59:59' group by x_count order by created_on" users = User.find_by_sql(sql) xls_report = StringIO.new book = Spreadsheet::Workbook.new sheet1 = book.create_worksheet :name => "sheet" blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10 sheet1.row(0).default_format = blue sheet1.row(0).concat(["时间","增涨总数"]) count_row = 1 users.each do |user| sheet1[count_row, 0] = user['x_count'] sheet1[count_row, 1] = user['y_count'] count_row += 1 end book.write xls_report send_data(xls_report.string, :type => "text/excel;charset=utf-8; header=present", :filename => filename_for_content_disposition("用户增长数.xls")) end def top_schools sql = "SELECT DATE_FORMAT(created_at,'%Y-%m') as time from user_extensions where created_at between '#{@start_time}-01 00:00:00' and '#{@end_time}-31 23:59:59' group by time" times = UserExtensions.connection.select_all(sql) xls_report = StringIO.new book = Spreadsheet::Workbook.new sheet1 = book.create_worksheet :name => "sheet" blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10 sheet1.row(0).default_format = blue sheet1.row(0).concat(["时间","高校1","增加总数","高校2","增加总数","高校3","增加总数"]) count_row = 1 times.each do |time| sql2 = "select count(*) as count, s.name from user_extensions ue, schools s where ue.school_id=s.id and ue.created_at between '#{time['time']}-01 00:00:00' and '#{time['time']}-31 23:59:59' group by school_id order by count desc limit 3" user = UserExtensions.find_by_sql(sql2) if user.length > 2 sheet1[count_row, 0] = time['time'] sheet1[count_row, 1] = user[0]['name'] sheet1[count_row, 2] = user[0]['count'] sheet1[count_row, 3] = user[1]['name'] sheet1[count_row, 4] = user[1]['count'] sheet1[count_row, 5] = user[2]['name'] sheet1[count_row, 6] = user[2]['count'] count_row += 1 end end book.write xls_report send_data(xls_report.string, :type => "text/excel;charset=utf-8; header=present", :filename => filename_for_content_disposition("学校增长top3.xls")) end # 每个学校的活跃用户数 def school_active_user_count sql = "SELECT ceil(if(count(users.id)<1000, count(users.id)+#{@base_score}, count(users.id))*#{@rate}) as y_count, s.name as s_name FROM users, schools s, user_extensions ue WHERE last_login_on between '#{Time.parse(@start_time)}' and '#{Time.parse(@end_time)}' AND users.id=ue.user_id AND s.id = ue.school_id GROUP BY ue.school_id ORDER BY y_count DESC" datas = User.find_by_sql(sql) xls_report = StringIO.new book = Spreadsheet::Workbook.new sheet1 = book.create_worksheet :name => "学校用户活跃数" sheet1.row(0).concat(["序号","学校","活跃用户数"]) count_row = 1 datas.each_with_index do |data, index| sheet1[count_row,0] = index + 1 sheet1[count_row,1] = data.s_name sheet1[count_row,2] = data.y_count count_row += 1 end book.write xls_report send_data(xls_report.string, :type => "text/excel;charset=utf-8; header=present", :filename => filename_for_content_disposition("学校活跃用户数.xls")) end def settings unless User.curren.admin? render_403 end render file: 'public/react/build/index.html', :layout => false end def set_rate rate = Statistic.first if rate rate.update_column(:rate, params[:rate]) else Statistic.create(:rate => params[:rate]) end end def allowed_user unless (User.current.admin? || User.current.login == "forge01") render_403 end end def find_rate @rate = params[:rate] || 1 @base_score = params[:base_score] || 0 @start_time = params[:start_time] || Time.now.strftime('%Y-%m-%d %H:%M:%S') @end_time = params[:end_time] || Time.now.strftime('%Y-%m-%d %H:%M:%S') end def user_list_xls users xls_report = StringIO.new book = Spreadsheet::Workbook.new sheet1 = book.create_worksheet :name => "sheet" blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10 sheet1.row(0).default_format = blue sheet1.row(0).concat(["时间","数目"]) count_row = 1 users.each do |user| sheet1[count_row, 0] = user['x_count'] sheet1[count_row, 1] = user['y_count'] count_row += 1 end book.write xls_report xls_report.string end end