diff --git a/app/controllers/attendances_controller.rb b/app/controllers/attendances_controller.rb
new file mode 100644
index 000000000..dc30df7e3
--- /dev/null
+++ b/app/controllers/attendances_controller.rb
@@ -0,0 +1,59 @@
+class AttendancesController < ApplicationController
+
+ before_action :require_login
+ before_action :find_course, only: [:index, :statistics]
+ before_action :user_course_identity
+
+ def index
+ current_date = Date.current
+ current_end_time = Time.current.strftime("%H:%M:%S")
+
+ if params[:history]
+ @attendances = @course.course_attendances.where("attendance_date < '#{current_date}' or
+ (attendance_date = '#{current_date}' and end_time < '#{current_end_time}')")
+ if @user_course_identity == Course::STUDENT
+ member = @course.students.find_by(user_id: current_user.id)
+ group_ids = [member&.course_group_id.to_i, 0]
+ @attendances = @attendances.joins(:course_attendance_groups).where(course_attendance_groups: {course_group_id: group_ids})
+
+ attendance_ids = @attendances.pluck(:id)
+ @normal_count = @course.course_member_attendances.where(course_member_id: member&.id, course_attendance_id: attendance_ids, attendance_status: "NORMAL").size
+ @leave_count = @course.course_member_attendances.where(course_member_id: member&.id, course_attendance_id: attendance_ids, attendance_status: "LEAVE").size
+ @absence_count = @course.course_member_attendances.where(course_member_id: member&.id, course_attendance_id: attendance_ids, attendance_status: "ABSENCE").size
+ end
+ else
+ @attendances = @course.course_attendances.where("attendance_date > '#{current_date}' or
+ (attendance_date = '#{current_date}' and end_time > '#{current_end_time}')")
+ end
+ @attendances_count = @attendances.size
+
+ @attendances = @attendances.order("attendance_date desc, start_time desc")
+ @attendances = paginate @attendances.includes(:user, :course_member_attendances)
+ end
+
+ def statistics
+ current_date = Date.current
+ current_end_time = Time.current.strftime("%H:%M:%S")
+ history_attendances = @course.course_attendances.where("attendance_date < '#{current_date}' or
+ (attendance_date = '#{current_date}' and end_time < '#{current_end_time}')")
+ all_member_attendances = CourseMemberAttendance.where(course_attendance_id: history_attendances)
+ if params[:group_id].present?
+ history_attendances = history_attendances.joins(:course_attendance_groups).where(course_attendance_groups: {course_group_id: [params[:group_id], 0]})
+ all_member_attendances = all_member_attendances.joins(:course_member).where(course_members: {course_group_id: params[:group_id]})
+ end
+
+ history_attendances = history_attendances.order("attendance_date desc, start_time desc")
+ data = AttendanceStatisticsService.call history_attendances, all_member_attendances
+ @all_history_count = data[:all_history_count]
+ @history_attendances = data[:history_attendances]
+ @avg_normal_rate = data[:avg_normal_rate]
+ @avg_absence_rate = data[:avg_absence_rate]
+ @avg_leave_rate = data[:avg_leave_rate]
+ end
+
+ private
+ def find_attendance
+ @attendance = CourseAttendance.find params[:id]
+ @course = @attendance.course
+ end
+end
\ No newline at end of file
diff --git a/app/controllers/challenges_controller.rb b/app/controllers/challenges_controller.rb
index 47c8fc68c..e73243b94 100644
--- a/app/controllers/challenges_controller.rb
+++ b/app/controllers/challenges_controller.rb
@@ -162,7 +162,7 @@ class ChallengesController < ApplicationController
#@pass_games_map = @shixun.challenges.joins(:games).where(games: {status:2}).group(:challenge_id).reorder(nil).count
#@play_games_map = @shixun.challenges.joins(:games).where(games: {status:[0,1]}).group(:challenge_id).reorder(nil).count
- @challenges = @shixun.challenges.joins(join_sql).select(base_columns)
+ @challenges = @shixun.challenges.joins(join_sql).select(base_columns).uniq
#@challenges = @shixun.challenges.fields_for_list
@editable = @shixun.status == 0 # before_action:有判断权限,如果没发布,则肯定是管理人员
diff --git a/app/controllers/course_second_categories_controller.rb b/app/controllers/course_second_categories_controller.rb
index 62cbf83d9..c59ffbdbe 100644
--- a/app/controllers/course_second_categories_controller.rb
+++ b/app/controllers/course_second_categories_controller.rb
@@ -43,6 +43,12 @@ class CourseSecondCategoriesController < ApplicationController
elsif @course_module.module_type == "video"
@course.course_videos.where(course_second_category_id: @category.id).update_all(course_second_category_id: 0)
@right_url = "/classrooms/#{@course.id}/course_videos"
+ elsif @course_module.module_type == "common_homework"
+ @category.homework_commons.update_all(course_second_category_id: 0)
+ @right_url = "/classrooms/#{@course.id}/common_homeworks/#{@course_module.id}"
+ elsif @course_module.module_type == "group_homework"
+ @category.homework_commons.update_all(course_second_category_id: 0)
+ @right_url = "/classrooms/#{@course.id}/group_homeworks/#{@course_module.id}"
end
@category.destroy
diff --git a/app/controllers/myshixuns_controller.rb b/app/controllers/myshixuns_controller.rb
index 29a9a9730..e816ab667 100644
--- a/app/controllers/myshixuns_controller.rb
+++ b/app/controllers/myshixuns_controller.rb
@@ -22,23 +22,17 @@ class MyshixunsController < ApplicationController
tip_exception("403", "")
end
begin
+ @shixun = Shixun.select(:id, :identifier, :challenges_count).find(@myshixun.shixun_id)
ActiveRecord::Base.transaction do
- begin
- @shixun = Shixun.select(:id, :identifier, :challenges_count).find(@myshixun.shixun_id)
@myshixun.destroy!
- StudentWork.where(:myshixun_id => @myshixun.id).update_all(myshixun_id: 0, work_status: 0, work_score: nil,
- final_score: nil, efficiency: 0, eff_score: 0, calculation_time: nil, cost_time: 0, compelete_status: 0)
- rescue Exception => e
- logger.error("######reset_my_game_failed:#{e.message}")
- raise("ActiveRecord::RecordInvalid")
- end
+
+ StudentWork.where(:myshixun_id => @myshixun.id)
+ .update_all(myshixun_id: 0, work_status: 0, work_score: nil,
+ final_score: nil, efficiency: 0, eff_score: 0, calculation_time: nil, cost_time: 0, compelete_status: 0)
end
# 删除版本库
GitService.delete_repository(repo_path: @repo_path) unless @shixun.is_choice_type?
rescue Exception => e
- if e.message != "ActiveRecord::RecordInvalid"
- logger.error("######delete_repository_error-:#{e.message}")
- end
raise "delete_repository_error:#{e.message}"
end
end
diff --git a/app/controllers/weapps/attendances_controller.rb b/app/controllers/weapps/attendances_controller.rb
index 2ec4180a1..da22aa300 100644
--- a/app/controllers/weapps/attendances_controller.rb
+++ b/app/controllers/weapps/attendances_controller.rb
@@ -37,8 +37,14 @@ class Weapps::AttendancesController < ApplicationController
@all_member_attendances = @all_member_attendances.joins(:course_member).where(course_members: {course_group_id: params[:group_id]})
end
- @history_attendances = all_attendances.order("id asc")
- @all_history_count = @history_attendances.size
+ all_attendances = all_attendances.order("attendance_date desc, start_time desc")
+
+ data = AttendanceStatisticsService.call all_attendances, @all_member_attendances
+ @all_history_count = data[:all_history_count]
+ @history_attendances = data[:history_attendances]
+ @avg_normal_rate = data[:avg_normal_rate]
+ @avg_absence_rate = data[:avg_absence_rate]
+ @avg_leave_rate = data[:avg_leave_rate]
end
def student_attendances
diff --git a/app/models/challenge.rb b/app/models/challenge.rb
index 31a683760..38aa2812a 100644
--- a/app/models/challenge.rb
+++ b/app/models/challenge.rb
@@ -75,7 +75,7 @@ class Challenge < ApplicationRecord
if identifier.present?
shixun.task_pass || self.status != 3 ? "/tasks/#{identifier}" : ""
else
- self.position == 1 ? "/api/shixuns/#{shixun.identifier}/shixun_exec" : ""
+ self.position == 1 ? "/shixuns/#{shixun.identifier}/shixun_exec.json" : ""
end
end
@@ -143,7 +143,7 @@ class Challenge < ApplicationRecord
# 关卡用户通关数
def user_passed_count
#games.map{|g| g.status == 2}.count
- self.games.where(status: 1).count
+ self.games.where(status: 2).count
end
# 关卡用户正在挑战的人数
diff --git a/app/models/game.rb b/app/models/game.rb
index 144dbced2..d0d59c0e3 100644
--- a/app/models/game.rb
+++ b/app/models/game.rb
@@ -7,6 +7,7 @@
class Game < ApplicationRecord
default_scope { order("games.created_at desc") }
+ #TODO: games表要增加challenge_id与user_id的唯一索引
has_many :outputs, -> { order('query_index DESC') }
has_many :challenge_samples, :dependent => :destroy
has_many :game_codes, :dependent => :destroy
diff --git a/app/services/attendance_statistics_service.rb b/app/services/attendance_statistics_service.rb
new file mode 100644
index 000000000..e31049b22
--- /dev/null
+++ b/app/services/attendance_statistics_service.rb
@@ -0,0 +1,54 @@
+class AttendanceStatisticsService < ApplicationService
+
+ attr_reader :attendances, :member_attendances
+
+ def initialize(attendances, member_attendances)
+ @attendances = attendances
+ @member_attendances = member_attendances
+ end
+
+ def call
+ all_normal_rate = []
+ all_absence_rate = []
+ all_leave_rate = []
+
+ history_attendances = []
+
+ attendances.each do |attendance|
+ normal_count = history_member_count(member_attendances, "NORMAL", attendance.id)
+ absence_count = history_member_count(member_attendances, "ABSENCE", attendance.id)
+ leave_count = history_member_count(member_attendances, "LEAVE", attendance.id)
+ all_count = member_attendances.select{|member_attendance| member_attendance.course_attendance_id == attendance.id}.size
+
+ normal_rate = cal_rate(normal_count, all_count)
+ all_normal_rate << normal_rate
+ absence_rate = cal_rate(absence_count, all_count)
+ all_absence_rate << absence_rate
+ leave_rate = cal_rate(leave_count, all_count)
+ all_leave_rate << leave_rate
+
+ history_attendances << {name: attendance.name, attendance_date: attendance.attendance_date.strftime("%Y-%m-%d"),
+ start_time: attendance.start_time.strftime("%H:%M"), end_time: attendance.end_time.strftime("%H:%M"),
+ normal_rate: normal_rate, absence_rate: absence_rate, leave_rate: leave_rate}
+ end
+
+ all_history_count = history_attendances.size
+ history_attendances = history_attendances[0..9].reverse
+ avg_normal_rate = cal_rate(all_normal_rate.sum, all_history_count)
+ avg_absence_rate = cal_rate(all_absence_rate.sum, all_history_count)
+ avg_leave_rate = cal_rate(all_leave_rate.sum, all_history_count)
+
+ {all_history_count: all_history_count, history_attendances: history_attendances, avg_normal_rate: avg_normal_rate,
+ avg_absence_rate: avg_absence_rate, avg_leave_rate: avg_leave_rate}
+ end
+
+ private
+
+ def history_member_count member_attendances, status, attendance_id
+ member_attendances.select{|member_attendance| member_attendance.attendance_status == status && member_attendance.course_attendance_id == attendance_id}.size
+ end
+
+ def cal_rate base, sum
+ sum == 0 ? 0 : (base.to_f / sum)
+ end
+end
\ No newline at end of file
diff --git a/app/views/attendances/index.json.jbuilder b/app/views/attendances/index.json.jbuilder
new file mode 100644
index 000000000..8a4dd2bb1
--- /dev/null
+++ b/app/views/attendances/index.json.jbuilder
@@ -0,0 +1,24 @@
+json.attendances @attendances do |attendance|
+ json.(attendance, :id, :name, :normal_count, :all_count, :mode)
+ json.author do
+ user = attendance.user
+ json.user_name user.real_name
+ json.user_login user.login
+ end
+ json.attendance_date attendance.attendance_date.strftime("%Y-%m-%d")
+ json.start_time attendance.start_time.strftime("%H:%M")
+ json.end_time attendance.end_time.strftime("%H:%M")
+ json.edit_auth @user_course_identity < Course::PROFESSOR || attendance.user_id == User.current.id
+
+ if @user_course_identity == Course::STUDENT
+ json.attendance_status student_attendance_status(attendance, User.current)
+ end
+end
+
+json.attendances_count @attendances_count
+
+if @user_course_identity == Course::STUDENT
+ json.normal_count @normal_count
+ json.leave_count @leave_count
+ json.absence_count @absence_count
+end
\ No newline at end of file
diff --git a/app/views/attendances/statistics.json.jbuilder b/app/views/attendances/statistics.json.jbuilder
new file mode 100644
index 000000000..d07f234d6
--- /dev/null
+++ b/app/views/attendances/statistics.json.jbuilder
@@ -0,0 +1,10 @@
+
+json.history_attendances @history_attendances.each_with_index.to_a do |attendance, index|
+ json.(attendance, :name, :attendance_date, :start_time, :end_time, :normal_rate, :absence_rate, :leave_rate)
+ json.index "签到#{index + 1}"
+end
+
+json.all_history_count @all_history_count
+json.avg_normal_rate @avg_normal_rate
+json.avg_absence_rate @avg_absence_rate
+json.avg_leave_rate @avg_leave_rate
\ No newline at end of file
diff --git a/app/views/weapps/attendances/index.json.jbuilder b/app/views/weapps/attendances/index.json.jbuilder
index da8be3c8d..0770bb6f6 100644
--- a/app/views/weapps/attendances/index.json.jbuilder
+++ b/app/views/weapps/attendances/index.json.jbuilder
@@ -5,25 +5,12 @@ json.current_attendance @current_attendance do |attendance|
json.end_time attendance.end_time.strftime("%H:%M")
end
-all_normal_rate = []
-all_absence_rate = []
-all_leave_rate = []
json.history_attendances @history_attendances.each_with_index.to_a do |attendance, index|
- normal_count = history_member_count(@all_member_attendances, "NORMAL", attendance.id)
- absence_count = history_member_count(@all_member_attendances, "ABSENCE", attendance.id)
- leave_count = history_member_count(@all_member_attendances, "LEAVE", attendance.id)
- all_count = @all_member_attendances.select{|member_attendance| member_attendance.course_attendance_id == attendance.id}.size
-
+ json.(attendance, :name, :attendance_date, :start_time, :end_time, :normal_rate, :absence_rate, :leave_rate)
json.index index + 1
- json.normal_rate cal_rate(normal_count, all_count)
- all_normal_rate << cal_rate(normal_count, all_count)
- json.absence_rate cal_rate(absence_count, all_count)
- all_absence_rate << cal_rate(absence_count, all_count)
- json.leave_rate cal_rate(leave_count, all_count)
- all_leave_rate << cal_rate(leave_count, all_count)
end
json.all_history_count @all_history_count
-json.avg_normal_rate @all_history_count == 0 ? 0 : all_normal_rate.sum / @all_history_count
-json.avg_absence_rate @all_history_count == 0 ? 0 : all_absence_rate.sum / @all_history_count
-json.avg_leave_rate @all_history_count == 0 ? 0 : all_leave_rate.sum / @all_history_count
+json.avg_normal_rate @avg_normal_rate
+json.avg_absence_rate @avg_absence_rate
+json.avg_leave_rate @avg_leave_rate
diff --git a/config/routes.rb b/config/routes.rb
index bcab93203..6c3efcfe8 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -550,6 +550,10 @@ Rails.application.routes.draw do
end
end
+ resources :attendances, shallow: true do
+ get :statistics, on: :collection
+ end
+
resources :polls, only:[:index,:new,:create] do
collection do
post :publish # 立即发布
diff --git a/lib/tasks/schools.rake b/lib/tasks/schools.rake
new file mode 100644
index 000000000..a788d57d1
--- /dev/null
+++ b/lib/tasks/schools.rake
@@ -0,0 +1,28 @@
+#coding=utf-8
+
+desc "合并高校的数据,第一个参数是: 正确高校的id, 第二个参数是: 错误高校需要合并到正确高校的id"
+# 命令: bundle exec rake schools:merge_school_data f_school=1 s_school=2,3
+namespace :schools do
+ task merge_school_data: :environment do
+ f_school = ENV['f_school'].to_i
+ school = School.find_by(id: f_school)
+ return if school.blank?
+
+ s_school = ENV['s_school'].split(",")
+ merge_schools = School.where(id: s_school)
+
+ # 改变用户的学校id 和 单位
+ UserExtension.where(school_id: merge_schools)
+ .update_all(school_id: f_school, department_id: nil)
+
+ # 改变课堂的学校id
+ Course.where(school_id: merge_schools).update_all(school_id: f_school)
+
+ # 实训报告表迁移数据
+ s_report = SchoolReport.find_by(school_id: f_school)
+ SchoolReport.where(school_id: merge_schools).each do |sr|
+ s_report.update_column(:shixun_evaluate_count, (s_report.shixun_evaluate_count+sr.shixun_evaluate_count))
+ sr.update(shixun_evaluate_count: 0)
+ end
+ end
+end
\ No newline at end of file
diff --git a/lib/tasks/video_transcode.rake b/lib/tasks/video_transcode.rake
index 995f9a82f..4fb7c17bd 100644
--- a/lib/tasks/video_transcode.rake
+++ b/lib/tasks/video_transcode.rake
@@ -2,13 +2,18 @@
namespace :video_transcode do
desc "视频转码成h264"
task :submit => :environment do
- Video.find_each do |v|
- if v.uuid && !v.transcoded && !v.file_url.include?('.mp4') && !AliyunVod::Service.get_meta_code_info(v.uuid)[:codecnamne].start_with?("h264", "h265")
- p "--- Start submit video trans code #{v.uuid}"
- AliyunVod::Service.submit_transcode_job(v.uuid, 'a0277c5c0c7458458e171b0cee6ebf5e')
- else
+ i = []
+ Video.where.not(uuid: nil, file_url: nil).where(transcoded: false, status: "published").find_each do |v|
+ code_info = AliyunVod::Service.get_meta_code_info(v.uuid)
+ if v.file_url.include?('.mp4') && code_info[:codecnamne]&.include?("h264")
v.update(transcoded: true)
+ else
+ puts("uuid: #{v.uuid}")
+ i << "#{v.id}, #{v.file_url}, #{code_info[:codecnamne]}"
+ AliyunVod::Service.submit_transcode_job(v.uuid, 'a0277c5c0c7458458e171b0cee6ebf5e')
end
end
+ puts "###########转码个数:#{i.size}"
+ puts "###########id,file_url, codecnamne:#{i}"
end
end
\ No newline at end of file
diff --git a/public/react/src/common/components/comment/util.js b/public/react/src/common/components/comment/util.js
index 2b4f36a85..8694161a3 100644
--- a/public/react/src/common/components/comment/util.js
+++ b/public/react/src/common/components/comment/util.js
@@ -1,7 +1,7 @@
/*
* @Description: quill delta -> html
* @Author: tangjiang
- * @Github:
+ * @Github:
* @Date: 2019-12-24 08:51:25
* @LastEditors : tangjiang
* @LastEditTime : 2019-12-26 09:30:11
@@ -55,7 +55,7 @@ export const formatDelta = (deltas) => {
*/
export const operate = (text, key, value) => {
let operatedText = null;
- debugger;
+
switch (key) {
case 'bold':
operatedText = `${text}`;
@@ -72,7 +72,7 @@ export const operate = (text, key, value) => {
case 'link':
operatedText = `${text}`;
break;
- default:
+ default:
operatedText = text;
}
diff --git a/public/react/src/modules/competitions/Competitioncommon/CompetitionCommonChild/CompetitionContentsMd.js b/public/react/src/modules/competitions/Competitioncommon/CompetitionCommonChild/CompetitionContentsMd.js
index 9ea972177..0cae1e2a6 100644
--- a/public/react/src/modules/competitions/Competitioncommon/CompetitionCommonChild/CompetitionContentsMd.js
+++ b/public/react/src/modules/competitions/Competitioncommon/CompetitionCommonChild/CompetitionContentsMd.js
@@ -34,7 +34,7 @@ class CompetitionContentsMd extends Component{
}else{
chart_rules.rule_contents.map((items,keys)=>{
- debugger
+
if(parseInt(this.props.tabkey)===items.competition_stage_id){
console.log(items)
this.contentMdRef.current.setValue(items.content);
diff --git a/public/react/src/modules/courses/Index.js b/public/react/src/modules/courses/Index.js
index 69c8b16ea..30a3511c8 100644
--- a/public/react/src/modules/courses/Index.js
+++ b/public/react/src/modules/courses/Index.js
@@ -684,12 +684,24 @@ class CoursesIndex extends Component{
(props) => (
+
{canNotLink? @@ -199,7 +199,13 @@ class CommonWorkItem extends Component{ } */}
-
+ {
+ item && item.upper_category_name &&
+ //
{ item.author && {item.author} }
{item.commit_count===undefined?"":{item.commit_count} 已交}
{item.uncommit_count===undefined?"":{item.uncommit_count} 未交}
diff --git a/public/react/src/modules/courses/busyWork/Index.js b/public/react/src/modules/courses/busyWork/Index.js
index b204a7b47..308950ab6 100644
--- a/public/react/src/modules/courses/busyWork/Index.js
+++ b/public/react/src/modules/courses/busyWork/Index.js
@@ -68,6 +68,12 @@ class CoursesWorkIndex extends Component{
(props) => (
{moduleChineseName} - +
+ {this.setState({dirSearchValue: e.target.value})}}/> +
} + { + course_module && course_module.filter((item)=> { + return item.id != bid && (!this.state.dirSearchValue || item.name.indexOf(this.state.dirSearchValue) != -1) + }).map( (item, index) => { + return