From 02655789e171b67bbeddb83cef59665e68293d8a Mon Sep 17 00:00:00 2001
From: cxt <853663049@qq.com>
Date: Thu, 31 Oct 2019 11:05:32 +0800
Subject: [PATCH] =?UTF-8?q?=E7=BB=9F=E8=AE=A1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 app/controllers/files_controller.rb    | 80 +++++++++++++++++++++-----
 app/models/attachment.rb               |  1 +
 app/models/attachment_group_setting.rb |  2 +
 app/models/course.rb                   |  4 ++
 4 files changed, 73 insertions(+), 14 deletions(-)

diff --git a/app/controllers/files_controller.rb b/app/controllers/files_controller.rb
index 117475894..bb81269da 100644
--- a/app/controllers/files_controller.rb
+++ b/app/controllers/files_controller.rb
@@ -24,26 +24,53 @@ class FilesController < ApplicationController
 
     get_category(@course, @course_second_category_id)
     @total_count = @attachments.size
-    @publish_count = @attachments.published.size
-    @unpublish_count = @total_count - @publish_count
 
-    @attachments = @attachments.by_keywords(params[:search])
-    @attachments =
-      case @user.course_identity(@course)
-      when 5
-        @attachments.published
-      when 6, 7
-        @attachments.publiced.published
+    if @user.course_identity(@course) == 5
+      member = @course.course_members.find_by(user_id: current_user.id, is_active: 1)
+      if member.try(:course_group_id).to_i == 0
+        @attachments = @attachments.published.unified_setting
       else
-        @attachments
+        not_atta_ids = @course.attachment_group_settings.none_published.where("course_group_id = #{member.try(:course_group_id)}").pluck(:attachment_id)
+
+        @attachments = @attachments.where.not(id: not_atta_ids).published
       end
+    elsif @user.course_identity(@course) > 5
+      @attachments = @attachments.publiced.published
+    end
+
+    @publish_count = @attachments.published.size
+    @unpublish_count = @total_count - @publish_count
+    @attachments = @attachments.by_keywords(params[:search])
 
     @attachments = @attachments.page(@page).per(@page_size)
   end
 
   def bulk_publish
     return normal_status(403, "您没有权限进行操作") if current_user.course_identity(@course) >= 5
-    @course.attachments.by_ids(@attachment_ids).unpublish.update_all(is_publish: 1, publish_time: Time.now)
+    tip_exception("请至少选择一个分班") if params[:group_ids].blank? && @course.course_groups.size != 0
+
+    attachments = @course.attachments.by_ids(@attachment_ids)
+
+    ActiveRecord::Base.transaction do
+      # 有分班设置时
+      if @course.course_group_module? && @course.course_groups_count != 0 && params[:group_ids]
+        group_ids = params[:group_ids]&.reject(&:blank?)
+        charge_group_ids = @course.charge_group_ids(current_user)
+        publish_groups = charge_group_ids & group_ids if group_ids
+
+        attachments.each do |atta|
+          if atta.published? && !atta.unified_setting || !atta.published?
+            create_atta_group_settings atta
+            atta.update_all(unified_setting: 0) if atta.unified_setting
+            none_publish_settings = atta.attachment_group_settings.where(course_group_id: publish_groups).none_published
+            none_publish_settings.update_all(publish_time: Time.now)
+          end
+        end
+      end
+
+      # 未发布的资源更新状态
+      attachments.where(is_publish: 0).update_all(is_publish: 1, publish_time: Time.now)
+    end
     render_ok
   end
 
@@ -153,6 +180,10 @@ class FilesController < ApplicationController
           attachment.is_publish = @atta_is_publish
           attachment.delay_publish = @atta_delay_publish
           attachment.publish_time = @atta_publish_time
+          attachment.unified_setting = @unified_setting
+          unless @unified_setting
+
+          end
           # attachment.set_publish_time(publish_time) if is_unified_setting
           # attachment.set_course_group_publish_time(@course, course_group_publish_times) if @course.course_groups.size > 0 && !is_unified_setting && publish_time.blank?
           attachment.save!
@@ -319,9 +350,30 @@ class FilesController < ApplicationController
 
   def publish_params
     tip_exception("缺少发布参数") if params[:delay_publish].blank?
-    tip_exception("缺少延期发布的时间参数") if params[:delay_publish].to_i == 1 && params[:publish_time].blank?
-    @atta_is_publish = params[:delay_publish].to_i == 1 && params[:publish_time].to_time > Time.now ? 0 : 1
+    @unified_setting = 1
+    if params[:delay_publish].to_i == 1 && @course.course_group_module? && @course.course_groups_count != 0
+      tip_exception("分班发布设置不能为空") if params[:group_settings].blank?
+      min_publish_time = params[:group_settings].pluck(:publish_time).reject(&:blank?).min
+      max_publish_time = params[:group_settings].pluck(:publish_time).reject(&:blank?).max
+      tip_exception("分班发布设置不能为空") if min_publish_time.blank?
+
+      # 分班设置中的时间一样且包含所有分班 则按统一设置处理,否则是非统一设置
+      @unified_setting = 0 unless min_publish_time == max_publish_time && params[:group_settings].pluck(:group_id).flatten.sort == @course.course_groups.pluck(:id).sort
+    elsif params[:delay_publish].to_i == 1
+      tip_exception("缺少延期发布的时间参数") if params[:publish_time].blank?
+      min_publish_time = params[:publish_time]
+    end
+    @atta_is_publish = params[:delay_publish].to_i == 1 && min_publish_time.to_time > Time.now ? 0 : 1
     @atta_delay_publish = params[:delay_publish].to_i
-    @atta_publish_time = params[:delay_publish].to_i == 1 && params[:publish_time] ? params[:publish_time] : Time.now
+    @atta_publish_time = params[:delay_publish].to_i == 1 ? min_publish_time : Time.now
+  end
+
+  def create_atta_group_settings atta
+    if atta.attachment_group_settings.size != @course.course_groups.size
+      @course.course_groups.where.not(id: atta.attachment_group_settings.pluck(:course_group_id)).each do |group|
+        atta.attachment_group_settings << AttachmentGroupSetting.new(course_group_id: group.id, course_id: @course.id,
+                                                                     publish_time: atta.publish_time)
+      end
+    end
   end
 end
diff --git a/app/models/attachment.rb b/app/models/attachment.rb
index 8b7034ab9..37884e40b 100644
--- a/app/models/attachment.rb
+++ b/app/models/attachment.rb
@@ -23,6 +23,7 @@ class Attachment < ApplicationRecord
   scope :mine,                          -> (author_id) { where(author_id: author_id) }
   scope :simple_columns,                -> { select(:id, :filename, :filesize, :created_on, :cloud_url, :author_id, :content_type) }
   scope :search_by_container,           -> (ids) {where(container_id: ids)}
+  scope :unified_setting, -> {where("unified_setting = ? ", 1)}
 
   validates_length_of :description, maximum: 100
 
diff --git a/app/models/attachment_group_setting.rb b/app/models/attachment_group_setting.rb
index 67240d88f..3fefe5ceb 100644
--- a/app/models/attachment_group_setting.rb
+++ b/app/models/attachment_group_setting.rb
@@ -3,4 +3,6 @@ class AttachmentGroupSetting < ActiveRecord::Base
   belongs_to :course_group
   belongs_to :course
 
+  scope :none_published, -> {where("attachment_group_settings.publish_time IS NULL OR attachment_group_settings.publish_time > ?", Time.now)}
+
 end
diff --git a/app/models/course.rb b/app/models/course.rb
index 16700428b..3e20eee12 100644
--- a/app/models/course.rb
+++ b/app/models/course.rb
@@ -111,6 +111,10 @@ class Course < ApplicationRecord
     course_members.where(user_id: user_id, role: role).exists?
   end
 
+  def course_group_module?
+    course_modules.exists?(module_type: "course_group", hidden: 0)
+  end
+
   # 作业对应的子目录/父目录名称
   def category_info type
     course_module = course_modules.find_by(module_type: type)