diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 7f1383bc..435c71fc 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -132,7 +132,6 @@ class ApplicationController < ActionController::Base end end - def ec_public_auth major_school unless User.current.admin? || major_school.template_major || major_school.school.users.where(:id => User.current.id).count > 0 || major_school.ec_major_school_users.where(:user_id => User.current.id).count > 0 || diff --git a/app/controllers/ec_years_controller.rb b/app/controllers/ec_years_controller.rb index 4661fd7b..c0c9483c 100644 --- a/app/controllers/ec_years_controller.rb +++ b/app/controllers/ec_years_controller.rb @@ -17,18 +17,11 @@ class EcYearsController < ApplicationController # 添加年份 def create @major_school = EcMajorSchool.find(params[:ec_major_school_id]) - ec_years = @major_school.ec_years.pluck(:year) - exist_year = ec_years.include?(params[:year].to_i) - if exist_year + if @major_school.ec_years.exists?(year: params[:year].to_i) @status = -1 else - prev_year = "#{params[:year].to_i - 1}" - prev_ec_year = @major_school.ec_years.where(:year => prev_year).first - if prev_ec_year.blank? - EcYear.create!(:year => params[:year], :ec_major_school_id => @major_school.id) - else - copy_year(prev_ec_year, params[:year]) - end + service = CopyEcYearService.new(@major_school, params[:year].to_i) + service.call @status = 1 end @major_manager = true @@ -246,7 +239,7 @@ class EcYearsController < ApplicationController template_file = EcTemplate.find_by_name "课程列表导入模板" if template_file.present? file = template_file.attachments.first - @file_url = "/attachments/download/#{file.id}/#{file.filename}" + @file_url = '' #"/attachments/download/#{file.id}/#{file.filename}" else @file_url = "javascript:void(0);" end @@ -357,236 +350,6 @@ class EcYearsController < ApplicationController @year = EcYear.find(params[:id]) end - # 复制最新一届下的所有数据. previous_ec_year: 本专业最新一届, new_year: 新建的届别 - def copy_year previous_ec_year, new_year - ActiveRecord::Base.transaction do - begin - # 如果是第一次创建届别,则直接创建 - if previous_ec_year.blank? - raise("没有界别可以复制") - else - logger.info("############previous_ec_year: #{previous_ec_year.id}") - # 多个中间表需要替换的id - egs_record = [] # 记录ec_graduation_subitems的新旧值 例如: [[prev_egs, new_egs], [...]] - egr_record = [] # 记录ec_graduation_requirements的新旧值, 例如: [[prev_egr, new_egr], [...]] - ec_record = [] # 记录ec_courses - ece_record = [] # 记录ec_course_evaluations - eces_record= [] # 记录ec_course_evaluation_subitems - ect_record = [] # 记录ec_course_targets - - # 复制 "届别" - ec_year = EcYear.create!(:year => new_year, - :ec_major_school_id => previous_ec_year.ec_major_school_id, - :calculation_value => previous_ec_year.calculation_value) - - # 复制 "毕业要求" - previous_ec_year.ec_graduation_requirements.try(:each) do |pre_egr| - new_egr = EcGraduationRequirement.new - new_egr.attributes = pre_egr.attributes.dup.except("id", "ec_year_id") - new_egr.ec_year_id = ec_year.id - new_egr.save! - egr_record << [pre_egr.id, new_egr.id] - # 复制 "毕业要求子标点" - pre_egr.ec_graduation_subitems.try(:each) do |pre_egs| - new_egs = EcGraduationSubitem.new - new_egs.attributes = pre_egs.attributes.dup.except("id", "ec_graduation_requirement_id") - new_egs.ec_graduation_requirement_id = new_egr.id - new_egs.save! - # 记录新旧对应关系,为之后的中间表做记录 - egs_record << [pre_egs.id, new_egs.id] - prev_ersvss = EcRequireSubVsStandard.where(:ec_graduation_subitem_id => pre_egs.id) - prev_ersvss.each do |prev_ersvs| - new_ersvss = EcRequireSubVsStandard.new - new_ersvss.attributes = prev_ersvs.attributes.dup.except("id", "ec_graduation_subitem_id") - new_ersvss.ec_graduation_subitem_id = new_egs.id - new_ersvss.save! - end - - end - end - - # 复制 "培养目标" - pre_eto = previous_ec_year.ec_training_objective - if pre_eto.present? - new_eto = EcTrainingObjective.new - new_eto.attributes = pre_eto.attributes.dup.except("id", "ec_year_id") - new_eto.ec_year_id = ec_year.id - new_eto.save! - - # 复制 "培养目标分项" - pre_eto.ec_training_subitems.try(:each) do |pre_ets| - new_ets = EcTrainingSubitem.new - new_ets.attributes = pre_ets.attributes.dup.except("id", "ec_training_objective_id") - new_ets.ec_training_objective_id = new_eto.id - new_ets.save! - - # 复制 "毕业要去 vs 培养目标" - pre_ervsos = EcRequirementVsObjective.where(:ec_training_objective_id => pre_ets.id) - pre_ervsos.each do |ervso| - new_ervso = EcRequirementVsObjective.new - new_ervso.attributes = ervso.attributes.dup.except("id", "ec_training_objective_id", "ec_graduation_requirement_id") - new_ervso.ec_training_objective_id = new_ets.id - new_egr_id = -1 - egr_record.each do |egr_id| - if egr_id[0] == ervso.ec_graduation_requirement_id - new_egr_id = egr_id[1] - end - end - raise("找不对应的毕业要求") if new_egr_id == -1 - new_ervso.ec_graduation_requirement_id = new_egr_id - new_ervso.save! - end - end - end - - # 复制 "课程体系" - previous_ec_year.ec_courses.try(:each) do |pre_ec| - new_ec = EcCourse.create!(name: pre_ec.name, ec_year_id: ec_year.id) - ec_record << [pre_ec.id, new_ec.id] - # 复制 "课程考核标准" - pre_ec.ec_course_evaluations.try(:each) do |pre_ece| - new_ece = EcCourseEvaluation.create!(name: pre_ece.name, - evluation_count: pre_ece.evluation_count, - ec_course_id: new_ec.id, - is_course_type: pre_ece.is_course_type) - ece_record << [pre_ece.id, new_ece.id] - # 复制 "考核分项" - pre_ece.ec_course_evaluation_subitems.try(:each) do |pre_eces| - new_eces = EcCourseEvaluationSubitem.create!(name: pre_eces.name, ec_course_evaluation_id: new_ece.id) - # 记录新旧对应关系,为之后的中间表做记录 - eces_record << [pre_eces.id, new_eces.id] - end - end - - # 复制 "课程目标" - pre_ec.ec_course_targets.try(:each) do |pre_ect| - new_ect = EcCourseTarget.new - new_ect.attributes = pre_ect.attributes.dup.except("id", "ec_course_id") - new_ect.ec_course_id = new_ec.id - new_ect.save! - # 记录新旧对应关系,为之后的中间表做记录 - ect_record << [pre_ect.id, new_ect.id] - # 复制 "课程目标和毕业要求指标点" - pre_ect.ec_graduation_subitem_course_targets.try(:each) do |pre_egsct| - new_egsct = EcGraduationSubitemCourseTarget.new - new_egsct.attributes = pre_egsct.attributes.dup.except("id", "ec_graduation_subitem_id", "ec_course_target_id") - # 寻找对应的new_egs_id - logger.info("############egs_record:#{egs_record}") - logger.info("############ec_graduation_subitem_id: #{pre_egsct.ec_graduation_subitem_id}") - new_egs_id = -1 - egs_record.each do |id| - if id[0] == pre_egsct.ec_graduation_subitem_id - new_egs_id = id[1] - end - end - raise("课程目标和毕业要求指标点找不到对应关系.") if new_egs_id == -1 - new_egsct.ec_graduation_subitem_id = new_egs_id - new_egsct.ec_course_target_id = new_ect.id - new_egsct.save! - end - - # 复制 "课程达成方法" - pre_ect.ec_course_achievement_methods.each do |pre_ecam| - # 寻找对应的 ec_course_id - new_ec_id = -1 - new_ece_id = -1 - new_eces_id = -1 - ec_record.each do |ec_id| - if ec_id[0] == pre_ecam.ec_course_id - new_ec_id = ec_id[1] - end - end - # 寻找对应的ec_course_evaluation_id - ece_record.each do |ece_id| - if ece_id[0] == pre_ecam.ec_course_evaluation_id - new_ece_id = ece_id[1] - end - end - # 寻找对应的ec_course_evaluation_subitem_id - eces_record.each do |eces_id| - if eces_id[0] == pre_ecam.ec_course_evaluation_subitem_id - new_eces_id = eces_id[1] - end - end - - new_ecam = EcCourseAchievementMethod.new - new_ecam.attributes = pre_ecam.attributes.dup.except("id", "ec_course_id", "ec_course_evaluation_id", - "ec_course_evaluation_subitem_id", "ec_course_target_id") - new_ecam.ec_course_id = new_ec_id if new_ec_id != -1 - new_ecam.ec_course_evaluation_id = new_ece_id if new_ece_id != -1 - new_ecam.ec_course_evaluation_subitem_id = new_eces_id if new_eces_id != -1 - new_ecam.ec_course_target_id = new_ect.id - new_ecam.save! - - # 复制 "课程评价达成关系" - pre_ecam.ec_achievement_evaluation_relates.each do |pre_eaer| - new_eaer = EcAchievementEvaluationRelate.new - new_eaer.attributes = pre_eaer.attributes.dup.except("id", "ec_course_achievement_method_id", - "ec_course_evaluation_subitem_id", "ec_course_target_id") - new_eaer.ec_course_achievement_method_id = new_ecam.id - # 寻找对应的 ec_course_evaluation_subitem_id - new_eces_id = -1 - eces_record.each do |eces_id| - if eces_id[0] == pre_eaer.ec_course_evaluation_subitem_id - new_eces_id = eces_id[1] - end - end - new_eaer.ec_course_evaluation_subitem_id = new_eces_id if new_eces_id != -1 - # 寻找对应的 ec_course_target_id - new_ect_id = -1 - ect_record.each do |ect_id| - if ect_id[0] == pre_eaer.ec_course_target_id - new_ect_id = ect_id[1] - end - end - new_eaer.ec_course_target_id = new_ect_id if new_ect_id != -1 - new_eaer.save! - end - end - end - - # 复制 "课程支撑" - pre_ec.ec_course_supports.try(:each) do |pre_ecs| - new_ecs = EcCourseSupport.new - new_ecs.attributes = pre_ecs.attributes.dup.except("id", "ec_course_id") - new_ecs.ec_course_id = new_ec.id - new_ecs.save! - # 复制 "课程vs毕业要求" - pre_ecs.ec_graduation_subitem_courses.try(:each) do |pre_egsc| - new_egs_id = -1 - egs_record.each do |egs_id| - if egs_id[0] == pre_egsc.ec_graduation_subitem_id - new_egs_id = egs_id[1] - end - end - new_egsc = EcGraduationSubitemCourse.new - new_egsc.attributes = pre_egsc.attributes.dup.except("id", "ec_graduation_subitem_id", "ec_course_support_id") - raise("找不到课程vs毕业要求的关联关系!") if new_egs_id == -1 - new_egsc.ec_graduation_subitem_id = new_egs_id - new_egsc.ec_course_support_id = new_ecs.id - new_egsc.save! - end - - end - - # 复制 "成绩等级设置" - pre_ec.ec_score_levels.try(:each) do |pre_esl| - new_esl = EcScoreLevel.new - new_esl.attributes = pre_esl.attributes.dup.except("id", "ec_course_id") - new_esl.ec_course_id = new_ec.id - new_esl.save! - end - - end - end - rescue Exception => e - logger.error("###########error_message: #{e.message}") - raise ActiveRecord::Rollback - end - - end - end - # 导出培养目标excel def export_training_objectives objects xls_report = StringIO.new diff --git a/app/controllers/myshixuns_controller.rb b/app/controllers/myshixuns_controller.rb index b1ac0073..f6854c7a 100644 --- a/app/controllers/myshixuns_controller.rb +++ b/app/controllers/myshixuns_controller.rb @@ -493,6 +493,7 @@ class MyshixunsController < ApplicationController return_back_time = format("%.3f", ( t1.to_f - brige_end_time.to_f)).to_f status = jsonTestDetails['status'] game_id = jsonTestDetails['buildID'] + sec_key = jsonTestDetails['sec_key'] logger.info("training_task_status start#1**#{game_id}**** #{Time.now.strftime("%Y-%m-%d %H:%M:%S.%L")}") resubmit = jsonTestDetails['resubmit'] outPut = tran_base64_decode64(jsonTestDetails['outPut']) @@ -535,7 +536,8 @@ class MyshixunsController < ApplicationController end logger.info("#############status: #{status}") logger.info("#############resubmit: #{resubmit}") - record = EvaluateRecord.where(:game_id => game_id).first + logger.info("sec_key is#############resubmit: #{sec_key}") + record = EvaluateRecord.where(:identifier => sec_key).first logger.info("training_task_status start#3**#{game_id}**** #{Time.now.strftime("%Y-%m-%d %H:%M:%S.%L")}") # status:0表示评测成功 diff --git a/app/controllers/student_work_controller.rb b/app/controllers/student_work_controller.rb index f0150ea4..8885353c 100644 --- a/app/controllers/student_work_controller.rb +++ b/app/controllers/student_work_controller.rb @@ -7,7 +7,7 @@ class StudentWorkController < ApplicationController require "base64" helper :attachments helper :files - before_filter :find_homework, :only => [:new, :index, :create, :homework_discuss, :homework_setting, :student_work_absence_penalty, :absence_penalty_list, :evaluation_list, :program_test,:program_test_ex, + before_filter :find_homework, :only => [:new, :index, :sonar, :create, :homework_discuss, :homework_setting, :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,:change_project,:relate_myshixun,:shixun_work_export,:import_score,:code_review_results] before_filter :find_work, :only => [:edit, :update, :show, :destroy, :add_score, :adjust_score, :add_ultimate_score, :praise_student_work, :retry_work, :revise_attachment, :hide_score_detail, :destroy_score, @@ -15,7 +15,7 @@ class StudentWorkController < ApplicationController before_filter :member_of_course, :only => [:new, :create, :show, :add_score, :praise_student_work, :commit_summary, :view_summary] before_filter :author_of_work, :only => [:edit, :update, :destroy] before_filter :teacher_of_course, :only => [:student_work_absence_penalty, :absence_penalty_list, :evaluation_list, :set_score_rule, :forbidden_anonymous_comment, :adjust_score, :add_ultimate_score] - before_filter :require_login, :only => [:index, :show] + before_filter :require_login, :only => [:index, :sonar, :show] if RUBY_PLATFORM =~ /linux/ require 'roo-xls' @@ -493,7 +493,7 @@ class StudentWorkController < ApplicationController render :json => resultObj end - def index + def _index # REDO:分班信息提前查出来,然后循环中根据匹配去取 @is_teacher = User.current.logged? ? (User.current.allowed_to?(:as_teacher,@course) || User.current.admin?) : false @@ -608,6 +608,12 @@ class StudentWorkController < ApplicationController @page = (params['page'] || 1).to_i @student_work_pages = Paginator.new @student_work_count, @limit, @page @offset ||= @student_work_pages.offset + end + + + def index + _index + @stundet_works = paginateHelper @stundet_works, @limit if @stundet_works.size != 0 @stundet_works = if @homework.homework_type == 1 @@ -630,6 +636,35 @@ class StudentWorkController < ApplicationController end end + + def sonar + _index + logger.debug "@stundet_works #{@stundet_works}" + + person_list = @stundet_works.map do |work| + o = { + name: "#{work.user.show_real_name}", + uid: "#{work.user.user_extensions.student_id}", + downloadUrl: '' + } + attachment = work.attachments.first + if attachment + o[:downloadUrl] = "https://#{Setting.host_name}/"+download_named_attachment_path(attachment.id, attachment.filename) + end + + o + end + + respond_to do |format| + format.json { + render json: { + homeworkId: @homework.id, + personList: person_list + } + } + end + end + # 查重详情页面的调分 def adjust_review_score if params[:score] && params[:challenge_id] @@ -1852,6 +1887,7 @@ class StudentWorkController < ApplicationController end end + private def hsd_committed_work?(user, homework) diff --git a/app/models/ec_graduation_subitem.rb b/app/models/ec_graduation_subitem.rb index b82b0789..12f60091 100644 --- a/app/models/ec_graduation_subitem.rb +++ b/app/models/ec_graduation_subitem.rb @@ -9,4 +9,7 @@ class EcGraduationSubitem < ActiveRecord::Base # 课程目标配置 has_many :ec_course_targets, :through => :ec_graduation_subitem_course_targets has_many :ec_graduation_subitem_course_targets, :dependent => :destroy + + has_many :ec_require_sub_vs_standards + has_many :ec_graduation_standards, through: :ec_require_sub_vs_standards end diff --git a/app/models/ec_require_sub_vs_standard.rb b/app/models/ec_require_sub_vs_standard.rb index a68481e1..0c696a9e 100644 --- a/app/models/ec_require_sub_vs_standard.rb +++ b/app/models/ec_require_sub_vs_standard.rb @@ -1,3 +1,6 @@ class EcRequireSubVsStandard < ActiveRecord::Base attr_accessible :ec_graduation_standard_id, :ec_graduation_subitem_id, :status + + belongs_to :ec_graduation_standard + belongs_to :ec_graduation_subitem end diff --git a/app/models/ec_requirement_vs_objective.rb b/app/models/ec_requirement_vs_objective.rb index 7b17e054..9c2b5878 100644 --- a/app/models/ec_requirement_vs_objective.rb +++ b/app/models/ec_requirement_vs_objective.rb @@ -1,3 +1,5 @@ class EcRequirementVsObjective < ActiveRecord::Base attr_accessible :ec_graduation_requirement_id, :ec_training_objective_id, :status + belongs_to :ec_graduation_requirement + belongs_to :ec_training_subitem end diff --git a/app/models/ec_training_subitem.rb b/app/models/ec_training_subitem.rb index 92edb18b..6f9a4f12 100644 --- a/app/models/ec_training_subitem.rb +++ b/app/models/ec_training_subitem.rb @@ -1,4 +1,5 @@ class EcTrainingSubitem < ActiveRecord::Base belongs_to :ec_training_objective + has_many :ec_requirement_vs_objectives, foreign_key: :ec_training_objective_id end diff --git a/app/models/ec_year.rb b/app/models/ec_year.rb index 83f5f78b..5f9aa00b 100644 --- a/app/models/ec_year.rb +++ b/app/models/ec_year.rb @@ -16,4 +16,8 @@ class EcYear < ActiveRecord::Base # 课堂配置 has_many :ec_courses, :dependent => :destroy acts_as_attachable + + def prev_year + ec_major_school.ec_years.find_by_year(year - 1) + end end diff --git a/app/models/school.rb b/app/models/school.rb index c5018191..8342039e 100644 --- a/app/models/school.rb +++ b/app/models/school.rb @@ -16,6 +16,7 @@ class School < ActiveRecord::Base has_many :ec_majors, :through => :ec_major_schools has_many :ec_major_schools, :dependent => :destroy + has_one :ec_template_major, conditions: 'template_major = 1', class_name: 'EcMajorSchool' has_many :partners, :dependent => :destroy has_many :customers, :dependent => :destroy diff --git a/app/services/copy_ec_year_service.rb b/app/services/copy_ec_year_service.rb new file mode 100644 index 00000000..83073d53 --- /dev/null +++ b/app/services/copy_ec_year_service.rb @@ -0,0 +1,306 @@ + class CopyEcYearService + attr_reader :major_school, :to_year + + def initialize(major_school, year) + @major_school = major_school + @to_year = major_school.ec_years.new(year: year) + end + + def call + if from_year.blank? + to_year.save! + return to_year + end + + # 专业第一次创建届别时,复制示例专业2017届 + ActiveRecord::Base.transaction do + copy_ec_year! + + copy_graduation_requirement! + + copy_training_objective! + + new_major_school? ? copy_template_ec_course! : copy_ec_courses! + end + + to_year + end + + private + + def new_major_school? + @_new_major ||= major_school.ec_years.count.zero? + end + + def from_year + @_from_year ||= new_major_school? ? template_major_year : to_year.prev_year + end + + def template_major_year + EcYear.joins(:ec_major_school).where(ec_major_schools: { template_major: true }).find_by_year('2017') + end + + def copy_ec_year! + to_year.calculation_value = from_year.calculation_value + to_year.save! + end + + def copy_graduation_requirement! + requirements = from_year.ec_graduation_requirements.includes(ec_graduation_subitems: :ec_require_sub_vs_standards) + + requirements.each do |requirement| + to_requirement = to_year.ec_graduation_requirements.new + to_requirement.attributes = requirement.attributes.except('id', 'ec_year_id', 'created_at', 'updated_at') + to_requirement.save! + + # 记录对应关系,创建支撑时使用 + graduation_requirement_map[requirement.id] = to_requirement.id + + copy_graduation_subitems(requirement, to_requirement) + end + end + + def copy_graduation_subitems(requirement, to_requirement) + requirement.ec_graduation_subitems.each do |item| + to_item = to_requirement.ec_graduation_subitems.new + to_item.attributes = item.attributes.except('id', 'ec_graduation_requirement_id', 'created_at', 'updated_at') + to_item.save! + + # 记录对应关系,创建支撑时使用 + graduation_subitem_map[item.id] = to_item.id + + copy_requirement_standard_supports!(item, to_item) + end + end + + def copy_requirement_standard_supports!(graduation_subitem, to_graduation_subitem) + graduation_subitem.ec_require_sub_vs_standards.each do |support| + to_support = to_graduation_subitem.ec_require_sub_vs_standards.new + to_support.attributes = support.attributes.except('id', 'ec_graduation_subitem_id', 'created_at', 'updated_at') + to_support.save! + end + end + + def copy_training_objective! + training_objective = from_year.ec_training_objective + return if training_objective.blank? + + attributes = training_objective.attributes.except('id', 'ec_year_id', 'created_at', 'updated_at') + to_training_objective = to_year.create_ec_training_objective!(attributes) + + copy_training_subitems!(training_objective, to_training_objective) + end + + def copy_training_subitems!(training_objective, to_training_objective) + training_subitems = training_objective.ec_training_subitems.includes(:ec_requirement_vs_objectives) + + training_subitems.each do |item| + to_item = to_training_objective.ec_training_subitems.new + to_item.attributes = item.attributes.except('id', 'ec_training_objective_id', 'created_at', 'updated_at') + to_item.save! + + copy_requirement_vs_objectives!(item, to_item) + end + end + + def copy_requirement_vs_objectives!(training_item, to_training_item) + training_item.ec_requirement_vs_objectives.each do |support| + to_support = to_training_item.ec_requirement_vs_objectives.new(status: support.status) + to_support.ec_graduation_requirement_id = graduation_requirement_map[support.ec_graduation_requirement_id] + to_support.save! + end + end + + def copy_template_ec_course! + course = from_year.ec_courses.includes( + :ec_score_levels, + ec_course_evaluations: :ec_course_evaluation_subitems, + ec_course_targets: :ec_graduation_subitem_course_targets, + ec_course_achievement_methods: :ec_achievement_evaluation_relates, + ec_course_supports: :ec_graduation_subitem_courses + ).find_by_name('数据库原理') + + to_course = to_year.ec_courses.new + to_course.attributes = course.attributes.except('id', 'ec_year_id', 'created_at', 'updated_at') + to_course.save! + + course_map[course.id] = to_course.id + + copy_course_evaluations!(course, to_course) + copy_course_targets!(course, to_course) + copy_course_achievement_methods!(course, to_course) + copy_ec_course_supports!(course, to_course) + copy_score_levels!(course, to_course) + + # 复制示例时需要复制学生和成绩数据 + copy_year_students! + end + + def copy_ec_courses! + courses = from_year.ec_courses.includes( + :ec_score_levels, + ec_course_evaluations: :ec_course_evaluation_subitems, + ec_course_targets: :ec_graduation_subitem_course_targets, + ec_course_achievement_methods: :ec_achievement_evaluation_relates, + ec_course_supports: :ec_graduation_subitem_courses + ) + + courses.each do |course| + to_course = to_year.ec_courses.new + to_course.attributes = course.attributes.except('id', 'ec_year_id', 'created_at', 'updated_at') + to_course.save! + + course_map[course.id] = to_course.id + + copy_course_evaluations!(course, to_course) + copy_course_targets!(course, to_course) + copy_course_achievement_methods!(course, to_course) + copy_ec_course_supports!(course, to_course) + copy_score_levels!(course, to_course) + end + end + + def copy_course_evaluations!(course, to_course) + course.ec_course_evaluations.each do |evaluation| + to_evaluation = to_course.ec_course_evaluations.new + to_evaluation.attributes = evaluation.attributes.except('id', 'ec_course_id', 'created_at', 'updated_at') + to_evaluation.save! + + course_evaluation_map[evaluation.id] = to_evaluation.id + + copy_course_evaluation_subitems!(evaluation, to_evaluation) + end + end + + def copy_course_evaluation_subitems!(evaluation, to_evaluation) + evaluation.ec_course_evaluation_subitems.each do |item| + to_item = to_evaluation.ec_course_evaluation_subitems.new + to_item.attributes = item.attributes.except('id', 'ec_course_evaluation_id', 'created_at', 'updated_at') + to_item.save! + + course_evaluation_subitem_map[item.id] = to_item.id + end + end + + def copy_course_targets!(course, to_course) + course.ec_course_targets.each do |target| + to_target = to_course.ec_course_targets.new + to_target.attributes = target.attributes.except('id', 'ec_course_id', 'created_at', 'updated_at') + to_target.save! + + course_target_map[target.id] = to_target.id + + copy_graduation_subitem_course_targets!(target, to_target) + end + end + + def copy_graduation_subitem_course_targets!(target, to_target) + target.ec_graduation_subitem_course_targets.each do |support| + to_support = to_target.ec_graduation_subitem_course_targets.new + to_support.attributes = support.attributes.except('id', 'ec_graduation_subitem_id', 'created_at', 'updated_at') + to_support.ec_graduation_subitem_id = graduation_subitem_map[support.ec_graduation_subitem_id] + to_support.save! + end + end + + def copy_course_achievement_methods!(course, to_course) + course.ec_course_achievement_methods.each do |from| + to = to_course.ec_course_achievement_methods.new + to.attributes = from.attributes.except('id', 'ec_course_id', 'ec_course_target_id', 'ec_course_evaluation_id', + 'ec_course_evaluation_subitem_id', 'created_at', 'updated_at') + + to.ec_course_target_id = course_target_map[from.ec_course_target_id] + to.ec_course_evaluation_id = course_evaluation_map[from.ec_course_evaluation_id] + to.ec_course_evaluation_subitem_id = course_evaluation_subitem_map[from.ec_course_evaluation_subitem_id] + to.save! + + copy_achievement_evaluation_relates!(from, to) + end + end + + def copy_achievement_evaluation_relates!(method, to_method) + method.ec_achievement_evaluation_relates.each do |relate| + to_relate = to_method.ec_achievement_evaluation_relates.new + to_relate.attributes = relate.attributes.except('id', 'ec_course_achievement_method_id', 'ec_course_target_id', + 'ec_course_evaluation_subitem_id', 'created_at', 'updated_at') + to_relate.ec_course_target_id = course_target_map[relate.ec_course_target_id] + to_relate.ec_course_evaluation_subitem_id = course_target_map[relate.ec_course_evaluation_subitem_id] + to_relate.save! + end + end + + def copy_ec_course_supports!(course, to_course) + course.ec_course_supports.each do |support| + to_support = to_course.ec_course_supports.new + to_support.attributes = support.attributes.except('id', 'ec_course_id', 'created_at', 'updated_at') + to_support.save! + + copy_graduation_subitem_courses!(support, to_support) + end + end + + def copy_graduation_subitem_courses!(course_support, to_course_support) + course_support.ec_graduation_subitem_courses.each do |item| + to_item = to_course_support.ec_graduation_subitem_courses.new + to_item.attributes = item.attributes.except('id', 'ec_course_support_id', 'ec_graduation_subitem_id', + 'created_at', 'updated_at') + to_item.ec_graduation_subitem_id = graduation_subitem_map[item.ec_graduation_subitem_id] + to_item.save! + end + end + + def copy_score_levels!(course, to_course) + course.ec_score_levels.each do |level| + to_level = to_course.ec_score_levels.new + to_level.attributes = level.attributes.except('id', 'ec_course_id', 'created_at', 'updated_at') + to_level.save! + end + end + + def copy_year_students! + students = from_year.ec_year_students.includes(:ec_student_achievements) + + students.each do |student| + to_student = to_year.ec_year_students.new + to_student.attributes = student.attributes.except('id', 'ec_year_id', 'created_at', 'updated') + to_student.save! + + copy_student_achievements!(student, to_student) + end + end + + def copy_student_achievements!(student, to_student) + student.ec_student_achievements.each do |achievement| + to_achievement = to_student.ec_student_achievements.new + to_achievement.attributes = achievement.attributes.except('id', 'ec_year_student_id', 'ec_course_evaluation_id', + 'ec_course_evaluation_subitem_id', 'created_at', 'updated_at') + to_achievement.ec_course_evaluation_id = course_evaluation_map[achievement.ec_course_evaluation_id] + to_achievement.ec_course_evaluation_subitem_id = course_evaluation_subitem_map[achievement.ec_course_evaluation_subitem_id] + to_achievement.save! + end + end + + def graduation_requirement_map + @_graduation_requirement_map ||= {} + end + + def graduation_subitem_map + @_graduation_subitem_map ||= {} + end + + def course_map + @_course_map ||= {} + end + + def course_evaluation_map + @_course_evaluation_map ||= {} + end + + def course_evaluation_subitem_map + @_course_evaluation_subitem_map ||= {} + end + + def course_target_map + @_course_target_map ||= {} + end + end \ No newline at end of file diff --git a/app/services/games_service.rb b/app/services/games_service.rb index 8b5e486d..2139715e 100644 --- a/app/services/games_service.rb +++ b/app/services/games_service.rb @@ -347,10 +347,13 @@ class GamesService rev = params[:rev] ? params[:rev] : "master" content_modified = 0 ActiveRecord::Base.transaction do + # params[:evaluate] 实训评测时更新必须给的参数,需要依据该参数做性能统计,其它类型的更新可以跳过 # 自动保存的时候evaluate为0;点评测的时候为1 if params[:evaluate] == 1 - record = EvaluateRecord.create!(:user_id => current_user.id, :shixun_id => @myshixun.shixun.id, :game_id => @game.id) + sec_key = generates_identifier(EvaluateRecord, 10) + record = EvaluateRecord.create!(:user_id => current_user.id, :shixun_id => @myshixun.shixun.id, + :game_id => @game.id, :identifier => sec_key) Rails.logger.warn("##game is is #{@game.id}, record id is #{record.id}, time is**** #{Time.now.strftime("%Y-%m-%d %H:%M:%S.%L")}") # @myshixun.student_works.update_all(:update_time => Time.now) if !@myshixun.student_works.blank? student_work_time = format("%.3f", (Time.now.to_f - record.created_at.to_f)).to_f @@ -385,7 +388,7 @@ class GamesService if content != last_content && code_file.blank? raise("update file failed") else - return {:success => "success", :resubmit => resubmit ,:content_modified => content_modified} + return {:success => "success", :resubmit => resubmit ,:content_modified => content_modified, sec_key: record.try(:identifier)} end end rescue Exception => e @@ -546,7 +549,7 @@ class GamesService :testCases => "#{testCases}", :resubmit => "#{resubmit}", :times => params[:first].to_i, :podType => shixun.webssh, :containers => "#{Base64.urlsafe_encode64(container_limit(shixun.mirror_repositories))}", :tpmScript => "#{tpmScript}", :timeLimit => "#{shixun.exec_time}", :content_modified => content_modified, :persistenceName => shixun.identifier, - :isPublished => (shixun.status < 2 ? 0 : 1)} + :isPublished => (shixun.status < 2 ? 0 : 1), :sec_key => params[:sec_key]} # 评测有文件输出的需要特殊传字段 path:表示文件存储的位置 params['file'] = Base64.urlsafe_encode64({:path => "#{game_challenge.picture_path}"}.to_json) if game_challenge.picture_path.present? @@ -569,7 +572,8 @@ class GamesService # ----单测模式end return {:result => "success", :resubmit => resubmit, :ableToCreate => res['ableToCreate'], :waitNum => res['waitNum'], - :waitingTime => res['waitingTime'], :position => game_challenge.position, :port => res['port'], :had_done => game.had_done } + :waitingTime => res['waitingTime'], :position => game_challenge.position, :port => res['port'], + :had_done => game.had_done} rescue Exception => e Rails.logger.error("评测出错,详情:" + e.message) return {:result => 'fail', :contents =>"实训云平台繁忙(繁忙等级:502),请稍后刷新并重试", :position => game_challenge.position, :had_done => game.had_done} @@ -878,7 +882,7 @@ class GamesService mirror_name = shixun.mirror_name # 轮询结束,更新评测耗时 - e_record = EvaluateRecord.where(:game_id => game.id).first + e_record = EvaluateRecord.where(:identifier => params[:sec_key]).first if game_status == 0 || game_status == 2 if e_record front_js = format("%.3f", (Time.now.to_f - e_record.try(:updated_at).to_f)).to_f @@ -1036,6 +1040,15 @@ class GamesService end private + DCODES = %W(2 3 4 5 6 7 8 9 a b c f e f g h i j k l m n o p q r s t u v w x y z) + # 随机生成字符 + def generates_identifier(container, num) + code = DCODES.sample(num).join + while container.exists?(identifier: code) do + code = DCODES.sample(num).join + end + code + end def format_answer_list games user_info = [] diff --git a/app/views/common/index.html.erb b/app/views/common/index.html.erb index e5922129..33f8d98e 100644 --- a/app/views/common/index.html.erb +++ b/app/views/common/index.html.erb @@ -1 +1 @@ -Educoder
\ No newline at end of file +Educoder
diff --git a/app/views/student_work/index.html.erb b/app/views/student_work/index.html.erb index 9221db7c..99384dfc 100644 --- a/app/views/student_work/index.html.erb +++ b/app/views/student_work/index.html.erb @@ -15,36 +15,37 @@

- <%= link_to @homework.course.name, course_path(@homework.course),:class => "color-grey-9" %> - > <% if @homework.course_homework_category.present? %> - <%= link_to @homework.course_homework_category.name, homework_common_index_path(:course => @homework.course_id, :homework_type => @homework.homework_type, :category => @homework.course_homework_category_id), :class => "color-grey-9" %> - <% else %> - <%= link_to "#{@homework.homework_type_ch}作业", homework_common_index_path(:course => @homework.course_id, :homework_type => @homework.homework_type),:class => "color-grey-9" %> - <% end %> + <%= link_to @homework.course.name, course_path(@homework.course), :class => "color-grey-9" %> + > + <% if @homework.course_homework_category.present? %> + <%= link_to @homework.course_homework_category.name, homework_common_index_path(:course => @homework.course_id, :homework_type => @homework.homework_type, :category => @homework.course_homework_category_id), :class => "color-grey-9" %> + <% else %> + <%= link_to "#{@homework.homework_type_ch}作业", homework_common_index_path(:course => @homework.course_id, :homework_type => @homework.homework_type), :class => "color-grey-9" %> + <% end %> > #<%= get_hw_index(@homework, @is_teacher, @homework.homework_type) + 1 %>

@@ -71,12 +72,12 @@ 参考答案 <% end %> - <% if @is_teacher && @homework.homework_type == 4 && @homework.homework_group_reviews.size > 0 %> -

  • - - 查重结果 - -
  • + <% if @is_teacher && @homework.homework_type == 4 && @homework.homework_group_reviews.count > 0 %> +
  • + + 查重结果 + +
  • <% end %>
  • @@ -153,7 +154,7 @@ <% student_works = @homework.student_works.where("work_status != 0") %> <% if @group_teacher %> <% groups = @course.course_groups.where(:id => @member.teacher_course_groups.pluck(:course_group_id)) %> - <% group_students = @course.members.where(:course_group_id => @member.teacher_course_groups.pluck(:course_group_id)).select{|m| m.roles.to_s.include?("Student")} %> + <% group_students = @course.members.where(:course_group_id => @member.teacher_course_groups.pluck(:course_group_id)).select {|m| m.roles.to_s.include?("Student")} %> <% student_works = student_works.where(:user_id => group_students.map(&:user_id)) %> <% else %> <% groups = @course.course_groups %> @@ -198,11 +199,15 @@ 不限 > - + > - + > - + +
  • 分班情况: @@ -212,7 +217,8 @@

    <% groups.includes(:members).each do |group| %> > - + <% end %> <% if !@group_teacher %> @@ -241,6 +247,10 @@ <% end %> <% end %> + <% if User.current.admin? %> + 质量检测 + <% end %> +

    @@ -362,8 +372,7 @@ if (!event) { event = window.event; //针对ie浏览器 code = event.keyCode; - } - else { + } else { code = event.keyCode; } if (code == 13) { @@ -416,4 +425,28 @@ pop_box_new(htmlvalue, 452, 163); $("#submit_url").val('<%= import_score_student_work_index_path(:homework => @homework.id) %>'); } + + function sonar() { + $.ajax({ + url: '/student_work/sonar?homework=' + $("#homework_id").val(), + type: 'get', + data: $("#student_work_search_form").serialize(), + success: function (data) { + console.log(data); + //调用sonar + + $.ajax({ + url: 'http://127.0.0.1:8080/api/sonar', + contentType: "application/json; charset=utf-8", + dataType: "json", + type: 'post', + data: JSON.stringify(data), + success: function (data1) { + console.log(data1); + alert('调用完成,请等待处理完成'); + } + }) + } + }) + } diff --git a/config/routes.rb b/config/routes.rb index 92a7ce31..e4dfe08d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1248,6 +1248,7 @@ RedmineApp::Application.routes.draw do ## oauth相关 get 'relate_myshixun' get 'shixun_work_export' post 'import_score' + get 'sonar' end end diff --git a/db/migrate/20190524005242_add_identifier_to_evaluate_records.rb b/db/migrate/20190524005242_add_identifier_to_evaluate_records.rb new file mode 100644 index 00000000..7fe00179 --- /dev/null +++ b/db/migrate/20190524005242_add_identifier_to_evaluate_records.rb @@ -0,0 +1,8 @@ +class AddIdentifierToEvaluateRecords < ActiveRecord::Migration + def change + add_column :evaluate_records, :identifier, :string + add_index :evaluate_records, :identifier, unique: true + remove_index :evaluate_records, :name => :game + remove_index :evaluate_records, :name => :index_evaluate_records_on_user_id + end +end diff --git a/public/javascripts/educoder/edu_application.js b/public/javascripts/educoder/edu_application.js index 7cce4a21..f1caa2c5 100644 --- a/public/javascripts/educoder/edu_application.js +++ b/public/javascripts/educoder/edu_application.js @@ -1233,15 +1233,51 @@ $(document).bind('ajaxError', function(event, xhr, settings) { //工程认证各个页面的查看详情弹层 function elasticLayer(forumId){ + if (window.__memo) { + doElasticLayer(window.__memo, true) + return; + } + if (!forumId) return; + var url = 'https://www.educoder.net/api/v1/memos/' + forumId + $.ajax({ + url: url, + type: 'get', + success: function(res) { + console.log(res) + doElasticLayer(res.memo) + } + }); + + // document.body.addEventListener('touchmove',bodyScroll,false); + // $('body').css({'position':'fixed',"width":"100%"}); +} +function doElasticLayer(memo, rendered){ + if (rendered) { + $(".layerContent").show(); + $(".newMain").hide(); + return; + } + window.__memo = memo + var content = memo.content + var subject = memo.subject var html='
    ' + - '

    工程教育专业认证【培养目标】' + + '

    '+ subject +'' + '返回

    ' + - '
    ' + '
    ' + $(".newMain").after(html).hide(); - document.body.addEventListener('touchmove',bodyScroll,false); - $('body').css({'position':'fixed',"width":"100%"}); + + editormd.markdownToHTML("MDContent", { + htmlDecode: "style,script,iframe", // you can filter tags decode + taskList: true, + tex: true, // 默认不解析 + flowChart: true, // 默认不解析 + sequenceDiagram: true // 默认不解析 + }); } function removeElasticLayer(){ - $(".layerContent").remove(); + $(".layerContent").hide(); $(".newMain").show(); } diff --git a/public/react/public/index.html b/public/react/public/index.html index 71088e5f..e1f4976e 100644 --- a/public/react/public/index.html +++ b/public/react/public/index.html @@ -107,7 +107,9 @@ + + diff --git a/public/react/src/modules/ec/graduatesRequirement/GraduatesRequirement.js b/public/react/src/modules/ec/graduatesRequirement/GraduatesRequirement.js index 95545d85..da53acc7 100644 --- a/public/react/src/modules/ec/graduatesRequirement/GraduatesRequirement.js +++ b/public/react/src/modules/ec/graduatesRequirement/GraduatesRequirement.js @@ -612,7 +612,7 @@ class GraduatesRequirement extends Component {

    毕业要求指标点达成计算

    系统根据课程体系与毕业要求的支持关系,以课程的考核与成绩判定方式,一键计算毕业要求的达成度情况 - window.elasticLayer(3530)} class="color-blue">查看详情 + window.elasticLayer(3535)} class="color-blue">查看详情

  • diff --git a/public/react/src/modules/page/MainContentContainer.js b/public/react/src/modules/page/MainContentContainer.js index 01126075..b7fcdfa8 100644 --- a/public/react/src/modules/page/MainContentContainer.js +++ b/public/react/src/modules/page/MainContentContainer.js @@ -617,10 +617,10 @@ class MainContentContainer extends Component { // 之前的task_commit方法 gameBuild(fileUpdateResponse, first) { const { st, challenge, output_sets, onRunCodeTestFinish, resetTestSetsExpandedArray, showSnackbar, time_limit } = this.props - const { resubmit, content_modified } = fileUpdateResponse.data; + const { resubmit, content_modified, sec_key } = fileUpdateResponse.data; const timeOut = time_limit; // http://localhost:3000/myshixuns/so5w6iap97/stages/zl6kx8f7vfpo/game_build?first=1&resubmit=GDBEX741_1993 - const game_build_url = `${locationPath}/game_build?first=${first}&resubmit=${resubmit}&content_modified=${content_modified}` + const game_build_url = `${locationPath}/game_build?first=${first}&resubmit=${resubmit}&content_modified=${content_modified}&sec_key=${sec_key}` // var timeOut = parseInt(<%= @myshixun.main_mirror.try(:time_limit) %>); // 超时参数 resetTestSetsExpandedArray() axios.get(game_build_url, { @@ -639,7 +639,7 @@ class MainContentContainer extends Component { let requestTimes = 0; var gameStatusIntervalId = setInterval(()=>{ - let game_status_url = `${locationPath}/game_status?port=${port}&resubmit=${resubmit||""}&time_out=${timeOutFlag}` + let game_status_url = `${locationPath}/game_status?port=${port}&resubmit=${resubmit||""}&time_out=${timeOutFlag}&sec_key=${sec_key}` axios.get(game_status_url, { withCredentials: true,