diff --git a/app/controllers/admins/shixun_settings_controller.rb b/app/controllers/admins/shixun_settings_controller.rb
index 0ccd5725d..9202ccce6 100644
--- a/app/controllers/admins/shixun_settings_controller.rb
+++ b/app/controllers/admins/shixun_settings_controller.rb
@@ -92,6 +92,6 @@ class Admins::ShixunSettingsController < Admins::BaseController
end
def setting_params
- params.permit(:use_scope,:excute_time,:close,:status,:can_copy,:webssh,:hidden,:homepage_show,:task_pass,:code_hidden,:id,tag_repertoires:[])
+ params.permit(:use_scope,:excute_time,:close,:status,:can_copy,:webssh,:hidden,:homepage_show,:task_pass,:code_hidden,:page_no, :id,tag_repertoires:[])
end
end
diff --git a/app/controllers/exercises_controller.rb b/app/controllers/exercises_controller.rb
index 30fef596d..ac18754cd 100644
--- a/app/controllers/exercises_controller.rb
+++ b/app/controllers/exercises_controller.rb
@@ -683,12 +683,34 @@ class ExercisesController < ApplicationController
end
end
+ # 详情页的立即发布弹框
+ def publish_groups
+ @current_user = current_user
+ # 可立即发布的分班:当前用户管理的分班去除已发布的分班
+ group_ids = @course.charge_group_ids(@current_user) - @exercise.exercise_group_settings.exercise_group_published.pluck(:course_group_id)
+ @course_groups = @course.course_groups.where(id: group_ids)
+ @group_settings = @exercise.exercise_group_settings.where(id: group_ids)
+ end
+
#首页批量或单独 立即发布,应是跳出弹窗,设置开始时间和截止时间。
def publish
- tip_exception("缺少截止时间参数") if params[:end_time].blank?
- tip_exception("截止时间不能早于当前时间") if params[:end_time] <= strf_time(Time.now)
- tip_exception("截止时间不能晚于课堂结束时间(#{@course.end_date.end_of_day.strftime("%Y-%m-%d %H:%M")})") if
- @course.end_date.present? && params[:end_time] > strf_time(@course.end_date.end_of_day)
+ if params[:detail].blank?
+ tip_exception("缺少截止时间参数") if params[:end_time].blank?
+ tip_exception("截止时间不能早于当前时间") if params[:end_time] <= strf_time(Time.now)
+ tip_exception("截止时间不能晚于课堂结束时间(#{@course.end_date.end_of_day.strftime("%Y-%m-%d %H:%M")})") if
+ @course.end_date.present? && params[:end_time] > strf_time(@course.end_date.end_of_day)
+ else
+ group_end_times = params[:group_end_times].reject(&:blank?).map{|time| time.to_time}
+ group_ids = params[:group_ids].reject(&:blank?)
+ tip_exception("缺少截止时间参数") if group_end_times.blank?
+ tip_exception("截止时间和分班参数的个数不一致") if group_end_times.length != group_ids.length
+ group_end_times.each do |time|
+ tip_exception("分班截止时间不能早于当前时间") if time <= Time.now
+ tip_exception("分班截止时间不能晚于课堂结束时间(#{@course.end_date.end_of_day.strftime("%Y-%m-%d %H:%M")})") if
+ @course.end_date.present? && time > @course.end_date.end_of_day
+ end
+ end
+
ActiveRecord::Base.transaction do
begin
check_ids = Exercise.where(id: params[:check_ids])
@@ -702,28 +724,30 @@ class ExercisesController < ApplicationController
.exercise_group_not_published.present? ? 1 : 0
end
if ex_status == 1 #如果试卷存在已发布的,或者是已截止的,那么则直接跳过
- g_course = params[:group_ids] #表示是否传入分班参数,如果传入分班的参数,那么试卷的统一设置需修改
+ g_course = group_ids #表示是否传入分班参数,如果传入分班的参数,那么试卷的统一设置需修改
tiding_group_ids = g_course
if g_course
- user_course_groups = @course.charge_group_ids(current_user)
- if g_course.map(&:to_i).sort == user_course_groups.sort # 如果是设置为全部班级,则试卷不用分组,且试卷设定为统一设置,否则则分组设置
+ user_course_groups = @course.course_groups.pluck(:id)
+ if g_course.map(&:to_i).sort == user_course_groups.sort &&
+ ((params[:detail] && group_end_times.min == group_end_times.max) || params[:detail].blank?) # 如果是设置为全部班级,则试卷不用分组,且试卷设定为统一设置,否则则分组设置
exercise.exercise_group_settings.destroy_all
ex_unified = true
- e_time = ex_end_time
+ e_time = params[:detail] ? group_end_times.max : ex_end_time
tiding_group_ids = []
else
ex_unified = false
- g_course.each do |i|
+ g_course.each_with_index do |i, index|
exercise_group_setting = exercise.exercise_group_settings.find_in_exercise_group("course_group_id",i).first #根据课堂分班的id,寻找试卷所在的班级
+ group_end_time = params[:detail] ? group_end_times[index] : ex_end_time
if exercise_group_setting #如果该试卷分组存在,则更新,否则新建
- exercise_group_setting.update_attributes(publish_time:Time.now,end_time:ex_end_time)
+ exercise_group_setting.update_attributes(publish_time: Time.now, end_time: group_end_time)
else
p_course_group = {
:exercise_id => exercise.id,
:course_group_id => i,
:course_id => exercise.course.id,
:publish_time => Time.now,
- :end_time => ex_end_time,
+ :end_time => group_end_time,
}
new_exercise_group = exercise.exercise_group_settings.new p_course_group
new_exercise_group.save
@@ -1077,22 +1101,38 @@ class ExercisesController < ApplicationController
def commit_exercise
ActiveRecord::Base.transaction do
begin
- if @user_course_identity > Course::ASSISTANT_PROFESSOR #为学生时
- objective_score = calculate_student_score(@exercise,current_user)[:total_score]
- subjective_score = @answer_committed_user.subjective_score
- total_score_subjective_score = subjective_score < 0.0 ? 0.0 : subjective_score
- total_score = objective_score + total_score_subjective_score
- commit_option = {
+ can_commit_exercise = false
+ if (@user_course_identity > Course::ASSISTANT_PROFESSOR) && params[:commit_method].present? #为学生时
+ if params[:commit_method].to_i == 2 #自动提交时
+ user_left_time = get_exercise_left_time(@exercise,current_user)
+ if user_left_time.to_i <= 0
+ can_commit_exercise = true
+ end
+ else
+ can_commit_exercise = true
+ end
+ if can_commit_exercise
+ objective_score = calculate_student_score(@exercise,current_user)[:total_score]
+ subjective_score = @answer_committed_user.subjective_score
+ total_score_subjective_score = subjective_score < 0.0 ? 0.0 : subjective_score
+ total_score = objective_score + total_score_subjective_score
+ commit_option = {
:status => 1,
:commit_status => 1,
:end_at => Time.now,
:objective_score => objective_score,
:score => total_score,
- :subjective_score => subjective_score
- }
- @answer_committed_user.update_attributes(commit_option)
- CommitExercsieNotifyJobJob.perform_later(@exercise.id, current_user.id)
- normal_status(0,"试卷提交成功!")
+ :subjective_score => subjective_score,
+ :commit_method => @answer_committed_user&.commit_method.to_i > 0 ? @answer_committed_user&.commit_method.to_i : params[:commit_method].to_i
+ }
+ @answer_committed_user.update_attributes(commit_option)
+ CommitExercsieNotifyJobJob.perform_later(@exercise.id, current_user.id)
+ normal_status(0,"试卷提交成功!")
+ else
+ normal_status(-1,"提交失败,请重试!")
+ end
+ else
+ normal_status(-1,"提交失败,请重试!")
end
rescue Exception => e
uid_logger_error(e.message)
diff --git a/app/controllers/polls_controller.rb b/app/controllers/polls_controller.rb
index a8e081cb2..6b9fd004c 100644
--- a/app/controllers/polls_controller.rb
+++ b/app/controllers/polls_controller.rb
@@ -289,20 +289,21 @@ class PollsController < ApplicationController
((params[:detail] && group_end_times.min == group_end_times.max) || params[:detail].blank?) # 如果是设置为全部班级,则问卷不用分组,且问卷设定为统一设置,否则则分组设置
poll.poll_group_settings.destroy_all
poll_unified = true
- e_time = ex_end_time
+ e_time = params[:detail] ? group_end_times.max : ex_end_time
else
poll_unified = false
g_course.each_with_index do |i, index|
poll_group_setting = poll.poll_group_settings.find_in_poll_group("course_group_id",i).first #根据课堂分班的id,寻找问卷所在的班级
+ group_end_time = params[:detail] ? group_end_times[index] : ex_end_time
if poll_group_setting #如果该问卷分组存在,则更新,否则新建
- poll_group_setting.update_attributes(publish_time:Time.now, end_time: params[:detail] ? group_end_times[index] : ex_end_time)
+ poll_group_setting.update_attributes(publish_time: Time.now, end_time: group_end_time)
else
p_course_group = {
:poll_id => poll.id,
:course_group_id => i,
:course_id => poll.course.id,
:publish_time => Time.now,
- :end_time => params[:detail] ? group_end_times[index] : ex_end_time,
+ :end_time => group_end_time,
}
new_poll_group = poll.poll_group_settings.new p_course_group
new_poll_group.save
diff --git a/app/jobs/end_exercise_calculate_job.rb b/app/jobs/end_exercise_calculate_job.rb
index 39d8bb1db..b6d8e491e 100644
--- a/app/jobs/end_exercise_calculate_job.rb
+++ b/app/jobs/end_exercise_calculate_job.rb
@@ -19,7 +19,8 @@ class EndExerciseCalculateJob < ApplicationJob
:end_at => Time.now,
:objective_score => objective_score,
:score => total_score,
- :subjective_score => user_sub_score
+ :subjective_score => user_sub_score,
+ :commit_method => user&.commit_method.to_i > 0 ? user&.commit_method.to_i : 4
}
user.update_attributes(commit_option)
end
diff --git a/app/models/exercise_user.rb b/app/models/exercise_user.rb
index 84f042b25..0f2e8456e 100644
--- a/app/models/exercise_user.rb
+++ b/app/models/exercise_user.rb
@@ -1,4 +1,5 @@
class ExerciseUser < ApplicationRecord
+ # commit_method 0 为默认, 1为学生的手动提交,2为倒计时结束后自动提交,3为试卷定时截止的自动提交, 4为教师手动的立即截止
belongs_to :user
belongs_to :exercise
diff --git a/app/models/shixun.rb b/app/models/shixun.rb
index 4912ea15a..0cdb2e82b 100644
--- a/app/models/shixun.rb
+++ b/app/models/shixun.rb
@@ -1,5 +1,6 @@
class Shixun < ApplicationRecord
include Searchable::Shixun
+ attr_accessor :page_no #管理员页面 实训配置更新状态时,需要接受page_no参数
# status: 0:编辑 1:申请发布 2:正式发布 3:关闭 -1:软删除
# hide_code: 隐藏代码窗口
diff --git a/app/tasks/exercise_publish_task.rb b/app/tasks/exercise_publish_task.rb
index 220512664..a7b533d05 100644
--- a/app/tasks/exercise_publish_task.rb
+++ b/app/tasks/exercise_publish_task.rb
@@ -66,7 +66,8 @@ class ExercisePublishTask
:end_at => Time.now,
:objective_score => s_score,
:score => total_score,
- :subjective_score => subjective_score
+ :subjective_score => subjective_score,
+ :commit_method => exercise_user&.commit_method.to_i > 0 ? exercise_user&.commit_method.to_i : 3
}
exercise_user.update_attributes(commit_option)
end
@@ -108,7 +109,8 @@ class ExercisePublishTask
:end_at => Time.now,
:objective_score => s_score,
:score => total_score,
- :subjective_score => subjective_score
+ :subjective_score => subjective_score,
+ :commit_method => exercise_user&.commit_method.to_i > 0 ? exercise_user&.commit_method.to_i : 3
}
exercise_user.update_attributes(commit_option)
end
diff --git a/app/views/exercises/_exercise_user.json.jbuilder b/app/views/exercises/_exercise_user.json.jbuilder
index d41fb9e20..5f00bbd70 100644
--- a/app/views/exercises/_exercise_user.json.jbuilder
+++ b/app/views/exercises/_exercise_user.json.jbuilder
@@ -8,6 +8,7 @@ json.user_group_name ex_user_info[:user_group_name]
json.student_id ex_user_info[:student_id]
json.commit_status ex_user_info[:commit_status]
json.end_at ex_user_info[:end_at]
+json.commit_method exercise_user&.commit_method.to_i
if subjective_type == 1
json.objective_score ex_user_info[:ex_object_score]
json.subjective_score ex_user_info[:ex_subject_score]
diff --git a/app/views/exercises/_user_exercise_info.json.jbuilder b/app/views/exercises/_user_exercise_info.json.jbuilder
index 0d21cc593..bdac3a985 100644
--- a/app/views/exercises/_user_exercise_info.json.jbuilder
+++ b/app/views/exercises/_user_exercise_info.json.jbuilder
@@ -9,6 +9,7 @@ json.exercise_answer_user do
json.user_id ex_answerer.id
json.login ex_answerer.login
if exercise_user.present?
+ json.commit_method exercise_user&.commit_method.to_i
json.start_at exercise_user.start_at
json.score exercise_user.score.present? ? exercise_user.score.round(1).to_s : "0.0"
end
diff --git a/app/views/exercises/publish_groups.json.jbuilder b/app/views/exercises/publish_groups.json.jbuilder
new file mode 100644
index 000000000..72cefdd1a
--- /dev/null
+++ b/app/views/exercises/publish_groups.json.jbuilder
@@ -0,0 +1,6 @@
+json.course_groups @course_groups do |group|
+ json.id group.id
+ json.name group.name
+ json.end_time @group_settings.select{|group_setting| group_setting.course_group_id == group.id}.first&.end_time
+end
+json.end_time @exercise.end_time
\ No newline at end of file
diff --git a/config/routes.rb b/config/routes.rb
index 4f37b98ed..50b61c463 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -619,6 +619,7 @@ Rails.application.routes.draw do
get :exercise_result
post :cancel_exercise
get :begin_commit #提交前的弹窗
+ get :publish_groups
end
resources :exercise_questions,only:[:new,:create,:index]
end
diff --git a/db/migrate/20191011030441_add_commit_method_to_exercise_user.rb b/db/migrate/20191011030441_add_commit_method_to_exercise_user.rb
new file mode 100644
index 000000000..060e5eb5f
--- /dev/null
+++ b/db/migrate/20191011030441_add_commit_method_to_exercise_user.rb
@@ -0,0 +1,5 @@
+class AddCommitMethodToExerciseUser < ActiveRecord::Migration[5.2]
+ def change
+ add_column :exercise_users, :commit_method, :integer, :default => 0
+ end
+end
diff --git a/public/react/src/common/course/WordsBtn.js b/public/react/src/common/course/WordsBtn.js
index 58b000338..85a85cfb6 100644
--- a/public/react/src/common/course/WordsBtn.js
+++ b/public/react/src/common/course/WordsBtn.js
@@ -8,15 +8,21 @@ class WordsBtn extends Component {
}
render() {
- let{to, href,targets}=this.props
+ let{to, href,targets, style2 }=this.props
return(