You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							356 lines
						
					
					
						
							13 KiB
						
					
					
				
			
		
		
	
	
							356 lines
						
					
					
						
							13 KiB
						
					
					
				| desc "User Score description"
 | |
| task :user_score do
 | |
|   puts "user_score sync."
 | |
| end
 | |
| 
 | |
| namespace :user_score do
 | |
|   desc "calculating user score"
 | |
|   task :calculate => :environment do
 | |
|     puts "truncating table...#{Rails.env}"
 | |
|     UserScore.destroy_all
 | |
|     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?
 | |
|         if m.author.member_of?(project)
 | |
|           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
 | |
| 
 | |
|     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?
 | |
|         if j.user.member_of?(project)
 | |
|           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
 | |
|     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?
 | |
|         if j.user.member_of?(project)
 | |
|           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
 | |
| 
 | |
|     end
 | |
|     puts ":change_issue_status calculate Completed. collaboration users count: #{users.count}"
 | |
| 
 | |
|     # 对留言的回复
 | |
|     JournalsForMessage.includes(:user).where("m_parent_id IS NOT NULL").each do |jfm|
 | |
|       users[jfm.user.id] = users[jfm.user.id].to_i + 1
 | |
|     end
 | |
|     puts ":reply_message calculate Completed. collaboration users count: #{users.count}"
 | |
| 
 | |
|     # 对帖子的回复
 | |
|     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?
 | |
|         if m.author.member_of?(project)
 | |
|           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
 | |
|     end
 | |
|     puts ":reply_posting calculate Completed. collaboration users count: #{users.count}"
 | |
| 
 | |
|     UserScore.transaction do
 | |
|       users.each do |user_id, score|
 | |
|         UserScore.find_or_create_by_user_id(user_id).update_attribute(:collaboration, score)
 | |
|       end
 | |
|     end
 | |
|     puts "=== UserScore#collaboration calculate Completed. collaboration users count: #{users.count}"
 | |
|     puts ""
 | |
| 
 | |
|     users.clear
 | |
| 
 | |
|     # influence 影响力得分
 | |
|     #关注
 | |
|     users_influence = {}
 | |
|     Watcher.includes(:watchable).where("watchable_type = 'Principal'").all.each do |w|
 | |
|       users_influence[w.watchable.id] = users_influence[w.watchable.id].to_i + 2
 | |
|     end
 | |
|     puts ":followed_by calculate Completed. influence users count: #{users_influence.count}"
 | |
| 
 | |
|     UserScore.transaction do
 | |
|       users_influence.each do |user_id, score|
 | |
|         UserScore.find_or_create_by_user_id(user_id).update_attribute(:influence, score)
 | |
|       end
 | |
|     end
 | |
|     puts "=== UserScore#influence calculate Completed. influence users count: #{users_influence.count}"
 | |
|     puts ""
 | |
|     # skill 技术得分
 | |
|     # 顶踩帖
 | |
|     users_skill = {}
 | |
|     PraiseTread.where("praise_tread_object_type = 'Memo' || praise_tread_object_type = 'Message'").all.each do |pt|
 | |
|       obj = PraiseTread.find_object_by_type_and_id(pt.praise_tread_object_type, pt.praise_tread_object_id)
 | |
|       if obj.nil?
 | |
|         next
 | |
|       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?
 | |
|           if pt.user.member_of?(project)
 | |
|             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
 | |
| 
 | |
|         end
 | |
|         if level == 1
 | |
|           users_skill[target_user.id] = users_skill[target_user.id].to_i - 2 #帖子被一级会员踩-2分  add praise_tread
 | |
|           unless project.nil?
 | |
|             if target_user.member_of?(project)
 | |
|               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
 | |
| 
 | |
|           end
 | |
|         elsif  level == 2
 | |
|           users_skill[target_user.id] = users_skill[target_user.id].to_i - 4 #帖子被二级会员踩-4分  add praise_tread
 | |
|           unless project.nil?
 | |
|             if target_user.member_of?(project)
 | |
|               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
 | |
| 
 | |
|           end
 | |
|         elsif level == 3
 | |
|           users_skill[target_user.id] = users_skill[target_user.id].to_i - 6 #帖子被三级会员踩-6分  add praise_tread
 | |
|           unless project.nil?
 | |
|             if target_user.member_of?(project)
 | |
|               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
 | |
|         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?
 | |
|             if target_user.member_of?(project)
 | |
|               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
 | |
| 
 | |
|           end
 | |
|         elsif level == 2
 | |
|           users_skill[target_user.id] = users_skill[target_user.id].to_i + 6 #帖子被二级会员顶+6分  add praise_tread
 | |
|           unless project.nil?
 | |
|             if target_user.member_of?(project)
 | |
|               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  level == 3
 | |
|           users_skill[target_user.id] = users_skill[target_user.id].to_i + 8 #帖子被三级会员顶+8分  add praise_tread
 | |
|           unless project.nil?
 | |
|             if target_user.member_of?(project)
 | |
|               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
 | |
|     end
 | |
|     puts ":praised_by_user and :treaded_by_user calculate Completed. skill users count: #{users_skill.count}"
 | |
|     UserScore.transaction do
 | |
|       users_skill.each do |user_id, score|
 | |
|         UserScore.find_or_create_by_user_id(user_id).update_attribute(:skill, score)
 | |
|       end
 | |
|     end
 | |
|     puts "=== UserScore#skill calculate Completed. skill users count: #{users_skill.count}"
 | |
|     puts ""
 | |
| 
 | |
|     # active 项目贡献得分
 | |
|     users_active = {}
 | |
|     # 提交代码
 | |
|     Changeset.includes(:user).all.each do |changeset|
 | |
|       if changeset.user.nil?
 | |
|         next
 | |
|       end
 | |
|       users_active[changeset.user.id] = users_active[changeset.user.id].to_i + 4
 | |
|       project = changeset.project
 | |
|       unless project.nil?
 | |
|         if changeset.user.member_of?(project)
 | |
|           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
 | |
|     end
 | |
|     puts ":push_code calculate Completed. active users count: #{users_active.count}"
 | |
|     #提交文档
 | |
|     Document.includes(:user).all.each do |document|
 | |
|       if document.user.nil?
 | |
|         next
 | |
|       end
 | |
|       users_active[document.user.id] = users_active[document.user.id].to_i + 4
 | |
|       project = document.project
 | |
|       unless project.nil?
 | |
|         if document.user.member_of?(project)
 | |
|           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
 | |
|     end
 | |
|     puts ":push_document calculate Completed. active users count: #{users_active.count}"
 | |
|     #提交附件
 | |
|     Attachment.includes(:author).all.each do |attachment|
 | |
|       #if attachment.container_id_changed?
 | |
|       #  type = attachment.container_type
 | |
|       #  types = %w|Document News Version Project Issue Message WikiPage|
 | |
|       #  if types.include?(type)
 | |
|       if attachment.author.nil?
 | |
|         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?
 | |
|           if attachment.author.member_of?(project)
 | |
|             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
 | |
|     end
 | |
|     puts ":push_file calculate Completed. active users count: #{users_active.count}"
 | |
|     #更新完成度
 | |
|     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?
 | |
|         if j.user.member_of?(project)
 | |
|           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
 | |
|     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?
 | |
|         if issue.author.member_of?(project)
 | |
|           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
 | |
|     end
 | |
|     puts ":post_issue calculate Completed. active users count: #{users_active.count}"
 | |
| 
 | |
| 
 | |
|     UserScore.transaction do
 | |
|       users_active.each do |user_id, score|
 | |
|         UserScore.find_or_create_by_user_id(user_id).update_attribute(:active, score)
 | |
|       end
 | |
|     end
 | |
|     puts "=== UserScore#active calculate Completed. active users count: #{users_active.count}"
 | |
|     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
 | |
| 
 | |
| desc "create tmp file, to test"
 | |
| file 'tmp/test.yml' do
 | |
|   require 'yaml'
 | |
|   var = {
 | |
|       :name => "name",
 | |
|       :age => "age",
 | |
|       :agent => "agent"
 | |
|   }
 | |
|   File.open('tmp/test.yml', 'w') do |f|
 | |
|     f.write YAML.dump({'conf' => var})
 | |
|   end
 | |
| end |