diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index b80282798..a418c5f37 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -111,7 +111,9 @@ class AccountsController < ApplicationController sync_params = { password: params[:password].to_s, - email: @user.mail + email: @user.mail, + login_name: @user.login, + source_id: 0 } interactor = Gitea::User::UpdateInteractor.call(@user.login, sync_params) diff --git a/app/controllers/admins/nps_controller.rb b/app/controllers/admins/nps_controller.rb index 491e62778..8b3d828ff 100644 --- a/app/controllers/admins/nps_controller.rb +++ b/app/controllers/admins/nps_controller.rb @@ -8,6 +8,9 @@ class Admins::NpsController < Admins::BaseController @user_nps = @user_nps.where(sql, keyword: "%#{keyword}%") end @user_nps = @user_nps.where("action_type != 'close'") if params[:done_score].present? + @min_score = @user_nps.where("action_type != 'close'").minimum("score") + @max_score = @user_nps.where("action_type != 'close'").maximum("score") + @score_total_count = UserNp.where("action_type !='close'").count @user_nps = paginate @user_nps.includes(:user) end diff --git a/app/controllers/commit_logs_controller.rb b/app/controllers/commit_logs_controller.rb index 3be1794a7..cc071340e 100644 --- a/app/controllers/commit_logs_controller.rb +++ b/app/controllers/commit_logs_controller.rb @@ -22,6 +22,8 @@ class CommitLogsController < ApplicationController CommitLog.create(user: user, project: project, repository_id: repository_id, name: repository_name, full_name: repository_full_name, ref: ref, commit_id: commit_id, message: message) + # 统计数据新增 + CacheAsyncSetJob.perform_later("project_common_service", {commits: 1}, project.id) end end diff --git a/app/controllers/organizations/organizations_controller.rb b/app/controllers/organizations/organizations_controller.rb index 58aa0d29d..0ae113590 100644 --- a/app/controllers/organizations/organizations_controller.rb +++ b/app/controllers/organizations/organizations_controller.rb @@ -31,6 +31,7 @@ class Organizations::OrganizationsController < Organizations::BaseController Organizations::CreateForm.new(organization_params.merge(original_name: "")).validate! @organization = Organizations::CreateService.call(current_user, organization_params) Util.write_file(@image, avatar_path(@organization)) if params[:image].present? + Cache::V2::OwnerCommonService.new(@organization.id).reset end rescue Exception => e uid_logger_error(e.message) @@ -48,6 +49,7 @@ class Organizations::OrganizationsController < Organizations::BaseController Gitea::Organization::UpdateService.call(current_user.gitea_token, login, @organization.reload) Util.write_file(@image, avatar_path(@organization)) if params[:image].present? + Cache::V2::OwnerCommonService.new(@organization.id).reset end rescue Exception => e uid_logger_error(e.message) diff --git a/app/models/organization.rb b/app/models/organization.rb index 56351a415..adf43a2cd 100644 --- a/app/models/organization.rb +++ b/app/models/organization.rb @@ -81,15 +81,15 @@ class Organization < Owner scope :with_visibility, ->(visibility) { joins(:organization_extension).where(organization_extensions: {visibility: visibility}) if visibility.present? } - after_save :reset_cache_data + # after_save :reset_cache_data def gitea_token team_users.joins(:team).where(teams: {authorize: "owner"}).take&.user&.gitea_token end - def reset_cache_data - Cache::V2::OwnerCommonService.new(self.id).reset - end + # def reset_cache_data + # Cache::V2::OwnerCommonService.new(self.id).reset + # end def self.build(name, nickname, gitea_token=nil) self.create!(login: name, nickname: nickname, gitea_token: gitea_token) diff --git a/app/queries/admins/user_query.rb b/app/queries/admins/user_query.rb index dabfa9c5e..6187f2ecc 100644 --- a/app/queries/admins/user_query.rb +++ b/app/queries/admins/user_query.rb @@ -30,6 +30,15 @@ class Admins::UserQuery < ApplicationQuery users = users.joins(user_extension: :school).where(schools: { auto_users_trial: params[:auto_trial].to_i == 1 }) end + # 第三方账户类型 + if params[:open_user_type].present? + if params[:open_user_type] == "Forge" + users = users.left_joins(:open_users).where(open_users: {id: nil}) + else + users = users.joins(:open_users).where(open_users: {type: params[:open_user_type]}) + end + end + # 关键字检索 keyword = params[:keyword].to_s.strip.presence if keyword diff --git a/app/services/cache/v2/project_common_service.rb b/app/services/cache/v2/project_common_service.rb index 8ed0a0636..97023ae29 100644 --- a/app/services/cache/v2/project_common_service.rb +++ b/app/services/cache/v2/project_common_service.rb @@ -1,5 +1,5 @@ class Cache::V2::ProjectCommonService < ApplicationService - attr_reader :project_id, :owner_id, :name, :identifier, :description, :visits, :watchers, :praises, :forks, :issues, :pullrequests + attr_reader :project_id, :owner_id, :name, :identifier, :description, :visits, :watchers, :praises, :forks, :issues, :pullrequests, :commits attr_accessor :project def initialize(project_id, params={}) @@ -14,6 +14,7 @@ class Cache::V2::ProjectCommonService < ApplicationService @forks = params[:forks] @issues = params[:issues] @pullrequests = params[:pullrequests] + @commits = params[:commits] end def read @@ -81,6 +82,10 @@ class Cache::V2::ProjectCommonService < ApplicationService "pullrequests" end + def commits_key + "commits" + end + def project_common result = $redis_cache.hgetall(project_common_key) result.blank? ? reset_project_common : result @@ -149,6 +154,11 @@ class Cache::V2::ProjectCommonService < ApplicationService Cache::V2::ProjectRankService.call(@project_id, {pullrequests: @pullrequests}) Cache::V2::ProjectDateRankService.call(@project_id, Date.today, {pullrequests: @pullrequests}) end + if @commits.present? + $redis_cache.hincrby(project_common_key, commits_key, @commits) + Cache::V2::ProjectRankService.call(@project_id, {commits: @commits}) + Cache::V2::ProjectDateRankService.call(@project_id, Date.today, {commits: @commits}) + end end $redis_cache.hgetall(project_common_key) @@ -194,6 +204,10 @@ class Cache::V2::ProjectCommonService < ApplicationService $redis_cache.hset(project_common_key, pullrequests_key, PullRequest.where(project_id: @project_id).count) end + def reset_project_commits + $redis_cache.hset(project_common_key, commits_key, CommitLog.where(project_id: @project_id).count) + end + def reset_project_common load_project return unless @project.present? @@ -209,6 +223,7 @@ class Cache::V2::ProjectCommonService < ApplicationService reset_project_forks reset_project_issues reset_project_pullrequests + reset_project_commits $redis_cache.hgetall(project_common_key) end diff --git a/app/services/cache/v2/project_date_rank_service.rb b/app/services/cache/v2/project_date_rank_service.rb index 092aff796..08aae6f77 100644 --- a/app/services/cache/v2/project_date_rank_service.rb +++ b/app/services/cache/v2/project_date_rank_service.rb @@ -1,5 +1,6 @@ +# 项目日活跃度计算存储 class Cache::V2::ProjectDateRankService < ApplicationService - attr_reader :project_id, :rank_date, :visits, :praises, :forks, :issues, :pullrequests + attr_reader :project_id, :rank_date, :visits, :praises, :forks, :issues, :pullrequests, :commits attr_accessor :project_common def initialize(project_id, rank_date=Date.today, params={}) @@ -10,6 +11,7 @@ class Cache::V2::ProjectDateRankService < ApplicationService @forks = params[:forks] @issues = params[:issues] @pullrequests = params[:pullrequests] + @commits = params[:commits] end def read @@ -37,7 +39,7 @@ class Cache::V2::ProjectDateRankService < ApplicationService $redis_cache.zincrby(project_rank_key, @praises.to_i * 5, @project_id) end if @forks.present? - $redis_cache.zincrby(project_rank_key, @forks.to_i * 5, @project_id) + $redis_cache.zincrby(project_rank_key, @forks.to_i * 10, @project_id) end if @issues.present? $redis_cache.zincrby(project_rank_key, @issues.to_i * 10, @project_id) @@ -45,6 +47,9 @@ class Cache::V2::ProjectDateRankService < ApplicationService if @pullrequests.present? $redis_cache.zincrby(project_rank_key, @pullrequests.to_i * 10, @project_id) end + if @commits.present? + $redis_cache.zincrby(project_rank_key, @commits.to_i * 1, @project_id) + end $redis_cache.zscore(project_rank_key, @project_id) end diff --git a/app/services/cache/v2/project_rank_service.rb b/app/services/cache/v2/project_rank_service.rb index 7e5d323bf..3265c0a6c 100644 --- a/app/services/cache/v2/project_rank_service.rb +++ b/app/services/cache/v2/project_rank_service.rb @@ -1,5 +1,5 @@ class Cache::V2::ProjectRankService < ApplicationService - attr_reader :project_id, :visits, :praises, :forks, :issues, :pullrequests + attr_reader :project_id, :visits, :praises, :forks, :issues, :pullrequests, :commits attr_accessor :project_common def initialize(project_id, params={}) @@ -9,6 +9,7 @@ class Cache::V2::ProjectRankService < ApplicationService @forks = params[:forks] @issues = params[:issues] @pullrequests = params[:pullrequests] + @commits = params[:commits] end def read @@ -54,7 +55,7 @@ class Cache::V2::ProjectRankService < ApplicationService $redis_cache.zincrby(project_rank_key, @praises.to_i * 5, @project_id) end if @forks.present? - $redis_cache.zincrby(project_rank_key, @forks.to_i * 5, @project_id) + $redis_cache.zincrby(project_rank_key, @forks.to_i * 10, @project_id) end if @issues.present? $redis_cache.zincrby(project_rank_key, @issues.to_i * 10, @project_id) @@ -62,6 +63,9 @@ class Cache::V2::ProjectRankService < ApplicationService if @pullrequests.present? $redis_cache.zincrby(project_rank_key, @pullrequests.to_i * 10, @project_id) end + if @commits.present? + $redis_cache.zincrby(project_rank_key, @commits.to_i * 1, @project_id) + end reset_user_project_rank end @@ -70,7 +74,7 @@ class Cache::V2::ProjectRankService < ApplicationService def reset_project_rank load_project_common - score = @project_common["visits"].to_i * 1 + @project_common["praises"].to_i * 5 + @project_common["forks"].to_i * 5 + @project_common["issues"].to_i * 10 + @project_common["pullrequests"].to_i * 10 + score = @project_common["visits"].to_i * 1 + @project_common["praises"].to_i * 5 + @project_common["forks"].to_i * 10 + @project_common["issues"].to_i * 10 + @project_common["pullrequests"].to_i * 10 + @project_common["commits"].to_i * 1 $redis_cache.zadd(project_rank_key, score, @project_id) reset_user_project_rank diff --git a/app/views/admins/nps/index.html.erb b/app/views/admins/nps/index.html.erb index cc3eb94ad..5c083f33c 100644 --- a/app/views/admins/nps/index.html.erb +++ b/app/views/admins/nps/index.html.erb @@ -13,12 +13,31 @@ <%= submit_tag('搜索', class: 'btn btn-primary ml-3', 'data-disable-with': '搜索中...') %> NPS系统开关 - checked<%end %> data-toggle="toggle" data-onstyle="primary" id="nps_toggle" data-on="开" data-off="关" data-size="small"> + checked + <% end %> data-toggle="toggle" data-onstyle="primary" id="nps_toggle" data-on="开" data-off="关" data-size="small"> <% end %> - +
数据统计:
++ 评分用户数/用户总数:<%= @score_total_count %>/<%= UserNp.count %>, + 平均评分:<%= UserNp.where("action_type !='close'").average(:score).to_f.round(1) %>, + <% @user_nps_mid = @score_total_count % 2 == 0 ? @score_total_count / 2 : (@score_total_count + 1) / 2 %> + 评分中位数:<%= UserNp.where("action_type !='close'").order("score").pluck(:score)[@user_nps_mid - 1].to_i %>, + 最低评分/评分人数:<%=@min_score.to_i %>/<%= UserNp.where("action_type !='close'").where(score: @min_score).count %>, + 最高评分/评分人数:<%=@max_score.to_i %>/<%= UserNp.where("action_type !='close'").where(score: @max_score).count %> +
++ 填写意见用户数/用户总数:<%= UserNp.where("memo is not null").count %>/<%= UserNp.count %>, + 期待更加丰富的功能:<%= UserNp.where("memo like '%期待更加丰富的功能%'").count %>, + 希望有新手引导:<%= UserNp.where("memo like '%希望有新手引导%'").count %>, + 提升用户体验:<%= UserNp.where("memo like '%用户体验需进一步提升%'").count %>, + 其他:<%= UserNp.where("memo is not null").where.not(id: UserNp.where("memo like '%期待更加丰富的功能%' or memo like '%希望有新手引导%' or memo like '%用户体验需进一步提升%' ").ids).count %> +
+