forked from Trustie/forgeplus
195 lines
5.4 KiB
Ruby
195 lines
5.4 KiB
Ruby
# == Schema Information
|
|
#
|
|
# Table name: competition_users
|
|
#
|
|
# id :integer not null, primary key
|
|
# competition_info_id :integer
|
|
# user_id :integer
|
|
# leader :string(255)
|
|
# org_name :string(255)
|
|
# org_job :string(255)
|
|
# org_rank :string(255)
|
|
# zone :string(255)
|
|
# sub_competition :string(255)
|
|
# subject_source_type :integer
|
|
# subject_source_name :string(255)
|
|
# phone :string(255)
|
|
# members :text(65535)
|
|
# created_at :datetime not null
|
|
# updated_at :datetime not null
|
|
# status :integer default("0")
|
|
# enroll_template_id :integer
|
|
# mail :string(255)
|
|
# ext1 :string(255)
|
|
# ext2 :string(255)
|
|
# ext3 :string(255)
|
|
# api_status :integer default("0")
|
|
# api_result :text(65535)
|
|
# score :float(24) default("0")
|
|
#
|
|
# Indexes
|
|
#
|
|
# index_competition_users_on_competition_info_id (competition_info_id)
|
|
# index_competition_users_on_user_id (user_id)
|
|
#
|
|
|
|
class CompetitionUser < ApplicationRecord
|
|
belongs_to :competition_info, counter_cache: true
|
|
belongs_to :user
|
|
|
|
has_many :attachments, as: :container, dependent: :destroy
|
|
has_many :competition_user_scores, dependent: :destroy
|
|
|
|
validates :user_id, uniqueness: { scope: :competition_info_id}
|
|
|
|
# 报名扩展字段应用记录
|
|
# ext5:竞赛阶段
|
|
# ext1:指导老师
|
|
# ext2:申请模板文件
|
|
# ext3:申请模板状态
|
|
# ext4:参赛队伍名称
|
|
|
|
serialize :members, JSON
|
|
|
|
# %i[real_name org_name org_job org_rank].each do |method_name|
|
|
# define_method method_name do
|
|
# members&.[](method_name.to_s)
|
|
# end
|
|
#
|
|
# define_method "#{method_name}=" do |value|
|
|
# self.config ||= {}
|
|
# members.[]=(method_name.to_s, value)
|
|
# end
|
|
# end
|
|
#
|
|
|
|
scope :with_member_phone, -> (phone) {
|
|
where("members LIKE ?", "%\"phone\":\"#{phone}\"%")
|
|
}
|
|
|
|
def members_to_string
|
|
return [] if members.blank?
|
|
str = []
|
|
if members.is_a?(Array)
|
|
members.each do |m|
|
|
str.push("#{m["real_name"]} #{m["org_name"]} #{m["org_job"]} #{m["org_rank"]} #{m["phone"]}")
|
|
end
|
|
else
|
|
m = members
|
|
str.push("#{m["real_name"]} #{m["org_name"]} #{m["org_job"]} #{m["org_rank"]} #{m["phone"]}")
|
|
end
|
|
str
|
|
end
|
|
|
|
def subject_source_from
|
|
self.subject_source_type == 0 ? "自主提报" : self.subject_source_name
|
|
end
|
|
|
|
def api_result_text
|
|
"" if self.api_status != 3 || self.api_result.blank?
|
|
data = JSON.parse self.api_result
|
|
data["msg"].present? ? data["msg"] : data["errorOutput"].present? ? data["errorOutput"] : "系统打分错误,信息不详"
|
|
rescue =>err
|
|
return nil
|
|
end
|
|
|
|
def api_result_data
|
|
{} if self.api_status != 3 || self.api_result.blank?
|
|
data = JSON.parse self.api_result
|
|
data
|
|
rescue =>err
|
|
return {}
|
|
end
|
|
|
|
def apply_template_id
|
|
self.ext2
|
|
end
|
|
|
|
def apply_status
|
|
self.ext3.to_i
|
|
end
|
|
|
|
def last_score
|
|
self.api_status == 2 ? format("%.4f", (self.api_result_data["pass@1"] || self.api_result_data["accuracy"]).to_f).to_f : 0.to_f
|
|
end
|
|
|
|
def stage_score(stage)
|
|
competition_user_scores = self.competition_user_scores.where(stage: stage.to_i).order(score: :desc)
|
|
competition_user_scores.blank? ? 0 : competition_user_scores.first.score.to_f
|
|
end
|
|
|
|
def stage_last_score(stage)
|
|
competition_user_scores = self.competition_user_scores.where(stage: stage.to_i).order(created_at: :desc)
|
|
competition_user_scores.blank? ? 0 : competition_user_scores.first.score.to_f
|
|
end
|
|
|
|
def max_score_json
|
|
competition_user_scores = self.competition_user_scores.where(stage: stage.to_i).order(score: :desc)
|
|
competition_user_scores.blank? ? 0 : competition_user_scores.first.score.to_f
|
|
end
|
|
|
|
def stage_api_status(stage)
|
|
competition_user_scores = self.competition_user_scores.where(stage: stage.to_i).order(created_at: :desc)
|
|
competition_user_scores.blank? ? 0 : competition_user_scores.first.api_status
|
|
end
|
|
|
|
def stage_api_result_text(stage)
|
|
{} if stage_api_status(stage) != 3
|
|
api_result = self.competition_user_scores.where(stage: stage.to_i).order(created_at: :desc).first&.api_result
|
|
{} if api_result.blank?
|
|
data = JSON.parse api_result
|
|
data["msg"].present? ? data["msg"] : data["errorOutput"].present? ? data["errorOutput"] : "系统打分错误,信息不详"
|
|
rescue =>err
|
|
return {}
|
|
end
|
|
|
|
def stage_max_score_data(stage)
|
|
api_result = self.competition_user_scores.where(stage: stage.to_i).order(score: :desc).first&.api_result
|
|
{} if api_result.blank?
|
|
api_result["data"]
|
|
rescue =>err
|
|
return {}
|
|
end
|
|
|
|
def user_login
|
|
self.user&.login.to_s
|
|
end
|
|
|
|
def attachment_names
|
|
names = []
|
|
self.attachments.each do |att|
|
|
names.push att.filename
|
|
end
|
|
names.join("\r\n")
|
|
end
|
|
|
|
def attachment_files
|
|
names = []
|
|
self.attachments.each do |att|
|
|
names.push "#{EduSetting.get('host_name')}/#{download_url(att)}"
|
|
end
|
|
names.join("\r\n")
|
|
end
|
|
|
|
def download_url(attachment)
|
|
attachment&.uuid.present? ? "api/attachments/#{attachment.uuid}" : "api/attachments/#{attachment.id}"
|
|
end
|
|
|
|
def works_name
|
|
if self['works_name'].present?
|
|
self['works_name']
|
|
else
|
|
self.attachment_names
|
|
end
|
|
end
|
|
|
|
def works_url
|
|
if self['works_url'].present?
|
|
self['works_url']
|
|
else
|
|
self.attachment_files
|
|
end
|
|
end
|
|
|
|
end
|