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.
pgfqe6ch8/app/controllers/statistics_controller.rb

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