203 lines
14 KiB
Ruby
203 lines
14 KiB
Ruby
class Api::V1::Projects::PortraitController < Api::V1::BaseController
|
|
before_action :require_public_and_member_above
|
|
|
|
def index
|
|
Cache::V2::PlatformStatisticService.new().reset
|
|
@platform_statistic = $redis_cache.hgetall("v2-platform-statistic")
|
|
|
|
# 社区影响力
|
|
praise_count = PraiseTread.where(praise_tread_object_type: "Project", praise_tread_object_id: @project.id).count
|
|
praise_count = PraiseTread.where(praise_tread_object_type: "Project", praise_tread_object_id: @project.id).count
|
|
watcher_count = Watcher.where(watchable_type:"Project", watchable_id: @project.id).count
|
|
fork_count = ForkUser.where(project_id: @project.id).count
|
|
community_impact_praise = @platform_statistic['max-praise-count'].to_i == 0 ? 0 : 30*(praise_count.to_f/@platform_statistic['max-praise-count'].to_i)
|
|
community_impact_watcher = @platform_statistic['max-watcher-count'].to_i == 0 ? 0 : 30*(watcher_count.to_f/@platform_statistic['max-watcher-count'].to_i)
|
|
community_impact_fork = @platform_statistic['max-fork-count'].to_i == 0 ? 0 : 40*(fork_count.to_f/@platform_statistic['max-fork-count'].to_i)
|
|
community_impact = format("%.2f", community_impact_praise + community_impact_watcher + community_impact_fork)
|
|
|
|
# 项目成熟度
|
|
pullrequest_count = PullRequest.where(project_id: @project.id).count
|
|
complete_issue_count = Issue.issue_issue.where(project_id: @project.id, status_id: [3,5]).count
|
|
project_create_day = (Time.now.to_i - @project.created_on.to_i)/(3600*24)
|
|
max_project_create_day = (Time.now.to_i - Project.order("created_on desc").last.created_on.to_i)/(3600*24)
|
|
project_maturity_pullrequest = @platform_statistic['max-pullrequest-count'].to_i == 0? 0 : 40*(pullrequest_count.to_f/@platform_statistic['max-pullrequest-count'].to_i)
|
|
project_maturity_complete_issue = @platform_statistic['max-complete-issue-count'].to_i == 0? 0 : 40*(complete_issue_count.to_f/@platform_statistic['max-complete-issue-count'].to_i)
|
|
project_maturity_project_create_day = max_project_create_day.to_i <= 0 || project_create_day.to_i <= 0 ? 0 : 20*(Math.sqrt(project_create_day).to_f/Math.sqrt(max_project_create_day))
|
|
project_maturity = format("%.2f", project_maturity_pullrequest + project_maturity_complete_issue + project_maturity_project_create_day)
|
|
|
|
# 项目健康度
|
|
member_count = Member.where(project_id: @project.id).count
|
|
max_member_count = @platform_statistic['max-member-count'].to_i
|
|
|
|
project_last_commit = CommitLog.joins(:project).merge(Project.common).where(project_id: @project.id).order("created_at desc").first
|
|
last_commit_day = project_last_commit.present? ? (Time.now.to_i - project_last_commit.created_at.to_i)/(3600*24) : 0
|
|
|
|
has_license = @project.license.present? ? 1 : 0
|
|
|
|
closed_pullrequest_count = PullRequest.where(project_id: @project.id).merged_and_closed.count
|
|
closed_issue_count = Issue.issue_issue.where(project_id: @project.id).closed.count
|
|
pullrequest_count = PullRequest.where(project_id: @project.id).count
|
|
issue_count = Issue.issue_issue.where(project_id: @project.id).count
|
|
health_code1 = max_member_count.to_i == 0 ? 0 : 0.3*(member_count.to_f/max_member_count)
|
|
health_code2 = last_commit_day.to_i == 0 ? 0 : 0.7*(1.to_f/(1+last_commit_day))
|
|
health_code = 10 * (health_code1 + health_code2)
|
|
health_license = 10 * has_license
|
|
health_pullrequest = pullrequest_count <= 1 ? 0 : 40 * (closed_pullrequest_count.to_f/pullrequest_count)*(1-1/Math.sqrt(pullrequest_count+1))
|
|
health_issue = issue_count <= 1 ? 0 : 40 * (closed_issue_count.to_f/issue_count)*(1-1/Math.sqrt(issue_count+1))
|
|
|
|
project_health = format("%.2f", health_code + health_license + health_pullrequest + health_issue)
|
|
|
|
# 团队影响度
|
|
member_count = Member.where(project_id: @project.id).count
|
|
max_member_count = @platform_statistic['max-member-count'].to_i
|
|
recent_one_month_member_count = Member.where(project_id:@project.id).where("created_on >?", Time.now - 30.days).count
|
|
max_recent_one_month_member_count = @platform_statistic['max-recent-one-month-member-count'].to_i
|
|
issue_assigner_count = IssueAssigner.joins(:issue).merge(Issue.issue_issue).where(issues: {project_id: @project.id}).distinct.count
|
|
team_impact_member = 40*(member_count.to_f/max_member_count)
|
|
team_impact_recent_member = 40*(recent_one_month_member_count.to_f/max_recent_one_month_member_count)
|
|
team_impact_issue_assigner = 20*(issue_assigner_count.to_f/max_member_count)
|
|
team_impact = format("%.2f", team_impact_member + team_impact_recent_member + team_impact_issue_assigner)
|
|
|
|
# 开发活跃度
|
|
recent_one_month_commit_count = CommitLog.joins(:project).merge(Project.common).where(project_id: @project.id).where("created_at >?", Time.now - 30.days).count
|
|
recent_one_month_pullrequest_count = PullRequest.where(project_id: @project.id).where("created_at >?", Time.now - 30.days).count
|
|
recent_one_month_issue_count = Issue.issue_issue.where(project_id: @project.id).where("created_on >?", Time.now - 30.days).count
|
|
recent_one_month_release_count = VersionRelease.joins(:repository).where(repositories: {project_id: @project.id}).where("created_at >?", Time.now - 30.days).count
|
|
max_recent_one_month_commit_count = @platform_statistic['max-recent-one-month-commit-count'].to_i
|
|
max_recent_one_month_pullrequest_count = @platform_statistic['max-recent-one-month-pullrequest-count'].to_i
|
|
max_recent_one_month_issue_count = @platform_statistic['max-recent-one-month-issue-count'].to_i
|
|
max_recent_one_month_release_count = @platform_statistic['max-recent-one-month-release-count'].to_i
|
|
develop_activity_commit = max_recent_one_month_commit_count.zero? ? 0 : 40*(recent_one_month_commit_count.to_f/max_recent_one_month_commit_count)
|
|
develop_activity_issue = max_recent_one_month_issue_count.zero? ? 0 : 20*(recent_one_month_issue_count.to_f/max_recent_one_month_issue_count)
|
|
develop_activity_pullrequest = max_recent_one_month_pullrequest_count.zero? ? 0 : 20*(recent_one_month_pullrequest_count.to_f/max_recent_one_month_pullrequest_count)
|
|
develop_activity_release = max_recent_one_month_release_count.zero? ? 0 : 20*(recent_one_month_release_count.to_f/max_recent_one_month_release_count)
|
|
develop_activity = format("%.2f", develop_activity_commit + develop_activity_issue + develop_activity_pullrequest + develop_activity_release)
|
|
|
|
render :json => {community_impact: community_impact, project_maturity: project_maturity, project_health: project_health, team_impact: team_impact, develop_activity: develop_activity}
|
|
end
|
|
|
|
# 社区影响力
|
|
def community_impact
|
|
Cache::V2::PlatformStatisticService.new().reset
|
|
@platform_statistic = $redis_cache.hgetall("v2-platform-statistic")
|
|
praise_count = PraiseTread.where(praise_tread_object_type: "Project", praise_tread_object_id: @project.id).count
|
|
watcher_count = Watcher.where(watchable_type:"Project", watchable_id: @project.id).count
|
|
fork_count = ForkUser.where(project_id: @project.id).count
|
|
community_impact_praise = @platform_statistic['max-praise-count'].to_i == 0 ? 0 : 30*(praise_count.to_f/@platform_statistic['max-praise-count'].to_i)
|
|
community_impact_watcher = @platform_statistic['max-watcher-count'].to_i == 0 ? 0 : 30*(watcher_count.to_f/@platform_statistic['max-watcher-count'].to_i)
|
|
community_impact_fork = @platform_statistic['max-fork-count'].to_i == 0 ? 0 : 40*(fork_count.to_f/@platform_statistic['max-fork-count'].to_i)
|
|
community_impact = format("%.2f", community_impact_praise + community_impact_watcher + community_impact_fork)
|
|
|
|
render :json => {
|
|
community_impact_praise: community_impact_praise,
|
|
community_impact_watcher: community_impact_watcher,
|
|
community_impact_fork: community_impact_fork,
|
|
community_impact: community_impact
|
|
}
|
|
end
|
|
|
|
# 项目成熟度
|
|
def project_maturity
|
|
Cache::V2::PlatformStatisticService.new().reset
|
|
@platform_statistic = $redis_cache.hgetall("v2-platform-statistic")
|
|
pullrequest_count = PullRequest.where(project_id: @project.id).count
|
|
complete_issue_count = Issue.issue_issue.where(project_id: @project.id, status_id: [3,5]).count
|
|
project_create_day = (Time.now.to_i - @project.created_on.to_i)/(3600*24)
|
|
max_project_create_day = (Time.now.to_i - Project.order("created_on desc").last.created_on.to_i)/(3600*24)
|
|
project_maturity_pullrequest = @platform_statistic['max-pullrequest-count'].to_i == 0? 0 : 40*(pullrequest_count.to_f/@platform_statistic['max-pullrequest-count'].to_i)
|
|
project_maturity_complete_issue = @platform_statistic['max-complete-issue-count'].to_i == 0? 0 : 40*(complete_issue_count.to_f/@platform_statistic['max-complete-issue-count'].to_i)
|
|
project_maturity_project_create_day = max_project_create_day.to_i <= 0 || project_create_day.to_i <= 0 ? 0 : 20*(Math.sqrt(project_create_day).to_f/Math.sqrt(max_project_create_day))
|
|
project_maturity = format("%.2f", project_maturity_pullrequest + project_maturity_complete_issue + project_maturity_project_create_day)
|
|
|
|
render :json => {
|
|
project_maturity_pullrequest: project_maturity_pullrequest,
|
|
project_maturity_complete_issue: project_maturity_complete_issue,
|
|
project_maturity_project_create_day: project_maturity_project_create_day,
|
|
project_maturity: project_maturity
|
|
}
|
|
end
|
|
|
|
# 项目健康度
|
|
def project_health
|
|
Cache::V2::PlatformStatisticService.new().reset
|
|
@platform_statistic = $redis_cache.hgetall("v2-platform-statistic")
|
|
|
|
member_count = Member.where(project_id: @project.id).count
|
|
max_member_count = @platform_statistic['max-member-count'].to_i
|
|
|
|
project_last_commit = CommitLog.joins(:project).merge(Project.common).where(project_id: @project.id).order("created_at desc").first
|
|
last_commit_day = project_last_commit.present? ? (Time.now.to_i - project_last_commit.created_at.to_i)/(3600*24) : 0
|
|
|
|
has_license = @project.license.present? ? 1 : 0
|
|
|
|
closed_pullrequest_count = PullRequest.where(project_id: @project.id).merged_and_closed.count
|
|
closed_issue_count = Issue.issue_issue.where(project_id: @project.id).closed.count
|
|
pullrequest_count = PullRequest.where(project_id: @project.id).count
|
|
issue_count = Issue.issue_issue.where(project_id: @project.id).count
|
|
health_code1 = max_member_count.to_i == 0 ? 0 : 0.3*(member_count.to_f/max_member_count)
|
|
health_code2 = last_commit_day.to_i == 0 ? 0 : 0.7*(1.to_f/(1+last_commit_day*0.1))
|
|
health_code = 10 * (health_code1 + health_code2)
|
|
health_license = 10 * has_license
|
|
health_pullrequest = pullrequest_count <= 1 ? 0 : 40 * (closed_pullrequest_count.to_f/pullrequest_count)*(1-1/Math.sqrt(pullrequest_count+1))
|
|
health_issue = issue_count <= 1 ? 0 : 40 * (closed_issue_count.to_f/issue_count)*(1-1/Math.sqrt(issue_count+1))
|
|
|
|
project_health = format("%.2f", health_code + health_license + health_pullrequest + health_issue)
|
|
|
|
render :json => {
|
|
health_code: health_code,
|
|
health_license: health_license,
|
|
health_pullrequest: health_pullrequest,
|
|
health_issue: health_issue,
|
|
project_health: project_health
|
|
}
|
|
end
|
|
|
|
# 团队健康度
|
|
def team_impact
|
|
Cache::V2::PlatformStatisticService.new().reset
|
|
@platform_statistic = $redis_cache.hgetall("v2-platform-statistic")
|
|
member_count = Member.where(project_id: @project.id).count
|
|
max_member_count = @platform_statistic['max-member-count'].to_i
|
|
recent_one_month_member_count = Member.where(project_id:@project.id).where("created_on >?", Time.now - 30.days).count
|
|
max_recent_one_month_member_count = @platform_statistic['max-recent-one-month-member-count'].to_i
|
|
issue_assigner_count = IssueAssigner.joins(:issue).merge(Issue.issue_issue).where(issues: {project_id: @project.id}).distinct.count
|
|
team_impact_member = 40*(member_count.to_f/max_member_count)
|
|
team_impact_recent_member = 40*(recent_one_month_member_count.to_f/max_recent_one_month_member_count)
|
|
team_impact_issue_assigner = 20*(issue_assigner_count.to_f/max_member_count)
|
|
team_impact = format("%.2f", team_impact_member + team_impact_recent_member + team_impact_issue_assigner)
|
|
|
|
render :json => {
|
|
team_impact_member: team_impact_member,
|
|
team_impact_recent_member: team_impact_recent_member,
|
|
team_impact_issue_assigner: team_impact_issue_assigner,
|
|
team_impact: team_impact
|
|
}
|
|
end
|
|
|
|
# 开发活跃度
|
|
def develop_activity
|
|
Cache::V2::PlatformStatisticService.new().reset
|
|
@platform_statistic = $redis_cache.hgetall("v2-platform-statistic")
|
|
recent_one_month_commit_count = CommitLog.joins(:project).merge(Project.common).where(project_id: @project.id).where("created_at >?", Time.now - 30.days).count
|
|
recent_one_month_pullrequest_count = PullRequest.where(project_id: @project.id).where("created_at >?", Time.now - 30.days).count
|
|
recent_one_month_issue_count = Issue.issue_issue.where(project_id: @project.id).where("created_on >?", Time.now - 30.days).count
|
|
recent_one_month_release_count = VersionRelease.joins(:repository).where(repositories: {project_id: @project.id}).where("created_at >?", Time.now - 30.days).count
|
|
max_recent_one_month_commit_count = @platform_statistic['max-recent-one-month-commit-count'].to_i
|
|
max_recent_one_month_pullrequest_count = @platform_statistic['max-recent-one-month-pullrequest-count'].to_i
|
|
max_recent_one_month_issue_count = @platform_statistic['max-recent-one-month-issue-count'].to_i
|
|
max_recent_one_month_release_count = @platform_statistic['max-recent-one-month-release-count'].to_i
|
|
develop_activity_commit = max_recent_one_month_commit_count.zero? ? 0 : 40*(recent_one_month_commit_count.to_f/max_recent_one_month_commit_count)
|
|
develop_activity_issue = max_recent_one_month_issue_count.zero? ? 0 : 20*(recent_one_month_issue_count.to_f/max_recent_one_month_issue_count)
|
|
develop_activity_pullrequest = max_recent_one_month_pullrequest_count.zero? ? 0 : 20*(recent_one_month_pullrequest_count.to_f/max_recent_one_month_pullrequest_count)
|
|
develop_activity_release = max_recent_one_month_release_count.zero? ? 0 : 20*(recent_one_month_release_count.to_f/max_recent_one_month_release_count)
|
|
develop_activity = format("%.2f", develop_activity_commit + develop_activity_issue + develop_activity_pullrequest + develop_activity_release)
|
|
|
|
render :json => {
|
|
develop_activity_commit: develop_activity_commit,
|
|
develop_activity_issue: develop_activity_issue,
|
|
develop_activity_pullrequest: develop_activity_pullrequest,
|
|
develop_activity_release: develop_activity_release,
|
|
develop_activity: develop_activity
|
|
}
|
|
end
|
|
end |