diff --git a/app/controllers/api/pm/issues_controller.rb b/app/controllers/api/pm/issues_controller.rb index 0263a115a..162ce7bcf 100644 --- a/app/controllers/api/pm/issues_controller.rb +++ b/app/controllers/api/pm/issues_controller.rb @@ -1,7 +1,7 @@ class Api::Pm::IssuesController < Api::Pm::BaseController before_action :require_login, except: [:index] 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 :check_issue_operate_permission, only: %i[update destroy] @@ -40,6 +40,19 @@ class Api::Pm::IssuesController < Api::Pm::BaseController render 'api/v1/issues/index' 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 @issue.associate_attachment_container render 'api/v1/issues/show' diff --git a/app/models/issue.rb b/app/models/issue.rb index b91dbb26a..b40efefa1 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -296,4 +296,12 @@ class Issue < ApplicationRecord 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 diff --git a/app/services/api/v1/issues/concerns/checkable.rb b/app/services/api/v1/issues/concerns/checkable.rb index 287fae2f6..8067262e2 100644 --- a/app/services/api/v1/issues/concerns/checkable.rb +++ b/app/services/api/v1/issues/concerns/checkable.rb @@ -12,6 +12,10 @@ module Api::V1::Issues::Concerns::Checkable raise ApplicationService::Error, "Milestone不存在!" unless Version.find_by_id(milestone_id).present? 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) raise ApplicationService::Error, "请输入正确的标记ID数组!" unless issue_tag_ids.is_a?(Array) raise ApplicationService::Error, "最多可选择3个标记" if issue_tag_ids.size > 3 diff --git a/app/services/api/v1/issues/update_service.rb b/app/services/api/v1/issues/update_service.rb index 6938bc946..7134197ab 100644 --- a/app/services/api/v1/issues/update_service.rb +++ b/app/services/api/v1/issues/update_service.rb @@ -5,6 +5,7 @@ class Api::V1::Issues::UpdateService < ApplicationService 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 :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_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_priority(priority_id) if priority_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_assigners(assigner_ids) unless assigner_ids.nil? check_attachments(attachment_ids) unless attachment_ids.nil? diff --git a/app/views/api/pm/issues/parent_issues.json.jbuilder b/app/views/api/pm/issues/parent_issues.json.jbuilder new file mode 100644 index 000000000..a9a930d6a --- /dev/null +++ b/app/views/api/pm/issues/parent_issues.json.jbuilder @@ -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 \ No newline at end of file diff --git a/config/routes/api.rb b/config/routes/api.rb index bf38eceaf..ee89921b6 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -11,6 +11,7 @@ defaults format: :json do end member do get :link_index + get :parent_issues end resources :issue_links