# encoding: utf-8
module ExerciseHelper
def exercise_shixun_json_data shixuns
shixuns . map do | shixun |
shixun_owner = shixun . owner . try ( :show_name )
shixun_path = shixun_path ( shixun )
shixun_level = shixun . shixun_level
shixun . attributes . dup . except ( " gpid " , " identifier " , " major_id " , " webssh " , " homepage_show " , " fork_from " , " git_url " ,
" mirror_script_id " , " repo_name " , " pod_life " ) . merge ( {
shixun_owner : shixun_owner ,
shixun_level : shixun_level ,
shixun_path : shixun_path
} )
end
end
def un_commit_num exercise
course = exercise . course
member = course . members . where ( :user_id = > User . current . id ) . first
exercise_users = exercise . exercise_users
student_count = course . student . count
if member . present? && member . teacher_course_groups . count > 0
group_students = course . members . where ( :course_group_id = > member . teacher_course_groups . pluck ( :course_group_id ) ) . map ( & :user_id )
student_count = group_students . size
exercise_users = exercise_users . where ( :user_id = > group_students )
end
student_count - exercise_users . where ( :commit_status = > 1 , :user_id = > course . student . map ( & :student_id ) ) . count
end
def has_commit_num exercise
course = exercise . course
member = course . members . where ( :user_id = > User . current . id ) . first
exercise_users = exercise . exercise_users
if member . present? && member . teacher_course_groups . count > 0
group_students = course . members . where ( :course_group_id = > member . teacher_course_groups . pluck ( :course_group_id ) ) . map ( & :user_id )
exercise_users = exercise_users . where ( :user_id = > group_students )
end
exercise_users . where ( :commit_status = > 1 , :user_id = > course . student . map ( & :student_id ) ) . count
end
def un_comment_num exercise
course = exercise . course
member = course . members . where ( :user_id = > User . current . id ) . first
exercise_users = exercise . exercise_users
if member . present? && member . teacher_course_groups . count > 0
group_students = course . members . where ( :course_group_id = > member . teacher_course_groups . pluck ( :course_group_id ) ) . map ( & :user_id )
exercise_users = exercise_users . where ( :user_id = > group_students )
end
exercise_users . where ( :commit_status = > 1 , :subjective_score = > - 1 ) . count
end
def has_comment_num exercise
course = exercise . course
member = course . members . where ( :user_id = > User . current . id ) . first
exercise_users = exercise . exercise_users
if member . present? && member . teacher_course_groups . count > 0
group_students = course . members . where ( :course_group_id = > member . teacher_course_groups . pluck ( :course_group_id ) ) . map ( & :user_id )
exercise_users = exercise_users . where ( :user_id = > group_students )
end
exercise_users . where ( " commit_status = 1 and subjective_score != -1 " ) . count
end
def answer_is_correct eq , user
is_correct = false
case eq . question_type
when 1
answer = get_user_answer ( eq , user )
standard_answer = get_user_standard_answer ( eq , user )
is_correct = ! answer . empty? && ! standard_answer . empty? && answer . first . exercise_choice . choice_position == standard_answer . first . exercise_choice_id
when 2
standard_answer = get_user_standard_answer ( eq , user )
is_correct = ! standard_answer . empty? && get_mulscore ( eq , user ) . to_i == standard_answer . first . exercise_choice_id
when 3
answer = get_user_answer ( eq , user )
standard_answer = get_user_standard_answer ( eq , user )
is_correct = ! answer . empty? && ! standard_answer . empty? && standard_answer . collect { | answer | answer . strip } . include? ( answer . first . answer_text . strip . downcase )
when 5
is_correct = eq . exercise_shixun_answers . where ( :status = > 1 , :user_id = > user . id ) . count == eq . shixun . challenges . count
end
is_correct
end
def question_correct_rate eq , user_ids
count = 0
rate = 0
user_ids_str = user_ids . length == 0 ? " (-1) " : " ( " + user_ids . join ( " , " ) + " ) "
user_ids . each do | user_id |
user = User . where ( :id = > user_id ) . first
case eq . question_type
when 1 , 2 , 3
if user && answer_is_correct ( eq , user )
count += 1
end
rate = user_ids . length == 0 ? 0 : count . to_f / user_ids . length
when 4
rate = user_ids . length * eq . question_score > 0 ? eq . exercise_answers . where ( " user_id in #{ user_ids_str } and score <> -1 " ) . collect ( & :score ) . sum . to_f / ( user_ids . length * eq . question_score ) : 0
when 5
rate = user_ids . length * eq . question_score > 0 ? eq . exercise_shixun_answers . where ( " user_id in #{ user_ids_str } " ) . collect ( & :score ) . sum . to_f / ( user_ids . length * eq . question_score ) : 0
end
end
rate = format ( " %.1f " , rate * 100 )
end
#多选的时候查询去重
def total_answer id , user_ids
user_ids = user_ids . blank? ? " (-1) " : " ( " + user_ids . join ( " , " ) + " ) "
total = ExerciseAnswer . find_by_sql ( " SELECT distinct(user_id) FROM `exercise_answers` where exercise_question_id = #{ id } and user_id in #{ user_ids } " ) . count
end
def shixun_question_score eq , user
score = 0
if eq . question_type == 5
eq . exercise_shixun_answers . where ( :user_id = > user . id ) . each do | answer |
score += answer . score
end
end
score
end
# 单选
def sigle_selection_standard_answer ( params )
size = params . ord - 96
if size > 0 # 小写字母答案
answer = params . ord - 96
else
answer = params . ord - 64
end
end
# 多选
def multiselect_standard_answer ( params )
size = params . ord - 96
answer = [ ]
if size > 0 # 小写字母答案
for i in 0 .. ( params . length - 1 )
answer << ( params [ i ] . ord - 96 ) . to_s
end
else
for i in 0 .. ( params . length - 1 )
answer << ( params [ i ] . ord - 64 )
end
end
answer = answer . sort
answer . join ( " " )
end
#
def fill_standart_answer ( params , standart_answer )
params . each do | param |
standart_answer . answer_text = param . value
standart_answer . save
end
end
# 获取多选的得分
def get_mulscore ( question , user )
ecs = ExerciseAnswer . where ( " user_id =? and exercise_question_id =? " , user . id , question . id )
arr = [ ]
ecs . each do | ec |
arr << ec . exercise_choice . choice_position
end
#arr = arr.sort
str = arr . sort . join ( " " )
return str
end
# 判断用户是否已经提交了问卷
# status 为0的时候是用户点击试卷。为1表示用户已经提交
def has_commit_exercise? ( exercise_id , user_id )
pu = ExerciseUser . where ( " exercise_id=? and user_id=? and status=? " , exercise_id , user_id , true )
if pu . empty?
false
else
true
end
end
def can_edit_exercise exercise , exercise_user
exercise_end = exercise . end_time . nil? ? false : exercise . end_time > Time . now
if exercise . time == - 1
can_edit_excercise = exercise_end && exercise_user . commit_status == 0
else
left_time = ( Time . now . to_i - exercise_user . start_at . to_i ) < exercise . time . to_i * 60
can_edit_excercise = ! exercise_user . status && left_time && exercise_end
end
can_edit_excercise
end
# 判断学生是否点击过问卷, 点击则为他保存一个记录, 记录start_at
def has_click_exercise? ( exercise_id , user_id )
pu = ExerciseUser . where ( " exercise_id=? and user_id=? and status=? " , exercise_id , user_id , false )
if pu . empty?
false
else
true
end
end
def convert_to_char ( str )
result = " "
length = str . length
unless str . nil?
if length === 1
result += ( str . to_i + 64 ) . chr
return result
elsif length > 1
for i in 0 ... length
result += ( str [ i ] . to_i + 64 ) . chr
end
return result
end
end
return result
end
def convert_to_chi_num num
result = " "
case num . to_i
when 1
result = '一'
when 2
result = '二'
when 3
result = '三'
when 4
result = '四'
when 5
result = '五'
when 6
result = '六'
when 7
result = '七'
when 8
result = '八'
when 9
result = '九'
end
return result
end
def get_current_score exercise
total_score = 0
mc_score = 0
mcq_score = 0
single_score = 0
multi_score = 0
shixun_score = 0
unless exercise . nil?
exercise . exercise_questions . each do | exercise_question |
unless exercise_question . question_score . nil?
total_score += exercise_question . question_score
case exercise_question . question_type
when 1
mc_score += exercise_question . question_score
when 2
mcq_score += exercise_question . question_score
when 3
single_score += exercise_question . question_score
when 4
multi_score += exercise_question . question_score
when 5
shixun_score += exercise_question . question_score
end
end
end
return total_score , mc_score , mcq_score , single_score , multi_score , shixun_score
end
return total_score , mc_score , mcq_score , single_score , multi_score , shixun_score
end
def answer_be_selected? ( answer , user )
# pv = answer.exercise_answers.where("#{ExerciseAnswer.table_name}.user_id = #{user.id} ")
pv = answer . exercise_answers . select { | e | e . user_id == user . id }
if ! pv . nil? && pv . size > 0
true
else
false
end
end
#获取未完成的题目
def get_uncomplete_question exercise , exercise_user
# all_questions = exercise.exercise_questions.includes(:exercise_answers).where("question_type != 5")
uncomplete_question = [ ]
questions = exercise . user_question_list ( exercise_user . id )
questions . includes ( :exercise_answers ) . where ( " question_type != 5 " ) . each do | question |
# answers = get_user_answer(question, user)
answers = question . exercise_answers . select { | e | e . user_id == exercise_user . user_id }
if answers . empty?
uncomplete_question << question
end
end
uncomplete_question
end
# 获取未通关的实训
def get_uncomplete_shixun exercise , exercise_user
questions = exercise . user_question_list ( exercise_user . try ( :id ) )
all_questions = questions . where ( " question_type = 5 " )
uncomplete_shixun = [ ]
all_questions . each do | question |
myshixun = Myshixun . where ( :shixun_id = > question . shixun_id , :user_id = > user . id ) . first
unless myshixun && myshixun . is_complete?
uncomplete_shixun << question
end
end
uncomplete_shixun
end
# 题目已答或未答
def question_answer_or_not question , user
if question . question_type == 5
# is_answer = question.exercise_shixun_answers.where(:user_id => user.id, :status => 1).count > 0
is_answer = question . exercise_shixun_answers . select { | e | e . user_id == user . id && e . status == 1 } . count > 0
else
# is_answer = user.exercise_answer.where(:exercise_question_id => question.id).count > 0
is_answer = question . exercise_answers . select { | e | e . user_id == user . id } . count > 0
end
is_answer
end
def question_commit_status question , user
status = " "
case question . question_type
when 3 , 4
get_anwser_vote_text ( question . id , user . id ) == " " ? status = " 未答 " : status = " "
when 1 , 2
get_user_answer ( question , user ) . empty? ? status = " 未答 " : status = " "
when 5
question . exercise_shixun_answers . where ( :user_id = > user . id ) . empty? ? status = " 未答 " : status = " "
end
status
end
# 获取文本题答案
def get_anwser_vote_text ( question_id , user_id )
pv = ExerciseAnswer . find_by_exercise_question_id_and_user_id ( question_id , user_id )
if pv . nil?
''
else
pv . answer_text
end
end
def new_get_anwser_vote_text question , user
pv = question . exercise_answers . select { | exercise_answer | exercise_answer . user_id == user . id }
if pv . blank?
''
else
pv . first . try ( :answer_text )
end
end
# 获取当前学生回答问题的答案
def get_user_answer ( question , user )
user_answer = question . exercise_answers . where ( " #{ ExerciseAnswer . table_name } .user_id = #{ user . id } " )
# user_answer = question.exercise_answers.select{|e| e.user_id == user.id}
user_answer
end
# 获取问题的标准答案
def get_user_standard_answer ( question , user )
if question . question_type == 3
standard_answer = [ ]
question . exercise_standard_answers . each do | answer |
standard_answer << answer . answer_text . downcase
end
else
standard_answer = question . exercise_standard_answers
end
standard_answer
end
# 问题随机的下拉列表
def question_random_select
type = [ ]
option1 = [ ]
option1 << " 题目不随机打乱 "
option1 << 0
type << option1
option2 = [ ]
option2 << " 题目随机打乱 "
option2 << 1
type << option2
end
# 选项随机的下拉列表
def choice_random_select
type = [ ]
option1 = [ ]
option1 << " 选项不随机打乱 "
option1 << 0
type << option1
option2 = [ ]
option2 << " 选项随机打乱 "
option2 << 1
type << option2
end
#允许学生查看结果的下拉列表
def show_result_select
type = [ ]
option1 = [ ]
option1 << " 允许学生查看测验结果 "
option1 << 1
type << option1
option2 = [ ]
option2 << " 不允许学生查看测验结果 "
option2 << 0
type << option2
end
end