You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
232 lines
10 KiB
232 lines
10 KiB
# 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
|