@ -5,7 +5,7 @@ class StudentWorkController < ApplicationController
include ApplicationHelper
include ApplicationHelper
require 'bigdecimal'
require 'bigdecimal'
require " base64 "
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 :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 :member_of_course , :only = > [ :new , :create , :show , :add_score , :praise_student_work ]
before_filter :author_of_work , :only = > [ :edit , :update , :destroy ]
before_filter :author_of_work , :only = > [ :edit , :update , :destroy ]
@ -81,6 +81,8 @@ class StudentWorkController < ApplicationController
#根据传入的tIndex确定是第几次测试
#根据传入的tIndex确定是第几次测试
#之后如果觉得很卡 可以改成将结果传回JS再以参数形式传回来
#之后如果觉得很卡 可以改成将结果传回JS再以参数形式传回来
def program_test_ex
def program_test_ex
tStarttime = Time . now
is_test = params [ :is_test ] == 'true'
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 } #保存每测试一次返回的结果
resultObj = { status : 0 , results : [ ] , error_msg : '' , time : Time . now . strftime ( '%Y-%m-%d %T' ) , tseq : 1 , tcount : 1 , testid : 1 } #保存每测试一次返回的结果
@ -98,8 +100,17 @@ class StudentWorkController < ApplicationController
test = @homework . homework_tests [ index - 1 ]
test = @homework . homework_tests [ index - 1 ]
#请求测试
#请求测试
begin
result = test_realtime_ex ( test , params [ :src ] )
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
if result [ " status " ] . to_i != - 2
#result["results"].first['output'] = result["results"].first['output'].gsub(" ","□")
#result["results"].first['output'] = result["results"].first['output'].gsub(" ","□")
#result["results"].first['result'] = result["results"].first['result'].gsub(" ","□")
#result["results"].first['result'] = result["results"].first['result'].gsub(" ","□")
@ -114,11 +125,19 @@ class StudentWorkController < ApplicationController
resultObj [ :results ] = result [ " results " ] . first #本次测试结果
resultObj [ :results ] = result [ " results " ] . first #本次测试结果
resultObj [ :error_msg ] = result [ " error_msg " ] #编译错误时的信息
resultObj [ :error_msg ] = result [ " error_msg " ] #编译错误时的信息
#该状态用于存入CodeTests
tmpstatus = - 1
if result [ " status " ] . to_i == - 2 #编译错误
if result [ " status " ] . to_i == - 2 #编译错误
resultObj [ :results ] = result [ " error_msg " ]
resultObj [ :results ] = result [ " error_msg " ]
resultObj [ :status ] = - 2
resultObj [ :status ] = - 2
tmpstatus = - 2
elsif result [ " results " ] [ 0 ] [ " status " ] . to_i == 2
elsif result [ " results " ] [ 0 ] [ " status " ] . to_i == 2
resultObj [ :status ] = 2
resultObj [ :status ] = 2
tmpstatus = 2
end
if result [ " status " ] == 0
tmpstatus = 0
end
end
unless student_work . save
unless student_work . save
@ -134,6 +153,14 @@ class StudentWorkController < ApplicationController
end
end
#每次从数据库取出上次的结果加上本次的结果再存入数据库
#每次从数据库取出上次的结果加上本次的结果再存入数据库
if result [ " status " ] . to_i != - 2
result [ " results " ] . first [ 'user_wait' ] = tUsedtime
if result [ " results " ] [ 0 ] [ " status " ] . to_i == 2
result [ " status " ] = 2
end
end
status = result [ " status " ]
status = result [ " status " ]
if index == 1
if index == 1
student_work_test = student_work . student_work_tests . build ( status : status ,
student_work_test = student_work . student_work_tests . build ( status : status ,
@ -162,6 +189,19 @@ class StudentWorkController < ApplicationController
resultObj [ :index ] = student_work . student_work_tests . count
resultObj [ :index ] = student_work . student_work_tests . count
end
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 } 毫秒 "
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 )
#渲染返回结果
#渲染返回结果
render :json = > resultObj
render :json = > resultObj
end
end
@ -169,6 +209,114 @@ class StudentWorkController < ApplicationController
end
end
end
end
#找出该作业的所有提交作业
def find_all_student_work_by_homeid ( )
all_studentwork = StudentWork . where ( " homework_common_id = #{ @homework . id } and is_test = 0 " )
all_studentwork
end
def request_code_repeattest ( src )
url = " #{ Redmine :: Configuration [ 'jplag_server' ] } api/realtime_test.json "
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
def index
# 作业消息状态更新
# 作业消息状态更新