|
|
|
@ -1,13 +1,14 @@
|
|
|
|
|
class IssuesController < ApplicationController
|
|
|
|
|
before_action :require_login
|
|
|
|
|
before_action :require_login, except: [:index, :show]
|
|
|
|
|
before_action :set_project
|
|
|
|
|
before_action :check_project_public, only: [:index ,:show, :copy, :index_chosen]
|
|
|
|
|
before_action :check_issue_permission, except: [:index, :show, :copy, :index_chosen]
|
|
|
|
|
before_action :set_issue, only: [:edit, :update, :destroy, :show, :copy, :index_chosen]
|
|
|
|
|
before_action :check_project_public, only: [:index ,:show, :copy, :index_chosen, :close_issue]
|
|
|
|
|
before_action :check_issue_permission, except: [:index, :show, :index_chosen]
|
|
|
|
|
before_action :set_issue, only: [:edit, :update, :destroy, :show, :copy, :index_chosen, :close_issue, :lock_issue]
|
|
|
|
|
|
|
|
|
|
include ApplicationHelper
|
|
|
|
|
|
|
|
|
|
def index
|
|
|
|
|
issues = @project.issues.includes(:user,:tracker, :priority, :version, :issue_status, :journals)
|
|
|
|
|
|
|
|
|
|
issues = issues.where(is_private: false) unless current_user.present? && (current_user.admin? || @project.member?(current_user))
|
|
|
|
|
@all_issues_size = issues.size
|
|
|
|
|
@open_issues_size = issues.where.not(status_id: 5).size
|
|
|
|
@ -245,6 +246,10 @@ class IssuesController < ApplicationController
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if params[:status_id].to_i == 5
|
|
|
|
|
@issue.issue_times.update_all(end_time: Time.now)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
@issue.create_journal_detail(change_files, issue_files, issue_file_ids)
|
|
|
|
|
normal_status(0, "更新成功")
|
|
|
|
|
else
|
|
|
|
@ -254,9 +259,19 @@ class IssuesController < ApplicationController
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def show
|
|
|
|
|
@user_permission = current_user.present? && (!@issue.is_lock || @project.member?(current_user) || current_user.admin? || @issue.user == current_user)
|
|
|
|
|
@issue_attachments = @issue.attachments
|
|
|
|
|
@issue_user = @issue.user
|
|
|
|
|
@issue_assign_to = @issue.get_assign_user
|
|
|
|
|
@join_users = join_users(@issue)
|
|
|
|
|
#总耗时
|
|
|
|
|
cost_time(@issue)
|
|
|
|
|
|
|
|
|
|
#被依赖
|
|
|
|
|
@be_depended_issues_array = be_depended_issues(@issue)
|
|
|
|
|
|
|
|
|
|
#依赖于
|
|
|
|
|
depended_issues(@issue)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def destroy
|
|
|
|
@ -276,6 +291,43 @@ class IssuesController < ApplicationController
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def close_issue
|
|
|
|
|
type = params[:status_id].to_i || 5
|
|
|
|
|
if type == 5
|
|
|
|
|
message = "关闭"
|
|
|
|
|
else
|
|
|
|
|
message = "重新开启"
|
|
|
|
|
end
|
|
|
|
|
if @issue.update_attribute(:status_id, type)
|
|
|
|
|
if type == 5
|
|
|
|
|
@issue.issue_times.update_all(end_time: Time.now)
|
|
|
|
|
end
|
|
|
|
|
@issue.create_journal_detail(false, [], [])
|
|
|
|
|
normal_status(0, message)
|
|
|
|
|
else
|
|
|
|
|
normal_status(-1, "操作失败")
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def lock_issue
|
|
|
|
|
if @issue.user == current_user || current_user.admin?
|
|
|
|
|
type = (params[:lock_type].to_i == 1)
|
|
|
|
|
if @issue.update_attribute(:is_lock, type)
|
|
|
|
|
if type
|
|
|
|
|
@issue.custom_journal_detail("lock_issue","", "因为#{params[:lock_reason].present? ? params[:lock_reason].to_s : "某种原因"}而锁定,并将对话限制为协作者")
|
|
|
|
|
else
|
|
|
|
|
@issue.custom_journal_detail("unlock_issue","", "解除锁定")
|
|
|
|
|
end
|
|
|
|
|
normal_status(0, "操作成功")
|
|
|
|
|
else
|
|
|
|
|
normal_status(-1, "操作失败")
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
normal_status(-1, "您没有权限")
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
private
|
|
|
|
|
def set_project
|
|
|
|
|
@project = Project.find_by_id(params[:project_id])
|
|
|
|
@ -292,8 +344,10 @@ class IssuesController < ApplicationController
|
|
|
|
|
|
|
|
|
|
def set_issue
|
|
|
|
|
@issue = Issue.find_by_id(params[:id])
|
|
|
|
|
unless @issue.present?
|
|
|
|
|
if @issue.blank?
|
|
|
|
|
normal_status(-1, "标签不存在")
|
|
|
|
|
elsif @issue.is_lock &&!(@project.member?(current_user) || current_user.admin?)
|
|
|
|
|
normal_status(-1, "您没有权限")
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
@ -303,25 +357,104 @@ class IssuesController < ApplicationController
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def join_users(issue)
|
|
|
|
|
#协作者
|
|
|
|
|
issue_comment_users_array = []
|
|
|
|
|
issue_comment_users = issue.journals.select(:user_id).distinct
|
|
|
|
|
if issue.present? && issue_comment_users.size > 0
|
|
|
|
|
issue_comment_users.each do |j|
|
|
|
|
|
user_avatar = url_to_avatar(j.user)
|
|
|
|
|
issue_comment_users_array.push({login: j.user.try(:login), avatar_url: user_avatar})
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
issue_comment_users_array
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def cost_time(issue)
|
|
|
|
|
#总耗时
|
|
|
|
|
@cost_time_array = []
|
|
|
|
|
@all_cost_time = 0
|
|
|
|
|
all_issue_times = issue.issue_times.includes(:user).where.not(end_time: nil)
|
|
|
|
|
if issue.present? && all_issue_times.size > 0
|
|
|
|
|
all_issue_times.each do |time|
|
|
|
|
|
cost_time = time.end_time.to_i - time.start_time.to_i
|
|
|
|
|
cost_time = cost_time > 0 ? cost_time : 0
|
|
|
|
|
@all_cost_time = @all_cost_time + cost_time
|
|
|
|
|
set_cost_time = Time.at(cost_time).utc.strftime('%H h %M min %S s')
|
|
|
|
|
@cost_time_array.push({login: time.user.try(:login), avatar_url: url_to_avatar(time.user), cost_time: set_cost_time})
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def depended_issues(issue)
|
|
|
|
|
#依赖于
|
|
|
|
|
@depended_issues_id = []
|
|
|
|
|
@depended_issues_array = []
|
|
|
|
|
depended_issues = issue.issue_depends.pluck(:id,:depend_issue_id).uniq
|
|
|
|
|
if issue.present? && depended_issues.size > 0
|
|
|
|
|
depended_issues.each do |de|
|
|
|
|
|
@depended_issues_id.push(de[1])
|
|
|
|
|
issues = Issue.select(:id, :subject).where(id: de[1]).as_json
|
|
|
|
|
issues = issues.first.merge(depend_id: de[0])
|
|
|
|
|
@depended_issues_array.push(issues)
|
|
|
|
|
end
|
|
|
|
|
@depended_issues_id.delete(issue.id)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def be_depended_issues(issue)
|
|
|
|
|
be_depended_issues_array = []
|
|
|
|
|
be_depended_issues = IssueDepend.where(depend_issue_id: issue.id).pluck(:id,:issue_id).uniq
|
|
|
|
|
if issue.present? && be_depended_issues.size > 0
|
|
|
|
|
be_depended_issues.each do |de|
|
|
|
|
|
d_issues = Issue.select(:id, :subject).where(id: de[1]).as_json
|
|
|
|
|
d_issues = d_issues.first.merge(depend_id: de[0])
|
|
|
|
|
be_depended_issues_array.push(d_issues)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
be_depended_issues_array
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def issue_left_chosen(project,issue_id)
|
|
|
|
|
issue_info = Array.new(11)
|
|
|
|
|
use_tags = []
|
|
|
|
|
issue_comment_users_array = []
|
|
|
|
|
cost_time_array = []
|
|
|
|
|
all_cost_time = 0
|
|
|
|
|
be_depended_issues_array = []
|
|
|
|
|
depended_issues_array = []
|
|
|
|
|
all_issues = []
|
|
|
|
|
depended_issues_id = []
|
|
|
|
|
if issue_id.present?
|
|
|
|
|
use_tags = Issue.find(issue_id).issue_tags.select(:id).pluck(:id)
|
|
|
|
|
issue = Issue.find(issue_id)
|
|
|
|
|
use_tags = issue.issue_tags.select(:id).pluck(:id)
|
|
|
|
|
select_arrays = [:assigned_to_id, :tracker_id, :status_id, :priority_id, :fixed_version_id, :start_date, :due_date, :estimated_hours, :done_ratio, :issue_type, :token]
|
|
|
|
|
issue_info = Issue.select(select_arrays).where(id: issue_id).pluck(select_arrays)
|
|
|
|
|
issue_info = issue_info[0]
|
|
|
|
|
|
|
|
|
|
issue_comment_users_array = join_users(issue)
|
|
|
|
|
#总耗时
|
|
|
|
|
cost_time(issue)
|
|
|
|
|
cost_time_array = @cost_time_array
|
|
|
|
|
all_cost_time = @all_cost_time
|
|
|
|
|
|
|
|
|
|
#被依赖
|
|
|
|
|
be_depended_issues_array = be_depended_issues(issue)
|
|
|
|
|
|
|
|
|
|
#依赖于
|
|
|
|
|
depended_issues(issue)
|
|
|
|
|
depended_issues_array = @depended_issues_array
|
|
|
|
|
depended_issues_id = @depended_issues_id
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
|
project_members = project.members_user_infos
|
|
|
|
|
project_members_info = [] #指派给
|
|
|
|
|
project_members.each do |member|
|
|
|
|
|
real_name = member[2] + member[3]
|
|
|
|
|
unless real_name.present?
|
|
|
|
|
real_name = member[1]
|
|
|
|
|
end
|
|
|
|
|
user = member.user
|
|
|
|
|
real_name = user.try(:show_real_name)
|
|
|
|
|
user_id = member[0]
|
|
|
|
|
is_chosen = ((member[0].to_s == issue_info[0].to_s) ? "1" : "0")
|
|
|
|
|
member_info = {id: user_id, name: real_name, is_chosen: is_chosen}
|
|
|
|
|
is_chosen = ((user.id.to_s == issue_info[0].to_s) ? "1" : "0")
|
|
|
|
|
member_info = {id: user_id, name: real_name,avatar_url: url_to_avatar(user),is_chosen: is_chosen}
|
|
|
|
|
project_members_info.push(member_info)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
@ -335,7 +468,6 @@ class IssuesController < ApplicationController
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
issue_status = IssueStatus&.pluck(:id,:name,:position)
|
|
|
|
|
new_status_info = [] #缺陷类型
|
|
|
|
|
if issue_status.size > 0
|
|
|
|
@ -356,7 +488,6 @@ class IssuesController < ApplicationController
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
issue_versions = project.versions&.pluck(:id,:name, :status)
|
|
|
|
|
new_version_info = [] #issue里程碑
|
|
|
|
|
if issue_versions.size > 0
|
|
|
|
@ -396,6 +527,16 @@ class IssuesController < ApplicationController
|
|
|
|
|
new_types_info.push(new_type_info)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
depend_other_issues = project.issues.where.not(id: issue_id)&.pluck(:id, :subject)
|
|
|
|
|
if depend_other_issues.size > 0
|
|
|
|
|
depend_other_issues.each do |t|
|
|
|
|
|
is_chosen = depended_issues_id.include?(t[0]) ? "1" : "0"
|
|
|
|
|
new_issue = {id: t[0], subject: t[1], is_chosen: is_chosen}
|
|
|
|
|
all_issues.push(new_issue)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
"assign_user": project_members_info,
|
|
|
|
|
"tracker": new_tracker_info,
|
|
|
|
@ -404,10 +545,16 @@ class IssuesController < ApplicationController
|
|
|
|
|
"issue_version": new_version_info,
|
|
|
|
|
"start_date": issue_info[5],
|
|
|
|
|
"due_date": issue_info[6],
|
|
|
|
|
"joins_users": issue_comment_users_array,
|
|
|
|
|
"cost_time_users": cost_time_array,
|
|
|
|
|
"total_cost_time": Time.at(all_cost_time).utc.strftime('%H h %M min %S s'),
|
|
|
|
|
"be_depended_issues": be_depended_issues_array,
|
|
|
|
|
"depended_issues":depended_issues_array,
|
|
|
|
|
"estimated_hours": issue_info[7],
|
|
|
|
|
"done_ratio": new_done_info,
|
|
|
|
|
"issue_tag": new_tags_info,
|
|
|
|
|
"issue_type": new_types_info
|
|
|
|
|
"issue_type": new_types_info,
|
|
|
|
|
"all_issues": all_issues
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
|