#coding=utf-8 class ProjectsService include ApplicationHelper include ApiHelper include ActionView::Helpers::DateHelper include ProjectsHelper #获取指定用户的项目列表 def user_projects(user) projects = user.projects.not_deleted.select("projects.*,(SELECT MAX(updated_at) FROM `forge_activities` WHERE forge_activities.project_id = projects.id) AS updated_at ").order("updated_at desc") projects end #显示项目 def show_project(params,current_user) project = Project.find(params[:id]) project.generate_invite_code project.generate_qrcode project end def send_wechat_create_project_notice user,project count = ShieldWechatMessage.where("container_type='User' and container_id=#{user.id} and shield_type='Project' and shield_id=#{project.id}").count Rails.logger.info "!!!!!!!!!!!!!!!!!!!!!!#{project}" if count == 0 ws = WechatService.new title = "恭喜您创建项目成功。" ws.create_project_notice user.id, "create_project_notice", project.id,title, project.name, format_time(project.created_on),"点击查看项目详情。" end end def createNewProject params,user status = -1 issue_custom_fields = IssueCustomField.sorted.all trackers = Tracker.sorted.all project = Project.new project[:name] = params[:name] project[:description] = '' project[:is_public] = '0' #公开 project[:project_type] = 0 project[:project_new_type] = 1 project[:identifier] = Project.next_identifier if Setting.sequential_project_identifiers? project.organization_id = params[:organization_id] project.user_id = user.id # if validate_parent_id && @project.save if project.save p = Project.find("#{project.id}") send_wechat_create_project_notice user,p r = Role.givable.find_by_id(Setting.new_project_user_role_id.to_i) || Role.givable.first m = Member.new(:user => user, :roles => [r]) # project's score if ProjectScore.where("project_id=?", project.id).first.nil? ProjectScore.create(:project_id => project.id, :score => false) end # end project_info = ProjectInfo.new(:user_id => user.id, :project_id => project.id) user_grades = UserGrade.create(:user_id => user.id, :project_id => project.id) project_status = ProjectStatus.create(:project_id => project.id, :watchers_count => 0, :changesets_count => 0, :project_type => project.project_type,:grade => 0) project.members << m project.project_infos << project_info status = 0 end status end #修改项目成员角色 def modify_user_project_role params status = -1 project = Project.find("#{params[:id]}") member = project.member_principals.includes(:roles, :principal).where("user_id=?",params[:user_id]).first if member member.member_roles[0].role_id = params[:role_id] role = Role.find(params[:role_id]) if role.allowed_to?(:is_manager) projectInfo = ProjectInfo.new(:user_id => member.user_id, :project_id => project.id) projectInfo.save else user_admin = ProjectInfo.where("user_id = ? and project_id = ?", member.user_id, project.id) if user_admin.size > 0 user_admin.each do |user| user.destroy end end end if member.member_roles[0].save status = 0 end end status end class JoinProjectError < Errors define_error [ 0, '您已成功加入项目', 1, '您的邀请码不正确', 2, '您还未登录', 3, '您已经是该项目的管理人员', 4, '您已经是该项目的开发人员', 5, '您已经是该项目的报告人员', 6, '该项目不存在或已被删除啦', 7, '您的申请已提交,请等待管理员审批', 8, '您已经发送过申请了,请耐心等待', '未知错误,请稍后再试' ] end #加入项目结果 def send_wechat_join_project_notice user,project,role_id,result count = ShieldWechatMessage.where("container_type='User' and container_id=#{user.id} and shield_type='Project' and shield_id=#{project.id}").count if count == 0 result_name = result == 0 ? "已同意" : "已拒绝" if result == 0 title = "恭喜您加入项目成功。" remark = "点击查看项目详情。" uid = 0 type = "project" else title = "很遗憾您未能成功加入项目。" remark = "点击查看申请详情。" uid = user.id type = "review_project_member" end ws = WechatService.new ws.join_project_notice user.id, "project", project.id,title, project.name,result_name, remark,uid end end def join_project params,current_user status = -1 project = Project.find_by_invite_code(params[:invite_code]) if params[:invite_code] if project if project[:is_delete] == 1 status = 6 else if current_user.member_of?(project) #如果已经是成员 member = project.member_principals.includes(:roles, :principal).where("user_id=?",current_user.id).first status = member.member_roles[0].role_id #将之前的申请都改为已拒绝 applied_messages = AppliedMessage.where(:project_id => project.id, :status => true, :applied_user_id=>current_user.id,:applied_type => "AppliedProject") applied_messages.update_all(:status=>5) else if params[:invite_code].present? if params[:role] == 5 members = [] user_grades = [] project_info = [] user_grades << UserGrade.new(:user_id => current_user.id, :project_id => project.id) project.user_grades << user_grades unless user_grades.first.user_id.nil? members << Member.new(:role_ids => ["5"], :user_id => current_user.id) project.members << members project_info << ProjectInfo.new(:user_id => current_user.id, :project_id => project.id) project.project_infos << project_info status = 0 send_wechat_join_project_notice current_user,project,5,0 #将之前的申请都改为已拒绝 applied_messages = AppliedMessage.where(:project_id => project.id, :status => true, :applied_user_id=>current_user.id,:applied_type => "AppliedProject") applied_messages.update_all(:status=>5) else if !AppliedProject.where(:project_id => project.id, :user_id => current_user.id).first.nil? status = 8 else AppliedProject.create(:user_id => current_user.id, :project_id => project.id, :role => params[:role]) status = 7 end end else status = 4 end end end else status = 1 end status end def get_project_review_members(project,role_id,current_user) review_members = [] if role_id == 3 || role_id == 4 #AppliedMessage.where(:applied_id => @applied_message.applied_id, :project_id => @applied_message.project_id, :status => 1, #:applied_type => "AppliedProject") apply_messages = AppliedMessage.where(:user_id => current_user.id, :project_id => project.id, :status => 1, :role=>role_id) apply_messages.each do |m| user = User.find(m.applied_user_id) if user img_url = "/images/"+url_to_avatar(user) gender = user.user_extensions.gender.nil? ? 0 : user.user_extensions.gender work_unit = get_user_work_unit user location = get_user_location user review_members << {:id => user.id, :img_url => img_url, :nickname => user.login, :gender => gender, :work_unit => work_unit, :mail => user.mail, :location => location, role_name: "", name: user.show_name, roles_id: role_id, :brief_introduction => user.user_extensions.brief_introduction,:realname=>user.realname,:real_name=>user.realname} end end end review_members end def get_reviewer_info params,current_user status = -1 info = nil project = Project.find(params[:project_id]) if project # messages = AppliedProject.where(:project_id=> project.id, :user_id=>params[:user_id]).first #status 1未处理 5拒绝 7同意 applied_message = AppliedMessage.where(:user_id => current_user.id, :project_id => project.id, :applied_user_id=>params[:user_id],:applied_type => "AppliedProject").last if applied_message status = applied_message.status user = User.find(params[:user_id]) if user img_url = "/images/"+url_to_avatar(user) gender = user.user_extensions.gender.nil? ? 0 : user.user_extensions.gender work_unit = get_user_work_unit user location = get_user_location user info = {:id => user.id, :img_url => img_url, :nickname => user.login, :gender => gender, :work_unit => work_unit, :mail => user.mail, :location => location, role_name: "", name: user.show_name, roles_id: applied_message.role, :brief_introduction => user.user_extensions.brief_introduction,:realname=>user.realname} end end end {status:status,reviewer:info} end def deal_join_apply params,current_user status = -1 message = "" project = Project.find(params[:project_id]) user = User.find(params[:user_id]) if project applied_messages = AppliedMessage.where(:user_id => current_user.id, :project_id => project.id, :status => 1, :applied_user_id=>user.id,:applied_type => "AppliedProject") apply_message = applied_messages.first if apply_message if user.member_of?(project) message = "已经是该项目的成员了" u_member = project.member_principals.includes(:roles, :principal).where("user_id=?",params[:user_id]).first if u_member.member_roles[0].role_id == 5 applied_messages.update_all(:status=>5) else applied_messages.update_all(:status=>7) end else applied_project = apply_message.applied ap_role = applied_project.try(:role) if ap_role rolename = ap_role == 3 ? "管理人员" : "开发人员" if params[:type] == 0 #同意 members = [] user_grades = [] project_info = [] members << Member.new(:role_ids => ["#{ap_role}"], :user_id => user.id) user_grades << UserGrade.new(:user_id => user.id, :project_id => project.id) role = Role.find(ap_role) project_info << ProjectInfo.new(:project_id => project.id, :user_id => user.id) if role.allowed_to?(:is_manager) project.members << members project.project_infos << project_info project.user_grades << user_grades unless user_grades.first.user_id.nil? # 添加成功后所有管理员收到的消息状态都要更新 applied_messages.update_all(:status => 7, :viewed => true) # 添加成功后,申请人收到消息 AppliedMessage.create(:user_id => user.id, :applied_type => "AppliedProject", :applied_id => applied_project.id , :status => 6, :viewed => false, :applied_user_id => current_user.id, :role => applied_project.role, :project_id => applied_project.project_id) message = "您已同意"+rolename+user.show_name+",加入项目" send_wechat_join_project_notice user,project,ap_role,0 else #拒绝 AppliedMessage.create(:user_id => user.id, :applied_type => "AppliedProject", :applied_id => applied_project.id ,:status => 4, :viewed => false, :applied_user_id => current_user.id, :role => applied_project.role, :project_id => applied_project.project_id) applied_messages.update_all(:status => 5, :viewed => true) applied_project.delete message = "您已拒绝"+rolename+user.show_name+",加入项目" send_wechat_join_project_notice user,project,ap_role,1 end status = 0 else message = "该申请不存在或已被处理" end end else message = "该申请不存在或已被处理" end else message = "该项目不存在或已被删除" end {:status => status,:message => message} end def send_wechat_project_issue_notice user,project,issue_id,issue_title,priority_id count = ShieldWechatMessage.where("container_type='User' and container_id=#{user.id} and shield_type='Project' and shield_id=#{project.id}").count if count == 0 title = "您有新的issue需要解决。" remark = "点击详情查看issue。" case priority_id when "1" priority = "低" when "2" priority = "正常" when "3" priority = "高" when "4" priority = "紧急" when "5" priority = "立刻" end ws = WechatService.new ws.project_issue_notice user.id, "issues", issue_id,title, issue_title,priority, remark end end #删除项目成员 def project_delete_member project,user_id,current_user if current_user.nil? state = -1 return state end member = project.members.where("user_id=?",user_id).first if member != nil member.destroy # end user_admin = ProjectInfo.where("user_id = ? and project_id = ?", member.user_id, project.id) if user_admin.size > 0 user_admin.each do |user| user.destroy end end user_grade = UserGrade.where("user_id = ? and project_id = ?", member.user_id, project.id) if user_grade.size > 0 user_grade.each do |grade| grade.destroy end end # 移出的时候删除申请消息,不需要删除消息,所以不必要关联删除 applied_projects = AppliedProject.where(:project_id => project.id, :user_id => member.user_id).first unless applied_projects.nil? applied_projects.delete end #移出项目发送消息 ForgeMessage.create(:user_id => member.user_id, :project_id => project.id, :forge_message_type => "RemoveFromProject", :viewed => false, :forge_message_id => current_user.id) return 0 else return 1 end end def exit_project project,user if user.nil? state = -1 return state end if project.user_id == user.id state = -2 return state end members = Member.where(:user_id => user.id, :project_id=>project.id).first if members != nil members.destroy # 移出的时候删除申请消息,不需要删除消息,所以不必要关联删除 applied_projects = AppliedProject.where(:project_id => project.id, :user_id => members.user_id).first unless applied_projects.nil? applied_projects.delete end state = 0 else state = -3 end return state end end