diff --git a/app/models/issue.rb b/app/models/issue.rb index e6d5a5e4d..78962df7c 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -105,6 +105,23 @@ class Issue < ApplicationRecord scope :pm_includes, -> {includes(:project, :show_issue_tags, :issue_status, :priority, :version, :user, :show_assigners, :comment_journals, :operate_journals)} scope :closed, ->{where(status_id: 5)} scope :opened, ->{where.not(status_id: 5)} + scope :with_assigner_info, -> { + joins("LEFT JOIN ( + SELECT ia.issue_id, ia.assigner_id + FROM issue_assigners ia + JOIN ( + SELECT issue_id, MIN(id) AS min_assigner_id + FROM issue_assigners + GROUP BY issue_id + ) tmp ON ia.issue_id = tmp.issue_id AND ia.id = tmp.min_assigner_id + ) assigner ON issues.id = assigner.issue_id + LEFT JOIN users u ON assigner.assigner_id = u.id") + } + + scope :ordered_by_assigner, -> { + order("CASE WHEN u.id IS NULL THEN 1 ELSE 0 END ASC") + .order("COALESCE(u.nickname, u.login) DESC") + } after_create :incre_project_common, :incre_user_statistic, :incre_platform_statistic before_save :check_pm_and_update_due_date after_save :incre_or_decre_closed_issues_count, :change_versions_count, :send_update_message_to_notice_system, :associate_attachment_container, :generate_uuid diff --git a/app/services/api/v1/issues/list_service.rb b/app/services/api/v1/issues/list_service.rb index 0ceac0ee4..fc65bacdb 100644 --- a/app/services/api/v1/issues/list_service.rb +++ b/app/services/api/v1/issues/list_service.rb @@ -9,7 +9,7 @@ class Api::V1::Issues::ListService < ApplicationService validates :category, inclusion: { in: %w[all opened closed], message: '请输入正确的Category'} validates :participant_category, inclusion: { in: %w[all aboutme authoredme assignedme atme], message: '请输入正确的ParticipantCategory'} - validates :sort_by, inclusion: { in: %w[issues.created_on issues.updated_on issues.blockchain_token_num issue_priorities.position issues.start_date issues.due_date issues.status_id] , message: '请输入正确的SortBy'}, allow_blank: true + validates :sort_by, inclusion: { in: %w[issues.created_on issues.updated_on issues.blockchain_token_num issue_priorities.position issues.start_date issues.due_date issues.status_id, assigners] , message: '请输入正确的SortBy'}, allow_blank: true validates :sort_direction, inclusion: { in: %w[asc desc], message: '请输入正确的SortDirection'}, allow_blank: true validates :current_user, presence: true @@ -175,6 +175,8 @@ class Api::V1::Issues::ListService < ApplicationService scope = issues.includes(:priority, :issue_status, :user, :show_assigners, :show_issue_tags, :version, :comment_journals) scope = if sort_by == 'issue_priorities.position' scope.reorder("issue_priorities.position #{sort_direction}, issues.updated_on DESC").distinct + elsif sort_by == 'assigners' + scope.with_assigner_info.ordered_by_assigner else scope.reorder("#{sort_by} #{sort_direction}").distinct end