From 473b9e3dfd09b1957d88e20e792a6261abc0df54 Mon Sep 17 00:00:00 2001 From: yystopf Date: Thu, 24 Jul 2025 09:59:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E8=B4=9F=E8=B4=A3?= =?UTF-8?q?=E4=BA=BA=E7=AD=9B=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/issue.rb | 17 +++++++++++++++++ app/services/api/v1/issues/list_service.rb | 4 +++- 2 files changed, 20 insertions(+), 1 deletion(-) 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