You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
educoder/app/controllers/issues_controller.rb

382 lines
13 KiB

class IssuesController < ApplicationController
before_action :require_login
before_action :set_project
5 years ago
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]
def index
5 years ago
issues = @project.issues.includes(:user,:tracker, :issue_tag, :version, :issue_status, :journals)
5 years ago
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
@close_issues_size = issues.where(status_id: 5).size
@assign_to_me_size = issues.where(assigned_to_id: current_user&.id).size
@my_published_size = issues.where(author_id: current_user&.id).size
status_type = params[:status_type].to_s #issue状态的选择
search_name = params[:search].to_s
start_time = params[:start_date]
end_time = params[:due_date]
if status_type.to_s == "1" #表示开启中的
issues = issues.where.not(status_id: 5)
elsif status_type.to_s == "2" #表示关闭中的
issues = issues.where(status_id: 5)
end
if search_name.present?
issues = issues.where("subject like ?", "%#{search_name}%")
end
if start_time&.present? || end_time&.present?
issues = issues.where("start_date between ? and ?",start_time&.present? ? start_time.to_date : Time.now.to_date, end_time&.present? ? end_time.to_date : Time.now.to_date)
end
issues = issues.where(author_id: params[:author_id]) if params[:author_id].present?
issues = issues.where(assigned_to_id: params[:assigned_to_id]) if params[:assigned_to_id].present?
issues = issues.where(tracker_id: params[:tracker_id]) if params[:tracker_id].present?
issues = issues.where(status_id: params[:status_id]) if params[:status_id].present?
issues = issues.where(priority_id: params[:priority_id]) if params[:priority_id].present?
issues = issues.where(fixed_version_id: params[:fixed_version_id]) if params[:fixed_version_id].present?
issues = issues.where(done_ratio: params[:done_ratio].to_i) if params[:done_ratio].present?
order_type = params[:order_type] || "desc" #或者"asc"
order_name = params[:order_name] || "created_on" #或者"updated_on"
@page = params[:page]
@limit = params[:limit] || "15"
@issues = issues.order("#{order_name} #{order_type}")
@issues_size = issues.size
@issues = issues.order("#{order_name} #{order_type}").page(@page).per(@limit)
respond_to do |format|
format.json
format.xlsx{
set_export_cookies
export_issues(@issues)
export_name = "#{@project.name}_issues列表_#{Time.now.strftime('%Y%m%d_%H%M%S')}"
render xlsx: "#{export_name.strip}",template: "issues/index.xlsx.axlsx",locals: {table_columns:@table_columns,issues:@export_issues}
}
end
end
def index_chosen
@issue_chosen = issue_left_chosen(@project, nil)
end
def commit_issues
issues = @project.issues.includes(:user,:tracker)
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
@close_issues_size = issues.where(status_id: 5).size
status_type = params[:status_type].to_s
if status_type.to_s == "1" #表示开启中的
issues = issues.where.not(status_id: 5)
elsif status_type.to_s == "2" #表示关闭中的
issues = issues.where(status_id: 5)
end
@commit_issues = []
total_commit_issues = {
name: "合计",
user_login: nil,
all_count: issues.size,
trackers: trackers_size(issues)
}
@commit_issues.push(total_commit_issues)
members = issues.pluck(:assigned_to_id).uniq
members.each do |m|
user = User.select(:id, :login, :firstname, :lastname).find(m)
user_issues = issues.where(assigned_to_id: m) #指派给
member_params = {
name: user.try(:show_real_name),
user_login: user.try(:login),
all_count: issues.size,
trackers: trackers_size(user_issues)
}
@commit_issues.push(member_params)
end
un_assign = issues.where(assigned_to_id: nil)
total_commit_issues = {
name: "未指派",
user_login: nil,
all_count: un_assign.size,
trackers: trackers_size(un_assign)
}
@commit_issues.push(total_commit_issues)
end
def new
@issue_chosen = issue_left_chosen(@project, nil)
end
def create
if params[:subject].blank?
normal_status(-1, "标题不能为空")
else
issue_params = {
subject: params[:subject],
description: params[:description],
is_private: params[:is_private],
assigned_to_id: params[:assigned_to_id],
tracker_id: params[:tracker_id],
status_id: params[:status_id],
priority_id: params[:priority_id],
fixed_version_id: params[:fixed_version_id],
start_date: params[:start_date].to_s.to_date,
due_date: params[:due_date].to_s.to_date,
estimated_hours: params[:estimated_hours],
done_ratio: params[:done_ratio]
}
@issue = Issue.new(issue_params.merge(author_id: current_user.id, project_id: @project.id))
if @issue.save!
if params[:attachment_ids].present?
params[:attachment_ids].each do |id|
attachment = Attachment.select(:id, :container_id, :container_type)&.find_by_id(id)
unless attachment.blank?
attachment.container = @issue
attachment.save
end
end
end
if params[:assigned_to_id].present?
Tiding.create!(user_id: params[:assigned_to_id], trigger_user_id: current_user.id,
container_id: @issue.id, container_type: 'Issue',
parent_container_id: @project.id, parent_container_type: "Project",
tiding_type: 'issue', status: 0)
end
normal_status(0, "创建成功")
else
normal_status(-1, "创建失败")
end
end
end
def edit
@issue_chosen = issue_left_chosen(@project, @issue.id)
@issue_attachments = @issue.attachments
end
def update
issue_params = {
subject: params[:subject],
description: params[:description],
is_private: params[:is_private],
assigned_to_id: params[:assigned_to_id],
tracker_id: params[:tracker_id],
status_id: params[:status_id],
priority_id: params[:priority_id],
fixed_version_id: params[:fixed_version_id],
start_date: params[:start_date].to_s.to_date,
due_date: params[:due_date].to_s.to_date,
estimated_hours: params[:estimated_hours],
5 years ago
done_ratio: params[:done_ratio],
closed_on: (params[:status_id].to_i == 5) ? Time.now : nil
}
if @issue.update_attributes(issue_params)
issue_files = params[:attachment_ids]
change_files = false
issue_file_ids = []
if issue_files.present?
issue_attachments = @issue&.attachments
issue_file_ids = issue_attachments&.pluck(:id)
left_file_ids = issue_file_ids - issue_files
new_file_ids = issue_files - issue_file_ids
if left_file_ids.size > 0
change_files = true
issue_attachments.where(id: left_file_ids).delete_all
end
if new_file_ids.size > 0
change_files = true
new_file_ids.each do |id|
attachment = Attachment.select(:id, :container_id, :container_type)&.find_by_id(id)
unless attachment.blank?
attachment.container = @issue
attachment.save
end
end
end
end
@issue.create_journal_detail(change_files, issue_files, issue_file_ids)
normal_status(0, "更新成功")
else
normal_status(-1, "更新失败")
end
end
def show
@issue_attachments = @issue.attachments
@issue_user = @issue.user
@issue_assign_to = @issue.get_assign_user
end
def destroy
if @issue.destroy
normal_status(0, "删除成功")
else
normal_status(-1, "删除失败")
end
end
5 years ago
def copy
@new_issue = @issue.dup
if @new_issue.save
@status = 1
else
@status = -1
end
end
private
def set_project
@project = Project.find_by_id(params[:project_id])
unless @project.present?
normal_status(-1, "项目不存在")
end
end
def check_project_public
unless @project.is_public || @project.member?(current_user) || current_user.admin?
normal_status(-1, "您没有权限")
end
end
def set_issue
@issue = Issue.find_by_id(params[:id])
unless @issue.present?
normal_status(-1, "标签不存在")
end
end
def check_issue_permission
unless @project.member?(current_user) || current_user.admin?
normal_status(-1, "您没有权限")
end
end
def issue_left_chosen(project,issue_id)
issue_info = Array.new(9)
if issue_id.present?
select_arrays = [:assigned_to_id, :tracker_id, :status_id, :priority_id, :fixed_version_id, :start_date, :due_date, :estimated_hours, :done_ratio]
issue_info = Issue.select(select_arrays).where(id: issue_id).pluck(select_arrays)
issue_info = issue_info[0]
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_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}
project_members_info.push(member_info)
end
tracker_info = project.trackers&.pluck(:id, :name, :position)
new_tracker_info = [] #类型
if tracker_info.size > 0
tracker_info.each do |t|
is_chosen = (t[0] == issue_info[1]) ? "1" : "0"
new_tracker = {id: t[0], name: t[1], position: t[2], is_chosen: is_chosen}
new_tracker_info.push(new_tracker)
end
end
issue_status = IssueStatus&.pluck(:id,:name,:position)
new_status_info = [] #缺陷类型
if issue_status.size > 0
issue_status.each do |t|
is_chosen = (t[0] == issue_info[2]) ? "1" : "0"
new_issue = {id: t[0], name: t[1], position: t[2], is_chosen: is_chosen}
new_status_info.push(new_issue)
end
end
issue_priority = project.issue_tags&.pluck(:id,:title, :color)
new_priority_info = [] #issue标签优先程度
if issue_priority.size > 0
issue_priority.each do |t|
is_chosen = (t[0] == issue_info[3]) ? "1" : "0"
new_issue = {id: t[0], name: t[1], color: t[2], is_chosen: is_chosen}
new_priority_info.push(new_issue)
end
end
issue_versions = project.versions&.pluck(:id,:name, :status)
new_version_info = [] #issue里程碑
if issue_versions.size > 0
issue_versions.each do |t|
is_chosen = (t[0] == issue_info[4]) ? "1" : "0"
new_issue = {id: t[0], name: t[1], status: t[2], is_chosen: is_chosen}
new_version_info.push(new_issue)
end
end
issue_done_ratio = %w(0 10 20 30 40 50 60 70 80 90 100)
new_done_info = [] #完成度
if issue_done_ratio.size > 0
issue_done_ratio.each do |t|
is_chosen = (t == issue_info[8].to_s) ? "1" : "0"
5 years ago
new_issue = {id:t.to_i, ratio: (t.to_s + "%"), is_chosen: is_chosen}
new_done_info.push(new_issue)
end
end
{
"assign_user": project_members_info,
"tracker": new_tracker_info,
"issue_status": new_status_info,
"issue_tag": new_priority_info,
"issue_version": new_version_info,
"start_date": issue_info[5],
"due_date": issue_info[6],
"estimated_hours": issue_info[7],
"done_ratio": new_done_info
}
end
5 years ago
def export_issues(issues)
@table_columns = %w(ID 类型 标题 描述 状态 指派给 优先级 发布人 创建时间 里程碑 开始时间 截止时间 完成度)
@export_issues = []
issues.each do |i|
issue_array = [i.id, i.tracker.try(:name), i.subject, i.description, i.issue_status.try(:name),i.get_assign_user.try(:show_real_name),
i.issue_tag.try(:title), i.user.try(:show_real_name), format_time(i.created_on), i.version.try(:title), i.start_date.to_s, i.due_date.to_s, i.done_ratio.to_s + "%" ]
@export_issues.push(issue_array)
end
end
def trackers_size(issues)
trackers_id = Tracker.pluck(:id,:name)
tracker_array = []
trackers_id.each do |t|
tracker_info = {
id: t[0],
name: t[1],
issues_count: issues.issues_count(t[0])
}
tracker_array.push(tracker_info)
end
tracker_array
end
end