422 lines
15 KiB
Ruby
422 lines
15 KiB
Ruby
#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
|