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 81 kB

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

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