From f7093d1dd5ba41d9d27f807a81f8cc784d28caf6 Mon Sep 17 00:00:00 2001 From: xiaoxiaoqiong Date: Wed, 26 May 2021 18:02:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=8B=E5=B7=A5=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../statistic_school_daily_report1_task.rb | 72 +++++++++++++++++++ .../statistic_school_daily_report2_task.rb | 72 +++++++++++++++++++ .../statistic_school_daily_report_task.rb | 4 +- lib/tasks/statistic_school_daily_report.rake | 7 ++ 4 files changed, 153 insertions(+), 2 deletions(-) create mode 100644 app/tasks/statistic_school_daily_report1_task.rb create mode 100644 app/tasks/statistic_school_daily_report2_task.rb diff --git a/app/tasks/statistic_school_daily_report1_task.rb b/app/tasks/statistic_school_daily_report1_task.rb new file mode 100644 index 00000000..2ae9a121 --- /dev/null +++ b/app/tasks/statistic_school_daily_report1_task.rb @@ -0,0 +1,72 @@ +class StatisticSchoolDailyReport1Task + def call + School.find_each do |school| + # 新增教师和学生 + users = User.joins(:user_extensions) + .where(user_extensions: {school_id: school.id}) + + teacher_count = users.where(created_on: yesterday, user_extensions: {identity: User::TEACHER}).count + student_count = users.where(created_on: yesterday, user_extensions: {identity: User::STUDENT}).count + professional_count = users.where(created_on: yesterday, user_extensions: {identity: User::ENTERPRISE}).count + + # 活跃用户 + active_user_ids = users.where(last_login_on: yesterday).pluck(:id) + active_user_count = active_user_ids.size + + + # 新增课堂 + course_count = school.courses.where(created_at: yesterday).count + + # 新增实训 + shixun_count = Shixun.joins(creator: :user_extensions) + .where(user_extensions: {identity: User::TEACHER, school_id: school.id}) + .where(created_at: yesterday).count + # 新增实训作业数 + shixun_homework_count = HomeworkCommon.joins(:course).where(courses: {school_id: school.id}) + .where(homework_type: 4, created_at: yesterday).count + + # 新增实训评测数量 + shixun_evaluate_count = EvaluateRecord.joins('LEFT JOIN homework_commons_shixuns hcs ON hcs.shixun_id = evaluate_records.shixun_id') + .joins('LEFT JOIN homework_commons hc ON hcs.homework_common_id = hc.id AND hc.homework_type = 4') + .joins('LEFT JOIN course_members ON course_members.user_id = evaluate_records.user_id') + .joins('LEFT JOIN courses ON course_members.course_id = courses.id AND hc.course_id = courses.id') + .where(courses: {school_id: school.id}) + .where(created_at: yesterday).reorder(nil).count + # shixun_evaluate_count = 0 + + # 无有效数据时不记录 + data = [teacher_count, student_count, professional_count, course_count, shixun_count, active_user_count, + shixun_homework_count, shixun_evaluate_count] + next if data.all?(&:zero?) + + create_params = { + school_id: school.id, school_name: school.name, teacher_increase_count: teacher_count, + student_increase_count: student_count, professional_increase_count: professional_count, course_increase_count: course_count, + shixun_homework_count: shixun_homework_count, shixun_evaluate_count: shixun_evaluate_count, + shixun_increase_count: shixun_count, active_user_count: active_user_count, date: current_date + } + report = SchoolDailyReport.create!(create_params) + + if active_user_ids.present? + values = '(' + active_user_ids.join(", #{report.id}),(") + ", #{report.id})" + user_sql = "INSERT INTO school_daily_active_users(user_id, school_daily_report_id) VALUES#{values}" + SchoolDailyActiveUser.connection.execute(user_sql) + end + end + end + + private + + def current_date + @_current_date ||= Time.parse("2021-05-20") - 1.day + end + + def yesterday + @_yesterday ||= begin + # 每日凌晨2点为节点 + end_time = Time.parse("2021-05-20") + 2.hour + begin_time = end_time - 1.day + begin_time..end_time + end + end +end diff --git a/app/tasks/statistic_school_daily_report2_task.rb b/app/tasks/statistic_school_daily_report2_task.rb new file mode 100644 index 00000000..ad573041 --- /dev/null +++ b/app/tasks/statistic_school_daily_report2_task.rb @@ -0,0 +1,72 @@ +class StatisticSchoolDailyReport2Task + def call + School.find_each do |school| + # 新增教师和学生 + users = User.joins(:user_extensions) + .where(user_extensions: {school_id: school.id}) + + teacher_count = users.where(created_on: yesterday, user_extensions: {identity: User::TEACHER}).count + student_count = users.where(created_on: yesterday, user_extensions: {identity: User::STUDENT}).count + professional_count = users.where(created_on: yesterday, user_extensions: {identity: User::ENTERPRISE}).count + + # 活跃用户 + active_user_ids = users.where(last_login_on: yesterday).pluck(:id) + active_user_count = active_user_ids.size + + + # 新增课堂 + course_count = school.courses.where(created_at: yesterday).count + + # 新增实训 + shixun_count = Shixun.joins(creator: :user_extensions) + .where(user_extensions: {identity: User::TEACHER, school_id: school.id}) + .where(created_at: yesterday).count + # 新增实训作业数 + shixun_homework_count = HomeworkCommon.joins(:course).where(courses: {school_id: school.id}) + .where(homework_type: 4, created_at: yesterday).count + + # 新增实训评测数量 + shixun_evaluate_count = EvaluateRecord.joins('LEFT JOIN homework_commons_shixuns hcs ON hcs.shixun_id = evaluate_records.shixun_id') + .joins('LEFT JOIN homework_commons hc ON hcs.homework_common_id = hc.id AND hc.homework_type = 4') + .joins('LEFT JOIN course_members ON course_members.user_id = evaluate_records.user_id') + .joins('LEFT JOIN courses ON course_members.course_id = courses.id AND hc.course_id = courses.id') + .where(courses: {school_id: school.id}) + .where(created_at: yesterday).reorder(nil).count + # shixun_evaluate_count = 0 + + # 无有效数据时不记录 + data = [teacher_count, student_count, professional_count, course_count, shixun_count, active_user_count, + shixun_homework_count, shixun_evaluate_count] + next if data.all?(&:zero?) + + create_params = { + school_id: school.id, school_name: school.name, teacher_increase_count: teacher_count, + student_increase_count: student_count, professional_increase_count: professional_count, course_increase_count: course_count, + shixun_homework_count: shixun_homework_count, shixun_evaluate_count: shixun_evaluate_count, + shixun_increase_count: shixun_count, active_user_count: active_user_count, date: current_date + } + report = SchoolDailyReport.create!(create_params) + + if active_user_ids.present? + values = '(' + active_user_ids.join(", #{report.id}),(") + ", #{report.id})" + user_sql = "INSERT INTO school_daily_active_users(user_id, school_daily_report_id) VALUES#{values}" + SchoolDailyActiveUser.connection.execute(user_sql) + end + end + end + + private + + def current_date + @_current_date ||= Time.parse("2021-05-21") - 1.day + end + + def yesterday + @_yesterday ||= begin + # 每日凌晨2点为节点 + end_time = Time.parse("2021-05-21") + 2.hour + begin_time = end_time - 1.day + begin_time..end_time + end + end +end diff --git a/app/tasks/statistic_school_daily_report_task.rb b/app/tasks/statistic_school_daily_report_task.rb index d367ae9e..4955c1e9 100644 --- a/app/tasks/statistic_school_daily_report_task.rb +++ b/app/tasks/statistic_school_daily_report_task.rb @@ -57,13 +57,13 @@ class StatisticSchoolDailyReportTask private def current_date - @_current_date ||= Time.parse("2021-05-20") - 1.day + @_current_date ||= Time.zone.now.beginning_of_day - 1.day end def yesterday @_yesterday ||= begin # 每日凌晨2点为节点 - end_time = Time.parse("2021-05-20") + 2.hour + end_time = Time.zone.now.beginning_of_day + 2.hour begin_time = end_time - 1.day begin_time..end_time end diff --git a/lib/tasks/statistic_school_daily_report.rake b/lib/tasks/statistic_school_daily_report.rake index 6bfa58bb..ca9ba1c6 100644 --- a/lib/tasks/statistic_school_daily_report.rake +++ b/lib/tasks/statistic_school_daily_report.rake @@ -6,6 +6,13 @@ namespace :school_daily_report do StatisticSchoolDailyReportTask.new.call end + task daily_statistic19: :environment do + StatisticSchoolDailyReport1Task.new.call + end + task daily_statistic20: :environment do + StatisticSchoolDailyReport2Task.new.call + end + desc 'statistic school daily report data before now' task :statistic, [:date] => :environment do |_, args| date = Time.zone.parse(args[:date]).beginning_of_day