forgeplus/app/controllers/competition_infos_controlle...

706 lines
35 KiB
Ruby
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

class CompetitionInfosController < ApplicationController
include ApplicationHelper
before_action :find_competition, only: [:show, :edit, :update, :update_zone_or_sub, :enroll, :upload, :enroll_status,
:statistics, :import, :import_template, :enroll_list, :ranking_list, :enroll_update, :enroll_status_update, :apply_status_update,
:upload_enroll_template, :upload_apply_template, :enroll_template, :apply_template, :online_switch, :destroy, :update_expert_audit]
before_action :require_admin, only: [:new, :edit, :create, :destroy]
before_action :check_competition_manager, only: [:update, :enroll_status_update, :online_switch, :enroll_template]
before_action :check_competition_manager_and_expert, only: [:enroll_list]
before_action :require_login, only: [:enroll, :enroll_update, :enroll_status_update, :upload, :upload_enroll_template, :update_expert_audit]
skip_before_action :verify_authenticity_token, :only => [:update_expert_audit]
def index
competition_infos = CompetitionInfo.order(sort_no: :desc)
competition_infos = competition_infos.where("competition_infos.title like ?", "%#{params[:name]}%") if params[:name].present?
competition_infos = competition_infos.joins(:watchers).where(watchers: { user_id: current_user.id }) if params[:category].to_s == "watched"
competition_infos = competition_infos.joins(:competition_users).where(competition_users: { user_id: current_user.id }) if params[:category].to_s == "joined"
competition_infos = competition_infos.where(status: ActiveModel::Type::Boolean.new.cast(params[:status])) if ActiveModel::Type::Boolean.new.cast(params[:status]).present?
if params[:is_expert_audit].present?
competition_infos = competition_infos.where(:is_expert_audit => params[:is_expert_audit].to_s == "true")
end
@competition_infos = paginate(competition_infos)
respond_to do |format|
format.html
format.json { render_ok(data: @competition_infos.as_json, count: competition_infos.count) }
end
end
def list
@competition_infos = CompetitionInfo.order(sort_no: :desc)
@competition_infos = @competition_infos.where(id: params[:ids].to_s.split(",")) if params[:ids].present?
end
def recommend
sort_direction = ["asc", "desc"].include?(params[:sort_direction].to_s) ? params[:sort_direction] : "desc"
sort_by = params[:sort_by] || "created_at"
competition_infos = CompetitionInfo.where(status: true)
competition_infos = competition_infos.where("title like ?", "%#{params[:name]}%") if params[:name].present?
@total_count = competition_infos.count
if sort_by.to_s == "hot"
competition_infos = competition_infos.select("competition_infos.*, (SELECT count(1) from competition_users where competition_users.competition_info_id = competition_infos.id ) as count").order("count #{sort_direction}")
elsif sort_by.to_s == "new"
sort_by = "created_at"
competition_infos = competition_infos.order("#{sort_by} #{params[:sort_direction]}")
else
competition_infos = competition_infos.order("#{sort_by} #{params[:sort_direction]}")
end
@competition_infos = paginate(competition_infos)
render_ok(data: @competition_infos.as_json, count: @total_count)
end
def update_expert_audit
@competition_info.update_attributes(:is_expert_audit => params[:is_expert_audit].to_s == "true")
render_ok
end
# GET /competition_infos/new
def new
@competition_info = CompetitionInfo.new
end
# GET /competition_infos/1/edit
def edit
respond_to do |format|
format.html
format.json { render_ok(data: @competition_info.as_json) }
end
end
# POST /competition_infos.json
def create
@competition_info = CompetitionInfo.new(competition_info_params)
@competition_info.admin_data = params[:admin_data] if params[:admin_data].present?
respond_to do |format|
if @competition_info.save
format.html { redirect_to competition_infos_path, notice: '创建成功.' }
format.json { render_ok(data: @competition_info.as_json) }
else
format.html { render :new }
format.json { render json: @competition_info.errors, status: -1 }
end
end
end
# PATCH/PUT /competition_infos/1.json
def update
# @competition_info = CompetitionInfo.find params[:id]
respond_to do |format|
@competition_info.admin_data = params[:admin_data] if params[:admin_data].present?
if @competition_info.update!(competition_info_params)
format.html { redirect_to competition_infos_path, notice: '更新成功.' }
format.json { render_ok(data: @competition_info.as_json) }
else
format.html { render :edit }
format.json { render json: @competition_info.errors, status: -1 }
end
end
end
def online_switch
if @competition_info.status
@competition_info.update_attributes!(status: false)
else
@competition_info.update_attributes!(status: true)
end
render_ok
end
def update_zone_or_sub
tip_exception "参数错误" if params[:new].blank? || params[:old].blank? || params[:type].blank?
if params[:type].to_s == "zone"
competition_users = CompetitionUser.where(competition_info: @competition_info.id).where(zone: params[:old].to_s)
competition_users.update_all(zone: params[:new].to_s)
elsif params[:type].to_s == "sub"
competition_users = CompetitionUser.where(competition_info: @competition_info.id).where(sub_competition: params[:old].to_s)
competition_users.update_all(sub_competition: params[:new].to_s)
end
render_ok
end
def import
return render_error('请上传正确的文件') if params[:file].blank? || !params[:file].is_a?(ActionDispatch::Http::UploadedFile)
ActiveRecord::Base.transaction do
doc = SimpleXlsxReader.open(params[:file].tempfile)
enroll_fields = @competition_info.enroll_fields.stringify_keys.except("ID")
# 获取第一张工作表的第一行作为列名
sheet = doc.sheets.first
column_names = sheet.rows.first
success_count = 0
failed_count = 0
sheet.rows[1..-1].each do |row|
send_data = {}
enroll_fields.each do |key, value|
target_index = column_names.index(key)
next if target_index.nil?
send_data[value] = row[target_index]
end
members_keys = column_names - enroll_fields.keys - ["*用户标识"]
if EduSetting.get("is_local") == "true"
members_keys = members_keys.each_slice(3).to_a
else
members_keys = members_keys.each_slice(5).to_a
end
member_array = []
members_keys.each do |ma|
member = {}
ma.each_with_index do |i, index|
if index == 0
key_name = "key"
member[key_name] = index
else
key_name = "real_name" if i.end_with?("姓名")
key_name = "org_name" if i.end_with?("单位")
key_name = "phone" if i.end_with?("手机号")
key_name = "zw" if i.end_with?("职务")
key_name = "jx" if i.end_with?("jx")
member[key_name] = row[column_names.index(i)]
end
end
member_array << member
end
send_data["members"] = member_array
login_index = column_names.index("*用户标识")
user = User.find_by(login:row[login_index]) || User.find_by(phone: send_data['phone'])
if user.present?
begin
cu = @competition_info.competition_users.new(user_id: user.id)
cu.attributes = send_data
cu.save!
success_count += 1
rescue => e
failed_count += 1
end
else
failed_count += 1
end
end
render_ok({success_count: success_count, failed_count: failed_count})
end
rescue => e
render_error("读取Excel文件失败: #{e.message}")
end
def import_template
respond_to do |format|
format.json
format.xlsx {
set_export_cookies
enroll_fields = @competition_info.enroll_fields.except("ID")
@table_columns = ["*用户标识"] | enroll_fields.keys
if EduSetting.get("is_local") == "true"
@table_columns = @table_columns + ["*成员姓名", "*成员单位", "*成员手机号"]
else
@table_columns = @table_columns + ["*成员姓名", "*成员单位", "*成员手机号", "*职务", "*jx"]
end
render xlsx: "竞赛报名导入模板", template: "competition_infos/import_template.xlsx.axlsx", locals: { table_columns: @table_columns }
}
end
end
def enroll_list
competition_users = CompetitionUser.where(competition_info: @competition_info.id).order("updated_at desc")
zones = @competition_info.manager_zones(current_user)
if params[:zone].present?
competition_users = zones.include?(params[:zone].to_s) ? competition_users.where(zone: params[:zone].to_s) : competition_users.where(zone: [])
else
competition_users = current_user.admin? ? competition_users : competition_users.where(zone: zones)
end
competition_users = competition_users.where(sub_competition: params[:sub_competition].to_s) if params[:sub_competition].present?
if params[:keyword].present?
if ["tzb2025"].include?(@competition_info.identifier)
if params[:apply_status].present?
competition_users = competition_users.where("competition_users.org_name LIKE :keyword OR competition_users.leader LIKE :keyword OR competition_users.phone LIKE :keyword", keyword: "%#{params[:keyword].to_s}%")
else
competition_users = competition_users.where("competition_users.ext4 LIKE :keyword OR competition_users.ext5 LIKE :keyword ", keyword: "%#{params[:keyword].to_s}%")
end
else
competition_users = competition_users.where("competition_users.org_name LIKE :keyword OR competition_users.leader LIKE :keyword OR competition_users.phone LIKE :keyword", keyword: "%#{params[:keyword].to_s}%")
end
end
if params[:status].present?
competition_users = competition_users.where(status: params[:status].to_s.split(","))
end
if params[:apply_status].present?
competition_users = competition_users.where(ext3: params[:apply_status].to_s.split(","))
else
if ["yys2025", "tzb2025"].include?(@competition_info.identifier)
if params[:type]=="un_file"
competition_users = competition_users.where("leader is not null and phone is not null and org_name is not null")
else
competition_users = competition_users.where("competition_users.enroll_template_id is not null")
end
end
end
if params[:upload].to_s == "true"
# competition_users = competition_users.joins("join attachments on attachments.container_type='CompetitionUser' and attachments.container_id = competition_users.id")
competition_users = competition_users.where(status: 3)
end
if params[:sub_item].present?
competition_users = competition_users.where(sub_item: params[:sub_item])
end
competition_users = competition_users.where(id: params[:included_ids].to_s.split(",")) if params[:included_ids].present?
competition_users = competition_users.where.not(id: params[:excluded_ids].to_s.split(",")) if params[:excluded_ids].present?
@competition_users_count = competition_users.count
competition_users = competition_users.select("DISTINCT competition_users.*")
if params[:sort_by].present? && params[:sort_direction].present?
sort_by = CompetitionUser.column_names.include?(params[:sort_by]) ? params[:sort_by] : 'updated_at'
sort_direction = %w(desc asc).include?(params[:sort_direction]) ? params[:sort_direction] : 'desc'
competition_users = competition_users.reorder("#{sort_by} #{sort_direction}")
end
@competition_users = paginate(competition_users)
respond_to do |format|
format.json
# 导出功能
format.xlsx {
set_export_cookies
competition_users = params[:upload].to_s == "true" ? competition_users.where(status: [2, 3]) : competition_users.where(status: [1, 2, 3])
enroll_fields = @competition_info.enroll_fields
enroll_fields = enroll_fields.delete_if { |key, value| ["sub_item", "works_name", "works_url"].include?(value) } if params[:upload].to_s != "true"
@table_columns = ["序号"] | enroll_fields.keys
# @table_columns = @table_columns + %w(参赛报名表下载链接)
@table_columns = @table_columns + %w(作品下载链接) if params[:upload].to_s == "true" && !enroll_fields.values.include?("works_url")
@table_columns = @table_columns + %w(申请表下载链接) if params[:apply_status].present?
@table_columns = @table_columns + %w(bm审查下载链接) if @competition_info.identifier == "KXSYSJ-2024" && params[:upload].to_s == "true"
# 重排成员放最后
enroll_fields_values = enroll_fields.values - ["members_to_string"] + ["members_to_string"]
@export_infos = []
@export_infos_new = []
@only_files = []
max_members = []
file_count=0
competition_users.each_with_index do |u, index|
info_array = []
info_array.push(index + 1)
file_array = []
# file = Attachment.where_id_or_uuid(u.enroll_template_id).first
# file_array = file_array + [file.blank? ? "" : "#{EduSetting.get('host_name')}/#{download_url(file)}"]
if params[:upload].to_s == "true" && !enroll_fields.values.include?("works_url")
# file_array = file_array + [u.attachments.blank? ? "" : "#{EduSetting.get('host_name')}/#{download_url(u.attachments.first)}"]
file_array = file_array + [u.attachment_files]
end
if params[:only_files].to_s == "true"
u.attachments.each do |attach|
file_count += 1
@only_files.push(["作品#{file_count}", attach.filename])
end
end
if params[:apply_status].present?
file = Attachment.where_id_or_uuid(u.ext2).first
file_array = file_array + [file.blank? ? "" : "#{EduSetting.get('host_name')}/#{download_url(file)}"]
end
if @competition_info.identifier == "KXSYSJ-2024" && params[:upload].to_s == "true"
file = Attachment.where_id_or_uuid(u.bm_file_id).first
file_array = file_array + [file.blank? ? "" : "#{EduSetting.get('host_name')}/#{download_url(file)}"]
end
enroll_fields_values.each do |val|
if "members_to_string" == val.to_s
members = u.send("#{val}")
max_members.push(members.size)
info_array = info_array + file_array + members
else
info_array.push("#{u.send("#{val}")}")
end
end
@export_infos.push(info_array)
end
Rails.logger.info("######_______________1111########@export_infos: #{@export_infos}")
if max_members.present? && max_members.max > 1
max_members.max.times do |n|
@table_columns = @table_columns - ["成员"]
@table_columns.push("成员#{n + 1}")
end
total_col = enroll_fields.values.size + max_members.max.to_i
@export_infos.each do |info|
blank_str = []
(total_col - 1 - info.size).times do
blank_str.push("")
end
@export_infos_new.push(info + blank_str)
end
else
@table_columns = @table_columns - ["成员"] + ["成员"]
@export_infos_new = @export_infos
end
export_name = "竞赛报名列表_#{Time.now.strftime('%Y%m%d_%H%M%S')}"
export_name = "竞赛作品列表_#{Time.now.strftime('%Y%m%d_%H%M%S')}" if params[:upload].to_s == "true"
Rails.logger.info("######_______________########export_infos_new: #{@export_infos_new}")
if params[:only_files].to_s == "true"
render xlsx: "作品清单_#{Time.now.strftime('%Y%m%d_%H%M%S')}", template: "competition_infos/enroll_list.xlsx.axlsx", locals: { table_columns: ["序号","作品名称"], export_infos: @only_files }
else
render xlsx: "#{export_name.strip}", template: "competition_infos/enroll_list.xlsx.axlsx", locals: { table_columns: @table_columns, export_infos: @export_infos_new }
end
}
format.zip {
competition_users = params[:upload].to_s == "true" ? competition_users.where(status: [2, 3]) : competition_users.where(status: [1, 2, 3])
Rails.logger.info("######_______________########competition_users.size: #{competition_users.size}")
service = Competition::ZipWorkFileService.new(competition_users, "files", params[:file_index])
send_file service.zip, filename: service.filename, type: 'application/zip'
}
end
end
def enroll_template
file_attr_name = params[:file].to_s == "bm_file_id" ? params[:file].to_s : "enroll_template_id"
competition_users = CompetitionUser.where(competition_info: @competition_info.id).order("updated_at desc")
competition_users = competition_users.where(status: [1, 2, 3])
competition_users = competition_users.where("competition_users.enroll_template_id is not null") if file_attr_name.to_s == "enroll_template_id"
competition_users = competition_users.where("competition_users.bm_file_id is not null") if file_attr_name.to_s == "bm_file_id"
zones = @competition_info.manager_zones(current_user)
if params[:zone].present?
competition_users = zones.include?(params[:zone].to_s) ? competition_users.where(zone: params[:zone].to_s) : competition_users.where(zone: [])
else
competition_users = current_user.admin? ? competition_users : competition_users.where(zone: zones)
end
if params[:sub_competition].present?
competition_users = competition_users.where(sub_competition: params[:sub_competition].to_s)
end
if params[:keyword].present?
competition_users = competition_users.where("competition_users.org_name LIKE :keyword OR competition_users.leader LIKE :keyword OR competition_users.phone LIKE :keyword", keyword: "%#{params[:keyword].to_s}%")
end
respond_to do |format|
format.json
format.zip {
Rails.logger.info("######_______________########competition_users.size: #{competition_users.size}")
service = Competition::ZipEnrollTemplateService.new(competition_users, "files", file_attr_name)
send_file service.zip, filename: service.filename, type: 'application/zip'
}
end
end
def apply_template
competition_users = CompetitionUser.where(competition_info: @competition_info.id).order("updated_at desc")
competition_users = competition_users.where(status: [1, 2, 3]).where("competition_users.ext2 is not null")
zones = @competition_info.manager_zones(current_user)
if params[:zone].present?
competition_users = zones.include?(params[:zone].to_s) ? competition_users.where(zone: params[:zone].to_s) : competition_users.where(zone: [])
else
competition_users = current_user.admin? ? competition_users : competition_users.where(zone: zones)
end
if params[:sub_competition].present?
competition_users = competition_users.where(sub_competition: params[:sub_competition].to_s)
end
if params[:keyword].present?
competition_users = competition_users.where("competition_users.org_name LIKE :keyword OR competition_users.leader LIKE :keyword OR competition_users.phone LIKE :keyword", keyword: "%#{params[:keyword].to_s}%")
end
respond_to do |format|
format.json
format.zip {
Rails.logger.info("######_______________########competition_users.size: #{competition_users.size}")
service = Competition::ZipApplyTemplateService.new(competition_users, "files")
send_file service.zip, filename: service.filename, type: 'application/zip'
}
end
end
def show
@competition_info.increment!(:visits)
end
def enroll_status_update
competition_user = CompetitionUser.find_by(competition_info: @competition_info.id, user_id: params[:user_id])
tip_exception "未找到该报名用户" if competition_user.blank?
tip_exception "状态参数错误" unless ['0', '1', '2'].include?(params[:status].to_s)
old_status = competition_user.status
stage = competition_user.ext5
# 作品驳回时得分清0
if old_status.to_i == 3 && params[:status].to_i ==2
stage_score = competition_user.competition_user_scores.find_by(stage: stage.to_i)
stage_score.update_attributes!(score: 0, last_score: 0) if stage_score.present?
competition_user.update_attributes!(score: 0)
cache_key = "limit_forbid_control:#{@competition_info.identifier}:competition_api_score:#{competition_user.id}-#{stage}"
Rails.cache.delete(cache_key)
api_score_control = LimitForbidControl::CompetitionApiScore.new(@competition_user&.id)
api_score_control.clear
end
competition_user.update_attributes!(status: params[:status].to_i)
render_ok
end
def apply_status_update
competition_user = CompetitionUser.find_by(competition_info: @competition_info.id, user_id: params[:user_id])
tip_exception "未找到该报名用户" if competition_user.blank?
tip_exception "状态参数错误" unless ['0', '1', '2'].include?(params[:status].to_s)
competition_user.update_attributes!(ext3: params[:status].to_i)
render_ok
end
def enroll
competition_user = CompetitionUser.find_by(competition_info: @competition_info.id, user_id: current_user.id)
tip_exception "您已经报名!" if competition_user.present?
competition_user = CompetitionUser.new(enroll_params)
competition_user.competition_info = @competition_info
competition_user.user = current_user
competition_user.members = params[:members]
competition_user.status = 1 if competition_user.status.to_i == 0
competition_user.status = 2 if @competition_info.identifier.include?("qz202")
# competition_user.status = 2 if @competition_info.identifier.include?("tzb2025")
if @competition_info.identifier.to_s.downcase.include?("kxsysj-2024-2")
if CompetitionUser.where(competition_info: @competition_info.id).where(ext1: competition_user.ext1).present?
tip_exception "一个作品复赛序号只能一个队伍使用,如有作品复赛序号被冒用,咨询大赛组委会进行删除或其他操作。"
end
competition_user.status = 2
end
if @competition_info.identifier.to_s.downcase.include?("tzb2025")
if CompetitionUser.where(competition_info: @competition_info.id).where(status: [1, 2, 3])
.where(ext4: competition_user.ext4).where(ext5: competition_user.ext5).present?
tip_exception "该参赛团队报名表已提交,无法再次提交。"
end
end
competition_user.save
render_ok
end
def enroll_update
competition_user = CompetitionUser.find_by(competition_info: @competition_info.id, user_id: current_user.id)
tip_exception "未报名,请先报名" if competition_user.blank?
competition_user.update_attributes!(enroll_params)
competition_user.members = params[:members]
competition_user.status = 1 if competition_user.status.to_i == 0
competition_user.status = 2 if @competition_info.identifier.include?("qz202")
# competition_user.status = 2 if @competition_info.identifier.include?("tzb2025")
if @competition_info.identifier.to_s.downcase.include?("kxsysj-2024-2")
if CompetitionUser.where(competition_info: @competition_info.id).where(ext1: competition_user.ext1)
.where(status: [2,3]).where.not(id: competition_user.id).present?
tip_exception "一个作品复赛序号只能一个队伍使用,如有作品复赛序号被冒用,咨询大赛组委会进行删除或其他操作。"
end
competition_user.status = 2
end
if @competition_info.identifier.to_s.downcase.include?("tzb2025")
if CompetitionUser.where(competition_info: @competition_info.id)
.where(ext4: competition_user.ext4).where(ext5: competition_user.ext5)
.where(status: [1, 2, 3]).where.not(id: competition_user.id).present?
tip_exception "该参赛团队报名表已提交,无法再次提交。"
end
end
competition_user.save
render_ok
end
def upload_enroll_template
competition_user = CompetitionUser.find_by(competition_info: @competition_info.id, user_id: current_user.id)
tip_exception "未报名,请先报名" if competition_user.blank?
tip_exception "附件参数enroll_template_id不能为空" if params[:enroll_template_id].blank?
competition_user.update_attributes!(enroll_template_id: params[:enroll_template_id])
render_ok
end
def upload_apply_template
competition_user = CompetitionUser.find_by(competition_info: @competition_info.id, user_id: current_user.id)
# tip_exception "未报名,请先报名" if competition_user.blank?
if competition_user.blank? && ["yys2025", "tzb2025"].include?(@competition_info.identifier)
competition_user = CompetitionUser.new
competition_user.competition_info = @competition_info
competition_user.user = current_user
competition_user.status = 2
competition_user.save
else
tip_exception "未报名,请先报名" unless competition_user.present?
end
tip_exception "附件参数apply_template_id不能为空" if params[:apply_template_id].blank?
competition_user.update_attributes!(ext2: params[:apply_template_id], ext3: 1)
render_ok
end
def enroll_status
@stage = params[:stage] || params[:ext5]
@competition_user = CompetitionUser.find_by(competition_info: @competition_info.id, user_id: current_user.id)
# first_round_ids = CompetitionUser.where(competition_info_id: @competition_info.id).where("score > 26").pluck(:id)
# 第一轮赛合格人员
first_round_ids = [541, 543, 544, 545, 546, 548, 550, 551, 552, 554, 555, 556, 558, 560, 563, 565, 567, 576, 579, 581]
@second_round = first_round_ids.include?(@competition_user&.id)
if @competition_info.identifier.to_s == "dmsc" || @competition_info.identifier.to_s == "zswd"
cache_key = "limit_forbid_control:#{@competition_info.identifier}:competition_api_score:#{@competition_user&.id}-#{@stage}"
@count_control = Rails.cache.read(cache_key)
else
api_score_control = LimitForbidControl::CompetitionApiScore.new(@competition_user&.id)
@count_control = api_score_control.forbid?
end
end
def upload
@stage = params[:stage] || params[:ext5]
competition_user = CompetitionUser.find_by(competition_info: @competition_info.id, user_id: current_user.id)
tip_exception "未报名,请先报名" if competition_user.blank?
# tip_exception "附件参数attachment_ids不能为空" if params[:attachment_ids].blank?
# 第一轮赛合格人员
# first_round_ids = CompetitionUser.where(competition_info_id: @competition_info.id).where("score > 26").pluck(:id)
first_round_ids = [541, 543, 544, 545, 546, 548, 550, 551, 552, 554, 555, 556, 558, 560, 563, 565, 567, 576, 579, 581]
tip_exception "您不在复赛名单中,不能参加复赛!" if @competition_info.identifier == "zstp2022" && !first_round_ids.include?(competition_user&.id)
if @competition_info.identifier.to_s == "dmsc" || @competition_info.identifier.to_s == "zswd"
cache_key = "limit_forbid_control:#{@competition_info.identifier}:competition_api_score:#{competition_user.id}-#{@stage}"
allow_count = 1
count_control = Rails.cache.read(cache_key)
if count_control.present? && count_control.to_i >= allow_count
return normal_status(-1, "打分受限当前竞赛仅支持3天打一次榜")
else
Rails.cache.write(cache_key, count_control.to_i + 1, expires_in: 5.minutes)
end
else
api_score_control = LimitForbidControl::CompetitionApiScore.new(competition_user.id)
return normal_status(-1, "今日打分已达上限,请明日再试") if api_score_control.forbid?
api_score_control.increment!
end
competition_user.bm_file_id = params[:bm_file_id] if params[:bm_file_id].present?
# tip_exception "您已经提交作品!" if competition_user.present? && competition_user.attachments.present?
if params[:attachment_ids].present?
competition_user.attachments.update_all(container_id: nil, container_type: nil)
params[:attachment_ids].each do |id|
attachment = Attachment.where_id_or_uuid(id).first
unless attachment.blank?
attachment.container = competition_user
attachment.author_id = current_user.id
attachment.description = ""
attachment.save
end
forge_url = Rails.application.config_for(:configuration)['platform_url'] || EduSetting.get("main_site")
filePath = "#{forge_url}/api/attachments/#{attachment.id}"
if EduSetting.get("competition_ccks_ids").to_s.split(",").include?(@competition_info.identifier.to_s)
api_url = "/script/ccks"
CompetitionAutoScoreNewJob.perform_later(competition_user.id, api_url, filePath)
elsif EduSetting.get("competition_zstp2023_ids").to_s.split(",").include?(@competition_info.identifier.to_s)
api_url = "/script/ccks2023"
CompetitionAutoScoreNewJob.perform_later(competition_user.id, api_url, filePath)
elsif @competition_info.identifier.to_s == "dmsc"
api_url = "/script/qyCode"
CompetitionAutoScoreNewJob.perform_later(competition_user.id, api_url, filePath, @stage)
elsif @competition_info.identifier.to_s == "zswd"
api_url = "/script/qyMilitary"
CompetitionAutoScoreNewJob.perform_later(competition_user.id, api_url, filePath, @stage)
elsif @competition_info.identifier.to_s == "mmlss"
api_url = "/script/mmlssEval"
CompetitionAutoScoreNewJob.perform_later(competition_user.id, api_url, filePath, @stage)
elsif @competition_info.identifier.to_s == "zstp2025"
api_url = "/script/ccks2025"
CompetitionAutoScoreNewJob.perform_later(competition_user.id, api_url, filePath)
end
end
end
competition_user.sub_item = params[:sub_item] if params[:sub_item].present?
competition_user.works_name = params[:works_name] if params[:works_name].present?
competition_user.works_url = params[:works_url] if params[:works_url].present?
if @stage.present?
competition_user.update_attributes!(api_status: 1, status: 3, ext5: @stage)
else
competition_user.update_attributes!(api_status: 1, status: 3)
end
render_ok
end
# 自动打分接口
def auto_score
filePath = params[:filePath].to_s
team_id = params[:team_id].to_s
api_url = params[:api_url].to_s
tip_exception("参数错误") if filePath.blank? || team_id.blank? || api_url.blank?
competition_team = CompetitionTeam.find team_id
competition_team.update_attributes!(api_status: 1)
api_score_control = LimitForbidControl::CompetitionApiScore.new(team_id)
return normal_status(-1, "今日打分已达上限,请明日再试") if api_score_control.forbid?
api_score_control.increment!
CompetitionAutoScoreJob.perform_later(team_id, api_url, filePath)
render_ok
end
# 赛事风采
def statistics
@competition_users = @competition_info.competition_users.where(status: [1, 2, 3])
@upload_count = @competition_users.joins("join attachments on attachments.container_type='CompetitionUser' and attachments.container_id = competition_users.id").count
end
# 排名
def ranking_list
@stage = params[:stage] || params[:ext5]
if @stage.present?
competition_users = @competition_info.competition_users.joins(:competition_user_scores)
.where("competition_users.status = 3")
.where("competition_user_scores.stage = ? ", @stage.to_i)
.where("competition_user_scores.score > 0")
.order("competition_user_scores.score desc, competition_user_scores.created_at asc")
@rank_num = competition_users.pluck(:id)
if params[:keyword].present?
competition_users = competition_users.where("competition_users.org_name LIKE :keyword OR competition_users.leader LIKE :keyword OR competition_users.ext4 LIKE :keyword ", keyword: "%#{params[:keyword].to_s}%")
end
@competition_users_count = competition_users.count
@competition_users = paginate(competition_users)
else
competition_users = @competition_info.competition_users.where("competition_users.status = 3").where("score > 0").order("score desc, created_at asc")
@rank_num = competition_users.pluck(:id)
if params[:keyword].present?
competition_users = competition_users.where("competition_users.org_name LIKE :keyword OR competition_users.leader LIKE :keyword OR competition_users.ext4 LIKE :keyword ", keyword: "%#{params[:keyword].to_s}%")
end
@competition_users_count = competition_users.count
@competition_users = paginate(competition_users)
end
end
def tzb_actived
tip_exception "请输入激活码" if params[:code].blank?
SyncCompetitionTzbUserJob.perform_later("code")
tzb_user = CompetitionTzbUser.find_by(activation_code: params[:code])
tip_exception "激活码正在同步确认中,请稍后再试" if tzb_user.blank?
tip_exception "激活码正在同步确认中,请稍后再试" if tzb_user.user_id.blank?
user = User.find_by(id: tzb_user.user_id)
successful_authentication(user)
tzb_user.update_attributes!(actived: true)
render_ok({ user: { login: user.login, mail: user.mail, password: tzb_user.pwd } })
end
def destroy
if @competition_info.destroy!
flash[:success] = '删除成功'
else
flash[:danger] = '删除失败'
end
redirect_to "api/competition_infos"
end
private
def enroll_params
params.permit(:org_name, :org_job, :org_rank, :leader, :zone, :sub_competition, :phone,
:subject_source_type, :subject_source_name, :enroll_template_id, :mail, :ext1, :ext2, :ext3, :ext4, :ext5,
:bm_file_id, :teacher_name, :teacher_dept, :teacher_email, :teacher_phone, :teacher_professional)
end
def competition_info_params
params.require(:competition_info).permit(:title, :zones, :zones_local, :sub_competitions, :identifier, :content, :description, :org_name,
:video_url, :is_local, :manager_ids, :upload_date, :enroll_date, :guide, :about_us,
:banner_url, :enroll_template, :enroll_columns, :applet_banner_url, :start_at,:start_upload_date, :sort_no,
:ext1, :ext2, :ext3, :ext4, :ext5, :ext6, :ext7, :ext8, :is_expert_audit)
end
def find_competition
if CompetitionInfo.where(:identifier => params[:id]).exists?
@competition_info = CompetitionInfo.where(:identifier => params[:id]).first
else
@competition_info = CompetitionInfo.find(params[:id])
end
end
def manager_competition_zones
if current_user.admin?
@competition_info.competition_zones
else
@competition_info.manager_zones(current_user)
end
end
def check_competition_manager
unless @competition_info.is_manager?(current_user)
tip_exception(403, "你没有权限操作!")
end
end
def check_competition_manager_and_expert
unless @competition_info.is_manager?(current_user) || current_user.is_expert?
tip_exception(403, "你没有权限操作!")
end
end
end