dev_ec
hjm 5 years ago
commit 675074d5eb

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

@ -27,7 +27,7 @@ class Ecs::CreateCourseService < ApplicationService
private
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: 80, level: '良好', position: 2 },

@ -17,12 +17,12 @@ class Ecs::QueryCourseEvaluationService < ApplicationService
end
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_score_map = student_scores.group_by { |item| item.ec_course_target_id }
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 = arr.first.ec_graduation_subitem
@ -37,7 +37,7 @@ class Ecs::QueryCourseEvaluationService < ApplicationService
arr.map(&:ec_course_target).uniq.each do |target|
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
end
@ -60,8 +60,19 @@ class Ecs::QueryCourseEvaluationService < ApplicationService
def score_levels_map
@_score_levels_map ||= begin
index = 0
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
@ -87,23 +98,29 @@ class Ecs::QueryCourseEvaluationService < ApplicationService
@_course_achievement += data[:average_score].to_f * course_target.weight.to_f
# 计算学生成绩分布区间
student_count = 0
data[:score_levels] = score_levels.map do |score_level|
level_condition_proc =
if (score_level.position - 1).zero? # 第一区间
-> (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 }
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
# 计算该成绩区间人数
count = score_targets.sum(&level_condition_proc)
student_count += count
{ id: score_level.id, count: count }
end
data[:score_levels].each do |score_level|
score_level[:rate] = score_level[:count].fdiv(student_count).round(2)
end
data
end
end

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

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

@ -33,7 +33,8 @@ class CourseSupports extends Component {
Supportstype:false,
Supportslist:'',
Supportssum:false,
Supportsclass:false
Supportsclass:false,
Supportsclasskey:undefined
}
}
@ -72,6 +73,24 @@ class CourseSupports extends Component {
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(){
this.setState({
@ -81,58 +100,71 @@ class CourseSupports extends Component {
this.UpdateClassData();
}
EditSupportCourse=(key,e)=>{
EditSupportCourse=(keys,e)=>{
$('#school_major_list').scrollLeft(0);
let id=e.target.id;
id=parseInt(id);
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
})
}
})
.catch(function (error) {
console.log(error);
});
// const url = `/ec_course_supports/edit_require_vs_course?subitem_id=`+id
// axios.get(url)
// .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();
// let offsettop=$("#school_ListTableLine").position().top||$("#school_ListTableLine").scrollTop || $("#school_ListTableLine").pageYOffset;
// window.scrollTo(0, offsettop)
@ -314,19 +346,36 @@ class CourseSupports extends Component {
})
return
}
for(var p=0; p<editcourse.length;p++){
if(editcourse[p].weigths===""){
editcourse[p].weigths=0;
}
if(editcourse[p].ec_course_id===""){
this.setState({
// Supportstype:true,
Supportslist:'保存失败,课程不能为空',
Supportsclass:true
})
return
}
}
// for(var p=0; p<editcourse.length;p++){
// if(editcourse[p].weigths===""){
// editcourse[p].weigths=0;
// }
// if(editcourse[p].ec_course_id===""){
// this.setState({
// // Supportstype:true,
// Supportslist:'保存失败,课程不能为空',
// Supportsclass:true
// })
// 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';
axios.post(Url, {
ec_year_id: ec_year_id,
@ -345,6 +394,7 @@ class CourseSupports extends Component {
Supportstype:true,
Supportssum:false,
Supportsclass:false,
Supportsclasskey:undefined,
})
this.UpdateClassData();
}else if(response.data.status===-1){
@ -353,6 +403,7 @@ class CourseSupports extends Component {
Supportstype:true,
Supportssum:false,
Supportsclass:false,
Supportsclasskey:undefined,
})
}
}).catch((error) => {
@ -505,18 +556,26 @@ class CourseSupports extends Component {
</p>
<div className="clearfix editorModify">
{Supportsclass===true?<style>
{
`
.showredfont .ant-select-selection{
border: 1px solid #db0505 !important;
}
`
}
</style>:""}
{
editcourse.map((it,key)=>{
return(
<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)=>{
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>
<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">
<span className="column-1"
style={{
@ -569,7 +628,7 @@ class CourseSupports extends Component {
<span className="ml30">合计: <span>{editnum}</span></span>
</div>
<div className="right editglybuttonboxs">
<div className="right editlybuttonbox">
<div className="defalutSubmitbtn fr" onClick={this.SubmitClassData}>保存</div>
<div className="defalutCancelbtn fr mr20" onClick={this.CancelSupports}>取消</div>
</div>

Loading…
Cancel
Save