dev_ec
hjm 5 years ago
commit 675074d5eb

@ -1,7 +1,6 @@
class EcCourseStudentScore < ApplicationRecord class EcCourseStudentScore < ApplicationRecord
belongs_to :ec_year_student belongs_to :ec_year_student
belongs_to :ec_course belongs_to :ec_course
belongs_to :ec_course_target
has_many :ec_student_score_targets, dependent: :delete_all has_many :ec_student_score_targets, dependent: :delete_all
end end

@ -27,7 +27,7 @@ class Ecs::CreateCourseService < ApplicationService
private private
def create_default_score_levels!(ec_course) def create_default_score_levels!(ec_course)
EcScoreLevel.bulk_insert(:ec_course_id, :score, :level, :position) do |worker| EcScoreLevel.bulk_insert(:ec_course_id, :score, :level, :position, :created_at, :updated_at) do |worker|
[ [
{ ec_course_id: ec_course.id, score: 90, level: '优秀', position: 1 }, { ec_course_id: ec_course.id, score: 90, level: '优秀', position: 1 },
{ ec_course_id: ec_course.id, score: 80, level: '良好', position: 2 }, { ec_course_id: ec_course.id, score: 80, level: '良好', position: 2 },

@ -17,12 +17,12 @@ class Ecs::QueryCourseEvaluationService < ApplicationService
end end
def graduation_subitem_evaluations def graduation_subitem_evaluations
student_scores = ec_course.ec_course_student_scores.joins(:ec_course_target).group(:ec_course_target_id) student_scores = ec_course.ec_course_student_scores.joins(ec_student_score_targets: :ec_course_target).group(:ec_course_target_id)
student_scores = student_scores.select('AVG(score) as average_score, ec_course_target_id') student_scores = student_scores.select('AVG(score) as average_score, ec_course_target_id')
student_score_map = student_scores.group_by { |item| item.ec_course_target_id } student_score_map = student_scores.group_by { |item| item.ec_course_target_id }
subitem_targets = ec_course.ec_graduation_subitem_course_targets subitem_targets = ec_course.ec_graduation_subitem_course_targets
.includes(ec_graduation_subitem: :ec_graduation_requirement) .includes(:ec_course_target, ec_graduation_subitem: :ec_graduation_requirement)
subitem_targets.group_by(&:ec_graduation_subitem_id).map do |_id, arr| subitem_targets.group_by(&:ec_graduation_subitem_id).map do |_id, arr|
subitem = arr.first.ec_graduation_subitem subitem = arr.first.ec_graduation_subitem
@ -37,7 +37,7 @@ class Ecs::QueryCourseEvaluationService < ApplicationService
arr.map(&:ec_course_target).uniq.each do |target| arr.map(&:ec_course_target).uniq.each do |target|
target_total_rates += target.weight.to_f target_total_rates += target.weight.to_f
student_score = student_score_map[target.id] student_score = student_score_map[target.id]&.first
reach_real_target += student_score.average_score.to_f * target.weight.to_f if student_score reach_real_target += student_score.average_score.to_f * target.weight.to_f if student_score
end end
@ -60,8 +60,19 @@ class Ecs::QueryCourseEvaluationService < ApplicationService
def score_levels_map def score_levels_map
@_score_levels_map ||= begin @_score_levels_map ||= begin
index = 0
ec_course.ec_score_levels.each_with_object({}) do |level, obj| ec_course.ec_score_levels.each_with_object({}) do |level, obj|
obj[level.id.to_s] = level.as_json(only: %i[id position score level]) hash = level.as_json(only: %i[id position score level])
hash[:description] =
case index
when 0 then "#{level.score}分以上"
when ec_course.ec_score_levels.to_a.size - 1 then "低于#{level.score}"
else "#{level.score}~#{ec_course.ec_score_levels[index - 1].score - 1}"
end
index += 1
obj[level.id.to_s] = hash
end end
end end
end end
@ -87,23 +98,29 @@ class Ecs::QueryCourseEvaluationService < ApplicationService
@_course_achievement += data[:average_score].to_f * course_target.weight.to_f @_course_achievement += data[:average_score].to_f * course_target.weight.to_f
# 计算学生成绩分布区间 # 计算学生成绩分布区间
student_count = 0
data[:score_levels] = score_levels.map do |score_level| data[:score_levels] = score_levels.map do |score_level|
level_condition_proc = level_condition_proc =
if (score_level.position - 1).zero? # 第一区间 if (score_level.position - 1).zero? # 第一区间
-> (score_target){ score_target.score >= score_level.score ? 1 : 0 } -> (score_target){ score_target.score >= score_level.score ? 1 : 0 }
elsif score_levels.position == score_levels.size # 末尾区间 elsif score_level.position == score_levels.size # 末尾区间
-> (score_target){ score_target.score < score_level.score ? 1 : 0 } -> (score_target){ score_target.score < score_level.score ? 1 : 0 }
else else
# 中间区间 # 中间区间
-> (score_target){ score_target.score >= score_level.score && score_target.score < score_targets[score_level.position - 1] ? 1 : 0 } -> (score_target){ score_target.score >= score_level.score && score_target.score < score_levels[score_level.position - 1].score ? 1 : 0 }
end end
# 计算该成绩区间人数 # 计算该成绩区间人数
count = score_targets.sum(&level_condition_proc) count = score_targets.sum(&level_condition_proc)
student_count += count
{ id: score_level.id, count: count } { id: score_level.id, count: count }
end end
data[:score_levels].each do |score_level|
score_level[:rate] = score_level[:count].fdiv(student_count).round(2)
end
data data
end end
end end

@ -38,14 +38,13 @@ export function initAxiosInterceptors(props) {
// https://github.com/axios/axios/issues/1497 // https://github.com/axios/axios/issues/1497
// TODO 读取到package.json中的配置 // TODO 读取到package.json中的配置
var proxy = "http://localhost:3000" var proxy = "http://localhost:3000"
// proxy = "http://testbdweb.trustie.net"
// proxy="https://pre-newweb.educoder.net" // proxy = "http://testbdweb.educoder.net"
// proxy="https://test-newweb.educoder.net" // proxy = "https://testeduplus2.educoder.net"
proxy="http://192.168.2.63:3001"; //proxy="http://47.96.87.25:48080"
proxy="https://pre-newweb.educoder.net"
// wy proxy="https://test-newweb.educoder.net"
proxy="http://192.168.2.63:3001"
// 在这里使用requestMap控制避免用户通过双击等操作发出重复的请求 // 在这里使用requestMap控制避免用户通过双击等操作发出重复的请求
// 如果需要支持重复的请求考虑config里面自定义一个allowRepeat参考来控制 // 如果需要支持重复的请求考虑config里面自定义一个allowRepeat参考来控制

@ -350,3 +350,9 @@ input{
.mt60{ .mt60{
margin-top:60px; margin-top:60px;
} }
.editlybuttonbox{
margin-bottom: 30px;
margin-right: 3%;
}

@ -33,7 +33,8 @@ class CourseSupports extends Component {
Supportstype:false, Supportstype:false,
Supportslist:'', Supportslist:'',
Supportssum:false, Supportssum:false,
Supportsclass:false Supportsclass:false,
Supportsclasskey:undefined
} }
} }
@ -72,6 +73,24 @@ class CourseSupports extends Component {
console.log(error); console.log(error);
}); });
const zrl = `/ec_years/${ec_year_id}/ec_courses/search.json`;
axios.get(zrl,{params:{
per_page:10000,
}
})
.then((response) => {
if(response.status===200){
this.setState({
ec_courses_list:response.data.ec_courses
})
}
})
.catch(function (error) {
console.log(error);
});
} }
componentDidMount(){ componentDidMount(){
this.setState({ this.setState({
@ -81,58 +100,71 @@ class CourseSupports extends Component {
this.UpdateClassData(); this.UpdateClassData();
} }
EditSupportCourse=(key,e)=>{ EditSupportCourse=(keys,e)=>{
$('#school_major_list').scrollLeft(0); $('#school_major_list').scrollLeft(0);
let id=e.target.id; let id=e.target.id;
id=parseInt(id); id=parseInt(id);
let subindex =e.target.getAttribute("subindex"); let subindex =e.target.getAttribute("subindex");
const url = `/ec_course_supports/edit_require_vs_course?subitem_id=`+id
axios.get(url)
.then((response) => {
if(response.status===200){
var support_data;
if(response.data.edit_support_data.length>0){
support_data=response.data.edit_support_data;
}else if(response.data.edit_support_data.length===0){
support_data=[{weights: 0,top_relation: false,ec_course_name:'',ec_course_id:''}];
}
this.setState({
ec_courses_list:response.data.ec_courses_list,
editcourse:support_data,
index:subindex,
ec_graduation_subitem_id:id,
Supportssum:false,
Supportsclass:false,
})
let {editcourse} =this.state;
let neweditcourse=editcourse;
let newnum=0;
for(var j=0;j<neweditcourse.length;j++){
if(neweditcourse[j].weigths===undefined){
newnum=0
}else{
newnum=newnum+neweditcourse[j].weigths;
}
}
newnum= Math.round(newnum*100)/100;
this.setState({
editnum:newnum
})
}
}) // const url = `/ec_course_supports/edit_require_vs_course?subitem_id=`+id
.catch(function (error) { // axios.get(url)
console.log(error); // .then((response) => {
}); //
// if(response.status===200){
//
// this.setState({
// ec_courses_list:response.data.ec_courses_list,
// editcourse:support_data,
// index:subindex,
// ec_graduation_subitem_id:id,
// Supportssum:false,
// Supportsclass:false,
// })
//
// let {editcourse} =this.state;
// let neweditcourse=editcourse;
// let newnum=0;
// for(var j=0;j<neweditcourse.length;j++){
// if(neweditcourse[j].weigths===undefined){
// newnum=0
// }else{
// newnum=newnum+neweditcourse[j].weigths;
// }
// }
// newnum= Math.round(newnum*100)/100;
//
// this.setState({
// editnum:newnum
// })
// }
//
// })
// .catch(function (error) {
// console.log(error);
// });
let {data}=this.state;
data.graduation_subitems.map((item,key)=>{
if(keys===key){
if(item.course_supports.length>0){
this.setState({
editcourse:item.course_supports,
Editkey:key
})
}else if(item.course_supports.length===0){
this.setState({
editcourse:[{weights: 0,top_relation: false,ec_course_name:'',ec_course_id:''}],
Editkey:key
})
}
}
})
this.setState({
Editkey:key
})
// $("#school_ListTableLine").show(); // $("#school_ListTableLine").show();
// let offsettop=$("#school_ListTableLine").position().top||$("#school_ListTableLine").scrollTop || $("#school_ListTableLine").pageYOffset; // let offsettop=$("#school_ListTableLine").position().top||$("#school_ListTableLine").scrollTop || $("#school_ListTableLine").pageYOffset;
// window.scrollTo(0, offsettop) // window.scrollTo(0, offsettop)
@ -314,19 +346,36 @@ class CourseSupports extends Component {
}) })
return return
} }
for(var p=0; p<editcourse.length;p++){
if(editcourse[p].weigths===""){ // for(var p=0; p<editcourse.length;p++){
editcourse[p].weigths=0; // if(editcourse[p].weigths===""){
} // editcourse[p].weigths=0;
if(editcourse[p].ec_course_id===""){ // }
this.setState({ // if(editcourse[p].ec_course_id===""){
// Supportstype:true, // this.setState({
Supportslist:'保存失败,课程不能为空', // // Supportstype:true,
Supportsclass:true // Supportslist:'保存失败,课程不能为空',
}) // Supportsclass:true
return // })
} // return
} // }
// }
editcourse.map((item,key)=>{
if(item.weigths===""){
item.weigths=0;
}
if(item.ec_course_id===""){
this.setState({
// Supportstype:true,
Supportslist:'保存失败,课程不能为空',
Supportsclass:true,
Supportsclasskey:key
})
return
}
})
var Url = '/ec_course_supports'; var Url = '/ec_course_supports';
axios.post(Url, { axios.post(Url, {
ec_year_id: ec_year_id, ec_year_id: ec_year_id,
@ -345,6 +394,7 @@ class CourseSupports extends Component {
Supportstype:true, Supportstype:true,
Supportssum:false, Supportssum:false,
Supportsclass:false, Supportsclass:false,
Supportsclasskey:undefined,
}) })
this.UpdateClassData(); this.UpdateClassData();
}else if(response.data.status===-1){ }else if(response.data.status===-1){
@ -353,6 +403,7 @@ class CourseSupports extends Component {
Supportstype:true, Supportstype:true,
Supportssum:false, Supportssum:false,
Supportsclass:false, Supportsclass:false,
Supportsclasskey:undefined,
}) })
} }
}).catch((error) => { }).catch((error) => {
@ -505,18 +556,26 @@ class CourseSupports extends Component {
</p> </p>
<div className="clearfix editorModify"> <div className="clearfix editorModify">
{Supportsclass===true?<style>
{
`
.showredfont .ant-select-selection{
border: 1px solid #db0505 !important;
}
`
}
</style>:""}
{ {
editcourse.map((it,key)=>{ editcourse.map((it,key)=>{
return( return(
<div className="mb15" key={key}> <div className="mb15" key={key}>
<Select className={Supportsclass===true?"bor-red heightimportant":"heightimportant"} showSearch value={it.ec_course_name} onChange={this.handleChange}> <Select className={Supportsclasskey===key?"showredfont heightimportant":"heightimportant"} showSearch value={it.ec_course_name} onChange={this.handleChange}>
{ {
ec_courses_list.map((qva,qk)=>{ ec_courses_list.map((qva,qk)=>{
return( return(
<Option value={[qva.id,key,qva.name]} key={qk}>{qva.name}</Option> <Option value={[qva.id,key,qva.name]} key={[qva.id,key,qva.name]}>{qva.name}</Option>
) )
}) })
@ -557,7 +616,7 @@ class CourseSupports extends Component {
} }
</div> </div>
<span className="c_red none ml35" id="error_tip" style={{display:Supportssum===true||Supportsclass===true?'inline':'none'}}>{Supportslist}</span> <span className="c_red none ml35 color-red" id="error_tip" style={{display:Supportssum===true||Supportsclass===true?'inline':'none'}}>{Supportslist}</span>
<div className="clearfix editorModify"> <div className="clearfix editorModify">
<span className="column-1" <span className="column-1"
style={{ style={{
@ -569,7 +628,7 @@ class CourseSupports extends Component {
<span className="ml30">合计: <span>{editnum}</span></span> <span className="ml30">合计: <span>{editnum}</span></span>
</div> </div>
<div className="right editglybuttonboxs"> <div className="right editlybuttonbox">
<div className="defalutSubmitbtn fr" onClick={this.SubmitClassData}>保存</div> <div className="defalutSubmitbtn fr" onClick={this.SubmitClassData}>保存</div>
<div className="defalutCancelbtn fr mr20" onClick={this.CancelSupports}>取消</div> <div className="defalutCancelbtn fr mr20" onClick={this.CancelSupports}>取消</div>
</div> </div>

Loading…
Cancel
Save