添加项目个人得分统计功能

This commit is contained in:
z9hang 2014-06-26 15:05:24 +08:00
parent 7425178419
commit 7399e1aca2
4 changed files with 183 additions and 18 deletions

View File

@ -98,8 +98,10 @@ class Changeset < ActiveRecord::Base
end
def project
unless repository.nil?
repository.project
end
end
def author
user || committer.to_s.split('<').first

View File

@ -3,7 +3,7 @@ class MigrateCourseStudents < ActiveRecord::Migration
# 原课程的学生数据迁移成新模式
StudentsForCourse.all.each do |student|
project = Project.find_by_id(student.course_id)
if project
if project && project.course_extra
student.course_id = project.course_extra.id
student.save
end

View File

@ -11,7 +11,7 @@
#
# It's strongly recommended to check this file into your version control system.
ActiveRecord::Schema.define(:version => 20140618020535) do
ActiveRecord::Schema.define(:version => 20140617013146) do
create_table "activities", :force => true do |t|
t.integer "act_id", :null => false
@ -117,6 +117,7 @@ ActiveRecord::Schema.define(:version => 20140618020535) do
t.integer "messages_count", :default => 0, :null => false
t.integer "last_message_id"
t.integer "parent_id"
t.integer "course_id"
end
add_index "boards", ["last_message_id"], :name => "index_boards_on_last_message_id"
@ -229,6 +230,23 @@ ActiveRecord::Schema.define(:version => 20140618020535) do
t.datetime "updated_on", :null => false
end
create_table "course_infos", :force => true do |t|
t.integer "course_id"
t.integer "user_id"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
create_table "course_statuses", :force => true do |t|
t.integer "changesets_count"
t.integer "watchers_count"
t.integer "course_id"
t.float "grade", :default => 0.0
t.integer "course_ac_para", :default => 0
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
create_table "courses", :force => true do |t|
t.integer "tea_id"
t.string "name"
@ -246,6 +264,13 @@ ActiveRecord::Schema.define(:version => 20140618020535) do
t.string "endup_time"
t.string "class_period"
t.integer "school_id"
t.text "description"
t.integer "status", :default => 1
t.integer "attachmenttype", :default => 2
t.integer "lft"
t.integer "rgt"
t.integer "is_public", :limit => 1, :default => 1
t.integer "inherit_members", :limit => 1, :default => 1
end
create_table "custom_fields", :force => true do |t|
@ -309,6 +334,7 @@ ActiveRecord::Schema.define(:version => 20140618020535) do
create_table "enabled_modules", :force => true do |t|
t.integer "project_id"
t.string "name", :null => false
t.integer "course_id"
end
add_index "enabled_modules", ["project_id"], :name => "enabled_modules_project_id"
@ -354,11 +380,10 @@ ActiveRecord::Schema.define(:version => 20140618020535) do
t.string "name"
t.string "description"
t.integer "state"
t.integer "project_id", :default => 0
end
create_table "homework_for_courses", :force => true do |t|
t.integer "project_id"
t.integer "course_id"
t.integer "bid_id"
end
@ -513,13 +538,14 @@ ActiveRecord::Schema.define(:version => 20140618020535) do
create_table "members", :force => true do |t|
t.integer "user_id", :default => 0, :null => false
t.integer "project_id", :default => 0, :null => false
t.integer "project_id", :default => 0
t.datetime "created_on"
t.boolean "mail_notification", :default => false, :null => false
t.integer "course_id", :default => -1
end
add_index "members", ["project_id"], :name => "index_members_on_project_id"
add_index "members", ["user_id", "project_id"], :name => "index_members_on_user_id_and_project_id", :unique => true
add_index "members", ["user_id", "project_id", "course_id"], :name => "index_members_on_user_id_and_project_id", :unique => true
add_index "members", ["user_id"], :name => "index_members_on_user_id"
create_table "memos", :force => true do |t|
@ -565,6 +591,7 @@ ActiveRecord::Schema.define(:version => 20140618020535) do
t.integer "author_id", :default => 0, :null => false
t.datetime "created_on"
t.integer "comments_count", :default => 0, :null => false
t.integer "course_id"
end
add_index "news", ["author_id"], :name => "index_news_on_author_id"
@ -961,11 +988,13 @@ ActiveRecord::Schema.define(:version => 20140618020535) do
end
create_table "user_scores", :force => true do |t|
t.integer "user_id"
t.integer "user_id", :null => false
t.integer "collaboration"
t.integer "influence"
t.integer "skill"
t.integer "activity"
t.integer "active"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
create_table "user_statuses", :force => true do |t|

View File

@ -11,21 +11,48 @@ namespace :user_score do
puts "loading..."
# collaboration 协同得分
users = {}
grades = {}
# 发帖
Message.includes(:author).where("parent_id IS NULL").all.each do |m|
users[m.author.id] = users[m.author.id].to_i + 2
project = m.project
unless project.nil?
user_grade = UserGrade.find_by_user_id_and_project_id(m.author.id, project.id)
if user_grade.nil?
user_grade = UserGrade.create(:user_id => m.author.id, :project_id => project.id)
end
grades[user_grade.id] = grades[user_grade.id].to_i + 2
end
end
puts ":post_message calculate Completed. collaboration users count: #{users.count}"
# 对缺陷的留言
Journal.includes(:user).all.each do |j|
users[j.user.id] = users[j.user.id].to_i + 1
project = j.project
unless project.nil?
user_grade = UserGrade.find_by_user_id_and_project_id(j.user.id, project.id)
if user_grade.nil?
user_grade = UserGrade.create(:user_id => j.user.id, :project_id => project.id)
end
grades[user_grade.id] = grades[user_grade.id].to_i + 1
end
end
puts ":post_issue_message calculate Completed. collaboration users count: #{users.count}"
# 更改一次缺陷状态
Journal.joins(:details, :user).where("#{JournalDetail.table_name}.prop_key = 'status_id'").each do |j|
users[j.user.id] = users[j.user.id].to_i + 1
project = j.project
unless project.nil?
user_grade = UserGrade.find_by_user_id_and_project_id(j.user.id, project.id)
if user_grade.nil?
user_grade = UserGrade.create(:user_id => j.user.id, :project_id => project.id)
end
grades[user_grade.id] = grades[user_grade.id].to_i + 1
end
end
puts ":change_issue_status calculate Completed. collaboration users count: #{users.count}"
@ -38,6 +65,14 @@ namespace :user_score do
# 对帖子的回复
Message.includes(:author).where("parent_id IS NOT NULL").each do |m|
users[m.author.id] = users[m.author.id].to_i + 1
project = m.project
unless project.nil?
user_grade = UserGrade.find_by_user_id_and_project_id(m.author.id, project.id)
if user_grade.nil?
user_grade = UserGrade.create(:user_id =>m.author.id, :project_id => project.id)
end
grades[user_grade.id] = grades[user_grade.id].to_i + 1
end
end
puts ":reply_posting calculate Completed. collaboration users count: #{users.count}"
@ -76,24 +111,74 @@ namespace :user_score do
end
target_user = obj.author
level = UserLevels.get_level(pt.user)#pt.user.get_level
project = pt.project
if pt.praise_or_tread == 0
#踩帖
users_skill[pt.user.id] = users_skill[pt.user.id].to_i - 2 #踩别人帖-2分
unless project.nil?
user_grade = UserGrade.find_by_user_id_and_project_id(pt.user.id, project.id)
if user_grade.nil?
user_grade = UserGrade.create(:user_id =>pt.user.id, :project_id => project.id)
end
grades[user_grade.id] = grades[user_grade.id].to_i - 2
end
if level == 1
users_skill[target_user.id] = users_skill[target_user.id].to_i - 2 #帖子被一级会员踩-2分 add praise_tread
unless project.nil?
user_grade = UserGrade.find_by_user_id_and_project_id(target_user.id, project.id)
if user_grade.nil?
user_grade = UserGrade.create(:user_id =>target_user.id, :project_id => project.id)
end
grades[user_grade.id] = grades[user_grade.id].to_i - 2
end
elsif level == 2
users_skill[target_user.id] = users_skill[target_user.id].to_i - 4 #帖子被二级会员踩-4分 add praise_tread
unless project.nil?
user_grade = UserGrade.find_by_user_id_and_project_id(target_user.id, project.id)
if user_grade.nil?
user_grade = UserGrade.create(:user_id =>target_user.id, :project_id => project.id)
end
grades[user_grade.id] = grades[user_grade.id].to_i - 4
end
elsif level == 3
users_skill[target_user.id] = users_skill[target_user.id].to_i - 6 #帖子被三级会员踩-6分 add praise_tread
unless project.nil?
user_grade = UserGrade.find_by_user_id_and_project_id(target_user.id, project.id)
if user_grade.nil?
user_grade = UserGrade.create(:user_id =>target_user.id, :project_id => project.id)
end
grades[user_grade.id] = grades[user_grade.id].to_i - 6
end
end
elsif pt.praise_or_tread == 1
#顶贴
if level == 1
users_skill[target_user.id] = users_skill[target_user.id].to_i + 4 #帖子被一级会员顶+4分 add praise_tread
unless project.nil?
user_grade = UserGrade.find_by_user_id_and_project_id(target_user.id, project.id)
if user_grade.nil?
user_grade = UserGrade.create(:user_id =>target_user.id, :project_id => project.id)
end
grades[user_grade.id] = grades[user_grade.id].to_i + 4
end
elsif level == 2
users_skill[target_user.id] = users_skill[target_user.id].to_i + 6 #帖子被二级会员顶+6分 add praise_tread
unless project.nil?
user_grade = UserGrade.find_by_user_id_and_project_id(target_user.id, project.id)
if user_grade.nil?
user_grade = UserGrade.create(:user_id =>target_user.id, :project_id => project.id)
end
grades[user_grade.id] = grades[user_grade.id].to_i + 6
end
elsif level == 3
users_skill[target_user.id] = users_skill[target_user.id].to_i + 8 #帖子被三级会员顶+8分 add praise_tread
unless project.nil?
user_grade = UserGrade.find_by_user_id_and_project_id(target_user.id, project.id)
if user_grade.nil?
user_grade = UserGrade.create(:user_id =>target_user.id, :project_id => project.id)
end
grades[user_grade.id] = grades[user_grade.id].to_i + 8
end
end
end
end
@ -114,6 +199,14 @@ namespace :user_score do
next
end
users_active[changeset.user.id] = users_active[changeset.user.id].to_i + 4
project = changeset.project
unless project.nil?
user_grade = UserGrade.find_by_user_id_and_project_id(changeset.user.id, project.id)
if user_grade.nil?
user_grade = UserGrade.create(:user_id =>changeset.user.id, :project_id => project.id)
end
grades[user_grade.id] = grades[user_grade.id].to_i + 4
end
end
puts ":push_code calculate Completed. active users count: #{users_active.count}"
#提交文档
@ -122,6 +215,14 @@ namespace :user_score do
next
end
users_active[document.user.id] = users_active[document.user.id].to_i + 4
project = document.project
unless project.nil?
user_grade = UserGrade.find_by_user_id_and_project_id(document.user.id, project.id)
if user_grade.nil?
user_grade = UserGrade.create(:user_id =>document.user.id, :project_id => project.id)
end
grades[user_grade.id] = grades[user_grade.id].to_i + 4
end
end
puts ":push_document calculate Completed. active users count: #{users_active.count}"
#提交附件
@ -134,6 +235,17 @@ namespace :user_score do
next
end
users_active[attachment.author.id] = users_active[attachment.author.id].to_i + 4
if attachment.container.class.to_s == "Project"
project = attachment.project
unless project.nil?
user_grade = UserGrade.find_by_user_id_and_project_id(attachment.author.id, project.id)
if user_grade.nil?
user_grade = UserGrade.create(:user_id =>attachment.author.id, :project_id => project.id)
end
grades[user_grade.id] = grades[user_grade.id].to_i + 4
end
end
# end
#end
end
@ -141,11 +253,27 @@ namespace :user_score do
#更新完成度
Journal.joins(:details, :user).where("#{JournalDetail.table_name}.prop_key = 'done_ratio'").each do |j|
users_active[j.user.id] = users_active[j.user.id].to_i + 2
project = j.project
unless project.nil?
user_grade = UserGrade.find_by_user_id_and_project_id(j.user.id, project.id)
if user_grade.nil?
user_grade = UserGrade.create(:user_id =>j.user.id, :project_id => project.id)
end
grades[user_grade.id] = grades[user_grade.id].to_i + 4
end
end
puts ":update_issue_ratio calculate Completed. active users count: #{users_active.count}"
#发布缺陷
Issue.includes(:author).all.each do |issue|
users_active[issue.author.id] = users_active[issue.author.id].to_i + 4
project = issue.project
unless project.nil?
user_grade = UserGrade.find_by_user_id_and_project_id(issue.author.id, project.id)
if user_grade.nil?
user_grade = UserGrade.create(:user_id =>issue.author.id, :project_id => project.id)
end
grades[user_grade.id] = grades[user_grade.id].to_i + 4
end
end
puts ":post_issue calculate Completed. active users count: #{users_active.count}"
@ -156,8 +284,14 @@ namespace :user_score do
end
end
puts "=== UserScore#active calculate Completed. active users count: #{users_active.count}"
puts ""
UserGrade.transaction do
grades.each do |grade_id,score|
grade = UserGrade.find(grade_id)
grade.grade = score
grade.save
end
end
puts "=== UserGrid calculate Completed. UserGrids count: #{grades.count}"
end
end