Merge remote-tracking branch 'origin/dev_aliyun' into dev_aliyun

dev_auth
杨树明 5 years ago
commit 39a2492321

@ -16,7 +16,85 @@ class Admins::CompetitionStagesController < Admins::BaseController
def calculate_stage_score
if current_stage.max_end_time && current_stage.max_end_time < Time.now
current_stage.competition_scores.destroy_all
if current_stage.competition_stage_sections.size > 0
# 是否只有老师参赛
only_teacher = current_competition.member_staff.blank?
stage_sections = current_stage.competition_stage_sections.includes(:competition_entries)
shixuns = Shixun.where(identifier: current_stage.competition_entries.pluck(:shixun_identifier).reject(&:blank?))
# 计算每个战队的成绩
current_competition.competition_teams.each do |team|
totoal_score = 0
total_time = 0
user_ids = only_teacher ? team.team_members.pluck(:user_id) : team.team_members.where(is_teacher: 0).pluck(:user_id)
stage_sections.each do |section|
shixun_identifiers = section.competition_entries.pluck(:shixun_identifier).reject(&:blank?)
shixun_ids = shixuns.select{ |shixun| shixun_identifiers.include?(shixun.identifier) }.map(&:id)
end
end
end
if @type == "预赛"
# 'nyog9r7c','yugrij4n','48flws5g','bfgau7s6','mfv6zrj7','f398leqr','qwaffs2p','ose7482b','y5wh2ofx'
# 预赛的实训id 第一阶段118511971195 第二阶段1202, 1210, 1207 第三阶段125412551243
shixun1_id = [2303]
shixun2_id = [2994, 3012, 3024]
shixun3_id = [2944, 2938, 2943]
elsif @type == "决赛"
# '92b7vt8x','a7fxenvc','wt2xfzny','xa4m9cng','tng6heyf','am5o73er','9fla2zry','fzp3iu4w','qlsy6xb4'
# 预赛的实训id 第一阶段128913731256 第二阶段1488, 1453, 1487 第三阶段1470, 1473, 1408
shixun1_id = Shixun.where(:identifier => ['ftlc4x38']).pluck(:id)
shixun2_id = Shixun.where(:identifier => ['y9npgih2','ucqt7fw3','2p7ouzwk']).pluck(:id)
shixun3_id = Shixun.where(:identifier => ['fj49r7xv','gf2cvxfh','cmoxhtbs']).pluck(:id)
end
if @competition.competition_scores.where(:competition_stage_id => @stage.id).count == 0
# 三个阶段的开始时间和结束时间
s1_time = @stage.competition_stage_sections[0].start_time
e1_time = @stage.competition_stage_sections[0].end_time
s2_time = @stage.competition_stage_sections[1].start_time
e2_time = @stage.competition_stage_sections[1].end_time
s3_time = @stage.competition_stage_sections[2].start_time
e3_time = @stage.competition_stage_sections[2].end_time
@records = @competition.competition_teams.includes(:user => [:user_extensions => [:school]])
@records.each do |team|
user_ids = team.team_members.where(:is_teacher => 0).pluck(:user_id)
# 第一阶段的得分和耗时
challenges_1 = Challenge.where(:shixun_id => shixun1_id)
challenge_rate1 = 1.0
result1 = chart_exp_score_pre user_ids, s1_time, e1_time, challenges_1, challenge_rate1, 2
score1 = result1[0]
time1 = result1[1]
# 第二阶段的得分和耗时
challenge_rate2 = 1.0
challenges_2 = Challenge.where(:shixun_id => shixun2_id)
result2 = chart_exp_score_pre user_ids, s2_time, e2_time, challenges_2, challenge_rate2, 2
score2 = result2[0]
time2 = result2[1]
# 第三阶段的得分和耗时
challenges_3 = Challenge.where(:shixun_id => shixun3_id)
result3 = chart_exp_score_third user_ids, s3_time, e3_time, challenges_3
score3 = result3[0]
time3 = result3[1]
team[:s_score] = (score1 + score2 + score3).try(:round, 2)
team[:s_spend_time] = time1 + time2 + time3
# 比赛已截止且未有分数纪录 则创建
if Time.now > e3_time && team.competition_scores.where(:competition_id => @competition.id, :competition_stage_id => @stage.id).count == 0
CompetitionScore.create(:user_id => team.user_id, :competition_team_id => team.id, :competition_id => @competition.id, :competition_stage_id => @stage.id, :score => team[:s_score], :cost_time => team[:s_spend_time])
end
end
end
else
render_error("#{current_stage.name}还未结束")
end
@ -55,4 +133,58 @@ class Admins::CompetitionStagesController < Admins::BaseController
params.permit(:stage_name, :score_rate, stage: [:start_time, :end_time, :mission_count, :entry, :score_source, identifiers: []])
end
# challenges 每阶段的所有关卡
# s_time 阶段开始时间 e_time 阶段结束时间
# rate 关卡经验值与分数的比值
# challenge_count 每个实训的关卡数
# 对三个实训的所有关卡循环: 找到在比赛时间内通关的最低耗时
def chart_stage_score user_ids, s_time, e_time, challenges, s_rate, challenge_count
total_score = 0
total_time = 0
length = challenge_count #每个实训的关卡数
for i in 1..length
score = 0
time = 0
challenges.where(:position => i).each do |challenge|
Game.where(:challenge_id => challenge.id, :user_id => user_ids, :status => 2).select{|game| game.open_time >= s_time && game.end_time <= e_time }.each do |game|
game_score = challenge.score * s_rate
cost_time = (game.end_time.to_i - s_time.to_i) > 0 ? (game.end_time.to_i - s_time.to_i) : 0
if score < game_score
score = game_score
time = cost_time
elsif score == game_score
time = cost_time > time ? time : cost_time
end
end
end
total_score += score
total_time += time
end
return [total_score, total_time]
end
def chart_stage_rate user_ids, s_time, e_time, challenges
# 第三阶段的得分和耗时
score3 = 0
time3 = 0
challenges.each do |challenge|
Game.where(:challenge_id => challenge.id, :user_id => user_ids, :status => 2).select{|game| game.open_time >= s_time && game.end_time <= e_time }.each do |game|
outputs = game.outputs.select{|output| !output.text_scor.nil? && output.created_at <= e_time }
if outputs.present?
outputs = outputs.sort { |a, b| b[:text_scor].to_f <=> a[:text_scor].to_f }
myshixun_score = outputs.first.text_scor.to_f
myshixun_time = outputs.first.created_at.to_i - s_time.to_i
if score3 < myshixun_score
score3 = myshixun_score
time3 = myshixun_time
elsif score3 == myshixun_score
time3 = myshixun_time > time3 ? time3 : myshixun_time
end
end
end
end
return [score3, time3]
end
end

@ -16,14 +16,13 @@ class Competitions::SaveTeamForm
validate :check_teachers_enrollable
def check_teachers_enrollable
if competition.teacher_enroll_forbidden? # 禁止老师报名
return if creator.is_teacher? # 因为创建者有单独校验,所以这里跳过
return if teacher_ids.blank?
if teacher_ids.present?
errors.add(:teacher_ids, :enroll_forbidden)
return
end
return if creator.is_teacher? # 因为创建者有单独校验,所以这里跳过
end
self.teacher_ids = teacher_ids.map(&:to_i)
@ -40,9 +39,9 @@ class Competitions::SaveTeamForm
# 存在已报名老师
enrolled_teacher_members = competition.team_members.where(user_id: all_teachers)
.where.not(competition_team_id: team.id).includes(:user)
.where.not(competition_team_id: team.id).pluck(:user_id)
if enrolled_teacher_members.present?
errors.add(:teacher_ids, :enrolled, names: enrolled_teacher_members.map { |m| m.user.real_name }.join(''))
errors.add(:teacher_ids, :enrolled, names: User.where(id: enrolled_teacher_members).map(&:real_name).join(''))
return
end
end
@ -50,14 +49,13 @@ class Competitions::SaveTeamForm
validate :check_members_enrollable
def check_members_enrollable
if competition.member_enroll_forbidden? # 禁止学生报名
return unless creator.is_teacher? # 因为创建者有单独校验,所以这里跳过
return if member_ids.blank?
if member_ids.present?
errors.add(:member_ids, :enroll_forbidden)
return
end
return unless creator.is_teacher? # 因为创建者有单独校验,所以这里跳过
end
self.member_ids = member_ids.map(&:to_i)
@ -74,9 +72,9 @@ class Competitions::SaveTeamForm
# 存在已报名成员
enrolled_members = competition.team_members.where(user_id: all_members)
.where.not(competition_team_id: team.id).includes(:user)
.where.not(competition_team_id: team.id).pluck(:user_id)
if enrolled_members.present?
errors.add(:member_ids, :enrolled, names: enrolled_members.map { |m| m.user.real_name }.join(''))
errors.add(:member_ids, :enrolled, names: User.where(id: enrolled_members).map(&:real_name).join(''))
return
end
end

@ -50,7 +50,7 @@ class Competition < ApplicationRecord
def competition_status
if !status
com_status = "nearly_published"
elsif end_time > Time.now
elsif end_time.nil? || end_time > Time.now
com_status = "progressing"
else
com_status = "ended"

@ -7,7 +7,7 @@
<th width="8%">报名人数</th>
<th width="8%">指导老师</th>
<th width="8%">参赛者</th>
<th width="14%">主题图片796*397</th>
<th width="14%">主题图片792*340</th>
<th width="8%">创建时间</th>
<th>
操作

@ -252,9 +252,7 @@ class Registration extends React.Component {
}
} else {
//有数据的
if (admin === true) {
if (result.data.my_teams[0].manage_permission === true) {
this.setState({
type: 5,
data: result.data.my_teams,
@ -263,24 +261,8 @@ class Registration extends React.Component {
personal: result.data.personal,
competition_name: result.data.competition_name,
members_count: result.data.members_count
})
} else {
this.setState({
type: 4,
data: result.data.my_teams,
count: result.data.count,
competition_teams: result.data.competition_teams,
personal: result.data.personal,
competition_name: result.data.competition_name,
members_count: result.data.members_count
})
}
} else {
if (result.data.my_teams[0].manage_permission === true) {
//普通账号true 为创建了竞赛
this.setState({
type: 2,
@ -289,22 +271,7 @@ class Registration extends React.Component {
personal: result.data.personal,
competition_name: result.data.competition_name,
members_count: result.data.members_count
})
} else {
//普通账号true 加入了竞赛
this.setState({
type: 3,
data: result.data.my_teams,
count: result.data.count,
personal: result.data.personal,
competition_name: result.data.competition_name,
members_count: result.data.members_count
})
}
}
}
@ -975,3 +942,56 @@ class Registration extends React.Component {
}
export default Registration;
// if (admin === true) {
// // if (result.data.my_teams[0].manage_permission === true) {
// this.setState({
// type: 5,
// data: result.data.my_teams,
// count: result.data.count,
// competition_teams: result.data.competition_teams,
// personal: result.data.personal,
// competition_name: result.data.competition_name,
// members_count: result.data.members_count
//
//
// })
// // } else {
// // this.setState({
// // type: 4,
// // data: result.data.my_teams,
// // count: result.data.count,
// // competition_teams: result.data.competition_teams,
// // personal: result.data.personal,
// // competition_name: result.data.competition_name,
// // members_count: result.data.members_count
// //
// //
// // })
// if (result.data.my_teams[0].manage_permission === true) {
//普通账号true 为创建了竞赛
// this.setState({
// type: 2,
// data: result.data.my_teams,
// count: result.data.count,
// personal: result.data.personal,
// competition_name: result.data.competition_name,
// members_count: result.data.members_count
//
//
// })
// } else {
// //普通账号true 加入了竞赛
// this.setState({
// type: 2,
// data: result.data.my_teams,
// count: result.data.count,
// personal: result.data.personal,
// competition_name: result.data.competition_name,
// members_count: result.data.members_count
//
//
// })
// }

@ -104,11 +104,19 @@ class PersonModal extends Component {
this.setState({
myuser: this.props.user,
mydatas: data,
polls_nametest: polls_nametests
polls_nametest: polls_nametests,
})
this.setState({
GetenrollmentAPI: this.props.GetenrollmentAPI,
})
try {
this.setState({
addonAfter: polls_nametests.length,
})
} catch (e) {
}
}
@ -148,7 +156,6 @@ class PersonModal extends Component {
};
//创建战队
Createateam = () => {
debugger
try {
if (this.state.polls_nametest.length === 0) {
this.props.showNotification(`请输入您的战队名称最多不超过60个字符`);
@ -862,6 +869,10 @@ class PersonModal extends Component {
member_ids, mydatas, booltech, boolstud, GetenrollmentAPI, Thecurrentnumberbool,
Thecurrentnumberboolstu, Thecurrentnumberstu
} = this.state;
const {
teacher_staff,
member_staff
} = this.props;
//Modal
//keyboard是否支持键盘 esc 关闭
//closable 是否显示右上角的关闭按钮
@ -1291,112 +1302,129 @@ class PersonModal extends Component {
{/*导师*/}
<div style={{
display: "flex",
flexDirection: "initial",
marginTop: "14px",
}}>
<p style={{
width: "59px",
marginTop: "9px",
fontSize: "16px",
}}>
{
teacher_staff === undefined || teacher_staff === null ?
"" :
<div>
<div style={{
display: "flex",
flexDirection: "initial",
marginTop: "14px",
}}>
<p style={{
width: "59px",
marginTop: "9px",
fontSize: "16px",
}}>
<span style={{
color: "#f5222d",
fontSize: "16px",
}}>*</span>
导师:
</p>
<style>
{
`
导师:
</p>
<style>
{
`
.yslzxueshiskmcd .ant-input{
height: 40px !important;
width: 487px !important;
}
`
}
</style>
{/*<div className={"yslzxueshiskmcd2"}>*/}
<Dropdown overlay={cpersondiv1} getPopupContainer={trigger => trigger.parentNode}
visible={this.state.person1}>
<Input
className="yslzxueshiskmcd"
placeholder="请输入老师姓名的任意关键字进行搜索,可以后续在添加"
onPressEnter={this.startSearch}
onFocus={this.inputOnFocus}
onBlur={this.inputOnBlur}
onChange={(e) => this.teacheronChange(e)}
value={this.state.keywordteachers}
suffix={
<i class="iconfont icon-sousuo"
onClick={() => this.Getteacherdata(keywordteachers, team_idteachers, teacher_ids)}/>
}
</style>
{/*<div className={"yslzxueshiskmcd2"}>*/}
<Dropdown overlay={cpersondiv1} getPopupContainer={trigger => trigger.parentNode}
visible={this.state.person1}>
<Input
className="yslzxueshiskmcd"
placeholder="请输入老师姓名的任意关键字进行搜索,可以后续在添加"
onPressEnter={this.startSearch}
onFocus={this.inputOnFocus}
onBlur={this.inputOnBlur}
onChange={(e) => this.teacheronChange(e)}
value={this.state.keywordteachers}
suffix={
<i class="iconfont icon-sousuo"
onClick={() => this.Getteacherdata(keywordteachers, team_idteachers, teacher_ids)}/>
}
/>
</Dropdown>
{/*</div>*/}
</div>
{
booltech === true ?
<p style={{marginLeft: "53px", color: "#FF954C", minHeight: "14px"}}>该老师已添加</p>
:
<div style={{marginLeft: "53px", minHeight: "14px", height: "14px"}}></div>
}
/>
</Dropdown>
{/*</div>*/}
</div>
{
booltech === true ?
<p style={{marginLeft: "53px", color: "#FF954C", minHeight: "14px"}}>该老师已添加</p>
:
<div style={{marginLeft: "53px", minHeight: "14px", height: "14px"}}></div>
</div>
}
{/*队员*/}
<div style={{
display: "flex",
flexDirection: "initial",
}}>
<p style={{
width: "59px",
marginTop: "9px",
fontSize: "16px",
}}>
{
member_staff === undefined || member_staff === null ?
"" :
<div>
<div style={{
display: "flex",
flexDirection: "initial",
}}>
<p style={{
width: "59px",
marginTop: "9px",
fontSize: "16px",
}}>
<span style={{
color: "#f5222d",
fontSize: "16px",
}}>*</span>
队员:
</p>
<style>
{
`
队员:
</p>
<style>
{
`
.yslzxueshiskmcd .ant-input{
height: 40px !important;
width: 487px !important;
}
`
}
</style>
<Dropdown overlay={persondiv2} getPopupContainer={trigger => trigger.parentNode}
visible={this.state.person2}>
<Input
className="yslzxueshiskmcd"
placeholder="请输入想要队员姓名的任意关键字进行搜索"
onPressEnter={this.startSearch2}
onFocus={this.inputOnFocus2}
onBlur={this.inputOnBlur2}
onChange={(e) => this.studentsonChange(e)}
value={this.state.keywordstudents}
suffix={
<i class="iconfont icon-sousuo "
onClick={() => this.Getstudentsdata(keywordstudents, team_idstudents, student_ids)}/>
}
</style>
<Dropdown overlay={persondiv2} getPopupContainer={trigger => trigger.parentNode}
visible={this.state.person2}>
<Input
className="yslzxueshiskmcd"
placeholder="请输入想要队员姓名的任意关键字进行搜索"
onPressEnter={this.startSearch2}
onFocus={this.inputOnFocus2}
onBlur={this.inputOnBlur2}
onChange={(e) => this.studentsonChange(e)}
value={this.state.keywordstudents}
suffix={
<i class="iconfont icon-sousuo "
onClick={() => this.Getstudentsdata(keywordstudents, team_idstudents, student_ids)}/>
}
/>
</Dropdown>
</div>
{
boolstud === true ?
<p style={{marginLeft: "53px", color: "#FF954C", minHeight: "18px"}}>该队员已添加</p>
:
<div style={{marginLeft: "53px", minHeight: "18px", height: "18px"}}></div>
}
/>
</Dropdown>
</div>
{
boolstud === true ?
<p style={{marginLeft: "53px", color: "#FF954C", minHeight: "18px"}}>该队员已添加</p>
:
<div style={{marginLeft: "53px", minHeight: "18px", height: "18px"}}></div>
</div>
}
{/*表格*/}
<div style={{marginLeft: "53px", border: "1px solid #E0E0E0"}}>
{/*<PersonModaltion ></PersonModaltion>*/}

Loading…
Cancel
Save