diff --git a/app/controllers/members_controller.rb b/app/controllers/members_controller.rb index db6aeda94..d3e164844 100644 --- a/app/controllers/members_controller.rb +++ b/app/controllers/members_controller.rb @@ -58,7 +58,7 @@ class MembersController < ApplicationController applied_project = @applied_message.applied user = User.find(@applied_message.applied_user_id) project = Project.find(applied_project.project_id) if !applied_project.nil? - if user.member_of?(project)|| AppliedMessage.where(:applied_id => @applied_message.applied_id, :status => 1).count == 0 + if user.member_of?(project)|| AppliedMessage.where(:applied_id => @applied_message.applied_id, :status => 0).count == 0 @flash_message = "该申请已被其他管理员处理" # @applied_message.update_attribute(:status, 2) else @@ -77,7 +77,7 @@ class MembersController < ApplicationController project.user_grades << user_grades unless user_grades.first.user_id.nil? # 添加成功后所有管理员收到的消息状态都要更新 - applied_messages = AppliedMessage.where(:applied_id => @applied_message.applied_id, :project_id => @applied_message.project_id, :status => 1, + applied_messages = AppliedMessage.where(:applied_id => @applied_message.applied_id, :project_id => @applied_message.project_id, :status => 0, :applied_type => "AppliedProject") applied_messages.update_all(:status => 7, :viewed => true) @applied_message = AppliedMessage.find(params[:applied_message_id]) @@ -88,7 +88,7 @@ class MembersController < ApplicationController ps.send_wechat_join_project_notice user,project,ap_role,0 # 添加成功后,批准人收到消息 # AppliedMessage.create(:user_id => @applied_message.user_id, :applied_type => "AppliedProject", :applied_id => applied_project.id , - # :status => 7, :viewed => true, :applied_user_id => @applied_message.applied_user_id, :role => applied_project.role, :project_id => applied_project.project_id) + # :status => 7, :viewed => true, :applied_user_id => @applied_message.applied_user_id, :role => applied_project.role, :project_id => applied_project.project_id) rescue Exception => e puts e end @@ -106,7 +106,7 @@ class MembersController < ApplicationController applied_project = @applied_message.applied project = Project.find(@applied_message.project_id) if !applied_project.nil? user = User.find(@applied_message.applied_user_id) - if user.member_of?(project) || AppliedMessage.where(:applied_id => @applied_message.applied_id, :status => 1).count == 0 + if user.member_of?(project) || AppliedMessage.where(:applied_id => @applied_message.applied_id, :status => 0).count == 0 @flash_message = "该申请已被其他管理员处理" # @applied_message.update_attribute(:status, 2) else @@ -115,7 +115,7 @@ class MembersController < ApplicationController :viewed => false, :applied_user_id => @applied_message.user_id, :role => applied_project.role, :project_id => applied_project.project_id) # 拒绝功后所有管理员收到的消息状态都要更新 - applied_messages = AppliedMessage.where(:applied_id => @applied_message.applied_id, :project_id => @applied_message.project_id, :status => 1, + applied_messages = AppliedMessage.where(:applied_id => @applied_message.applied_id, :project_id => @applied_message.project_id, :status => 0, :applied_type => "AppliedProject") applied_messages.update_all(:status => 5, :viewed => true) @applied_message = AppliedMessage.find(params[:applied_message_id]) diff --git a/app/controllers/organizations_controller.rb b/app/controllers/organizations_controller.rb index edffdd28b..14151cc1f 100644 --- a/app/controllers/organizations_controller.rb +++ b/app/controllers/organizations_controller.rb @@ -635,24 +635,74 @@ class OrganizationsController < ApplicationController end end def apply_subdomain - @organization = Organization.find(params[:id]) - admins = User.where("admin=1") - admins.each do |admin| - OrgMessage.create(:user_id => admin.id, :organization_id => @organization.id, :message_type => 'ApplySubdomain', :message_id => @organization.id, :sender_id => User.current.id, :viewed => 0, :content => params[:domain].downcase) + organization = Organization.find(params[:id]) + @applied_message_count = AppliedMessage.where(:applied_id => organization.id, :name => params[:domain].downcase, :status => 1).count + # 如果申请过该名字,怎不能重复申请 + if @applied_message_count > 0 + @flag = 1 + else + admins = User.where("admin=1") + admins.each do |admin| + AppliedMessage.create(:user_id => admin.id, :applied_id => organization.id, :applied_type => 'Organization', :viewed => 0, :satus => 1, :applied_user_id => User.current.id, :name => params[:domain].downcase) + # OrgMessage.create(:user_id => admin.id, :organization_id => @organization.id, :message_type => 'ApplySubdomain', :message_id => @organization.id, :sender_id => User.current.id, :viewed => 0, :content => params[:domain].downcase) + end end end + # stauts: 0:申请 ,2:申请人收到已接受消息 + # @flag 1:申请同名提醒, 2:操作的时候已经被人提前处理了 def agree_apply_subdomain - @organization = Organization.find(params[:organization_id]) - OrgMessage.find(params[:act_id]).update_attribute(:viewed, 1) - if Secdomain.where("pid=? and sub_type=2",@organization.id).count > 0 - domain = Secdomain.where("pid=? and sub_type=2",params[:organization_id]).first - Secdomain.update(domain.id, :subname => params[:org_domain]) + organization_id = params[:organization_id] + org_domain = params[:org_domain] + @applied_message = AppliedMessage.find(params[:ma_id]) + # 处理的时候判断是否有人已经处理了 + if @applied_message.status == 0 + # 事务处理:消息和数据的创建应该是同步的 + ActiveRecord::Base.transaction do + applied_messages = AppliedMessage.where(:applied_type => "Organization", :applied_id => organization_id, :name => org_domain, :status => 0) + applied_messages.update_all(:status => 2, :viewed => true, :updated_at => Time.now) + secdomain = Secdomain.where(:pid => organization_id, :sub_type => 2) + if secdomain.count > 0 + domain = Secdomain.where("pid=? and sub_type=2",organization_id).first + Secdomain.update(domain.id, :subname => params[:org_domain]) + else + Secdomain.create(:sub_type => 2, :pid => organization_id, :subname => params[:org_domain]) + end + # 自己处理自己的消息则不需要另外发送消息 + if User.current.id != @applied_message.applied_user_id + AppliedMessage.create(:user_id => @applied_message.applied_user_id, :applied_id => organization_id, :applied_type => 'Organization', :viewed => 0, :satus => 2, :applied_user_id => User.current.id, :name => org_domain.downcase) + end + @applied_message.status = 2 + @applied_message.updated_at = Time.now + end else - Secdomain.create(:sub_type => 2, :pid => params[:organization_id], :subname => params[:org_domain]) + @flag = 2 end - if OrgMessage.where("message_type='AgreeApplySubdomain' and organization_id=#{@organization.id} and content=?",params[:org_domain]).count == 0 - OrgMessage.create(:user_id => params[:user_id], :organization_id => @organization.id, :message_type => 'AgreeApplySubdomain', :message_id => @organization.id, :sender_id => User.current.id, :viewed => 0, :content => params[:org_domain]) + end + + # stauts: 0:申请 ,2:申请人收到已接受消息, 4:已拒绝 + # @flag 1:申请同名提醒, 2:操作的时候已经被人提前处理了 + def refused_apply_subdomain + organization_id = params[:organization_id] + org_domain = params[:org_domain] + @applied_message = AppliedMessage.find(params[:ma_id]) + # 多人同时操作处理 + secdomain = Secdomain.where(:pid => organization_id, :sub_type => 2) + # 处理过程中,如果已经被其他管理员处理,则弹框提示 + if @applied_message.status == 0 + # 事务处理:消息和数据的创建应该是同步的 + ActiveRecord::Base.transaction do + applied_messages = AppliedMessage.where(:applied_type => "Organization", :applied_id => organization_id, :name => org_domain, :status => 0) + applied_messages.update_all(:status => 4, :viewed => true, :updated_at => Time.now) + # 自己处理自己的消息则不需要另外发送消息 + if User.current.id != @applied_message.applied_user_id + AppliedMessage.create(:user_id => @applied_message.applied_user_id, :applied_id => organization_id, :applied_type => 'Organization', :viewed => 0, :satus => 4, :applied_user_id => User.current.id, :name => org_domain.downcase) + end + @applied_message.status = 4 + @applied_message.updated_at = Time.now + end + else + @flag = 2 end end end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index cbafbeed0..3b482a8eb 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -2052,42 +2052,10 @@ class UsersController < ApplicationController # @unreview_homework = 1 # 待审批的申请 - @applied_message_alls = [] - OrgMessage - - applied_messages_all = MessageAll.where(:user_id => @user.id, :message_type => ["OrgMessage", "AppliedMessage", "CourseMessage", "ForgeMessage"]).includes(:message) - applied_messages_all.each do |message_all| - mess = message_all.message - if !mess.nil? - if (message_all.message_type == "OrgMessage") - if mess.message_type == "ApplySubdomain" && OrgMessage.where(:organization_id => mess.organization_id, :message_type => "AgreeApplySubdomain").count == 0 - @applied_message_alls << mess - end - elsif (message_all.message_type == "AppliedMessage" ) - if (mess.applied_type == "AppliedContest" && mess.status == 0) || (mess.applied_type == "StudentWorksScoresAppeal" && mess.status == 0) || (mess.applied_type == "AppliedProject" && mess.status == 1 && AppliedMessage.where("applied_id = #{mess.applied_id} and status != 1").count == 0) || ( mess.applied_type == "ApplyAddSchools" && ApplyAddSchools.where(:school_id => mess.applied_id, :status => 0).count != 0 ) - @applied_message_alls << mess - end - elsif message_all.message_type == "CourseMessage" - if mess.course_message_type == "JoinCourseRequest" && mess.status == 0 - @applied_message_alls << mess - end - elsif message_all.message_type == "ForgeMessage" - if mess.forge_message_type == "PullRequest" && PullRequest.where(:pull_request_id => mess.forge_message_id, :status => [1, 3]).count > 0 && PullRequest.where(:pull_request_id => mess.forge_message_id).first.user_id != User.current.id - user_id = PullRequest.where(:pull_request_id => mess.forge_message_id, :status => [1, 3]).first.id - if ForgeMessage.where("status in (1,3) and user_id != #{user_id} and pull_request_id = #{mess.forge_message_id}") - @applied_message_alls << mess - end - end - end - end - end - @applied_message_alls_count = @applied_message_alls.count - # org_applied_messages = MessageAll.where(:message_type => "OrgMessage").includes(:message).order("created_at desc") - # org_applied_messages = org_applied_messages.message.map{|message| message.message_type == "ApplySubdomain" and OrgMessage.where(:organization_id => message.organization_id, :message_type => "AgreeApplySubdomain").count == 0}.length - # project_message_applied_count = AppliedMessage.where(:user_id => @user.id, :message_type => "AppliedProject", :status => 1) - # school_message_applied_count = AppliedMessage.where(:user_id => @user.id, :message_type => "ApplyAddSchools", :status => 0) - # course_message_applied_count = CourseMessage.where(:message_type => "JoinCourse", :satus => 0) - # @applied_message_count = org_message_applied_count + project_message_applied_count + school_message_applied_count + course_message_applied_count + applied_message_count = AppliedMessage.where(:applied_type => ["Organization", "AppliedContest", "StudentWorksScoresAppeal", "AppliedProject", "ApplyAddSchools"], :user_id => User.current.id, :status => 0).count + applied_course_message_count = CourseMessage.where(:user_id => User.current.id, :course_message_type => "JoinCourseRequest", :status => 0).count + applied_pull_request_message_count = ForgeMessage.where(:user_id => User.current.id, :forge_message_type => "PullRequest", :status => [1,3]).count + @applied_message_alls_count = applied_message_count + applied_course_message_count + applied_pull_request_message_count else # 看别人的主页显示动态 #更新用户申请成为课程老师或教辅消息的状态 @@ -2270,35 +2238,15 @@ class UsersController < ApplicationController end # 待审批的申请 + # 待审批的消息一般不多,可以特殊处理 def unapproval_applied_list - @message_alls = [] - # messages_all = MessageAll.where("(user_id =? and message_type !=?) or message_type =?" ,@user.id, "SystemMessage", "SystemMessage").includes(:message).order("created_at desc") - messages_all = MessageAll.where(:user_id => @user.id, :message_type => ["OrgMessage", "AppliedMessage", "CourseMessage", "ForgeMessage"]).includes(:message).order("created_at desc") - messages_all.each do |message_all| - mess = message_all.message - if !mess.nil? - if (message_all.message_type == "OrgMessage") - if mess.message_type == "ApplySubdomain" && OrgMessage.where(:organization_id => mess.organization_id, :message_type => "AgreeApplySubdomain").count == 0 - @message_alls << mess - end - elsif (message_all.message_type == "AppliedMessage" ) - if (mess.applied_type == "AppliedContest" && mess.status == 0) || (mess.applied_type == "StudentWorksScoresAppeal" && mess.status == 0) || (mess.applied_type == "AppliedProject" && mess.status == 1 && AppliedMessage.where("applied_id = #{mess.applied_id} and status != 1").count == 0) || ( mess.applied_type == "ApplyAddSchools" && ApplyAddSchools.where(:school_id => mess.applied_id, :status => 0).count != 0 ) - @message_alls << mess - end - elsif message_all.message_type == "CourseMessage" - if mess.course_message_type == "JoinCourseRequest" && mess.status == 0 - @message_alls << mess - end - elsif message_all.message_type == "ForgeMessage" - if mess.forge_message_type == "PullRequest" && PullRequest.where(:pull_request_id => mess.forge_message_id, :status => [1, 3]).count > 0 && PullRequest.where(:pull_request_id => mess.forge_message_id).first.user_id != User.current.id - user_id = PullRequest.where(:pull_request_id => mess.forge_message_id, :status => [1, 3]).first.id - if ForgeMessage.where("status in (1,3) and user_id != #{user_id} and pull_request_id = #{mess.forge_message_id}") - @message_alls << mess - end - end - end - end - end + user_id = User.current.id + sql = "SELECT * FROM `message_alls` ma left join `forge_messages` fm on ma.message_id=fm.id + left join `course_messages` cm on ma.message_id=cm.id left join `applied_messages` apm on ma.message_id=apm.id + where (ma.user_id =#{user_id} and ma.message_type = 'ForgeMessage' and fm.forge_message_type='PullRequest' and fm.status=0 and fm.user_id=#{user_id} ) or + (ma.user_id=#{user_id} and ma.message_type='AppliedMessage' and apm.applied_type in ('Organization', 'AppliedContest', 'StudentWorksScoresAppeal', 'AppliedProject', 'ApplyAddSchools') and apm.user_id =#{user_id} and apm.status =0 ) or + (ma.user_id=#{user_id} and ma.message_type='CourseMessage' and cm.course_message_type='JoinCourseRequest' and cm.status=0 and cm.user_id=#{user_id} );" + @message_alls = MessageAll.find_by_sql(sql) @message_count = @message_alls.count @message_alls = paginateHelper @message_alls, 20 respond_to do |format| diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 850cbca8f..68843228e 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -46,6 +46,10 @@ module ApplicationHelper @objs = paginateHelper @attachments,25 end + # 判断当前用户能否对消息进行操作 + def allow_to_show applied_message + (User.current.id == applied_message.user_id && applied_message.status == 0) ? true : false + end # 获取竞赛的管理人员 def contest_managers contest diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb index dcac601a4..b9f79609b 100644 --- a/app/helpers/users_helper.rb +++ b/app/helpers/users_helper.rb @@ -134,10 +134,6 @@ module UsersHelper end end - # 判断当前用户能否对消息进行操作 - def allow_to_show applied_message - (User.current.id == applied_message.user_id && applied_message.status == 1) ? true : false - end # 项目申请消息通过状态判断用户 # status(1:申请的消息;2:已操作过该消息(包括同意或者拒绝,消息状态更新);3:拒绝消息;4:被拒人收到消息;5:拒绝者收到消息;6:同意后申请人收到消息;7:同意后批准人收到消息) diff --git a/app/models/applied_project.rb b/app/models/applied_project.rb index a6eef8417..87bbf8bf8 100644 --- a/app/models/applied_project.rb +++ b/app/models/applied_project.rb @@ -11,7 +11,7 @@ class AppliedProject < ActiveRecord::Base # 仅仅给项目管理人员发送消息 def send_appliled_message self.project.managers.each do |member| - self.applied_messages << AppliedMessage.new(:user_id => member.user_id, :status => true, :viewed => false, :applied_user_id => self.user_id, :role => self.role, :project_id => self.project_id) + self.applied_messages << AppliedMessage.new(:user_id => member.user_id, :status => false, :viewed => false, :applied_user_id => self.user_id, :role => self.role, :project_id => self.project_id) #----------------微信通知---------------------- count = ShieldWechatMessage.where("container_type='User' and container_id=#{member.user_id} and shield_type='Project' and shield_id=#{self.project_id}").count diff --git a/app/models/message_all.rb b/app/models/message_all.rb index 836d24b9f..c84579ceb 100644 --- a/app/models/message_all.rb +++ b/app/models/message_all.rb @@ -2,5 +2,14 @@ class MessageAll < ActiveRecord::Base attr_accessible :message_id, :message_type, :user_id belongs_to :user # 虚拟关联---项目消息表/课程消息表/用户留言消息表/贴吧消息表 + belongs_to :forge_message, foreign_key: 'message_id', conditions: "message_alls.message_type = 'ForgeMessage'" + belongs_to :course_message, foreign_key: 'message_id', conditions: "message_alls.message_type = 'CourseMessage'" + belongs_to :applied_message, foreign_key: 'message_id', conditions: "message_alls.message_type = 'AppliedMessage'" + belongs_to :at_message, foreign_key: 'message_id', conditions: "message_alls.message_type = 'AtMessage'" + belongs_to :memo_message, foreign_key: 'message_id', conditions: "message_alls.message_type = 'MemoMessage'" + belongs_to :org_message, foreign_key: 'message_id', conditions: "message_alls.message_type = 'OrgMessage'" + belongs_to :system_message, foreign_key: 'message_id', conditions: "message_alls.message_type = 'SystemMessage'" + belongs_to :user_feedback_message, foreign_key: 'message_id', conditions: "message_alls.message_type = 'UserFeedbackMessage'" belongs_to :message ,:polymorphic => true + end diff --git a/app/models/org_message.rb b/app/models/org_message.rb index baedc77f4..35f00962f 100644 --- a/app/models/org_message.rb +++ b/app/models/org_message.rb @@ -1,7 +1,7 @@ class OrgMessage < ActiveRecord::Base belongs_to :user belongs_to :organization - has_many :message_alls, :as => :message, :dependent => :destroy + has_many :message_alls, :class_name => 'MessageAll', :as => :message, :dependent => :destroy validates :message_type, :presence => true validates :message_id, :presence => true validates :organization_id, :presence => true diff --git a/app/models/organization.rb b/app/models/organization.rb index 284754c03..864c0b8a8 100644 --- a/app/models/organization.rb +++ b/app/models/organization.rb @@ -10,6 +10,7 @@ class Organization < ActiveRecord::Base has_many :users, :through => :org_members has_many :files has_many :org_messages, :class_name => 'OrgMessage', :dependent => :destroy + has_many :applied_messages, :class_name => 'AppliedMessage', :dependent => :destroy acts_as_attachable validates_uniqueness_of :name after_create :save_as_org_activity, :add_default_subfields diff --git a/app/views/admin/syllabuses.html.erb b/app/views/admin/syllabuses.html.erb index d24f7d39a..c255c3c2c 100644 --- a/app/views/admin/syllabuses.html.erb +++ b/app/views/admin/syllabuses.html.erb @@ -38,6 +38,9 @@
当前组织已申请过该域名,请耐心等待管理员的审批,审批完成后系统会以消息的形式通知您
+ <% elsif @flag == 2 %> +已经被其他管理员抢先一步处理了
+ <% else %> +您的申请已提交,系统会以消息的形式通知您结果
+ <% end %> +<%= day %>
-<%= commits.count %>个提交
+当前页<%= commits.count %>个提交