新增:父子关系判断以及可设置为父工作项的列表

This commit is contained in:
yystopf 2023-12-12 09:47:54 +08:00
parent 48a446662f
commit 947117ac5f
6 changed files with 37 additions and 1 deletions

View File

@ -1,7 +1,7 @@
class Api::Pm::IssuesController < Api::Pm::BaseController class Api::Pm::IssuesController < Api::Pm::BaseController
before_action :require_login, except: [:index] before_action :require_login, except: [:index]
before_action :load_project before_action :load_project
before_action :load_issue, only: %i[show update destroy link_index link_issues] before_action :load_issue, only: %i[show update destroy link_index link_issues parent_issues]
before_action :load_issues, only: %i[batch_update batch_destroy] before_action :load_issues, only: %i[batch_update batch_destroy]
before_action :check_issue_operate_permission, only: %i[update destroy] before_action :check_issue_operate_permission, only: %i[update destroy]
@ -40,6 +40,19 @@ class Api::Pm::IssuesController < Api::Pm::BaseController
render 'api/v1/issues/index' render 'api/v1/issues/index'
end end
def parent_issues
@issues = Issue.where(pm_project_id: params[:pm_project_id])
.where.not(id: @issue.id)
.where.not(id: Issue.full_children_issues(@issue).map{|i|i.id})
if params[:only_name].present?
@issues = kaminary_select_paginate(
@issues.select(:id, :subject, :project_issues_index, :updated_on, :created_on))
else
@issues = @issues.includes(:priority, :issue_status, :user, :show_assigners, :show_issue_tags, :version, :comment_journals)
@issues = kaminari_paginate(@issues)
end
end
def show def show
@issue.associate_attachment_container @issue.associate_attachment_container
render 'api/v1/issues/show' render 'api/v1/issues/show'

View File

@ -296,4 +296,12 @@ class Issue < ApplicationRecord
end end
end end
def self.full_children_issues(issue, issues = [])
issue.children_issues.each do |i|
issues << i
full_children_issues(i, issues)
end
issues
end
end end

View File

@ -12,6 +12,10 @@ module Api::V1::Issues::Concerns::Checkable
raise ApplicationService::Error, "Milestone不存在" unless Version.find_by_id(milestone_id).present? raise ApplicationService::Error, "Milestone不存在" unless Version.find_by_id(milestone_id).present?
end end
def check_root_issue(issue, root_id)
raise ApplicationService::Error, "父工作项与当前工作项已存在父子关系!" if Issue.full_children_issues(issue).map{|i| i.id}.include?(root_id)
end
def check_issue_tags(issue_tag_ids) def check_issue_tags(issue_tag_ids)
raise ApplicationService::Error, "请输入正确的标记ID数组" unless issue_tag_ids.is_a?(Array) raise ApplicationService::Error, "请输入正确的标记ID数组" unless issue_tag_ids.is_a?(Array)
raise ApplicationService::Error, "最多可选择3个标记" if issue_tag_ids.size > 3 raise ApplicationService::Error, "最多可选择3个标记" if issue_tag_ids.size > 3

View File

@ -5,6 +5,7 @@ class Api::V1::Issues::UpdateService < ApplicationService
attr_reader :project, :issue, :current_user attr_reader :project, :issue, :current_user
attr_reader :status_id, :priority_id, :milestone_id, :branch_name, :start_date, :due_date, :subject, :description, :blockchain_token_num attr_reader :status_id, :priority_id, :milestone_id, :branch_name, :start_date, :due_date, :subject, :description, :blockchain_token_num
attr_reader :target_pm_project_id, :pm_sprint_id, :pm_issue_type, :root_id, :time_scale
attr_reader :issue_tag_ids, :assigner_ids, :attachment_ids, :receivers_login, :before_issue_tag_ids, :before_assigner_ids, :project_id attr_reader :issue_tag_ids, :assigner_ids, :attachment_ids, :receivers_login, :before_issue_tag_ids, :before_assigner_ids, :project_id
attr_accessor :add_assigner_ids, :previous_issue_changes, :updated_issue, :atme_receivers attr_accessor :add_assigner_ids, :previous_issue_changes, :updated_issue, :atme_receivers
@ -46,6 +47,7 @@ class Api::V1::Issues::UpdateService < ApplicationService
check_issue_status(status_id) if status_id.present? check_issue_status(status_id) if status_id.present?
check_issue_priority(priority_id) if priority_id.present? check_issue_priority(priority_id) if priority_id.present?
check_milestone(milestone_id) if milestone_id.present? check_milestone(milestone_id) if milestone_id.present?
check_root_issue(issue, root_id) if root_id.present?
check_issue_tags(issue_tag_ids) unless issue_tag_ids.nil? check_issue_tags(issue_tag_ids) unless issue_tag_ids.nil?
check_assigners(assigner_ids) unless assigner_ids.nil? check_assigners(assigner_ids) unless assigner_ids.nil?
check_attachments(attachment_ids) unless attachment_ids.nil? check_attachments(attachment_ids) unless attachment_ids.nil?

View File

@ -0,0 +1,8 @@
json.total_count @issues.total_count
json.issues @issues.each do |issue|
if params[:only_name].present?
json.(issue, :id, :subject, :project_issues_index)
else
json.partial! "api/v1/issues/simple_detail", locals: {issue: issue}
end
end

View File

@ -11,6 +11,7 @@ defaults format: :json do
end end
member do member do
get :link_index get :link_index
get :parent_issues
end end
resources :issue_links resources :issue_links