@ -5,7 +5,7 @@ class StudentWorkController < ApplicationController
include ApplicationHelper
require 'bigdecimal'
require " base64 "
before_filter :find_homework , :only = > [ :new , :index , :create , :student_work_absence_penalty , :absence_penalty_list , :evaluation_list , :program_test , :program_test_ex , :set_score_rule , :forbidden_anonymous_comment , :delete_work , :new_student_work_project , :student_work_project , :cancel_relate_project , :search_course_students ]
before_filter :find_homework , :only = > [ :new , :index , :create , :student_work_absence_penalty , :absence_penalty_list , :evaluation_list , :program_test , :program_test_ex , :set_score_rule , :forbidden_anonymous_comment , :delete_work , :new_student_work_project , :student_work_project , :cancel_relate_project , :search_course_students , :work_canrepeat ]
before_filter :find_work , :only = > [ :edit , :update , :show , :destroy , :add_score , :praise_student_work , :retry_work , :revise_attachment ]
before_filter :member_of_course , :only = > [ :new , :create , :show , :add_score , :praise_student_work ]
before_filter :author_of_work , :only = > [ :edit , :update , :destroy ]
@ -17,40 +17,40 @@ class StudentWorkController < ApplicationController
is_test = params [ :is_test ] == 'true'
resultObj = { status : 0 , results : [ ] , error_msg : '' , time : Time . now . strftime ( '%Y-%m-%d %T' ) }
student_work = find_or_save_student_work ( is_test )
student_work = find_or_save_student_work ( is_test )
unless student_work
resultObj [ :status ] = 100
else
if @homework . homework_type == 2 && @homework . homework_detail_programing
result = test_realtime ( student_work , params [ :src ] )
logger . debug result
resultObj [ :status ] = result [ " status " ]
resultObj [ :results ] = result [ " results " ]
resultObj [ :error_msg ] = result [ " error_msg " ]
results = result [ " results " ]
if result [ " status " ] . to_i == - 2 #编译错误
results = [ result [ " error_msg " ] ]
end
student_work_test = student_work . student_work_tests . build ( status : result [ " status " ] , results : results ,
src : params [ :src ] )
unless student_work . save
resultObj [ :status ] = 200
unless student_work
resultObj [ :status ] = 100
else
if @homework . homework_type == 2 && @homework . homework_detail_programing
result = test_realtime ( student_work , params [ :src ] )
logger . debug result
resultObj [ :status ] = result [ " status " ]
resultObj [ :results ] = result [ " results " ]
resultObj [ :error_msg ] = result [ " error_msg " ]
results = result [ " results " ]
if result [ " status " ] . to_i == - 2 #编译错误
results = [ result [ " error_msg " ] ]
end
student_work_test = student_work . student_work_tests . build ( status : result [ " status " ] , results : results ,
src : params [ :src ] )
unless student_work . save
resultObj [ :status ] = 200
else
student_work . name = params [ :title ]
student_work . description = params [ :src ]
if Time . parse ( @homework . end_time . to_s ) . strftime ( " %Y-%m-%d " ) < Time . parse ( Time . now . to_s ) . strftime ( " %Y-%m-%d " )
student_work . late_penalty = @homework . late_penalty
else
student_work . name = params [ :title ]
student_work . description = params [ :src ]
if Time . parse ( @homework . end_time . to_s ) . strftime ( " %Y-%m-%d " ) < Time . parse ( Time . now . to_s ) . strftime ( " %Y-%m-%d " )
student_work . late_penalty = @homework . late_penalty
else
student_work . late_penalty = 0
end
student_work . save
resultObj [ :status ] = result [ " status " ] . to_i
resultObj [ :time ] = student_work_test . created_at . to_s ( :db )
resultObj [ :index ] = student_work . student_work_tests . count
student_work . late_penalty = 0
end
student_work . save
resultObj [ :status ] = result [ " status " ] . to_i
resultObj [ :time ] = student_work_test . created_at . to_s ( :db )
resultObj [ :index ] = student_work . student_work_tests . count
end
end
end
render :json = > resultObj
end
@ -81,6 +81,8 @@ class StudentWorkController < ApplicationController
#根据传入的tIndex确定是第几次测试
#之后如果觉得很卡 可以改成将结果传回JS再以参数形式传回来
def program_test_ex
tStarttime = Time . now
is_test = params [ :is_test ] == 'true'
resultObj = { status : 0 , results : [ ] , error_msg : '' , time : Time . now . strftime ( '%Y-%m-%d %T' ) , tseq : 1 , tcount : 1 , testid : 1 } #保存每测试一次返回的结果
@ -92,83 +94,229 @@ class StudentWorkController < ApplicationController
resultObj [ :status ] = 100
else
if @homework . homework_type == 2 && @homework . homework_detail_programing
#找到第index个测试的输入输出
index = params [ :tIndex ] . to_i
resultObj [ :tseq ] = index
test = @homework . homework_tests [ index - 1 ]
#找到第index个测试的输入输出
index = params [ :tIndex ] . to_i
resultObj [ :tseq ] = index
test = @homework . homework_tests [ index - 1 ]
#请求测试
#请求测试
begin
result = test_realtime_ex ( test , params [ :src ] )
rescue Timeout :: Error
tEndtime = Time . now
tUsedtime = ( tEndtime . to_i - tStarttime . to_i ) * 1000 + ( tEndtime . usec - tStarttime . usec ) / 1000
logger . debug " program_test_ex user wait time = #{ tUsedtime } 毫秒 "
#status 0:答案正确 -3http超时 -2:编译错误 -1:答案错误 2:程序运行超时
CodeTests . create ( :homework_id = > @homework . id , :language = > @homework . homework_detail_programing . language , :status = > - 3 , :wait_time = > tUsedtime , :student_work_id = > student_work . id )
end
if result [ " status " ] . to_i != - 2
#result["results"].first['output'] = result["results"].first['output'].gsub(" ","□")
#result["results"].first['result'] = result["results"].first['result'].gsub(" ","□")
space_replace_1 ( result [ " results " ] . first [ 'output' ] )
space_replace_1 ( result [ " results " ] . first [ 'result' ] )
end
logger . debug result
#-1 默认值 0全部正确并结束 2 超时 -2 编译错误
resultObj [ :status ] = - 1
resultObj [ :results ] = result [ " results " ] . first #本次测试结果
resultObj [ :error_msg ] = result [ " error_msg " ] #编译错误时的信息
#该状态用于存入CodeTests
tmpstatus = - 1
if result [ " status " ] . to_i == - 2 #编译错误
resultObj [ :results ] = result [ " error_msg " ]
resultObj [ :status ] = - 2
tmpstatus = - 2
elsif result [ " results " ] [ 0 ] [ " status " ] . to_i == 2
resultObj [ :status ] = 2
tmpstatus = 2
end
if result [ " status " ] == 0
tmpstatus = 0
end
unless student_work . save
resultObj [ :status ] = 200
else
student_work . name = params [ :title ]
student_work . description = params [ :src ]
if Time . parse ( @homework . end_time . to_s ) . strftime ( " %Y-%m-%d " ) < Time . parse ( Time . now . to_s ) . strftime ( " %Y-%m-%d " )
student_work . late_penalty = @homework . late_penalty
else
student_work . late_penalty = 0
end
#每次从数据库取出上次的结果加上本次的结果再存入数据库
if result [ " status " ] . to_i != - 2
#result["results"].first['output'] = result["results"].first['output'].gsub(" ","□")
#result["results"].first['result'] = result["results"].first['result'].gsub(" ","□")
space_replace_1 ( result [ " results " ] . first [ 'output' ] )
space_replace_1 ( result [ " results " ] . first [ 'result' ] )
result [ " results " ] . first [ 'user_wait' ] = tUsedtime
if result [ " results " ] [ 0 ] [ " status " ] . to_i == 2
result [ " status " ] = 2
end
end
logger . debug result
status = result [ " status " ]
if index == 1
student_work_test = student_work . student_work_tests . build ( status : status ,
results : [ resultObj [ :results ] ] , src : params [ :src ] )
student_work_test . save!
resultObj [ :testid ] = student_work_test . id
else
#先从数据库取出result
student_work_test = StudentWorkTest . find ( params [ :testid ] )
results = student_work_test . results
results << resultObj [ :results ]
student_work_test . results = results
student_work_test . status = ( result [ " status " ] != 0 ? result [ " status " ] : student_work_test . status )
student_work_test . save!
status = student_work_test . status
resultObj [ :testid ] = student_work_test . id
end
#-1 默认值 0全部正确并结束 2 超时 -2 编译错误
resultObj [ :status ] = - 1
resultObj [ :results ] = result [ " results " ] . first #本次测试结果
resultObj [ :error_msg ] = result [ " error_msg " ] #编译错误时的信息
#超时或编译错误则直接返回了并存入数据库
if resultObj [ :status ] == 2 || resultObj [ :status ] == - 2 || index == @homework . homework_tests . size
if status == 0
resultObj [ :status ] = 0
end
student_work . save!
resultObj [ :time ] = student_work_test . created_at . to_s ( :db )
resultObj [ :index ] = student_work . student_work_tests . count
end
#将每次用户等待时间都存起来以便管理界面显示用
tEndtime = Time . now
tUsedtime = ( tEndtime . to_i - tStarttime . to_i ) * 1000 + ( tEndtime . usec - tStarttime . usec ) / 1000
logger . debug " program_test_ex user wait time = #{ tUsedtime } 毫秒 "
if result [ " status " ] . to_i == - 2 #编译错误
resultObj [ :results ] = result [ " error_msg " ]
resultObj [ :status ] = - 2
elsif result [ " results " ] [ 0 ] [ " status " ] . to_i == 2
resultObj [ :status ] = 2
time_used = 0
if result [ " status " ] . to_i != - 2
#至少一毫秒
time_used = result [ " results " ] . first [ 'time_used' ] == 0 ? 1 :result [ " results " ] . first [ 'time_used' ]
end
#0:答案正确 -3http超时 -2:编译错误 -1:答案错误 2:程序运行超时
CodeTests . create ( :homework_id = > @homework . id , :language = > @homework . homework_detail_programing . language , :status = > tmpstatus , :time_used = > time_used , :wait_time = > tUsedtime , :student_work_id = > student_work . id )
unless student_work . save
resultObj [ :status ] = 200
else
student_work . name = params [ :title ]
student_work . description = params [ :src ]
#渲染返回结果
render :json = > resultObj
end
end
end
end
if Time . parse ( @homework . end_time . to_s ) . strftime ( " %Y-%m-%d " ) < Time . parse ( Time . now . to_s ) . strftime ( " %Y-%m-%d " )
student_work . late_penalty = @homework . late_penalty
else
student_work . late_penalty = 0
end
#找出该作业的所有提交作业
def find_all_student_work_by_homeid ( )
all_studentwork = StudentWork . where ( " homework_common_id = #{ @homework . id } and is_test = 0 " )
#每次从数据库取出上次的结果加上本次的结果再存入数据库
status = result [ " status " ]
if index == 1
student_work_test = student_work . student_work_tests . build ( status : status ,
results : [ resultObj [ :results ] ] , src : params [ :src ] )
student_work_test . save!
resultObj [ :testid ] = student_work_test . id
else
#先从数据库取出result
student_work_test = StudentWorkTest . find ( params [ :testid ] )
results = student_work_test . results
results << resultObj [ :results ]
student_work_test . results = results
student_work_test . status = ( result [ " status " ] != 0 ? result [ " status " ] : student_work_test . status )
student_work_test . save!
status = student_work_test . status
resultObj [ :testid ] = student_work_test . id
end
all_studentwork
end
#超时或编译错误则直接返回了并存入数据库
if resultObj [ :status ] == 2 || resultObj [ :status ] == - 2 || index == @homework . homework_tests . size
if status == 0
resultObj [ :status ] = 0
end
student_work . save!
resultObj [ :time ] = student_work_test . created_at . to_s ( :db )
resultObj [ :index ] = student_work . student_work_tests . count
end
def request_code_repeattest ( src )
url = " #{ Redmine :: Configuration [ 'jplag_server' ] } api/realtime_test.json "
#渲染返回结果
render :json = > resultObj
end
factor = [ ]
src . each do | test |
factor << { work_id : test . id , des : test . description , created_at : test . created_at . to_i }
end
solutions = {
homeid : @homework . id ,
language : @homework . homework_detail_programing . language ,
factor : factor
}
uri = URI ( url )
body = solutions . to_json
logger . debug " send body "
logger . debug body
res = Net :: HTTP . new ( uri . host , uri . port ) . start do | client |
request = Net :: HTTP :: Post . new ( uri . path )
request . body = body
request [ " Content-Type " ] = " application/json "
client . request ( request )
end
JSON . parse ( res . body )
end
#点击代码查重按钮
def work_canrepeat
@homework_id = params [ :homework ]
@course_id = params [ :course_id ]
all_studentwork = find_all_student_work_by_homeid ( )
@work_count = all_studentwork . count
end
#代码查重 status: 0完成 -2不需要查重 -1查重失败不支持该语言
def code_repeattest
tStarttime = Time . now
logger . debug " code_repeattest start is #{ tStarttime } } "
resultObj = { status : - 2 }
@homework = HomeworkCommon . find params [ :homework ]
all_studentwork = find_all_student_work_by_homeid ( )
if all_studentwork == nil
resultObj [ :status ] = - 2
elsif all_studentwork . count < = 1
resultObj [ :status ] = - 2
else
#@homework.homework_detail_programing.language、id、description
logger . debug " time1 is #{ Time . now . usec } "
result = request_code_repeattest ( all_studentwork )
logger . debug " time2 is #{ Time . now . usec } "
resultObj [ :status ] = result [ 'status' ] . to_i
# resultObj[:results] = result['results']
#Time.now, simi_id = simiworkid , simi_value = simivalue
if resultObj [ :status ] == 0
@homework . simi_time = Time . now
resultObj [ :comparetime ] = @homework . simi_time
@homework . update_column ( 'simi_time' , @homework . simi_time )
logger . debug " time3 is #{ Time . now . usec } "
result [ 'results' ] . each do | key , value |
@student_work = StudentWork . where ( " id =? " , key . to_i ) . first
@student_work . update_column ( 'simi_id' , value [ 'simiworkid' ] . to_i )
@student_work . update_column ( 'simi_value' , value [ 'simivalue' ] . to_i )
# sqlstr = "update student_works set simi_id=#{value['simiworkid']},simi_value=#{value['simivalue']} where id=#{key.to_i} "
# dbh.execute(sqlstr)
end
logger . debug " time4 is #{ Time . now . usec } "
end
end
tEndtime = Time . now
logger . debug " code_repeattest end is #{ tEndtime } } "
tUsedtime = ( tEndtime . to_i - tStarttime . to_i ) * 1000000 + ( tEndtime . usec - tStarttime . usec )
logger . debug " code_repeattest userd utime is #{ tUsedtime } "
render :json = > resultObj
end
#上次代码查重时间
def last_codecomparetime
resultObj = { status : 0 }
@homework = HomeworkCommon . find params [ :homework ]
#转换一下
if @homework . simi_time != nil
resultObj [ :comparetime ] = Time . parse ( @homework . simi_time . to_s ) . strftime ( " %Y-%m-%d %H:%M:%S " )
else
resultObj [ :comparetime ] = 0
end
render :json = > resultObj
end
def index
# 作业消息状态更新
@ -504,7 +652,7 @@ class StudentWorkController < ApplicationController
if @homework . homework_detail_group . base_on_project == 1
stu_project . project_id = @student_work_project . project_id
else @homework . homework_detail_group . base_on_project == 0
stu_project . project_id = - 1
stu_project . project_id = - 1
end
stu_project . user_id = members [ i ] . to_i
stu_project . is_leader = 0
@ -1095,11 +1243,11 @@ class StudentWorkController < ApplicationController
student_work = StudentWork . where ( homework_common_id : @homework . id , user_id : User . current . id ) . first
if student_work . nil?
@homework . student_works . build (
name : params [ :title ] ,
description : params [ :src ] ,
user_id : User . current . id ,
is_test : is_test
)
name : params [ :title ] ,
description : params [ :src ] ,
user_id : User . current . id ,
is_test : is_test
)
unless @homework . save
logger . debug @homework . errors . full_messages
else
@ -1120,7 +1268,7 @@ class StudentWorkController < ApplicationController
src : src ,
language : @homework . homework_detail_programing . language ,
factor : factor
}
}
uri = URI ( url )
body = solutions . to_json
res = Net :: HTTP . new ( uri . host , uri . port ) . start do | client |