forked from jasder/forgeplus
107 lines
3.8 KiB
Ruby
107 lines
3.8 KiB
Ruby
class Admins::StatisticSchoolDataGrowService < ApplicationService
|
||
include CustomSortable
|
||
|
||
PAGE_SIZE = 20
|
||
|
||
attr_reader :params
|
||
|
||
sort_columns :teacher_increase_count, :student_increase_count,
|
||
:course_increase_count, :shixun_increase_count, :uniq_active_user_count,
|
||
:shixun_homework_count, :shixun_evaluate_count,
|
||
default_by: :teacher_increase_count, default_direction: :desc
|
||
|
||
def initialize(params)
|
||
@params = params
|
||
end
|
||
|
||
def call
|
||
reports = School.where(nil)
|
||
|
||
reports = search_filter(reports)
|
||
|
||
count = reports.count
|
||
|
||
subquery = SchoolDailyActiveUser.select('COUNT(distinct(user_id))').joins(:school_daily_report)
|
||
.where(date_condition_sql).where("school_id is not null and school_id = schools.id").to_sql
|
||
reports = reports.joins("LEFT JOIN school_daily_reports sdr ON sdr.school_id = schools.id AND #{date_condition_sql}")
|
||
reports = reports.select(
|
||
'schools.id school_id, schools.name school_name,'\
|
||
'SUM(teacher_increase_count) teacher_increase_count,'\
|
||
'SUM(student_increase_count) student_increase_count,'\
|
||
'SUM(course_increase_count) course_increase_count,'\
|
||
'SUM(shixun_increase_count) shixun_increase_count,'\
|
||
'SUM(shixun_homework_count) shixun_homework_count,'\
|
||
'SUM(shixun_evaluate_count) shixun_evaluate_count,'\
|
||
"(#{subquery}) uniq_active_user_count,"\
|
||
'SUM(active_user_count) active_user_count').group('schools.id')
|
||
|
||
reports = custom_sort(reports, params[:sort_by], params[:sort_direction])
|
||
reports = reports.order('school_id asc').limit(PAGE_SIZE).offset(offset)
|
||
|
||
[count, reports]
|
||
end
|
||
|
||
def grow_summary
|
||
@_grow_summary ||= begin
|
||
reports = School.joins("LEFT JOIN school_daily_reports sdr ON sdr.school_id = schools.id")
|
||
.where(date_condition_sql)
|
||
|
||
subquery = SchoolDailyActiveUser.select('COUNT(distinct user_id)')
|
||
.joins('LEFT JOIN school_daily_reports sdr ON sdr.id = school_daily_active_users.school_daily_report_id')
|
||
.where(date_condition_sql).to_sql
|
||
reports = search_filter(reports)
|
||
reports.select(
|
||
'SUM(teacher_increase_count) teacher_increase_count,'\
|
||
'SUM(student_increase_count) student_increase_count,'\
|
||
'SUM(course_increase_count) course_increase_count,'\
|
||
'SUM(shixun_increase_count) shixun_increase_count,'\
|
||
'SUM(shixun_homework_count) shixun_homework_count,'\
|
||
'SUM(shixun_evaluate_count) shixun_evaluate_count,'\
|
||
"(#{subquery}) uniq_active_user_count,"\
|
||
'SUM(active_user_count) active_user_count'
|
||
).first
|
||
end
|
||
end
|
||
|
||
private
|
||
|
||
def search_filter(relations)
|
||
keyword = params[:keyword].try(:to_s).try(:strip)
|
||
if keyword.present?
|
||
relations = relations.where("schools.name LIKE :keyword OR schools.id LIKE :keyword", keyword: "%#{keyword}%")
|
||
end
|
||
|
||
relations
|
||
end
|
||
|
||
def date_condition_sql
|
||
date = query_date
|
||
if date.is_a?(Range)
|
||
"date BETWEEN '#{date.min.strftime('%Y-%m-%d')}' AND '#{date.max.strftime('%Y-%m-%d')}'"
|
||
else
|
||
"date = '#{date.strftime('%Y-%m-%d')}'"
|
||
end
|
||
end
|
||
|
||
def query_date
|
||
if params[:grow_begin_date].present?
|
||
begin_time = Time.zone.parse(params[:grow_begin_date])
|
||
end_date = if params[:grow_end_date].present?
|
||
Time.zone.parse(params[:grow_end_date])
|
||
end
|
||
|
||
end_date.blank? || end_date == begin_time ? begin_time : begin_time..end_date
|
||
else
|
||
yesterday
|
||
end
|
||
end
|
||
|
||
def yesterday
|
||
# 每日凌晨5点为节点, 25日凌晨4点、3点、2点等等,未到更新数据时间点,看到的数据是:23日-24日的统计数据
|
||
(Time.zone.now - 5.hours).beginning_of_day - 1.days
|
||
end
|
||
|
||
def offset
|
||
(params[:page].to_i.zero? ? 0 : params[:page].to_i - 1) * PAGE_SIZE
|
||
end
|
||
end |