You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

student_work_controller.rb 74 kB

​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
10 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
11 years ago
​
11 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
11 years ago
​
​
​
​
​
​
11 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
10 years ago
​
​
​
​
​
​
​
10 years ago
​
​
​
​
​
​
​
10 years ago
​
​
​
​
​
​
10 years ago
​
​
​
10 years ago
10 years ago
10 years ago
11 years ago
​
​
​
10 years ago
10 years ago
​
​
​
​
​
​
​
10 years ago
​
​
​
​
​
​
​
10 years ago
​
​
​
​
​
​
10 years ago
​
​
​
10 years ago
10 years ago
10 years ago
11 years ago
​
​
​
10 years ago
​
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
​
​
​
​
​
​
​
​
​
10 years ago
​
10 years ago
​
​
​
​
10 years ago
​
​
​
​
​
​
10 years ago
​
​
​
11 years ago
​
​
​
10 years ago
10 years ago
11 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
11 years ago
​
​
​
​
​
​
​
​
​
​
​
11 years ago
​
​
​
​
​
​
​
​
​
11 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
11 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
11 years ago
​
11 years ago
​
​
​
​
​
​
11 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
11 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
11 years ago
11 years ago
​
​
​
​
​
​
11 years ago
11 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
11 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
11 years ago
​
​
​
​
​
​
​
​
​
​
11 years ago
11 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
11 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
10 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
11 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
11 years ago
11 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
10 years ago
​
​
​
10 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
10 years ago
​
​
​
10 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
10 years ago
​
​
​
10 years ago
​
​
​
​
11 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
10 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575
  1. #encoding: utf-8
  2. class StudentWorkController < ApplicationController
  3. layout "base_courses"
  4. include StudentWorkHelper
  5. include ApplicationHelper
  6. require 'bigdecimal'
  7. require "base64"
  8. 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]
  9. before_filter :find_work, :only => [:edit, :update, :show, :destroy, :add_score, :praise_student_work,:retry_work,:revise_attachment]
  10. before_filter :member_of_course, :only => [:new, :create, :show, :add_score, :praise_student_work]
  11. before_filter :author_of_work, :only => [:edit, :update, :destroy]
  12. before_filter :teacher_of_course, :only => [:student_work_absence_penalty, :absence_penalty_list, :evaluation_list, :set_score_rule, :forbidden_anonymous_comment]
  13. before_filter :is_logged, :only => [:index]
  14. ###
  15. def program_test
  16. is_test = params[:is_test] == 'true'
  17. resultObj = {status: 0, results: [], error_msg: '', time: Time.now.strftime('%Y-%m-%d %T')}
  18. student_work = find_or_save_student_work(is_test)
  19. unless student_work
  20. resultObj[:status] = 100
  21. else
  22. if @homework.homework_type == 2 && @homework.homework_detail_programing
  23. result = test_realtime(student_work, params[:src])
  24. logger.debug result
  25. resultObj[:status] = result["status"]
  26. resultObj[:results] = result["results"]
  27. resultObj[:error_msg] = result["error_msg"]
  28. results = result["results"]
  29. if result["status"].to_i == -2 #编译错误
  30. results = [result["error_msg"]]
  31. end
  32. student_work_test = student_work.student_work_tests.build(status: result["status"], results: results,
  33. src: params[:src])
  34. unless student_work.save
  35. resultObj[:status] = 200
  36. else
  37. student_work.name = params[:title]
  38. student_work.description = params[:src]
  39. if Time.parse(@homework.end_time.to_s).strftime("%Y-%m-%d") < Time.parse(Time.now.to_s).strftime("%Y-%m-%d")
  40. student_work.late_penalty = @homework.late_penalty
  41. else
  42. student_work.late_penalty = 0
  43. end
  44. student_work.save
  45. resultObj[:status] = result["status"].to_i
  46. resultObj[:time] = student_work_test.created_at.to_s(:db)
  47. resultObj[:index] = student_work.student_work_tests.count
  48. end
  49. end
  50. end
  51. render :json => resultObj
  52. end
  53. #行尾空格替换成□
  54. def space_replace_1(str)
  55. for i in 0 .. str.size
  56. tChar = str[i]
  57. if tChar != ' ' && tChar != "\n"
  58. sFlag = false
  59. eFlag = false
  60. elsif tChar == ' ' && sFlag == false
  61. tStart = i
  62. sFlag = true
  63. elsif tChar == "\n"
  64. tEnd = i - 1
  65. if sFlag == true
  66. for j in tStart .. tEnd
  67. str[j] = "□"
  68. end
  69. sFlag = false
  70. end
  71. end
  72. end
  73. end
  74. #由于负载问题 不要使用全局变量
  75. #根据传入的tIndex确定是第几次测试
  76. #之后如果觉得很卡 可以改成将结果传回JS再以参数形式传回来
  77. def program_test_ex
  78. tStarttime = Time.now
  79. is_test = params[:is_test] == 'true'
  80. resultObj = {status: 0, results: [], error_msg: '', time: Time.now.strftime('%Y-%m-%d %T'),tseq:1,tcount:1,testid:1} #保存每测试一次返回的结果
  81. student_work = find_or_save_student_work(is_test)
  82. resultObj[:tcount] = @homework.homework_tests.size
  83. unless student_work
  84. resultObj[:status] = 100
  85. else
  86. if @homework.homework_type == 2 && @homework.homework_detail_programing
  87. #找到第index个测试的输入输出
  88. index = params[:tIndex].to_i
  89. resultObj[:tseq] = index
  90. test = @homework.homework_tests[index - 1]
  91. #请求测试
  92. begin
  93. result = test_realtime_ex(test, params[:src])
  94. rescue Timeout::Error
  95. tEndtime = Time.now
  96. tUsedtime = (tEndtime.to_i-tStarttime.to_i)*1000+(tEndtime.usec - tStarttime.usec)/1000
  97. logger.debug "program_test_ex user wait time = #{tUsedtime} 毫秒"
  98. #status 0:答案正确 -5program_test_ex 函数出错 -4judge代码出错 -3http超时 -2:编译错误 -1:答案错误 2:程序运行超时
  99. resultObj[:status] = -3
  100. CodeTests.create(:homework_id=>@homework.id,:language=>@homework.homework_detail_programing.language,:status=>-3,:wait_time=>tUsedtime,:student_work_id=>student_work.id)
  101. rescue => e
  102. #-4 judge代码 出错
  103. logger.debug "program_test_error #{e}"
  104. resultObj[:status] = -4
  105. tmpstatus = -4
  106. CodeTests.create(:homework_id=>@homework.id,:language=>@homework.homework_detail_programing.language,:status=>tmpstatus,:time_used=>0,:wait_time=>0,:student_work_id=>student_work.id)
  107. end
  108. begin
  109. if resultObj[:status] != -3 && resultObj[:status] != -4
  110. if result["status"].to_i != -2
  111. #result["results"].first['output'] = result["results"].first['output'].gsub(" ","□")
  112. #result["results"].first['result'] = result["results"].first['result'].gsub(" ","□")
  113. space_replace_1(result["results"].first['output'])
  114. space_replace_1(result["results"].first['result'])
  115. end
  116. logger.debug result
  117. #-1 默认值 0全部正确并结束 2 超时 -2 编译错误
  118. resultObj[:status] = -1
  119. resultObj[:results] = result["results"].first #本次测试结果
  120. if result["status"].to_i == -2 #编译错误
  121. result["error_msg"] = result["error_msg"][0..2047]
  122. end
  123. resultObj[:error_msg] = result["error_msg"] #编译错误时的信息
  124. #该状态用于存入CodeTests
  125. tmpstatus = -1
  126. if result["status"].to_i == -2 #编译错误
  127. resultObj[:results] = result["error_msg"]
  128. resultObj[:status] = -2
  129. tmpstatus = -2
  130. elsif result["results"][0]["status"].to_i == 2
  131. resultObj[:status] = 2
  132. tmpstatus = 2
  133. end
  134. if result["status"] == 0
  135. tmpstatus = 0
  136. end
  137. unless student_work.save
  138. resultObj[:status] = 200
  139. else
  140. student_work.name = params[:title]
  141. student_work.description = params[:src]
  142. if Time.parse(@homework.end_time.to_s).strftime("%Y-%m-%d") < Time.parse(Time.now.to_s).strftime("%Y-%m-%d")
  143. student_work.late_penalty = @homework.late_penalty
  144. else
  145. student_work.late_penalty = 0
  146. end
  147. #每次从数据库取出上次的结果加上本次的结果再存入数据库
  148. if result["status"].to_i != -2
  149. result["results"].first['user_wait'] = tUsedtime
  150. if result["results"][0]["status"].to_i == 2
  151. result["status"] = 2
  152. end
  153. end
  154. status = result["status"]
  155. if index == 1
  156. student_work_test = student_work.student_work_tests.build(status: status,
  157. results: [resultObj[:results]],src: params[:src])
  158. student_work_test.save!
  159. resultObj[:testid] = student_work_test.id
  160. else
  161. #先从数据库取出result
  162. student_work_test = StudentWorkTest.find(params[:testid])
  163. results = student_work_test.results
  164. results << resultObj[:results]
  165. student_work_test.results = results
  166. student_work_test.status = (result["status"] != 0 ? result["status"] : student_work_test.status)
  167. student_work_test.save!
  168. status = student_work_test.status
  169. resultObj[:testid] = student_work_test.id
  170. end
  171. #超时或编译错误则直接返回了并存入数据库
  172. if resultObj[:status] == 2 || resultObj[:status] == -2 || index == @homework.homework_tests.size
  173. if status == 0
  174. resultObj[:status] = 0
  175. end
  176. student_work.save!
  177. resultObj[:time] = student_work_test.created_at.strftime(format='%Y-%m-%d %H:%M:%S')
  178. resultObj[:index] = student_work.student_work_tests.count
  179. end
  180. #将每次用户等待时间都存起来以便管理界面显示用
  181. tEndtime = Time.now
  182. tUsedtime = (tEndtime.to_i-tStarttime.to_i)*1000+(tEndtime.usec - tStarttime.usec)/1000
  183. logger.debug "program_test_ex user wait time = #{tUsedtime} 毫秒"
  184. time_used = 0
  185. if result["status"].to_i != -2
  186. #至少一毫秒
  187. time_used = result["results"].first['time_used'] == 0 ? 1:result["results"].first['time_used']
  188. end
  189. #0:答案正确 -3http超时 -2:编译错误 -1:答案错误 2:程序运行超时
  190. 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)
  191. end
  192. end
  193. rescue
  194. #-5 program_test_ex 函数出错
  195. logger.debug "program_test_error 2"
  196. resultObj[:status] = -5
  197. tmpstatus = -5
  198. CodeTests.create(:homework_id=>@homework.id,:language=>@homework.homework_detail_programing.language,:status=>tmpstatus,:time_used=>0,:wait_time=>0,:student_work_id=>student_work.id)
  199. end
  200. #渲染返回结果
  201. render :json => resultObj
  202. end
  203. end
  204. end
  205. #找出该作业的所有提交作业
  206. def find_all_student_work_by_homeid()
  207. all_studentwork = StudentWork.where("homework_common_id = #{@homework.id} and is_test = 0 ")
  208. all_studentwork
  209. end
  210. def request_code_repeattest(src)
  211. url = "#{Redmine::Configuration['jplag_server']}api/realtime_test.json"
  212. factor = []
  213. src.each do |test|
  214. factor << {work_id: test.id, des: test.description,created_at:test.created_at.to_i}
  215. end
  216. solutions = {
  217. homeid:@homework.id,
  218. language:@homework.homework_detail_programing.language,
  219. factor: factor
  220. }
  221. uri = URI(url)
  222. body = solutions.to_json
  223. logger.debug "send body"
  224. logger.debug body
  225. res = Net::HTTP.new(uri.host, uri.port).start do |client|
  226. request = Net::HTTP::Post.new(uri.path)
  227. request.body = body
  228. request["Content-Type"] = "application/json"
  229. client.request(request)
  230. end
  231. JSON.parse(res.body)
  232. end
  233. #点击代码查重按钮
  234. def work_canrepeat
  235. @homework_id = params[:homework]
  236. @course_id = params[:course_id]
  237. all_studentwork = find_all_student_work_by_homeid()
  238. @work_count = all_studentwork.has_committed.count
  239. end
  240. #代码查重 status: 0完成 -2不需要查重 -1查重失败不支持该语言
  241. def code_repeattest
  242. tStarttime = Time.now
  243. logger.debug "code_repeattest start is #{tStarttime}}"
  244. resultObj = {status: -2}
  245. @homework = HomeworkCommon.find params[:homework]
  246. all_studentwork = find_all_student_work_by_homeid().has_committed
  247. if all_studentwork == nil
  248. resultObj[:status] = -2
  249. elsif all_studentwork.count <= 1
  250. resultObj[:status] = -2
  251. else
  252. #@homework.homework_detail_programing.language、id、description
  253. logger.debug "time1 is #{Time.now.usec} "
  254. result = request_code_repeattest(all_studentwork)
  255. logger.debug "time2 is #{Time.now.usec} "
  256. resultObj[:status] = result['status'].to_i
  257. # resultObj[:results] = result['results']
  258. #Time.now, simi_id = simiworkid , simi_value = simivalue
  259. if resultObj[:status] == 0
  260. @homework.simi_time = Time.now
  261. resultObj[:comparetime] = @homework.simi_time
  262. @homework.update_column('simi_time', @homework.simi_time)
  263. logger.debug "time3 is #{Time.now.usec} "
  264. result['results'].each do |key,value|
  265. @student_work = StudentWork.where("id =?", key.to_i).first
  266. @student_work.update_column('simi_id', value['simiworkid'].to_i)
  267. @student_work.update_column('simi_value', value['simivalue'].to_i)
  268. # sqlstr = "update student_works set simi_id=#{value['simiworkid']},simi_value=#{value['simivalue']} where id=#{key.to_i} "
  269. # dbh.execute(sqlstr)
  270. end
  271. logger.debug "time4 is #{Time.now.usec} "
  272. end
  273. end
  274. tEndtime = Time.now
  275. logger.debug "code_repeattest end is #{tEndtime}}"
  276. tUsedtime = (tEndtime.to_i-tStarttime.to_i)*1000000+(tEndtime.usec - tStarttime.usec)
  277. logger.debug "code_repeattest userd utime is #{tUsedtime}"
  278. render :json => resultObj
  279. end
  280. #上次代码查重时间
  281. def last_codecomparetime
  282. resultObj = {status: 0}
  283. @homework = HomeworkCommon.find params[:homework]
  284. #转换一下
  285. if @homework.simi_time != nil
  286. resultObj[:comparetime] = Time.parse(@homework.simi_time.to_s).strftime("%Y-%m-%d %H:%M:%S")
  287. else
  288. resultObj[:comparetime] = 0
  289. end
  290. render :json => resultObj
  291. end
  292. def index
  293. # 作业消息状态更新
  294. @homework.course_messages.each do |homework_message|
  295. if User.current.id == homework_message.user_id && homework_message.viewed == 0
  296. homework_message.update_attributes(:viewed => true) if homework_message.viewed == 0
  297. end
  298. end
  299. #修改作品提示消息更新
  300. student_work_messages = CourseMessage.where("user_id =? and course_id =? and course_message_type =? and viewed =?", User.current.id, @homework.course, StudentWork.name, 0)
  301. student_work_messages.each do |message|
  302. message.update_attribute(:viewed, true)
  303. end
  304. # 作品打分消息状态更新
  305. studentworks_scores = CourseMessage.where("user_id =? and course_id =? and course_message_type =? and viewed =?", User.current.id, @homework.course, "StudentWorksScore", 0)
  306. studentworks_scores.each do |studentworks_score|
  307. studentworks_score.update_attributes(:viewed => true) if studentworks_score.viewed == 0
  308. end
  309. # 作品评论消息状态更新
  310. journals_for_teacher = CourseMessage.where("user_id =? and course_id =? and course_message_type =? and viewed =?", User.current.id, @homework.course, "JournalsForMessage", 0)
  311. journals_for_teacher.each do |journal_for_teacher|
  312. journal_for_teacher.update_attributes(:viewed => true)
  313. end
  314. #不能参与作业匿评消息状态更新
  315. no_evaluation = CourseMessage.where("user_id =? and course_id =? and course_message_type =? and viewed =? and status =?", User.current.id, @homework.course, "StudentWork", 0, 0)
  316. no_evaluation.update_all(:viewed => true)
  317. # 作品留言
  318. # 消息end
  319. #设置作业对应的forge_messages表的viewed字段
  320. query_student_work = @homework.course_messages
  321. query_student_work.each do |query|
  322. if User.current.id == query.user_id
  323. query.update_attributes(:viewed => true)
  324. end
  325. end
  326. ##################################################################################################################
  327. @order,@b_sort,@name,@group = params[:order] || "score",params[:sort] || "desc",params[:name].to_s.strip || "",params[:group]
  328. @homework_commons = @course.homework_commons.where("publish_time <= ?",Time.now.strftime("%Y-%m-%d")).order("created_at desc")
  329. @all_homework_commons = @course.homework_commons.order("created_at desc")
  330. @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin?
  331. @is_evaluation = @homework.homework_detail_manual && @homework.homework_detail_manual.comment_status == 2 && !@is_teacher #是不是匿评
  332. @show_all = false
  333. # 0表示没有分组的学生,-1表示所有分组的学生
  334. if @group
  335. if @group == "0"
  336. none_group_students = @course.members.select{ |member| member.course_group_id == 0 }
  337. if none_group_students.empty?
  338. student_in_group = '(0)'
  339. else
  340. student_in_group = '(' + none_group_students.map{ |member| member.user_id }.join(',') + ')'
  341. end
  342. elsif @group == "-1"
  343. all_group_students = @course.members.select{ |member| member.course_group_id }
  344. if all_group_students.empty?
  345. student_in_group = '(0)'
  346. else
  347. student_in_group = '(' + all_group_students.map{ |member| member.user_id }.join(',') + ')'
  348. end
  349. else
  350. course_group = CourseGroup.find_by_id(@group)
  351. group_students = course_group.users
  352. if group_students.empty?
  353. student_in_group = '(0)'
  354. else
  355. student_in_group = '(' + group_students.map{ |user| user.id }.join(',') + ')'
  356. end
  357. end
  358. #开放作品 || 老师 || 超级管理员 || 禁用匿评&&作业截止&&已提交作品 显示所有列表
  359. if (@homework.is_open == 1 && @course.is_public == 1) || (@homework.is_open == 1 && @course.is_public == 0 && User.current.member_of_course?(@course)) || @is_teacher || User.current.admin? || (User.current.member_of_course?(@course) && @homework.anonymous_comment == 1 && Time.parse(@homework.end_time.to_s).strftime("%Y-%m-%d") < Time.now.strftime("%Y-%m-%d") && !@homework.student_works.has_committed.where(:user_id => User.current.id).empty?)
  360. if @order == 'lastname'
  361. @stundet_works = search_homework_member @homework.student_works.select("student_works.*,student_works.work_score as score").joins(:user).where("users.id in #{student_in_group}").order("CONVERT(lastname USING gbk) COLLATE gbk_chinese_ci #{@b_sort}, login #{@b_sort}"),@name
  362. elsif @order == 'student_id'
  363. @stundet_works = search_homework_member @homework.student_works.select("student_works.*,student_works.work_score as score").joins(:user).where("users.id in #{student_in_group}").joins("join user_extensions on student_works.user_id = user_extensions.user_id").order("#{@order} #{@b_sort}"),@name
  364. else
  365. @stundet_works = search_homework_member @homework.student_works.select("student_works.*,student_works.work_score as score").joins(:user).where("users.id in #{student_in_group}").order("#{@order} #{@b_sort}"),@name
  366. end
  367. @show_all = true
  368. elsif User.current.member_of_course?(@course)
  369. if @homework.homework_detail_manual.comment_status == 1 #学生 && 未开启匿评 只看到自己的
  370. if @homework.homework_type == 3
  371. pro = @homework.student_work_projects.where(:user_id => User.current.id).first
  372. if pro.nil?
  373. @stundet_works = []
  374. else
  375. @stundet_works = @homework.student_works.select("student_works.*,student_works.work_score as score").where(:id => pro.student_work_id)
  376. end
  377. else
  378. @stundet_works = @homework.student_works.has_committed.select("student_works.*,student_works.work_score as score").where(:user_id => User.current.id)
  379. end
  380. elsif @homework.homework_detail_manual.comment_status == 2 #学生 && 开启匿评 看到匿评列表
  381. if @homework.homework_type == 3
  382. pro = @homework.student_work_projects.where(:user_id => User.current.id).first
  383. if pro.nil?
  384. my_work = []
  385. else
  386. my_work = @homework.student_works.where(:id => pro.student_work_id)
  387. end
  388. else
  389. my_work = @homework.student_works.has_committed.where(:user_id => User.current.id)
  390. end
  391. @stundet_works = my_work + User.current.student_works_evaluation_distributions.map(&:student_work).select { |work| work.homework_common_id == @homework.id}
  392. elsif @homework.homework_detail_manual.comment_status == 3 #学生 && 关闭匿评 未提交作品之前列表为空,提交了作品看到所有的
  393. if @homework.homework_type == 3
  394. pro = @homework.student_work_projects.where(:user_id => User.current.id).first
  395. if pro.nil?
  396. my_work = []
  397. else
  398. my_work = @homework.student_works.select("student_works.*,student_works.work_score as score").where(:id => pro.student_work_id)
  399. end
  400. else
  401. my_work = @homework.student_works.has_committed.select("student_works.*,student_works.work_score as score").where(:user_id => User.current.id)
  402. end
  403. if my_work.empty?
  404. @stundet_works = []
  405. else
  406. if @order == 'lastname'
  407. @stundet_works = search_homework_member @homework.student_works.has_committed.select("student_works.*,student_works.work_score as score").joins(:user).where("users.id in #{student_in_group}").order("CONVERT(lastname USING gbk) COLLATE gbk_chinese_ci #{@b_sort}, login #{@b_sort}"),@name
  408. elsif @order == 'student_id'
  409. @stundet_works = search_homework_member @homework.student_works.has_committed.select("student_works.*,student_works.work_score as score").joins(:user).where("users.id in #{student_in_group}").joins("join user_extensions on student_works.user_id = user_extensions.user_id").order("#{@order} #{@b_sort}"),@name
  410. else
  411. @stundet_works = search_homework_member @homework.student_works.has_committed.select("student_works.*,student_works.work_score as score").joins(:user).where("users.id in #{student_in_group}").order("#{@order} #{@b_sort}"),@name
  412. end
  413. @show_all = true
  414. end
  415. else
  416. @stundet_works = []
  417. end
  418. else
  419. render_403
  420. return
  421. end
  422. @student_work_count = (search_homework_member @homework.student_works.has_committed.select("student_works.*,student_works.work_score as score").joins(:user).where("users.id in #{student_in_group}").order("#{@order} #{@b_sort}"),@name).count
  423. else
  424. if (@homework.is_open == 1 &&@course.is_public == 1) || (@homework.is_open == 1 && @course.is_public == 0 && User.current.member_of_course?(@course)) || @is_teacher || User.current.admin? || (User.current.member_of_course?(@course) && @homework.anonymous_comment == 1 && Time.parse(@homework.end_time.to_s).strftime("%Y-%m-%d") < Time.now.strftime("%Y-%m-%d") && !@homework.student_works.has_committed.where(:user_id => User.current.id).empty?)
  425. if @order == 'lastname'
  426. @stundet_works = search_homework_member @homework.student_works.select("student_works.*,student_works.work_score as score").joins(:user).order("CONVERT(lastname USING gbk) COLLATE gbk_chinese_ci #{@b_sort}, login #{@b_sort}"),@name
  427. elsif @order == 'student_id'
  428. @stundet_works = search_homework_member @homework.student_works.select("student_works.*,student_works.work_score as score").joins("join user_extensions on student_works.user_id = user_extensions.user_id").order("#{@order} #{@b_sort}"),@name
  429. else
  430. @stundet_works = search_homework_member @homework.student_works.select("student_works.*,student_works.work_score as score").order("#{@order} #{@b_sort}"),@name
  431. end
  432. @show_all = true
  433. elsif User.current.member_of_course?(@course)
  434. if @homework.homework_detail_manual.comment_status == 1 #学生 && 未开启匿评 只看到自己的
  435. if @homework.homework_type == 3
  436. pro = @homework.student_work_projects.where(:user_id => User.current.id).first
  437. if pro.nil?
  438. @stundet_works = []
  439. else
  440. @stundet_works = @homework.student_works.select("student_works.*,student_works.work_score as score").where(:id => pro.student_work_id)
  441. end
  442. else
  443. @stundet_works = @homework.student_works.has_committed.select("student_works.*,student_works.work_score as score").where(:user_id => User.current.id)
  444. end
  445. elsif @homework.homework_detail_manual.comment_status == 2 #学生 && 开启匿评 看到匿评列表
  446. if @homework.homework_type == 3
  447. pro = @homework.student_work_projects.where(:user_id => User.current.id).first
  448. if pro.nil?
  449. my_work = []
  450. else
  451. my_work = @homework.student_works.where(:id => pro.student_work_id)
  452. end
  453. else
  454. my_work = @homework.student_works.has_committed.where(:user_id => User.current.id)
  455. end
  456. @stundet_works = my_work + User.current.student_works_evaluation_distributions.map(&:student_work).select { |work| work.homework_common_id == @homework.id}
  457. elsif @homework.homework_detail_manual.comment_status == 3 #学生 && 关闭匿评 未提交作品之前列表为空,提交了作品看到所有的
  458. if @homework.homework_type == 3
  459. pro = @homework.student_work_projects.where(:user_id => User.current.id).first
  460. if pro.nil?
  461. my_work = []
  462. else
  463. my_work = @homework.student_works.select("student_works.*,student_works.work_score as score").where(:id => pro.student_work_id)
  464. end
  465. else
  466. my_work = @homework.student_works.has_committed.select("student_works.*,student_works.work_score as score").where(:user_id => User.current.id)
  467. end
  468. if my_work.empty?
  469. @stundet_works = []
  470. else
  471. if @order == 'lastname'
  472. @stundet_works = search_homework_member @homework.student_works.has_committed.select("student_works.*,student_works.work_score as score").joins(:user).order("CONVERT(lastname USING gbk) COLLATE gbk_chinese_ci #{@b_sort}, login #{@b_sort}"),@name
  473. elsif @order == 'student_id'
  474. @stundet_works = search_homework_member @homework.student_works.has_committed.select("student_works.*,student_works.work_score as score").joins("join user_extensions on student_works.user_id = user_extensions.user_id").order("#{@order} #{@b_sort}"),@name
  475. else
  476. @stundet_works = search_homework_member @homework.student_works.has_committed.select("student_works.*,student_works.work_score as score").order("#{@order} #{@b_sort}"),@name
  477. end
  478. @show_all = true
  479. end
  480. else
  481. @stundet_works = []
  482. end
  483. else
  484. render_403
  485. return
  486. end
  487. @student_work_count = (search_homework_member @homework.student_works.has_committed.select("student_works.*,student_works.work_score as score").order("#{@order} #{@b_sort}"),@name).count
  488. end
  489. @score = @b_sort == "desc" ? "asc" : "desc"
  490. @is_focus = params[:is_focus] ? params[:is_focus].to_i : 0
  491. # 消息传过来的ID
  492. @message_student_work_id = params[:student_work_id]
  493. @left_nav_type = 3
  494. respond_to do |format|
  495. format.js
  496. format.html
  497. format.xls {
  498. filename = "#{@course.teacher.lastname.to_s + @course.teacher.firstname}_#{@course.name}_#{@course.time.to_s + @course.term}_#{@homework.name}#{l(:excel_homework_list)}.xls"
  499. send_data(homework_to_xls(@stundet_works), :type => "text/excel;charset=utf-8; header=present",
  500. :filename => filename_for_content_disposition(filename))
  501. }
  502. end
  503. end
  504. def new
  505. #更新消息
  506. noEvaluation = @homework.course_messages.where("user_id =? and viewed =?", User.current.id, 0)
  507. noEvaluation.update_all(:viewed => true)
  508. if @homework.homework_type==2
  509. redirect_to new_user_commit_homework_users_path(homework_id: @homework.id)
  510. return
  511. end
  512. @user = User.current
  513. #@student_work = @homework.student_works.where("user_id = ?",User.current.id).first
  514. #if @student_work.nil?
  515. @student_work = StudentWork.new
  516. #end
  517. respond_to do |format|
  518. format.html{ render :layout => "new_base_user"}
  519. end
  520. end
  521. def create
  522. # 提交作品前先判断是否已经提交
  523. @has_commit = false;
  524. if hsd_committed_work?(User.current.id, @homework.id)
  525. @work = StudentWork.where("user_id =? and homework_common_id =? and work_status != 0", User.current.id, @homework.id).first
  526. @has_commit = true;
  527. #flash[:notice] = l(:notice_successful_create)
  528. #redirect_to edit_student_work_url(params[:student_work])
  529. respond_to do |format|
  530. format.js
  531. end
  532. return
  533. end
  534. if params[:student_work]
  535. @submit_result = true
  536. student_work = StudentWork.find(params[:student_work_id]) if params[:student_work_id]
  537. student_work = StudentWork.where("user_id =? and homework_common_id =? and work_status = 0", User.current.id, @homework.id).first
  538. student_work ||= StudentWork.new
  539. student_work.name = params[:student_work][:name] == "#{@homework.name}的作品提交(可修改)" ? "#{@homework.name}的作品提交" : params[:student_work][:name]
  540. student_work.description = params[:student_work][:description]
  541. student_work.homework_common_id = @homework.id
  542. student_work.user_id = User.current.id
  543. student_work.save_attachments(params[:attachments])
  544. render_attachment_warning_if_needed(student_work)
  545. if @homework.homework_type == 3 && @homework.homework_detail_group.base_on_project == 1
  546. @student_work_project = @homework.student_work_projects.where("user_id = #{User.current.id}").first
  547. student_work.project_id = @student_work_project.project_id
  548. end
  549. #提交作品时,计算是否迟交
  550. if Time.parse(@homework.end_time.to_s).strftime("%Y-%m-%d") < Time.parse(Time.now.to_s).strftime("%Y-%m-%d")
  551. student_work.late_penalty = @homework.late_penalty
  552. student_work.work_status = 2
  553. else
  554. student_work.late_penalty = 0
  555. student_work.work_status = 1
  556. end
  557. if student_work.save
  558. if @homework.homework_type == 3 && @homework.homework_detail_group.base_on_project == 1
  559. @student_work_project.student_work_id = student_work.id
  560. @student_work_project.save
  561. members = params[:group_member_ids].split(',')
  562. for i in 1 .. members.count-1
  563. stu_project = StudentWorkProject.new
  564. stu_project.homework_common_id = @homework.id
  565. stu_project.student_work_id = student_work.id
  566. stu_project.project_id = @student_work_project.project_id
  567. stu_project.user_id = members[i].to_i
  568. stu_project.is_leader = 0
  569. stu_project.save
  570. end
  571. elsif @homework.homework_type == 3 && @homework.homework_detail_group.base_on_project == 0
  572. members = params[:group_member_ids].split(',')
  573. for i in 0 .. members.count-1
  574. stu_project = StudentWorkProject.new
  575. stu_project.homework_common_id = @homework.id
  576. stu_project.student_work_id = student_work.id
  577. stu_project.project_id = -1
  578. stu_project.user_id = members[i].to_i
  579. if i == 0
  580. stu_project.is_leader = 1
  581. else
  582. stu_project.is_leader = 0
  583. end
  584. stu_project.save
  585. end
  586. end
  587. @homework.update_column(:updated_at, Time.now)
  588. update_course_activity(@homework.class,@homework.id)
  589. update_user_activity(@homework.class,@homework.id)
  590. update_org_activity(@homework.class,@homework.id)
  591. course_message = CourseMessage.new(:user_id =>User.current.id,:content=>"new",:course_message_id=>student_work.id,:course_id => @course.id,:course_message_type=>"StudentWork", :status => 9) #作品提交记录
  592. course_message.save
  593. @student_work = StudentWork.where(homework_common_id: @homework.id, user_id: User.current.id).first
  594. respond_to do |format|
  595. format.js
  596. end
  597. return
  598. end
  599. end
  600. @submit_result = false
  601. respond_to do |format|
  602. format.js
  603. end
  604. end
  605. def edit
  606. @user = User.current
  607. if (!User.current.admin? && @homework.homework_type == 2) || Time.parse(@homework.end_time.to_s).strftime("%Y-%m-%d") < Time.now.strftime("%Y-%m-%d") #编程作业不能修改作业|| 截止日期已到不能修改作业
  608. render_403
  609. else
  610. respond_to do |format|
  611. format.html{ render :layout => "new_base_user"}
  612. end
  613. end
  614. end
  615. def update
  616. if params[:student_work]
  617. @submit_result = true
  618. @work.name = params[:student_work][:name]
  619. @work.description = params[:student_work][:description]
  620. @work.save_attachments(params[:attachments])
  621. render_attachment_warning_if_needed(@work)
  622. if @work.save
  623. #如果学生作品被打分后修改,应该给老师提示
  624. send_message_to_teacher(@work)
  625. if @homework.homework_type == 3
  626. @student_work_project = @homework.student_work_projects.where("user_id=?",User.current.id).first
  627. student_work_projects = @homework.student_work_projects.where("student_work_id=? and is_leader =?",@work.id,0)
  628. student_work_projects.delete_all
  629. members = params[:group_member_ids].split(',')
  630. for i in 1 .. members.count-1
  631. stu_project = StudentWorkProject.new
  632. stu_project.homework_common_id = @homework.id
  633. stu_project.student_work_id = @work.id
  634. if @homework.homework_detail_group.base_on_project == 1
  635. stu_project.project_id = @student_work_project.project_id
  636. else @homework.homework_detail_group.base_on_project == 0
  637. stu_project.project_id = -1
  638. end
  639. stu_project.user_id = members[i].to_i
  640. stu_project.is_leader = 0
  641. stu_project.save
  642. end
  643. end
  644. course_message = CourseMessage.new(:user_id =>User.current.id,:content=>"edit",:course_message_id=>@work.id,:course_id => @course.id,:course_message_type=>"StudentWork", :status => 9) #作品提交记录
  645. course_message.save
  646. @student_work = @work
  647. respond_to do |format|
  648. format.js
  649. end
  650. return
  651. end
  652. end
  653. =begin
  654. respond_to do |format|
  655. format.html{redirect_to edit_student_work_url(@work)}
  656. end
  657. =end
  658. @submit_result = false
  659. respond_to do |format|
  660. format.js
  661. end
  662. end
  663. def show
  664. @score = student_work_score @work,User.current
  665. @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin?
  666. @student_work_scores = @work.student_works_scores.order("updated_at desc")
  667. respond_to do |format|
  668. format.js
  669. end
  670. end
  671. def destroy
  672. if @work.destroy
  673. if @homework.homework_type == 3 && @homework.homework_detail_group.base_on_project == 1
  674. pros = @work.student_work_projects.where("is_leader = 0")
  675. pros.each do |pro|
  676. pro.destroy
  677. end
  678. project = @work.student_work_projects.where("is_leader = 1").first
  679. project.update_attributes(:student_work_id => nil)
  680. elsif @homework.homework_type == 3 && @homework.homework_detail_group.base_on_project == 0
  681. @work.student_work_projects.each do |pro2|
  682. pro2.destroy
  683. end
  684. end
  685. respond_to do |format|
  686. format.html {
  687. redirect_to student_work_index_url(:homework => @homework.id)
  688. }
  689. end
  690. end
  691. end
  692. def delete_work
  693. @work = StudentWork.where("user_id =? and homework_common_id =?", User.current.id, @homework.id).first
  694. if @work
  695. @work.destroy
  696. if @homework.homework_type == 3 && @homework.homework_detail_group.base_on_project == 1
  697. pros = @work.student_work_projects.where("is_leader = 0")
  698. pros.each do |pro|
  699. pro.destroy
  700. end
  701. project = @work.student_work_projects.where("is_leader = 1").first
  702. project.update_attributes(:student_work_id => nil)
  703. elsif @homework.homework_type == 3 && @homework.homework_detail_group.base_on_project == 0
  704. @work.student_work_projects.each do |pro2|
  705. pro2.destroy
  706. end
  707. end
  708. end
  709. redirect_to student_homeworks_user_path(User.current.id)
  710. end
  711. def retry_work
  712. if @work.destroy
  713. if @homework.homework_type == 3 && @homework.homework_detail_group.base_on_project == 1
  714. pros = @work.student_work_projects.where("is_leader = 0")
  715. pros.each do |pro|
  716. pro.destroy
  717. end
  718. project = @work.student_work_projects.where("is_leader = 1").first
  719. project.update_attributes(:student_work_id => nil)
  720. elsif @homework.homework_type == 3 && @homework.homework_detail_group.base_on_project == 0
  721. @work.student_work_projects.each do |pro2|
  722. pro2.destroy
  723. end
  724. end
  725. @student_work = StudentWork.new
  726. respond_to do |format|
  727. format.js
  728. end
  729. end
  730. end
  731. #添加评分,已评分则为修改评分
  732. def add_score
  733. @is_last = params[:is_last] == "true"
  734. render_403 and return if User.current == @work.user #不可以匿评自己的作品
  735. @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin?
  736. #老师、教辅可以随时评分,学生只能在匿评作业的匿评阶段进行评分
  737. render_403 and return unless @is_teacher || @homework.homework_detail_manual.comment_status == 2
  738. @score = student_work_score @work,User.current
  739. #@score.comment = params[:new_form][:user_message] if params[:new_form] && params[:new_form][:user_message] && params[:new_form][:user_message] != ""
  740. #@score.score = params[:score] if params[:score]
  741. #if User.current.admin?
  742. # @score.reviewer_role = 1
  743. #else
  744. # role = User.current.members.where("course_id = ?",@course.id).first.roles.first.name
  745. # @score.reviewer_role = get_role_by_name(role)
  746. #end
  747. #@is_new = false
  748. @is_last_a = @work.student_works_scores.empty?
  749. @new_score = StudentWorksScore.new
  750. if @score && params[:score]
  751. @new_score.score = params[:score].to_i == -1 ? @score.score : params[:score]
  752. elsif @score.nil? && params[:score]
  753. @new_score.score = params[:score].to_i == -1 ? nil : params[:score]
  754. end
  755. @new_score.comment = params[:new_form][:user_message] if params[:new_form] && params[:new_form][:user_message] && params[:new_form][:user_message] != ""
  756. @new_score.user_id = User.current.id
  757. @new_score.student_work_id = @work.id
  758. if @is_teacher && @work.work_status == 0
  759. @work.update_column('work_status', 1)
  760. end
  761. if User.current.admin?
  762. @new_score.reviewer_role = 1
  763. else
  764. role = User.current.members.where("course_id = ?",@course.id).first.roles.first.name
  765. @new_score.reviewer_role = get_role_by_name(role)
  766. end
  767. if @score
  768. if @is_teacher
  769. @is_new = true
  770. @is_last_a = false
  771. else
  772. @is_new = false
  773. end
  774. else
  775. @is_new = true
  776. end
  777. @new_score.save_attachments(params[:attachments])
  778. render_attachment_warning_if_needed(@new_score)
  779. if @new_score.save
  780. case @new_score.reviewer_role
  781. when 1 #教师评分:最后一个教师评分为最终评分
  782. @work.teacher_score = @new_score.score
  783. when 2 #教辅评分 教辅评分显示平均分
  784. #@work.teaching_asistant_score = @work.student_works_scores.where(:reviewer_role => 2).average(:score).try(:round, 2).to_f
  785. ts_score = StudentWorksScore.find_by_sql("SELECT AVG(score) AS score FROM (SELECT * FROM (SELECT * FROM student_works_scores WHERE student_work_id = #{@work.id} AND reviewer_role = 2 AND score IS NOT NULL ORDER BY created_at DESC) AS t GROUP BY user_id) AS a")
  786. @work.teaching_asistant_score = ts_score.first.score.nil? ? nil : ts_score.first.score.try(:round, 2).to_f
  787. when 3 #学生评分 学生评分显示平均分
  788. #@work.student_score = @work.student_works_scores.where(:reviewer_role => 3).average(:score).try(:round, 2).to_f
  789. stu_score = StudentWorksScore.find_by_sql("SELECT AVG(score) AS score FROM (SELECT * FROM (SELECT * FROM student_works_scores WHERE student_work_id = #{@work.id} AND reviewer_role = 3 ORDER BY created_at DESC) AS t GROUP BY user_id) AS a")
  790. @work.student_score = stu_score.first.score.try(:round, 2).to_f
  791. end
  792. @homework.update_column('updated_at', Time.now)
  793. update_course_activity(@homework.class,@homework.id)
  794. update_user_activity(@homework.class,@homework.id)
  795. update_org_activity(@homework.class,@homework.id)
  796. if @work.save
  797. @work = @homework.student_works.select("student_works.*,student_works.work_score as score").where(:id => @work.id).first
  798. respond_to do |format|
  799. format.js
  800. end
  801. end
  802. end
  803. end
  804. #添加评分的回复
  805. def add_score_reply
  806. @score = StudentWorksScore.find params[:score_id]
  807. @is_last = params[:is_last] == "true"
  808. @jour = @score.journals_for_messages.new(:user_id => User.current.id,:notes =>params[:message], :reply_id => 0)
  809. if @jour.save
  810. @status = 1
  811. else
  812. @status = 2
  813. end
  814. respond_to do |format|
  815. format.js
  816. end
  817. end
  818. #删除评分的回复
  819. def destroy_score_reply
  820. @jour = JournalsForMessage.find params[:jour_id]
  821. if @jour.destroy
  822. respond_to do |format|
  823. format.js
  824. end
  825. end
  826. end
  827. #提交未评分的评语
  828. def add_comments_to_work
  829. @work = StudentWork.find params[:id]
  830. respond_to do |format|
  831. format.js
  832. end
  833. end
  834. #为作品点赞
  835. def praise_student_work
  836. pt = PraiseTread.new
  837. pt.user_id = User.current.id
  838. pt.praise_tread_object_id = @work.id
  839. pt.praise_tread_object_type = "StudentWork"
  840. pt.praise_or_tread = 1
  841. if pt.save
  842. respond_to do |format|
  843. format.js
  844. end
  845. else
  846. render_404
  847. end
  848. end
  849. #缺评列表显示
  850. def student_work_absence_penalty
  851. order = params[:order] || "desc"
  852. if @homework.student_works.empty?
  853. @stundet_works = []
  854. else
  855. work_ids = "(" + @homework.student_works.map(&:id).join(",") + ")"
  856. @stundet_works = StudentWork.find_by_sql("SELECT *,(all_count - has_count) AS absence FROM(
  857. SELECT * ,
  858. (SELECT COUNT(*) FROM `student_works_evaluation_distributions` WHERE user_id = student_works.user_id AND student_work_id IN #{work_ids}) AS all_count,
  859. (SELECT COUNT(*) FROM `student_works_scores` WHERE user_id = student_works.user_id AND student_work_id IN #{work_ids}) AS has_count
  860. FROM `student_works`
  861. WHERE homework_common_id = #{@homework.id}
  862. ) AS table_1
  863. ORDER BY absence #{order}")
  864. end
  865. @order = order == "desc" ? "asc" : "desc"
  866. @left_nav_type = 3
  867. respond_to do |format|
  868. format.html
  869. end
  870. end
  871. #导出缺评列表
  872. def absence_penalty_list
  873. if @homework.student_works.empty?
  874. @stundet_works = []
  875. else
  876. work_ids = "(" + @homework.student_works.map(&:id).join(",") + ")"
  877. @stundet_works = StudentWork.find_by_sql("SELECT * FROM (SELECT *,(all_count - has_count) AS absence FROM(
  878. SELECT * ,
  879. (SELECT COUNT(*) FROM `student_works_evaluation_distributions` WHERE user_id = student_works.user_id AND student_work_id IN #{work_ids}) AS all_count,
  880. (SELECT COUNT(*) FROM `student_works_scores` WHERE user_id = student_works.user_id AND student_work_id IN #{work_ids}) AS has_count
  881. FROM `student_works`
  882. WHERE homework_common_id = #{@homework.id}
  883. ) AS table_1) AS table_2
  884. where absence > 0 order by absence")
  885. end
  886. respond_to do |format|
  887. format.xls {
  888. filename = "#{@course.teacher.lastname.to_s + @course.teacher.firstname}_#{@course.name}_#{@course.time.to_s + @course.term}_#{@homework.name}#{l(:excel_absence_list)}.xls"
  889. send_data(absence_penalty_list_xls(@stundet_works), :type => "text/excel;charset=utf-8; header=present",
  890. :filename => filename_for_content_disposition(filename))
  891. }
  892. end
  893. end
  894. #导出匿评列表
  895. def evaluation_list
  896. respond_to do |format|
  897. format.xls {
  898. filename = "#{@course.teacher.lastname.to_s + @course.teacher.firstname}_#{@course.name}_#{@course.time.to_s + @course.term}_#{@homework.name}#{l(:excel_evaluation_list)}.xls"
  899. send_data(evaluation_list_xls(@homework.student_works), :type => "text/excel;charset=utf-8; header=present",
  900. :filename => filename_for_content_disposition(filename))
  901. }
  902. end
  903. end
  904. #设置评分规则
  905. def set_score_rule
  906. homework_detail_manual = @homework.homework_detail_manual
  907. homework_detail_programing = @homework.homework_detail_programing
  908. unless @homework.late_penalty.to_s == params[:late_penalty].to_s
  909. @homework.late_penalty = params[:late_penalty]
  910. @homework.student_works.where("created_at > '#{@homework.end_time} 23:59:59'").each do |student_work|
  911. student_work.late_penalty = @homework.late_penalty
  912. student_work.save
  913. end
  914. end
  915. if params[:absence_penalty] && homework_detail_manual.absence_penalty.to_s != params[:absence_penalty].to_s
  916. homework_detail_manual.absence_penalty = params[:absence_penalty]
  917. if homework_detail_manual.comment_status == 3 #当前作业处于匿评结束状态,修改缺评扣分才会修改每个作品应扣分的值
  918. work_ids = "(" + @homework.student_works.map(&:id).join(",") + ")"
  919. @homework.student_works.each do |student_work|
  920. absence_penalty_count = student_work.user.student_works_evaluation_distributions.where("student_work_id IN #{work_ids}").count - student_work.user.student_works_scores.where("student_work_id IN #{work_ids}").count
  921. student_work.absence_penalty = absence_penalty_count > 0 ? absence_penalty_count * homework_detail_manual.absence_penalty : 0
  922. student_work.save
  923. end
  924. end
  925. homework_detail_manual.save if homework_detail_manual
  926. end
  927. teacher_priority = params[:teacher_priority] ? 1 : 0
  928. if homework_detail_manual.ta_proportion.to_s != params[:ta_proportion].to_s || @homework.teacher_priority.to_s != teacher_priority.to_s || (homework_detail_programing && homework_detail_programing.ta_proportion.to_s != params[:sy_proportion].to_s)
  929. homework_detail_manual.ta_proportion = params[:ta_proportion]
  930. homework_detail_programing.ta_proportion = params[:sy_proportion] if homework_detail_programing
  931. @homework.update_column('teacher_priority', teacher_priority)
  932. homework_detail_manual.save if homework_detail_manual
  933. homework_detail_programing.save if homework_detail_programing
  934. @homework.student_works.each do |student_work|
  935. set_final_score @homework,student_work
  936. student_work.save
  937. end
  938. end
  939. @homework.save
  940. if params[:student_path]
  941. redirect_to student_work_index_url(:homework => @homework.id)
  942. else
  943. @user_activity_id = params[:user_activity_id].to_i
  944. @is_in_course = params[:is_in_course].to_i
  945. @course_activity = params[:course_activity].to_i
  946. respond_to do |format|
  947. format.js
  948. end
  949. end
  950. end
  951. def forbidden_anonymous_comment
  952. @homework.update_column('anonymous_comment', 1)
  953. homework_detail_manual = @homework.homework_detail_manual
  954. homework_detail_programing = @homework.homework_detail_programing
  955. if homework_detail_programing
  956. homework_detail_manual.update_column('ta_proportion', 0.4)
  957. homework_detail_programing.update_column('ta_proportion', 0.6)
  958. else
  959. homework_detail_manual.update_column('ta_proportion', 1.0)
  960. end
  961. @homework.student_works.each do |student_work|
  962. set_final_score @homework,student_work
  963. student_work.save
  964. end
  965. @user_activity_id = params[:user_activity_id].to_i
  966. @is_in_course = params[:is_in_course].to_i
  967. @course_activity = params[:course_activity].to_i
  968. end
  969. def revise_attachment
  970. Attachment.attach_filesex(@work, params[:attachments], params[:attachment_type])
  971. revise_attachments = @work.attachments.where("attachtype = 7").reorder("created_on desc")
  972. if revise_attachments.count == 2
  973. revise_attachments.last.destroy
  974. end
  975. attachment = @work.attachments.where("attachtype = 7").first
  976. attachment.update_attributes(:description => params[:description])
  977. if attachment.attachtype == 7
  978. student_work = StudentWork.find attachment.container_id
  979. CourseMessage.create(:user_id => student_work.homework_common.user_id, :course_id => student_work.homework_common.course_id, :viewed => false,:course_message_id=>attachment.container_id,:course_message_type=>'StudentWork',:status=>2)
  980. end
  981. respond_to do |format|
  982. format.js
  983. end
  984. end
  985. def new_student_work_project
  986. @user_activity_id = params[:user_activity_id].to_i
  987. @is_in_course = params[:is_in_course].to_i
  988. @course_activity = params[:course_activity].to_i
  989. respond_to do |format|
  990. format.js
  991. end
  992. end
  993. #创建作业的关联项目
  994. def student_work_project
  995. @project = StudentWorkProject.new
  996. @project.homework_common_id = @homework.id
  997. @project.project_id = (Project.find params[:projectName].to_i).id
  998. @project.user_id = User.current.id
  999. @project.is_leader = 1
  1000. if @project.save
  1001. @user_activity_id = params[:user_activity_id].to_i
  1002. @is_in_course = params[:is_in_course].to_i
  1003. @course_activity = params[:course_activity].to_i
  1004. respond_to do |format|
  1005. format.js
  1006. end
  1007. end
  1008. end
  1009. #查找学生创建的项目列表
  1010. def search_user_projects
  1011. condition = '%%'
  1012. if !params[:name].nil?
  1013. condition = "%#{params[:name].strip}%".gsub(" ","")
  1014. end
  1015. @project_ids = Project.visible.where("user_id = #{User.current.id} and name like '#{condition}'")
  1016. @first = params[:first].to_i
  1017. respond_to do |format|
  1018. format.js
  1019. end
  1020. end
  1021. #查找课程的学生
  1022. def search_course_students
  1023. name = ""
  1024. unless params[:name].nil?
  1025. name = params[:name]
  1026. end
  1027. if @homework.homework_detail_group.base_on_project == 0
  1028. all_student_ids = "(" + @homework.course.student.map{|student| student.student_id}.join(",") + ")"
  1029. else
  1030. pro = Project.find @homework.student_work_projects.where("user_id=?",User.current.id).first.project_id
  1031. all_student_ids = "(" + pro.members.map{|member| member.user_id}.join(",") + ")"
  1032. end
  1033. all_students = User.where("id in #{all_student_ids}")
  1034. student_work_id = @homework.student_work_projects.where("user_id=? and student_work_id is not null",User.current.id).first.nil? ? -1 : @homework.student_work_projects.where("user_id=?",User.current.id).first.student_work_id
  1035. @commit_student_ids = @homework.student_work_projects.where("student_work_id != #{student_work_id}").map{|student| student.user_id}
  1036. @users = searchstudent_by_name all_students,name
  1037. respond_to do |format|
  1038. format.js
  1039. end
  1040. end
  1041. def cancel_relate_project
  1042. relate_pro = StudentWorkProject.where("user_id = #{User.current.id} and homework_common_id = #{@homework.id}").first
  1043. if relate_pro.destroy
  1044. @user_activity_id = params[:user_activity_id].to_i
  1045. @is_in_course = params[:is_in_course].to_i
  1046. @course_activity = params[:course_activity].to_i
  1047. respond_to do |format|
  1048. format.js
  1049. end
  1050. end
  1051. end
  1052. def get_user_infor
  1053. req = Hash.new(false)
  1054. user = User.where("id = #{params[:user_id].to_i}").first
  1055. if user
  1056. req[:id] = user.id
  1057. req[:name] = user.show_name
  1058. req[:student_id] = user.user_extensions.student_id
  1059. req[:valid] = true
  1060. else
  1061. req[:valid] = false
  1062. end
  1063. render :json => req
  1064. end
  1065. private
  1066. def searchstudent_by_name users, name
  1067. mems = []
  1068. if name != ""
  1069. name = name.to_s.downcase
  1070. users.each do |m|
  1071. username = m.lastname.to_s.downcase + m.firstname.to_s.downcase
  1072. if(m.login.to_s.downcase.include?(name) || m.user_extensions[:student_id].to_s.downcase.include?(name) || username.include?(name))
  1073. mems << m
  1074. end
  1075. end
  1076. else
  1077. mems = users
  1078. end
  1079. mems
  1080. end
  1081. def hsd_committed_work?(user, homework)
  1082. sw = StudentWork.where("user_id =? and homework_common_id =? and work_status != 0", user, homework).first
  1083. sw.nil? ? result = false : result = true
  1084. result
  1085. end
  1086. #获取作业
  1087. def find_homework
  1088. @homework = HomeworkCommon.find params[:homework]
  1089. @course = @homework.course
  1090. rescue
  1091. render_404
  1092. end
  1093. #获取作品
  1094. def find_work
  1095. @work = StudentWork.find params[:id]
  1096. @homework = @work.homework_common
  1097. @course = @homework.course
  1098. rescue
  1099. render_404
  1100. end
  1101. #是不是当前课程的成员
  1102. #当前课程成员才可以看到作品列表
  1103. def member_of_course
  1104. render_403 unless User.current.member_of_course?(@course) || User.current.admin?
  1105. end
  1106. #判断是不是当前作品的提交者
  1107. #提交者 && (非匿评作业 || 未开启匿评) 可以编辑作品
  1108. def author_of_work
  1109. render_403 unless User.current.admin? || (User.current.id == @work.user_id && @homework.homework_type != 1 || @homework.homework_detail_manual.comment_status == 1 )
  1110. end
  1111. def teacher_of_course
  1112. render_403 unless User.current.allowed_to?(:as_teacher,@course) || User.current.admin?
  1113. end
  1114. def is_logged
  1115. redirect_to signin_path unless User.current.logged?
  1116. end
  1117. #根据条件过滤作业结果
  1118. def search_homework_member homeworks,name
  1119. if name == ""
  1120. select_homework = homeworks
  1121. else
  1122. name = name.downcase
  1123. select_homework = homeworks.select{ |homework|
  1124. homework.user[:login].to_s.downcase.include?(name) || homework.user.user_extensions[:student_id].to_s.downcase.include?(name) || (homework.user[:lastname].to_s.downcase + homework.user[:firstname].to_s.downcase).include?(name)
  1125. }
  1126. end
  1127. select_homework
  1128. end
  1129. #作品列表转换为excel
  1130. def homework_to_xls items
  1131. xls_report = StringIO.new
  1132. book = Spreadsheet::Workbook.new
  1133. sheet1 = book.create_worksheet :name => "homework"
  1134. blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10
  1135. sheet1.row(0).default_format = blue
  1136. if @homework.homework_type == 1 #普通作业
  1137. if @homework.anonymous_comment ==0
  1138. sheet1.row(0).concat([l(:excel_user_id),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_mail),l(:excel_homework_name),l(:excel_homework_des),
  1139. l(:excel_t_score),l(:excel_ta_score), l(:excel_n_score),l(:excel_a_penalty),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)])
  1140. else
  1141. sheet1.row(0).concat([l(:excel_user_id),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_mail),l(:excel_homework_name),l(:excel_homework_des),
  1142. l(:excel_t_score),l(:excel_ta_score),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)])
  1143. end
  1144. count_row = 1
  1145. items.each do |homework|
  1146. sheet1[count_row,0]=homework.user.id
  1147. sheet1[count_row,1] = homework.user.show_name
  1148. sheet1[count_row,2] = homework.user.login
  1149. sheet1[count_row,3] = homework.user.user_extensions.student_id
  1150. sheet1[count_row,4] = homework.user.mail
  1151. sheet1[count_row,5] = homework.name
  1152. sheet1[count_row,6] = strip_html homework.description if !homework.description.nil?
  1153. sheet1[count_row,7] = homework.teacher_score.nil? ? l(:label_without_score) : homework.teacher_score.round(2)
  1154. sheet1[count_row,8] = homework.teaching_asistant_score.nil? ? l(:label_without_score) : homework.teaching_asistant_score.round(2)
  1155. if @homework.anonymous_comment ==0
  1156. sheet1[count_row,9] = homework.student_score.nil? ? l(:label_without_score) : homework.student_score.round(2)
  1157. sheet1[count_row,10] = (@homework.teacher_priority == 1 && !homework.teacher_score.nil?) ? 0 : homework.absence_penalty
  1158. sheet1[count_row,11] = (@homework.teacher_priority == 1 && !homework.teacher_score.nil?) ? 0 : homework.late_penalty
  1159. sheet1[count_row,12] = homework.respond_to?("score") ? homework.score.nil? ? l(:label_without_score) : homework.score.round(2) : l(:label_without_score)
  1160. sheet1[count_row,13] = format_time(homework.created_at)
  1161. else
  1162. sheet1[count_row,9] = (@homework.teacher_priority == 1 && !homework.teacher_score.nil?) ? 0 : homework.late_penalty
  1163. sheet1[count_row,10] = homework.respond_to?("score") ? homework.score.nil? ? l(:label_without_score) : homework.score.round(2) : l(:label_without_score)
  1164. sheet1[count_row,11] = format_time(homework.created_at)
  1165. end
  1166. count_row += 1
  1167. end
  1168. elsif @homework.homework_type == 2 #编程作业
  1169. if @homework.anonymous_comment ==0
  1170. sheet1.row(0).concat([l(:excel_user_id),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_mail),l(:excel_homework_name),l(:excel_homework_des),
  1171. l(:excel_t_score),l(:excel_ta_score), l(:excel_s_score),l(:excel_n_score),l(:excel_a_penalty),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)])
  1172. else
  1173. sheet1.row(0).concat([l(:excel_user_id),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_mail),l(:excel_homework_name),l(:excel_homework_des),
  1174. l(:excel_t_score),l(:excel_ta_score), l(:excel_s_score),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)])
  1175. end
  1176. count_row = 1
  1177. items.each do |homework|
  1178. sheet1[count_row,0]=homework.user.id
  1179. sheet1[count_row,1] = homework.user.show_name
  1180. sheet1[count_row,2] = homework.user.login
  1181. sheet1[count_row,3] = homework.user.user_extensions.student_id
  1182. sheet1[count_row,4] = homework.user.mail
  1183. sheet1[count_row,5] = homework.name
  1184. sheet1[count_row,6] = homework.description
  1185. sheet1[count_row,7] = homework.teacher_score.nil? ? l(:label_without_score) : homework.teacher_score.round(2)
  1186. sheet1[count_row,8] = homework.teaching_asistant_score.nil? ? l(:label_without_score) : homework.teaching_asistant_score.round(2)
  1187. sheet1[count_row,9] = homework.system_score.nil? ? l(:label_without_score) : homework.system_score.round(2)
  1188. if @homework.anonymous_comment ==0
  1189. sheet1[count_row,10] = homework.student_score.nil? ? l(:label_without_score) : homework.student_score.round(2)
  1190. sheet1[count_row,11] = (@homework.teacher_priority == 1 && !homework.teacher_score.nil?) ? 0 : homework.absence_penalty
  1191. sheet1[count_row,12] = (@homework.teacher_priority == 1 && !homework.teacher_score.nil?) ? 0 : homework.late_penalty
  1192. sheet1[count_row,13] = homework.respond_to?("score") ? homework.score.nil? ? l(:label_without_score) : homework.score.round(2) : l(:label_without_score)
  1193. sheet1[count_row,14] = format_time(homework.created_at)
  1194. else
  1195. sheet1[count_row,10] = (@homework.teacher_priority == 1 && !homework.teacher_score.nil?) ? 0 : homework.late_penalty
  1196. sheet1[count_row,11] = homework.respond_to?("score") ? homework.score.nil? ? l(:label_without_score) : homework.score.round(2) : l(:label_without_score)
  1197. sheet1[count_row,12] = format_time(homework.created_at)
  1198. end
  1199. count_row += 1
  1200. end
  1201. elsif @homework.homework_type == 3 #分组作业
  1202. if @homework.anonymous_comment ==0
  1203. sheet1.row(0).concat([l(:excel_group_member),l(:excel_homework_name),l(:excel_homework_project),l(:excel_homework_des),
  1204. l(:excel_t_score),l(:excel_ta_score),l(:excel_n_score),l(:excel_a_penalty),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)])
  1205. else
  1206. sheet1.row(0).concat([l(:excel_group_member),l(:excel_homework_name),l(:excel_homework_project),l(:excel_homework_des),
  1207. l(:excel_t_score),l(:excel_ta_score),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)])
  1208. end
  1209. count_row = 1
  1210. items.each do |homework|
  1211. sheet1[count_row,0] = get_group_member_names homework
  1212. sheet1[count_row,1] = homework.name
  1213. sheet1[count_row,2] = (homework.project_id == 0 || homework.project_id.nil?) ? l(:excel_no_project) : homework.project.name
  1214. sheet1[count_row,3] = strip_html homework.description
  1215. sheet1[count_row,4] = homework.teacher_score.nil? ? l(:label_without_score) : homework.teacher_score.round(2)
  1216. sheet1[count_row,5] = homework.teaching_asistant_score.nil? ? l(:label_without_score) : homework.teaching_asistant_score.round(2)
  1217. if @homework.anonymous_comment ==0
  1218. sheet1[count_row,6] = homework.student_score.nil? ? l(:label_without_score) : homework.student_score.round(2)
  1219. sheet1[count_row,7] = (@homework.teacher_priority == 1 && !homework.teacher_score.nil?) ? 0 : homework.absence_penalty
  1220. sheet1[count_row,8] = (@homework.teacher_priority == 1 && !homework.teacher_score.nil?) ? 0 : homework.late_penalty
  1221. sheet1[count_row,9] = homework.respond_to?("score") ? homework.score.nil? ? l(:label_without_score) : homework.score.round(2) : l(:label_without_score)
  1222. sheet1[count_row,10] = format_time(homework.created_at)
  1223. else
  1224. sheet1[count_row,6] = (@homework.teacher_priority == 1 && !homework.teacher_score.nil?) ? 0 : homework.late_penalty
  1225. sheet1[count_row,7] = homework.respond_to?("score") ? homework.score.nil? ? l(:label_without_score) : homework.score.round(2) : l(:label_without_score)
  1226. sheet1[count_row,8] = format_time(homework.created_at)
  1227. end
  1228. count_row += 1
  1229. end
  1230. end
  1231. book.write xls_report
  1232. xls_report.string
  1233. end
  1234. #缺评列表转换为excel
  1235. def absence_penalty_list_xls items
  1236. xls_report = StringIO.new
  1237. book = Spreadsheet::Workbook.new
  1238. sheet1 = book.create_worksheet :name => "homework"
  1239. blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10
  1240. sheet1.row(0).default_format = blue
  1241. sheet1.row(0).concat([l(:excel_student_id),l(:excel_nickname),l(:excel_user_name),l(:lable_all_penalty),l(:lable_has_penalty),l(:lable_absence_penalty)])
  1242. count_row = 1
  1243. items.each do |homework|
  1244. sheet1[count_row,0] = homework.user.user_extensions.student_id
  1245. sheet1[count_row,1] = homework.user.login
  1246. sheet1[count_row,2] = homework.user.lastname.to_s + homework.user.firstname.to_s
  1247. sheet1[count_row,3] = homework.all_count
  1248. sheet1[count_row,4] = homework.has_count
  1249. sheet1[count_row,5] = homework.absence
  1250. count_row += 1
  1251. end
  1252. book.write xls_report
  1253. xls_report.string
  1254. end
  1255. #匿评列表转换为excel
  1256. def evaluation_list_xls items
  1257. xls_report = StringIO.new
  1258. book = Spreadsheet::Workbook.new
  1259. sheet1 = book.create_worksheet :name => "homework"
  1260. blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10
  1261. sheet1.row(0).default_format = blue
  1262. sheet1.row(0).concat([l(:label_work_name),l(:label_work_id),l(:label_work_autor),l(:label_evaluation_id),l(:label_evaluation_name),
  1263. l(:label_evaluation_score),l(:label_evaluation_common),l(:label_evaluation_time)])
  1264. count_row = 1
  1265. items.each do |homework|
  1266. homework.student_works_scores.where(:reviewer_role => 3).each do |score|
  1267. sheet1[count_row,0] = homework.name
  1268. sheet1[count_row,1] = homework.user.user_extensions.student_id
  1269. sheet1[count_row,2] = homework.user.show_name
  1270. sheet1[count_row,3] = score.user.user_extensions.student_id
  1271. sheet1[count_row,4] = score.user.show_name
  1272. sheet1[count_row,5] = score.score
  1273. sheet1[count_row,6] = score.comment
  1274. sheet1[count_row,7] = format_time(score.created_at)
  1275. count_row += 1
  1276. end
  1277. end
  1278. book.write xls_report
  1279. xls_report.string
  1280. end
  1281. def find_or_save_student_work(is_test)
  1282. student_work = StudentWork.where(homework_common_id: @homework.id, user_id: User.current.id).first
  1283. if student_work.nil?
  1284. @homework.student_works.build(
  1285. name: params[:title],
  1286. description: params[:src],
  1287. user_id: User.current.id,
  1288. is_test: is_test
  1289. )
  1290. unless @homework.save
  1291. logger.debug @homework.errors.full_messages
  1292. else
  1293. student_work = StudentWork.where(homework_common_id: @homework.id, user_id: User.current.id).first
  1294. end
  1295. end
  1296. student_work
  1297. end
  1298. def test_realtime(student_work, src)
  1299. url = "#{Redmine::Configuration['judge_server']}api/realtime_test.json"
  1300. factor = []
  1301. @homework.homework_tests.each do |test|
  1302. factor << {input: test.input, output: test.output}
  1303. end
  1304. solutions = {
  1305. src:src,
  1306. language:@homework.homework_detail_programing.language,
  1307. factor: factor
  1308. }
  1309. uri = URI(url)
  1310. body = solutions.to_json
  1311. res = Net::HTTP.new(uri.host, uri.port).start do |client|
  1312. request = Net::HTTP::Post.new(uri.path)
  1313. request.body = body
  1314. request["Content-Type"] = "application/json"
  1315. client.request(request)
  1316. end
  1317. JSON.parse(res.body)
  1318. end
  1319. def test_realtime_ex(test, src)
  1320. url = "#{Redmine::Configuration['judge_server']}api/realtime_test.json"
  1321. factor = []
  1322. factor << {input: test.input, output: test.output}
  1323. solutions = {
  1324. src:src,
  1325. language:@homework.homework_detail_programing.language,
  1326. factor: factor
  1327. }
  1328. uri = URI(url)
  1329. body = solutions.to_json
  1330. res = Net::HTTP.new(uri.host, uri.port).start do |client|
  1331. request = Net::HTTP::Post.new(uri.path)
  1332. request.body = body
  1333. request["Content-Type"] = "application/json"
  1334. client.request(request)
  1335. end
  1336. JSON.parse(res.body)
  1337. end
  1338. #成绩计算
  1339. def set_final_score homework,student_work
  1340. if homework && homework.homework_detail_manual
  1341. if homework.homework_type != 2 #匿评作业
  1342. if homework.teacher_priority == 1 #教师优先
  1343. if student_work.teacher_score
  1344. student_work.final_score = student_work.teacher_score
  1345. student_work.work_score = student_work.teacher_score
  1346. else
  1347. if student_work.teaching_asistant_score.nil?
  1348. student_work.final_score = student_work.student_score
  1349. elsif student_work.student_score.nil?
  1350. student_work.final_score = student_work.teaching_asistant_score
  1351. else
  1352. ta_proportion = homework.homework_detail_manual.ta_proportion
  1353. final_ta_score = BigDecimal.new("#{student_work.teaching_asistant_score}") * BigDecimal.new("#{ta_proportion}")
  1354. final_s_score = BigDecimal.new("#{student_work.student_score}") * (BigDecimal.new('1.0') - BigDecimal.new("#{ta_proportion}"))
  1355. final_score = final_ta_score + final_s_score
  1356. student_work.final_score = format("%.2f",final_score.to_f)
  1357. end
  1358. if student_work.final_score
  1359. score = student_work.final_score - student_work.absence_penalty - student_work.late_penalty
  1360. student_work.work_score = format("%.2f",(score < 0 ? 0 : score).to_f) if score
  1361. else
  1362. student_work.work_score = nil
  1363. end
  1364. end
  1365. else #不考虑教师评分
  1366. if student_work.teaching_asistant_score.nil?
  1367. student_work.final_score = student_work.student_score
  1368. elsif student_work.student_score.nil?
  1369. student_work.final_score = student_work.teaching_asistant_score
  1370. else
  1371. ta_proportion = homework.homework_detail_manual.ta_proportion
  1372. final_ta_score = BigDecimal.new("#{student_work.teaching_asistant_score}") * BigDecimal.new("#{ta_proportion}")
  1373. final_s_score = BigDecimal.new("#{student_work.student_score}") * (BigDecimal.new('1.0') - BigDecimal.new("#{ta_proportion}"))
  1374. final_score = final_ta_score + final_s_score
  1375. student_work.final_score = format("%.2f",final_score.to_f)
  1376. end
  1377. if student_work.final_score
  1378. score = student_work.final_score - student_work.absence_penalty - student_work.late_penalty
  1379. student_work.work_score = format("%.2f",(score < 0 ? 0 : score).to_f) if score
  1380. else
  1381. student_work.work_score = nil
  1382. end
  1383. end
  1384. elsif homework.homework_type == 2 && homework.homework_detail_programing #编程作业-----设定:系统评分必定不为空
  1385. if homework.teacher_priority == 1 #教师优先
  1386. if student_work.teacher_score
  1387. student_work.final_score = student_work.teacher_score
  1388. student_work.work_score = student_work.teacher_score
  1389. else
  1390. if student_work.teaching_asistant_score.nil? #教辅未评分
  1391. if student_work.student_score.nil?
  1392. student_work.final_score = student_work.system_score
  1393. else
  1394. ta_proportion = homework.homework_detail_programing.ta_proportion + homework.homework_detail_manual.ta_proportion / 2
  1395. final_sy_score = BigDecimal.new("#{student_work.system_score || 0}") * BigDecimal.new("#{ta_proportion}")
  1396. final_st_score = BigDecimal.new("#{student_work.student_score}") * (BigDecimal.new('1.0') - BigDecimal.new("#{ta_proportion}"))
  1397. final_score = final_sy_score + final_st_score
  1398. student_work.final_score = format("%.2f",final_score.to_f)
  1399. end
  1400. elsif student_work.student_score.nil? #学生未评分
  1401. if student_work.teaching_asistant_score.nil?
  1402. student_work.final_score = student_work.system_score
  1403. else
  1404. ta_proportion = homework.homework_detail_programing.ta_proportion + (1.0 - homework.homework_detail_manual.ta_proportion - homework.homework_detail_programing.ta_proportion) / 2
  1405. final_sy_score = BigDecimal.new("#{student_work.system_score || 0}") * BigDecimal.new("#{ta_proportion}")
  1406. final_ts_score = BigDecimal.new("#{student_work.teaching_asistant_score}") * (BigDecimal.new('1.0') - BigDecimal.new("#{ta_proportion}"))
  1407. final_score = final_sy_score + final_ts_score
  1408. student_work.final_score = format("%.2f",final_score.to_f)
  1409. end
  1410. else
  1411. final_sy_score = BigDecimal.new("#{student_work.system_score || 0}") * BigDecimal.new("#{homework.homework_detail_programing.ta_proportion}")
  1412. final_ts_score = BigDecimal.new("#{student_work.teaching_asistant_score}") * BigDecimal.new("#{homework.homework_detail_manual.ta_proportion}")
  1413. final_st_score = BigDecimal.new("#{student_work.student_score}") * (BigDecimal.new('1.0') - BigDecimal.new("#{homework.homework_detail_programing.ta_proportion}") - BigDecimal.new("#{homework.homework_detail_manual.ta_proportion}"))
  1414. final_score = final_sy_score + final_ts_score + final_st_score
  1415. student_work.final_score = format("%.2f",final_score.to_f)
  1416. end
  1417. if student_work.final_score
  1418. score = student_work.final_score - student_work.absence_penalty - student_work.late_penalty
  1419. student_work.work_score = format("%.2f",(score < 0 ? 0 : score).to_f) if score
  1420. else
  1421. student_work.work_score = nil
  1422. end
  1423. end
  1424. else #不考虑教师评分
  1425. if student_work.teaching_asistant_score.nil? #教辅未评分
  1426. if student_work.student_score.nil?
  1427. student_work.final_score = student_work.system_score
  1428. else
  1429. ta_proportion = homework.homework_detail_programing.ta_proportion + homework.homework_detail_manual.ta_proportion / 2
  1430. final_sy_score = BigDecimal.new("#{student_work.system_score || 0}") * BigDecimal.new("#{ta_proportion}")
  1431. final_st_score = BigDecimal.new("#{student_work.student_score}") * (BigDecimal.new('1.0') - BigDecimal.new("#{ta_proportion}"))
  1432. final_score = final_sy_score + final_st_score
  1433. student_work.final_score = format("%.2f",final_score.to_f)
  1434. end
  1435. elsif student_work.student_score.nil? #学生未评分
  1436. if student_work.teaching_asistant_score.nil?
  1437. student_work.final_score = student_work.system_score
  1438. else
  1439. ta_proportion = homework.homework_detail_programing.ta_proportion + (1.0 - homework.homework_detail_manual.ta_proportion - homework.homework_detail_programing.ta_proportion) / 2
  1440. final_sy_score = BigDecimal.new("#{student_work.system_score || 0}") * BigDecimal.new("#{ta_proportion}")
  1441. final_ts_score = BigDecimal.new("#{student_work.teaching_asistant_score}") * (BigDecimal.new('1.0') - BigDecimal.new("#{ta_proportion}"))
  1442. final_score = final_sy_score + final_ts_score
  1443. student_work.final_score = format("%.2f",final_score.to_f)
  1444. end
  1445. else
  1446. final_sy_score = BigDecimal.new("#{student_work.system_score || 0}") * BigDecimal.new("#{homework.homework_detail_programing.ta_proportion}")
  1447. final_ts_score = BigDecimal.new("#{student_work.teaching_asistant_score}") * BigDecimal.new("#{homework.homework_detail_manual.ta_proportion}")
  1448. final_st_score = BigDecimal.new("#{student_work.student_score}") * (BigDecimal.new('1.0') - BigDecimal.new("#{homework.homework_detail_programing.ta_proportion}") - BigDecimal.new("#{homework.homework_detail_manual.ta_proportion}"))
  1449. final_score = final_sy_score + final_ts_score + final_st_score
  1450. student_work.final_score = format("%.2f",final_score.to_f)
  1451. end
  1452. if student_work.final_score
  1453. score = student_work.final_score - student_work.absence_penalty - student_work.late_penalty
  1454. student_work.work_score = format("%.2f",(score < 0 ? 0 : score).to_f) if score
  1455. else
  1456. student_work.work_score = nil
  1457. end
  1458. end
  1459. end
  1460. end
  1461. end
  1462. end

软件技术创新是当今国家整体创新能力的重要基础和发展引擎。近年来,大众参与的软件创新与创业活动已经成为网络时代软件开发和应用的新形态,正在快速改变着全球软件创新模式和软件产业格局。 ...