diff --git a/app/controllers/homework_commons_controller.rb b/app/controllers/homework_commons_controller.rb index c2e09fe2b..83bcaf37a 100644 --- a/app/controllers/homework_commons_controller.rb +++ b/app/controllers/homework_commons_controller.rb @@ -70,9 +70,25 @@ class HomeworkCommonsController < ApplicationController else case order when '1' - sql_str = %Q(homework_detail_manuals.comment_status = #{order} and homework_commons.end_time > '#{Time.now}') + if @user_course_identity == Course::STUDENT + unified_homework_ids = @homework_commons.published_no_end.unified_setting.pluck(:id) + group_homework_ids = @course.homework_group_settings.where("course_group_id = #{@member.course_group_id&.to_i}").published_no_end.pluck(:homework_common_id) + homework_ids = unified_homework_ids + group_homework_ids + homework_ids = homework_ids.blank? ? "(-1)" : "(" + homework_ids.join(",") + ")" + sql_str = %Q(homework_commons.id in #{homework_ids}) + else + sql_str = %Q(homework_detail_manuals.comment_status = #{order} and homework_commons.end_time > '#{Time.now}') + end when '2' - sql_str = %Q(allow_late = 1 and homework_commons.end_time < '#{Time.now}' and (late_time is null or late_time > '#{Time.now}')) + if @user_course_identity == Course::STUDENT + unified_homework_ids = @homework_commons.homework_ended.unified_setting.pluck(:id) + group_homework_ids = @course.homework_group_settings.where("course_group_id = #{@member.course_group_id&.to_i}").has_end.pluck(:homework_common_id) + homework_ids = unified_homework_ids + group_homework_ids + homework_ids = homework_ids.blank? ? "(-1)" : "(" + homework_ids.join(",") + ")" + sql_str = %Q(homework_commons.id in #{homework_ids} and allow_late = 1 and (late_time is null or late_time > '#{Time.now}')) + else + sql_str = %Q(allow_late = 1 and homework_commons.end_time < '#{Time.now}' and (late_time is null or late_time > '#{Time.now}')) + end when '3' sql_str = %Q(homework_detail_manuals.comment_status = #{order} and homework_detail_manuals.evaluation_end > '#{Time.now}') when '4' diff --git a/app/forms/users/update_account_form.rb b/app/forms/users/update_account_form.rb index 0eae399d8..3c90b3271 100644 --- a/app/forms/users/update_account_form.rb +++ b/app/forms/users/update_account_form.rb @@ -14,6 +14,7 @@ class Users::UpdateAccountForm validates :technical_title, presence: true, unless: -> { identity.to_s == 'student' } validates :student_id, presence: true, if: -> { identity.to_s == 'student' } validates :school_id, presence: true + validates :department_id, presence: true validate :check_school_exist def check_school_exist diff --git a/app/helpers/homework_commons_helper.rb b/app/helpers/homework_commons_helper.rb index ffbc61b53..534abea6f 100644 --- a/app/helpers/homework_commons_helper.rb +++ b/app/helpers/homework_commons_helper.rb @@ -117,9 +117,16 @@ module HomeworkCommonsHelper time = "提交剩余时间:" + how_much_time(max_end_time) time_status = 1 else - status << "已截止" - time = course.end_date.present? ? ("评阅剩余时间:" + how_much_time(course.end_date.end_of_day)) : "" - time_status = 5 + if max_end_time.present? && max_end_time < Time.now && homework_common.allow_late && + (homework_common.late_time.nil? || homework_common.late_time > Time.now) + status << "补交中" + time = "补交剩余时间:" + how_much_time(homework_common.late_time) + time_status = 2 + else + status << "已截止" + time = course.end_date.present? ? ("评阅剩余时间:" + how_much_time(course.end_date.end_of_day)) : "" + time_status = 5 + end end end end diff --git a/app/models/course.rb b/app/models/course.rb index cbd09048f..14c17cf39 100644 --- a/app/models/course.rb +++ b/app/models/course.rb @@ -257,10 +257,10 @@ class Course < ApplicationRecord # 老师负责的分班id def charge_group_ids user - member = user.is_a?(CourseMember) ? user : course_member(user.id) + member = user.is_a?(CourseMember) ? user : course_member(user&.id) group_ids = if member.present? member.teacher_course_groups.size > 0 ? member.teacher_course_groups.pluck(:course_group_id) : course_groups.pluck(:id) - elsif user.admin_or_business? + elsif user&.admin_or_business? course_groups.pluck(:id) else [] @@ -387,7 +387,7 @@ class Course < ApplicationRecord end def max_activity_time - course_acts.pluck(:updated_at).max + course_activities.pluck(:updated_at).max end # 课堂作业数 diff --git a/app/models/homework_common.rb b/app/models/homework_common.rb index a3030a728..65c2e6f21 100644 --- a/app/models/homework_common.rb +++ b/app/models/homework_common.rb @@ -47,6 +47,7 @@ class HomeworkCommon < ApplicationRecord scope :homework_published, -> {where("homework_commons.publish_time IS NOT NULL AND homework_commons.publish_time <= ? ",Time.now)} scope :published_no_end, -> {where("homework_commons.publish_time IS NOT NULL AND homework_commons.publish_time < ? and homework_commons.end_time > ?", Time.now, Time.now)} + scope :homework_ended, -> {where("homework_commons.end_time IS NOT NULL AND homework_commons.end_time <= ? ",Time.now)} scope :search_homework_type, lambda {|num| where(homework_type:num)} scope :unified_setting, -> {where("unified_setting = ? ", 1)} diff --git a/app/models/homework_group_setting.rb b/app/models/homework_group_setting.rb index 7a06d5a7a..457afeb5b 100644 --- a/app/models/homework_group_setting.rb +++ b/app/models/homework_group_setting.rb @@ -7,5 +7,6 @@ class HomeworkGroupSetting < ApplicationRecord scope :published_no_end, -> {where("homework_group_settings.publish_time IS NOT NULL AND homework_group_settings.publish_time < ? and homework_group_settings.end_time > ?", Time.now, Time.now)} scope :none_end, -> {where("homework_group_settings.end_time IS NULL or homework_group_settings.end_time > ?", Time.now)} + scope :has_end, -> {where("homework_group_settings.end_time IS NOT NULL AND homework_group_settings.end_time <= ?", Time.now)} end diff --git a/app/services/admins/school_daily_statistic_service.rb b/app/services/admins/school_daily_statistic_service.rb index 64bb97864..5dce40540 100644 --- a/app/services/admins/school_daily_statistic_service.rb +++ b/app/services/admins/school_daily_statistic_service.rb @@ -44,7 +44,7 @@ class Admins::SchoolDailyStatisticService < ApplicationService courses = Course.where(is_delete: 0, school_id: ids).group('school_id') course_map = courses.count - nearly_course_time_map = courses.joins(:course_acts).maximum('course_activities.updated_at') + nearly_course_time_map = courses.joins(:course_activities).maximum('course_activities.updated_at') active_course_map = courses.where(is_end: false).count shixun_map = Shixun.joins(user: :user_extension).where(user_extensions: { identity: :teacher, school_id: ids }) diff --git a/app/services/videos/dispatch_callback_service.rb b/app/services/videos/dispatch_callback_service.rb index e6c089ac2..b32c87c4e 100644 --- a/app/services/videos/dispatch_callback_service.rb +++ b/app/services/videos/dispatch_callback_service.rb @@ -3,7 +3,7 @@ class Videos::DispatchCallbackService < ApplicationService def initialize(params) @video = Video.find_by(uuid: params[:VideoId]) - @params = params`` + @params = params end def call diff --git a/app/views/homework_commons/index.json.jbuilder b/app/views/homework_commons/index.json.jbuilder index 44eabe06d..e47c40745 100644 --- a/app/views/homework_commons/index.json.jbuilder +++ b/app/views/homework_commons/index.json.jbuilder @@ -25,8 +25,8 @@ json.homeworks @homework_commons.each do |homework| json.upper_category_name homework.course_second_category&.name unless params[:category] charge_ids = @course.charge_group_ids(@member) - json.publish_immediately @user_course_identity < Course::STUDENT && homework.publish_immediately(charge_ids) - json.end_immediately @user_course_identity < Course::STUDENT && homework.end_immediately(charge_ids) + json.publish_immediately @user.logged? && @user_course_identity < Course::STUDENT && homework.publish_immediately(charge_ids) + json.end_immediately @user.logged? && @user_course_identity < Course::STUDENT && homework.end_immediately(charge_ids) unless curr_status[:status].include?("未发布") work_count = calculate_work_count homework, @member diff --git a/lib/tasks/migrate_course_resource.rake b/lib/tasks/migrate_course_resource.rake new file mode 100644 index 000000000..34d216625 --- /dev/null +++ b/lib/tasks/migrate_course_resource.rake @@ -0,0 +1,254 @@ +# 执行示例 RAILS_ENV=production bundle exec rake migrate_course_resource:import_attachments args=3835,2526 +# + +desc "同步课堂学生数据" +namespace :migrate_course_resource do + if ENV['args'] + source_id = ENV['args'].split(",")[0] # 源课堂id + target_id = ENV['args'].split(",")[1] # 目标课堂id + end + + task import_attachments: :environment do + source_course = Course.find_by(id: source_id) + target_course = Course.find_by(id: target_id) + return if source_course.blank? || target_course.blank? + + source_course.attachments.each do |atta| + if atta.course_second_category.present? + target_category = CourseSecondCategory.find_by(name: atta.course_second_category.name, course_id: target_course.id, category_type: "attachment") + unless target_category.present? + course_module = target_course.course_modules.find_by(module_type: "attachment") + target_category = CourseSecondCategory.create(name: atta.course_second_category.name, course_id: target_course.id, + category_type: "attachment", course_module_id: course_module&.id, + position: course_module&.course_second_categories&.count.to_i + 1) + end + end + target_course.attachments << target_course.attachments.build(atta.attributes.except("id").merge( + quotes: 0, + downloads: 0, + author_id: target_course.tea_id, + created_on: Time.now, + course_second_category_id: target_category&.id.to_i + )) + end + end + + task import_videos: :environment do + source_course = Course.find_by(id: source_id) + target_course = Course.find_by(id: target_id) + return if source_course.blank? || target_course.blank? + + source_course.course_videos.each do |video| + target_course.course_videos << CourseVideo.new(video_id: video.video_id) + end + end + + task import_homeworks: :environment do + source_course = Course.find_by(id: source_id) + target_course = Course.find_by(id: target_id) + return if source_course.blank? || target_course.blank? + + source_course.homework_commons.each do |homework| + ActiveRecord::Base.transaction do + if homework.course_second_category.present? + target_category = CourseSecondCategory.find_by(name: homework.course_second_category.name, course_id: target_course.id, category_type: "shixun_homework") + unless target_category.present? + course_module = target_course.course_modules.find_by(module_type: "shixun_homework") + target_category = CourseSecondCategory.create(name: homework.course_second_category.name, course_id: target_course.id, + category_type: "shixun_homework", course_module_id: course_module&.id, + position: course_module&.course_second_categories&.count.to_i + 1) + end + end + + # 复制作业的基本信息 + new_homework = HomeworkCommon.new(name: homework.name, user_id: target_course.tea_id, description: homework.description, + homework_type: homework.homework_type, course_id: target_course.id, + reference_answer: homework.reference_answer, course_second_category_id: target_category&.id.to_i) + + # 作业的基本设置复制 + new_homework.homework_detail_manual = HomeworkDetailManual.new + new_homework_detail_manual = new_homework.homework_detail_manual + new_homework_detail_manual.te_proportion = 0.7 + new_homework_detail_manual.ta_proportion = 0.3 + + if new_homework.homework_type == "group" + # 分组作业表的复制 + old_homework_group = homework.homework_detail_group + new_homework.homework_detail_group = HomeworkDetailGroup.new + new_homework.homework_detail_group.min_num = old_homework_group&.min_num + new_homework.homework_detail_group.max_num = old_homework_group&.max_num + new_homework.homework_detail_group.base_on_project = old_homework_group&.base_on_project + end + + if new_homework.homework_type == "practice" + # 分组作业表的复制 + new_homework.homework_commons_shixun = HomeworkCommonsShixun.new + new_homework.homework_commons_shixun.shixun_id = homework.homework_commons_shixun&.shixun_id + + homework.position = HomeworkCommon.where(course_id:target_course.id, homework_type: "practice").pluck(:position).max.to_i + 1 + + homework.homework_challenge_settings.each do |setting| + new_homework.homework_challenge_settings << HomeworkChallengeSetting.new(challenge_id: setting.challenge_id, + shixun_id: setting.shixun_id, score: setting.score) + end + end + + # 附件 + if new_homework.save + homework.attachments.try(:each) do |attachment| + att = attachment.copy + att.container_id = nil + att.container_type = nil + att.author_id = homework.user_id + att.attachtype = attachment.attachtype || 1 + # att.attachtype = 1 + att.copy_from = attachment.id + att.save! + new_homework.attachments << att + end + new_homework_detail_manual.save if new_homework_detail_manual + new_homework.homework_detail_group.save if new_homework.homework_detail_group + new_homework.homework_commons_shixun.save if new_homework.homework_commons_shixun + CreateStudentWorkJob.perform_later(new_homework.id) + end + end + end + end + + task import_exercises: :environment do + source_course = Course.find_by(id: source_id) + target_course = Course.find_by(id: target_id) + return if source_course.blank? || target_course.blank? + + source_course.exercises.each do |exercise| + ActiveRecord::Base.transaction do + new_exercise = Exercise.new(:exercise_name => exercise.exercise_name, :exercise_description => exercise.exercise_description, + :user_id => target_course.tea_id, :course_id => target_course.id) + # 复制试卷基本信息 + exercise.exercise_questions.each do |q| + option = { + :question_title => q.question_title, + :question_type => q.question_type || 1, + :question_number => q.question_number, + :question_score => q.question_score, + :shixun_name => q.shixun_name, + :shixun_id => q.shixun_id, + :is_ordered => q.is_ordered + } + exercise_question = new_exercise.exercise_questions.new option + # question_type:5实训题;其他是非实训题 + if q.question_type != 5 + # 复制选择题题目选项 + q.exercise_choices.try(:each_with_index) do |choice, index| + exercise_question.exercise_choices.new({choice_position: index+1, choice_text: choice.choice_text}) + end + + # 复制标准答案(填空题和问答题) 多空填空题的话,应该是原标准答案的exercise_choice_id,即为题空的位置。 + q.exercise_standard_answers.try(:each) do |answer| + exercise_question.exercise_standard_answers.new({exercise_choice_id: answer.exercise_choice_id, answer_text: answer.answer_text}) + end + else + # 复制实训题 + q.exercise_shixun_challenges.try(:each_with_index) do |sc, index| + exercise_question.exercise_shixun_challenges.new({position: index+1, challenge_id: sc.challenge_id, + shixun_id: sc.shixun_id, question_score: sc.question_score}) + end + end + end + new_exercise.save! + end + end + end + + task import_polls: :environment do + source_course = Course.find_by(id: source_id) + target_course = Course.find_by(id: target_id) + return if source_course.blank? || target_course.blank? + + source_course.polls.each do |poll| + new_poll = Poll.new(:polls_name => poll.polls_name, :polls_description => poll.polls_description, :user_id => target_course.tea_id, + :polls_type => 'Course', :course_id => target_course.id) + + poll.poll_questions.try(:each) do |q| + option = { + :question_title => q.question_title, + :question_type => q.question_type || 1, + :is_necessary => q.is_necessary, + :question_number => q.question_number, + :max_choices => q.max_choices, + :min_choices => q.min_choices + } + poll_question = new_poll.poll_questions.new option + q.poll_answers.try(:each_with_index) do |choice, index| + poll_question.poll_answers.new({answer_position: index+1, answer_text: choice.answer_text}) + end + end + new_poll.save! + end + end + + + task import_members: :environment do + source_course = Course.find_by(id: source_id) + target_course = Course.find_by(id: target_id) + return if source_course.blank? || target_course.blank? + + + # 先把target——course中的老师创建分班权限 + target_course.teachers.each do |member| + if member.teacher_course_groups.blank? + target_course.course_groups.each do |group| + TeacherCourseGroup.create!(course_group_id: group.id, course_id: target_course.id, course_member_id: member&.id, user_id: member&.user_id) + end + end + end + + source_course.course_members.where(role: %i[PROFESSOR ASSISTANT_PROFESSOR]).each do |teacher| + new_member = target_course.teachers.find_by(user_id: teacher.user_id) + unless new_member.present? + new_member = CourseMember.create!(course_id: target_course.id, user_id: teacher.user_id, role: teacher.role) + end + end + + source_course.course_groups.each do |group| + unless target_course.course_groups.where(name: group.name).exists? + new_group = CourseGroup.create!(course_id: target_course.id, name: group.name, position: target_course.course_groups.pluck(:position).max.to_i + 1) + else + new_group = target_course.course_groups.find_by(name: group.name) + end + new_user_ids = [] + group.course_members.where(role: 4).each do |member| + new_member = target_course.students.find_by(user_id: member.user_id) + if new_member.present? + new_member.update_attributes(course_group_id: new_group.id) + else + CourseMember.create!(course_id: target_course.id, course_group_id: new_group.id, user_id: member.user_id, role: member.role) + new_user_ids << member.user_id + end + end + + CourseAddStudentCreateWorksJob.perform_later(target_course.id, new_user_ids) unless new_user_ids.blank? + + group.teacher_course_groups.each do |teacher_group| + member = CourseMember.find_by(course_id: target_course.id, user_id: teacher_group.user_id, role: %i[CREATOR PROFESSOR ASSISTANT_PROFESSOR]) + if member.present? && !member.teacher_course_groups.where(course_group_id: new_group.id).exists? + TeacherCourseGroup.create!(course_group_id: new_group.id, course_id: target_course.id, course_member_id: member&.id, user_id: member&.user_id) + end + end + end + + user_ids = [] + source_course.students.where(course_group_id: 0).each do |member| + new_member = target_course.students.find_by(user_id: member.user_id) + if new_member.present? + new_member.update_attributes(course_group_id: 0) + else + CourseMember.create!(course_id: target_course.id, course_group_id: 0, user_id: member.user_id, role: member.role) + user_ids << member.user_id + end + end + CourseAddStudentCreateWorksJob.perform_later(target_course.id, user_ids) unless user_ids.blank? + + end + + end \ No newline at end of file diff --git a/lib/tasks/migrate_course_student.rake b/lib/tasks/migrate_course_student.rake deleted file mode 100644 index 913cb2562..000000000 --- a/lib/tasks/migrate_course_student.rake +++ /dev/null @@ -1,32 +0,0 @@ -# 执行示例 RAILS_ENV=production bundle exec rake migrate_course_student:student args=3835,2526,21950,1000 -# args 第一个课程 course_id,第二个参数是学校school_id,第三个参数是部门id,第四个参数是迁移数量 -# - -desc "同步学校的学生" -namespace :migrate_course_student do - if ENV['args'] - course_id = ENV['args'].split(",")[0] # 对应课堂的id - school_id = ENV['args'].split(",")[1] # 对应学校id - department_id = ENV['args'].split(",")[2] # 对应部门id - limit = ENV['args'].split(",")[3] # 限制导入的数量 - end - - task :student => :environment do - course = Course.find course_id - users = User.joins(:user_extension).where(user_extensions: {school_id: school_id, department_id: department_id, identity: 1}).limit(limit) - user_ids = [] - - users.each do |user| - if user.student_id.present? && !course.students.exists?(user_id: user.id) - begin - CourseMember.create!(course_id: course_id, user_id: user.id, role: 4) - user_ids << user.id - rescue Exception => e - Rails.logger(e.message) - end - end - end - CourseAddStudentCreateWorksJob.perform_later(course_id, user_ids) - - end -end \ No newline at end of file diff --git a/public/images/educoder/xcx/newpathsbanner.png b/public/images/educoder/xcx/newpathsbanner.png new file mode 100644 index 000000000..43e8bf1d1 Binary files /dev/null and b/public/images/educoder/xcx/newpathsbanner.png differ diff --git a/public/images/educoder/xcx/pathsbanner.png b/public/images/educoder/xcx/pathsbanner.png index 1023b49d5..43e8bf1d1 100644 Binary files a/public/images/educoder/xcx/pathsbanner.png and b/public/images/educoder/xcx/pathsbanner.png differ diff --git a/public/react/src/modules/courses/ListPageIndex.js b/public/react/src/modules/courses/ListPageIndex.js index 6198484dd..d787bd9c6 100644 --- a/public/react/src/modules/courses/ListPageIndex.js +++ b/public/react/src/modules/courses/ListPageIndex.js @@ -175,6 +175,9 @@ class ListPageIndex extends Component{ isexcellent:excellent }) } + updatabanners=()=>{ + this.refs.CoursesBanner.updatabanner() + } render() { let {yslGuideone} =this.state; // console.log("98"); @@ -187,7 +190,7 @@ class ListPageIndex extends Component{
{/*头部banner*/} - this.ispostexcellenttype(excellent)}> + this.ispostexcellenttype(excellent)}> {/*下面是指引哦*/} {/*{yslGuideone!==undefined?*/} {/*(*/} @@ -249,7 +252,7 @@ class ListPageIndex extends Component{ > () + (props) => (this.updatabanners()} {...this.props} {...props} {...this.state} />) } > {/* 学生列表*/} @@ -300,7 +303,7 @@ class ListPageIndex extends Component{ (props) => () } > - + {/*公告栏列表*/} @@ -324,7 +327,7 @@ class ListPageIndex extends Component{ } > - + () @@ -335,7 +338,7 @@ class ListPageIndex extends Component{ (props) => () } > - + () diff --git a/public/react/src/modules/courses/common/ModalWrapper.js b/public/react/src/modules/courses/common/ModalWrapper.js index 8b7e87692..6bdd5f188 100644 --- a/public/react/src/modules/courses/common/ModalWrapper.js +++ b/public/react/src/modules/courses/common/ModalWrapper.js @@ -42,7 +42,7 @@ class ModalWrapper extends Component{ { ` body { - overflow: hidden !important; + width: calc(100%) !important; } ` } diff --git a/public/react/src/modules/courses/coursesDetail/CoursesLeftNav.js b/public/react/src/modules/courses/coursesDetail/CoursesLeftNav.js index bb5395d67..9e514c468 100644 --- a/public/react/src/modules/courses/coursesDetail/CoursesLeftNav.js +++ b/public/react/src/modules/courses/coursesDetail/CoursesLeftNav.js @@ -954,7 +954,7 @@ class Coursesleftnav extends Component{ { ` body { - overflow: hidden !important; + width: calc(100%) !important; } ` } diff --git a/public/react/src/modules/courses/coursesHome/CoursesHome.js b/public/react/src/modules/courses/coursesHome/CoursesHome.js index 21f7b33bc..73289b2d5 100644 --- a/public/react/src/modules/courses/coursesHome/CoursesHome.js +++ b/public/react/src/modules/courses/coursesHome/CoursesHome.js @@ -130,7 +130,9 @@ class CoursesHome extends Component{
:""}
{this.props.Navname}名称: