CrazyIter_Bin il y a 1 an
Parent
commit
2fbe00e95f

+ 1 - 1
TEAMModelOS.SDK/Context/Attributes/Filter/ApiTokenAttribute.cs

@@ -265,7 +265,7 @@ namespace TEAMModelOS.Filter
                                                 {
                                                 {
                                                     BizConfig bizConfig = JsonDocument.Parse(response.Content).Deserialize<BizConfig>();
                                                     BizConfig bizConfig = JsonDocument.Parse(response.Content).Deserialize<BizConfig>();
                                                     //智学研可以直接访问所有学校的授权。
                                                     //智学研可以直接访问所有学校的授权。
-                                                    if (id.Equals("cc7e900c-4881-4fe9-9c64-abb1a1f95518") || id.Equals("8254bc86-aae9-4fef-9655-4fbda1bd39da"))
+                                                    if (id.Equals("cc7e900c-4881-4fe9-9c64-abb1a1f95518") ||id.Equals("633d4d36-2cae-469a-bdcb-c52ce2e416b3") || id.Equals("8254bc86-aae9-4fef-9655-4fbda1bd39da"))
                                                     {
                                                     {
                                                         school = XAuthSchool;
                                                         school = XAuthSchool;
                                                         pass = true;
                                                         pass = true;

+ 4 - 4
TEAMModelOS.SDK/Models/Cosmos/School/SchoolSetting.cs

@@ -67,10 +67,10 @@ namespace TEAMModelOS.SDK.Models
         /// </summary>
         /// </summary>
         public List<string> examTypes { get; set; } = new List<string>();
         public List<string> examTypes { get; set; } = new List<string>();
         public List<CodeDouble> intelligenceWeight { get; set; } = new List<CodeDouble>() {
         public List<CodeDouble> intelligenceWeight { get; set; } = new List<CodeDouble>() {
-            new CodeDouble { code = "attitude", value = 0.25 },//态度
-            new CodeDouble { code = "cooperate", value = 0.25 },//合作
-            new CodeDouble { code = "ability", value = 0.25 },//能力
-            new CodeDouble { code = "standard", value = 0.25 },//水平
+            new CodeDouble { code = "attitude", value = 0.10 },//态度
+            new CodeDouble { code = "cooperate", value = 0.10 },//合作
+            new CodeDouble { code = "ability", value = 0.10 },//能力
+            new CodeDouble { code = "standard", value = 0.70 },//水平
         };
         };
     }
     }
 
 

+ 2 - 1
TEAMModelOS.SDK/Models/Service/OpenApiService.cs

@@ -44,6 +44,7 @@ using Microsoft.AspNetCore.Hosting;
 using TEAMModelOS.Models.ShanDa;
 using TEAMModelOS.Models.ShanDa;
 using System.Runtime.ConstrainedExecution;
 using System.Runtime.ConstrainedExecution;
 using DocumentFormat.OpenXml.Wordprocessing;
 using DocumentFormat.OpenXml.Wordprocessing;
+using DocumentFormat.OpenXml.Office2010.Excel;
 
 
 namespace TEAMModelOS.SDK
 namespace TEAMModelOS.SDK
 {
 {
@@ -628,7 +629,7 @@ namespace TEAMModelOS.SDK
                     members = x.members,
                     members = x.members,
                     id = x.id
                     id = x.id
                 }).ToList();
                 }).ToList();
-                if (bizId.Equals("cc7e900c-4881-4fe9-9c64-abb1a1f95518") || bizId.Equals("8254bc86-aae9-4fef-9655-4fbda1bd39da"))
+                if (bizId.Equals("cc7e900c-4881-4fe9-9c64-abb1a1f95518") || bizId.Equals("633d4d36-2cae-469a-bdcb-c52ce2e416b3") || bizId.Equals("8254bc86-aae9-4fef-9655-4fbda1bd39da"))
                 {
                 {
                     if (listids.Count == 1 && listids.First().Equals("TeacherAll") && !string.IsNullOrEmpty(school))
                     if (listids.Count == 1 && listids.First().Equals("TeacherAll") && !string.IsNullOrEmpty(school))
                     {
                     {

+ 412 - 179
TEAMModelOS/Controllers/Student/OverallEducationController.cs

@@ -32,6 +32,7 @@ using TEAMModelOS.SDK.Models;
 using TEAMModelOS.SDK.Models.Cosmos;
 using TEAMModelOS.SDK.Models.Cosmos;
 using TEAMModelOS.SDK.Models.Cosmos.Common;
 using TEAMModelOS.SDK.Models.Cosmos.Common;
 using TEAMModelOS.SDK.Services;
 using TEAMModelOS.SDK.Services;
+using static TEAMModelOS.Controllers.OverallEducationController;
 using static TEAMModelOS.SDK.Models.Cosmos.Student.StudentAnalysis;
 using static TEAMModelOS.SDK.Models.Cosmos.Student.StudentAnalysis;
 using static TEAMModelOS.SDK.Services.ActivityStudentService;
 using static TEAMModelOS.SDK.Services.ActivityStudentService;
 
 
@@ -99,233 +100,465 @@ namespace TEAMModelOS.Controllers
         [Authorize(Roles = "IES")]
         [Authorize(Roles = "IES")]
         public async Task<IActionResult> Overview(JsonElement json)
         public async Task<IActionResult> Overview(JsonElement json)
         {
         {
-            json.TryGetProperty("studentYear", out JsonElement _studentYear);
-            json.TryGetProperty("grades", out JsonElement _grades);
-            json.TryGetProperty("school", out JsonElement _school);
-            json.TryGetProperty("periodId", out JsonElement _periodId);
-            json.TryGetProperty("semesterId", out JsonElement _semesterId);
-            json.TryGetProperty("studyYear", out JsonElement _studyYear);
-
-            var client = _azureCosmos.GetCosmosClient();
-            School school = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>($"{_school}", new PartitionKey("Base"));
-            SchoolSetting schoolSetting = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<SchoolSetting>($"{_school}", new PartitionKey("SchoolSetting"));
-            Dictionary<string, object> dict = OverallEducationService.GetQueryCond(json);
-            #region  此处代码用于处理 根据年级 学段获取 相关的班级。
-            HashSet<int> years = new HashSet<int>();
-            if (_grades.ValueKind.Equals(JsonValueKind.Array))
-            {
-                var yearsdata = SchoolService.GetYears(school, $"{_periodId}", _grades.ToObject<List<int>>());
-                years = yearsdata.years;
-            }
-            if (int.TryParse($"{_studentYear}", out int studentYear))
-            {
-                years.Add(studentYear);
-            }
-            if (!years.Any())
-            {
-                var period = school.period.Find(z => z.id.Equals($"{_periodId}"));
-                if (period != null && period.grades.IsNotEmpty())
+            try {
+                json.TryGetProperty("studentYear", out JsonElement _studentYear);
+                json.TryGetProperty("grades", out JsonElement _grades);
+                json.TryGetProperty("school", out JsonElement _school);
+                json.TryGetProperty("periodId", out JsonElement _periodId);
+                json.TryGetProperty("semesterId", out JsonElement _semesterId);
+                json.TryGetProperty("studyYear", out JsonElement _studyYear);
+                var client = _azureCosmos.GetCosmosClient();
+                School school = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>($"{_school}", new PartitionKey("Base"));
+                SchoolSetting schoolSetting = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<SchoolSetting>($"{_school}", new PartitionKey("SchoolSetting"));
+                Dictionary<string, object> dict = OverallEducationService.GetQueryCond(json);
+                #region  此处代码用于处理 根据年级 学段获取 相关的班级。
+                HashSet<int> years = new HashSet<int>();
+                if (_grades.ValueKind.Equals(JsonValueKind.Array))
                 {
                 {
-                    List<int> grades = new List<int>();
-                    period.grades.Select((z, index) => index).ToList().ForEach(t => { grades.Add(t); });
-                    var yearsdata = SchoolService.GetYears(school, $"{_periodId}", grades);
+                    var yearsdata = SchoolService.GetYears(school, $"{_periodId}", _grades.ToObject<List<int>>());
                     years = yearsdata.years;
                     years = yearsdata.years;
                 }
                 }
-            }
-            List<Class> classes = new List<Class>();
-            List<Student> students = new List<Student>();
-            List<Class> grade_classes = new List<Class>();
-            List<Student> grade_students = new List<Student>();
-            List<OverallEducation> grade_overallEducations = new List<OverallEducation>() ;
-            List<OverallEducation> overallEducations = new List<OverallEducation>();
-            HashSet<string> classIds = null;
-            if (json.TryGetProperty("classIds", out JsonElement _classIds))
-            {
-                classIds = _classIds.ToObject<HashSet<string>>();
-            }
-            if (years.Any() && years.Count > 0)
-            {
-                var gradeData =   await OverallEducationService.GetGradeData(client, years, $"{_periodId}", $"{_school}", classIds, $"{_studyYear}", $"{_semesterId}", _azureRedis);
-                classes=gradeData.classes;
-                students=gradeData.students;
-                grade_classes = gradeData.grade_classes;
-                grade_students=gradeData.grade_students;
-                grade_overallEducations = gradeData.overallEducations;
-                overallEducations=gradeData.overallEducations.FindAll(x=>students.Select(k=>k.id).Contains(x.studentId));
-            }
-            #endregion
-            #region
-            double dataCount = 0;
-            double sports_count90 = 0;
-            double sports_count60 = 0;
-            double sports_count = 0;
-            double art_count90 = 0;
-            double art_count60 = 0;
-            double art_count = 0;
-            double intelligence_count90 = 0;
-            double intelligence_count60 = 0;
-            double intelligence_count = 0;
-            double labour_count90 = 0;
-            double labour_count60 = 0;
-            double labour_count = 0;
-            double virtue_count90 = 0;
-            double virtue_count60 = 0;
-            double virtue_count = 0;
-            double rate90 = 0;
-            double rate60 = 0;
-            double activityCount = 0;
-            #endregion
+                if (int.TryParse($"{_studentYear}", out int studentYear))
+                {
+                    years.Add(studentYear);
+                }
+                if (!years.Any())
+                {
+                    var period = school.period.Find(z => z.id.Equals($"{_periodId}"));
+                    if (period != null && period.grades.IsNotEmpty())
+                    {
+                        List<int> grades = new List<int>();
+                        period.grades.Select((z, index) => index).ToList().ForEach(t => { grades.Add(t); });
+                        var yearsdata = SchoolService.GetYears(school, $"{_periodId}", grades);
+                        years = yearsdata.years;
+                    }
+                }
+                List<Class> classes = new List<Class>();
+                List<Student> students = new List<Student>();
+                List<Class> grade_classes = new List<Class>();
+                List<Student> grade_students = new List<Student>();
+                List<OverallEducation> grade_overallEducations = new List<OverallEducation>();
+                List<OverallEducation> overallEducations = new List<OverallEducation>();
+                HashSet<string> classIds = null;
+                //标记是否是下钻到班级
+                bool isClass = false;
+                if (json.TryGetProperty("classIds", out JsonElement _classIds))
+                {
+                    classIds = _classIds.ToObject<HashSet<string>>();
+                    if (classIds != null && classIds.Count > 0)
+                    {
+                        isClass = true;
+                    }
+                }
+                if (years.Any() && years.Count > 0)
+                {
+                    var gradeData = await OverallEducationService.GetGradeData(client, years, $"{_periodId}", $"{_school}", classIds, $"{_studyYear}", $"{_semesterId}", _azureRedis);
+                    classes = gradeData.classes;
+                    students = gradeData.students;
+                    grade_classes = gradeData.grade_classes;
+                    grade_students = gradeData.grade_students;
+                    grade_overallEducations = gradeData.overallEducations;
+                    overallEducations = gradeData.overallEducations.FindAll(x => students.Select(k => k.id).Contains(x.studentId));
+                }
+                #endregion
+
 
 
-            List<(double score, OverallEducation student, string className, string picture)> ranking = new List<(double score, OverallEducation student, string className, string picture)>();
-            List<(string classId, string className, double last, double best, double sum, double avg, int count)> classDatas = new List<(string classId, string className, double last, double best, double sum, double avg, int count)>();
-            if (overallEducations.IsNotEmpty()) {
-                dataCount = overallEducations.Count();
+                List<(double score, OverallEducation student, string className, string picture)> ranking = new List<(double score, OverallEducation student, string className, string picture)>();
+                List<(string classId, string className, double last, double best, double sum, double avg, int count)> classDatas = new List<(string classId, string className, double last, double best, double sum, double avg, int count)>();
                 //pr计算  100 - (100 * (index + 1) - 50) / stuCount;  index  整体排名  stuCount 总人数
                 //pr计算  100 - (100 * (index + 1) - 50) / stuCount;  index  整体排名  stuCount 总人数
-            }
-            double basic_Score = 60;
-            if (schoolSetting?.overallEducationSetting?.overallEducationInit!=null && schoolSetting?.overallEducationSetting?.overallEducationInit >= 0) {
-                basic_Score = schoolSetting.overallEducationSetting.overallEducationInit;
-            }
-            var hasData_labour = grade_overallEducations.Where(x => x.labour.Count > 0);
-            double max_labour = 0;
-            double min_labour = 0;
-            if (schoolSetting.overallEducationSetting.labour.Equals("sum"))
-            {
-                var data = hasData_labour.Select(x => new { score = x.labour.Sum(x => x.sumScore) , studentId = x.studentId });
-                max_labour = data.Max(z => z.score);
-                min_labour = data.Min(z => z.score);
-            }
-            var hasData_virtue = grade_overallEducations.Where(x => x.virtue.Count > 0);
-            double max_virtue = 0;
-            double min_virtue = 0;
+                double basic_Score = 60;
+                if (schoolSetting?.overallEducationSetting?.overallEducationInit != null && schoolSetting?.overallEducationSetting?.overallEducationInit >= 0)
+                {
+                    basic_Score = schoolSetting.overallEducationSetting.overallEducationInit;
+                }
+                var hasData_labour = grade_overallEducations.Where(x => x.labour.Count > 0);
+                double max_labour = 0;
+                double min_labour = 0;
 
 
-             if (schoolSetting.overallEducationSetting.virtue.Equals("sum"))
-            {
-                var data = hasData_virtue.Select(x =>new { score = x.virtue.Sum(x => x.sumScore) , studentId = x.studentId });
-                max_virtue = data.Max(z => z.score);
-                min_virtue = data.Min(z => z.score);
-            }
-            var hasData_lesson = grade_overallEducations.Where(x => x.lessonScore.Count > 0);
-            double max_lesson_gscore = 0;
-            double max_lesson_pscore = 0;
-            double max_lesson_tscore = 0;
-
-            double min_lesson_gscore = 0;
-            double min_lesson_pscore = 0;
-            double min_lesson_tscore = 0;
-            if (schoolSetting.overallEducationSetting.art.Equals("sum"))
-            {
-                var gdata = hasData_lesson.Select(x => new { score = x.lessonScore.Sum(x => x.gscore), studentId = x.studentId });
-                max_lesson_gscore = gdata.Max(z => z.score);
-                min_lesson_gscore = gdata.Min(z => z.score);
-                var pdata = hasData_lesson.Select(x => new { score = x.lessonScore.Sum(x => x.pscore), studentId = x.studentId });
-                max_lesson_pscore = pdata.Max(z => z.score);
-                min_lesson_pscore = pdata.Min(z => z.score);
-                var tdata = hasData_lesson.Select(x => new { score = x.lessonScore.Sum(x => x.tscore), studentId = x.studentId });
-                max_lesson_tscore = tdata.Max(z => z.score);
-                min_lesson_tscore = tdata.Min(z => z.score);
-            }
-            foreach (var item in overallEducations) {
-                DimensionScore dimensionScore = new DimensionScore() { studentId=item.semesterId,classId=item.classId};
-                if (item.sports.IsNotEmpty())
-                {  //体育
-                    if (schoolSetting.overallEducationSetting.sports.Equals("avg"))
+                var order_labour = hasData_labour.Select(x => new { score = x.labour.Sum(x => x.sumScore), studentId = x.studentId }).OrderByDescending(x => x.score).ToList();
+                max_labour = order_labour.Max(z => z.score);
+                min_labour = order_labour.Min(z => z.score);
+
+                var hasData_virtue = grade_overallEducations.Where(x => x.virtue.Count > 0);
+                double max_virtue = 0;
+                double min_virtue = 0;
+
+                var order_virtue = hasData_virtue.Select(x => new { score = x.virtue.Sum(x => x.sumScore), studentId = x.studentId }).OrderByDescending(x => x.score).ToList();
+                max_virtue = order_virtue.Max(z => z.score);
+                min_virtue = order_virtue.Min(z => z.score);
+
+                var hasData_lesson = grade_overallEducations.Where(x => x.lessonScore.Count > 0);
+                double max_lesson_gscore = 0;
+                double max_lesson_pscore = 0;
+                double max_lesson_tscore = 0;
+
+                double min_lesson_gscore = 0;
+                double min_lesson_pscore = 0;
+                double min_lesson_tscore = 0;
+                var order_gdata = hasData_lesson.Select(x => new { score = x.lessonScore.Sum(x => x.gscore), studentId = x.studentId }).OrderByDescending(x => x.score).ToList();
+                max_lesson_gscore = order_gdata.Max(z => z.score);
+                min_lesson_gscore = order_gdata.Min(z => z.score);
+                var order_pdata = hasData_lesson.Select(x => new { score = x.lessonScore.Sum(x => x.pscore), studentId = x.studentId }).OrderByDescending(x => x.score).ToList();
+                max_lesson_pscore = order_pdata.Max(z => z.score);
+                min_lesson_pscore = order_pdata.Min(z => z.score);
+                var order_tdata = hasData_lesson.Select(x => new { score = x.lessonScore.Sum(x => x.tscore), studentId = x.studentId }).OrderByDescending(x => x.score).ToList();
+                max_lesson_tscore = order_tdata.Max(z => z.score);
+                min_lesson_tscore = order_tdata.Min(z => z.score);
+                List<StudentDimensionScore> grade_dimensions = new List<StudentDimensionScore>();
+                //全年级的数据
+                foreach (var item in grade_overallEducations)
+                {
+                    var student = students.Find(x => x.id.Equals(item.studentId));
+                    StudentDimensionScore dimensionScore = new StudentDimensionScore() { studentId = item.studentId, classId = item.classId, studentName = student?.name, picture = student?.picture };
+                    //排名指数计算=( 当前值分数- 298) / (9992 - 298) * (99 - 60) + 60
+                    //将每个人的积分转化为60-100
+                    //排名 = (积分 - 最低积分) / (最高积分 - 最低积分) * (最大排名 - 最小排名) + 最小排名
+                    //劳动
+                    var labour = order_labour.Find(x => x.studentId.Equals(item.studentId));
+                    var labour_score = basic_Score;
+                    if (labour != null && labour.score > 0 && max_labour - min_labour>0)
                     {
                     {
-                        double sumScore = item.sports.Average(x => x.sumScore);
-                        double totalScore = item.sports.Average(x => x.totalScore);
-                        if (totalScore > 0)
-                        {
-                            dimensionScore.sports = sumScore * 1.0 / totalScore;
-                        }
-                        else {
-                            dimensionScore.sports = sumScore * 1.0 / item.sports.Count;
-                        }
+                        labour_score = (labour.score - min_labour) / (max_labour - min_labour) * (99 - basic_Score) + basic_Score;
                     }
                     }
-                    else if (schoolSetting.overallEducationSetting.sports.Equals("newest"))
+                    dimensionScore.labour = labour_score;
+                    //德育
+                    var virtue = order_virtue.Find(x => x.studentId.Equals(item.studentId));
+                    var virtue_score = basic_Score;
+                    if (virtue != null && virtue.score > 0 && max_virtue - min_virtue>0)
                     {
                     {
-                        double sumScore = item.sports.OrderByDescending(x => x.examDate).First().sumScore;
-                        double totalScore = item.sports.OrderByDescending(x => x.examDate).First().totalScore;
-                        if (totalScore > 0)
+                        virtue_score = (virtue.score - min_virtue) / (max_virtue - min_virtue) * (99 - basic_Score) + basic_Score;
+                    }
+                    dimensionScore.virtue = virtue_score;
+
+                    //合作
+                    var gdata = order_gdata.Find(x => x.studentId.Equals(item.studentId));
+                    var gdata_score = basic_Score;
+                    if (gdata != null && gdata.score > 0 && max_lesson_gscore - min_lesson_gscore>0)
+                    {
+                        gdata_score = (gdata.score - min_lesson_gscore) / (max_lesson_gscore - min_lesson_gscore) * (99 - basic_Score) + basic_Score;
+                    }
+                    dimensionScore.gscore = gdata_score;
+                    //态度
+                    var tdata = order_tdata.Find(x => x.studentId.Equals(item.studentId));
+                    var tdata_score = basic_Score;
+                    if (tdata != null && tdata.score > 0 && max_lesson_tscore - min_lesson_tscore>0)
+                    {
+                        tdata_score = (tdata.score - min_lesson_tscore) / (max_lesson_tscore - min_lesson_tscore) * (99 - basic_Score) + basic_Score;
+                    }
+                    dimensionScore.tscore = tdata_score;
+                    //能力
+                    var pdata = order_pdata.Find(x => x.studentId.Equals(item.studentId));
+                    var pdata_score = basic_Score;
+                    if (pdata != null && pdata.score > 0  && max_lesson_pscore - min_lesson_pscore>0)
+                    {
+                        pdata_score = (pdata.score - min_lesson_pscore) / (max_lesson_pscore - min_lesson_pscore) * (99 - basic_Score) + basic_Score;
+                    }
+                    dimensionScore.pscore = pdata_score;
+                    double intelligence = basic_Score;
+                    if (item.intelligence.IsNotEmpty())
+                    {
+                        //智育
+                        if (schoolSetting.overallEducationSetting.intelligence.Equals("avg"))
                         {
                         {
-                            dimensionScore.sports = sumScore * 1.0 / totalScore;
+                            double sumScore = item.intelligence.Average(x => x.sumScore);
+                            double totalScore = item.intelligence.Average(x => x.totalScore);
+                            if (totalScore > 0)
+                            {
+                                intelligence = sumScore * 1.0 / totalScore * 100;
+
+                            }
+                            else
+                            {
+                                intelligence = sumScore * 1.0 / item.intelligence.Count;
+                            }
                         }
                         }
-                        else
+                    }
+                    dimensionScore.exam = intelligence;
+                    //态度
+                    double attitude = 0.1;
+                    //合作
+                    double cooperate = 0.1;
+                    //能力
+                    double ability = 0.1;
+                    //水平
+                    double standard = 0.7;
+                    var attitudeWeight = schoolSetting.overallEducationSetting.intelligenceWeight.Find(x => x.code.Equals("attitude"));
+                    attitude = attitudeWeight != null ? attitudeWeight.value : attitude;
+                    var cooperateWeight = schoolSetting.overallEducationSetting.intelligenceWeight.Find(x => x.code.Equals("cooperate"));
+                    cooperate = cooperateWeight != null ? cooperateWeight.value : cooperate;
+                    var abilityWeight = schoolSetting.overallEducationSetting.intelligenceWeight.Find(x => x.code.Equals("ability"));
+                    ability = abilityWeight != null ? abilityWeight.value : ability;
+                    var standardWeight = schoolSetting.overallEducationSetting.intelligenceWeight.Find(x => x.code.Equals("standard"));
+                    standard = standardWeight != null ? standardWeight.value : standard;
+                    dimensionScore.intelligence = intelligence * standard + pdata_score * ability + tdata_score * attitude + gdata_score * cooperate;
+                    if (item.sports.IsNotEmpty())
+                    {  //体育
+                        if (schoolSetting.overallEducationSetting.sports.Equals("newest"))
                         {
                         {
-                            dimensionScore.sports = sumScore * 1.0 / item.sports.Count;
+                            double sumScore = item.sports.OrderByDescending(x => x.examDate).First().sumScore;
+                            double totalScore = item.sports.OrderByDescending(x => x.examDate).First().totalScore;
+                            if (totalScore > 0)
+                            {
+                                dimensionScore.sports = sumScore * 1.0 / totalScore * 100;
+                            }
+                            else
+                            {
+                                dimensionScore.sports = sumScore * 1.0 / item.sports.Count;
+                            }
                         }
                         }
+                        else { dimensionScore.sports = basic_Score; }
                     }
                     }
-                    else if (schoolSetting.overallEducationSetting.sports.Equals("sum"))
+                    else
                     {
                     {
-                        double sumScore = item.sports.Sum(x => x.sumScore);
-                        double totalScore = item.sports.Sum(x => x.totalScore);
-                        if (totalScore > 0)
+                        dimensionScore.sports = basic_Score;
+                    }
+
+                    if (item.art.IsNotEmpty())
+                    {
+                        //艺术
+                        if (schoolSetting.overallEducationSetting.art.Equals("newest"))
                         {
                         {
-                            dimensionScore.sports = sumScore * 1.0 / totalScore;
+                            var art = item.art.OrderByDescending(x => x.examDate).First();
+                            double sumScore = art.sumScore;
+                            double totalScore = art.totalScore;
+                            if (totalScore > 0)
+                            {
+                                dimensionScore.art = sumScore * 1.0 / totalScore * 100;
+                            }
+                            else
+                            {
+                                dimensionScore.art = sumScore * 1.0 / item.art.Count;
+                            }
+                            var subject_music = art.itemScore.Find(x => x.id.Equals("subject_music"));
+                            var subject_painting = art.itemScore.Find(x => x.id.Equals("subject_painting"));
+                            if (subject_music != null)
+                            {
+                                dimensionScore.subject_music = subject_music.score * 1.0 / subject_music.totalScore *100;
+                            }
+                            else
+                            {
+                                dimensionScore.subject_music = 0;
+                            }
+                            if (subject_painting != null)
+                            {
+                                dimensionScore.subject_painting = subject_painting.score * 1.0 / subject_painting.totalScore *100;
+                            }
+                            else
+                            {
+                                dimensionScore.subject_painting = 0;
+                            }
                         }
                         }
                         else
                         else
                         {
                         {
-                            dimensionScore.sports = sumScore * 1.0 / item.sports.Count;
+                            dimensionScore.art = basic_Score;
                         }
                         }
                     }
                     }
+                    else
+                    {
+                        dimensionScore.art = basic_Score;
+                    }
+                    dimensionScore.score = (dimensionScore.virtue + dimensionScore.intelligence + dimensionScore.labour + dimensionScore.art + dimensionScore.sports) / 5;
+                    schoolSetting.overallEducationSetting.reviewLevel.ForEach(z => {
+                        if (z.value[0] <= dimensionScore.score && z.value[1] > dimensionScore.score)
+                        {
+                            dimensionScore.level = z.code;
+                        }
+                    });
+                    grade_dimensions.Add(dimensionScore);
                 }
                 }
-                else {
-                    dimensionScore.sports = basic_Score;
+                //处理年级排名
+                grade_dimensions.OrderByDescending(x => x.score).Select((z, index) => z.gradeRanking = (index + 1));
+                var group_class_dimensions = grade_dimensions.GroupBy(z => z.classId).Select(z => new { key = z.Key, list = z });
+                foreach (var classData in group_class_dimensions)
+                {
+                    var classRanking = classData.list.OrderByDescending(x => x.score).Select((z, index) => z.classRanking = (index + 1));
                 }
                 }
+                // group_class_dimensions.ForEach(x=>x)
+                List<StudentDimensionScore> dimensions = new List<StudentDimensionScore>();
 
 
-                if (item.intelligence.IsNotEmpty())
-                {
-                    //智育
-                    if (schoolSetting.overallEducationSetting.intelligence.Equals("avg"))
-                    {
-                        double sumScore = item.sports.Average(x => x.sumScore);
-                        double totalScore = item.sports.Average(x => x.totalScore);
-                    }
-                    else if (schoolSetting.overallEducationSetting.intelligence.Equals("newest"))
-                    {
 
 
-                    }
-                    else if (schoolSetting.overallEducationSetting.intelligence.Equals("sum"))
+
+                //当前条件的数据
+                foreach (var item in overallEducations)
+                {
+                    var dimension = grade_dimensions.Find(x => x.studentId.Equals(item.studentId));
+                    if (dimension != null)
                     {
                     {
+                        dimensions.Add(dimension);
                     }
                     }
                 }
                 }
-                else {
-                    dimensionScore.intelligence = basic_Score;
-                }
-                if (item.art.IsNotEmpty()) {
-                    //艺术
-                    if (schoolSetting.overallEducationSetting.art.Equals("avg"))
-                    {
+                var class_dimensions = dimensions.GroupBy(z => z.classId).Select(z => new { key = z.Key, list = z });
+                List<dynamic> classDimensions = new List<dynamic>();
+                List<AchievementScore> achievementScores = new List<AchievementScore>();
 
 
-                    }
-                    else if (schoolSetting.overallEducationSetting.art.Equals("newest"))
+                foreach (var classData in class_dimensions)
+                {
+                    ClassDimensionScore classDimensionScore = new ClassDimensionScore() { classId = classData.key };
+                    var clazz = classes.Find(x => x.id.Equals(classData.key));
+                    classDimensionScore.className = clazz?.name;
+                    classDimensionScore.max = classData.list.Max(x => x.score);
+                    classDimensionScore.min = classData.list.Min(x => x.score);
+                    classDimensionScore.score = classData.list.Average(x => x.score);
+                    classDimensionScore.pscore = classData.list.Average(x => x.pscore);
+                    classDimensionScore.tscore = classData.list.Average(x => x.tscore);
+                    classDimensionScore.gscore = classData.list.Average(x => x.gscore);
+                    if (!isClass)
                     {
                     {
+                        achievementScores.Add(new AchievementScore
+                        {
+                            gscore = classDimensionScore.gscore,
+                            pscore = classDimensionScore.pscore,
+                            tscore = classDimensionScore.tscore,
+                            id = classData.key,
+                            name = clazz?.name,
+                            type = "class"
+                        });
                     }
                     }
-                    else if (schoolSetting.overallEducationSetting.art.Equals("sum"))
-                    {
+                    schoolSetting.overallEducationSetting.reviewLevel.ForEach(z => {
+                        if (z.value[0] <= classDimensionScore.score && z.value[1] > classDimensionScore.score)
+                        {
+                            classDimensionScore.level = z.code;
+                        }
+                    });
 
 
-                    }
+                    classDimensions.Add(classDimensionScore);
+                }
+                double pscore_avg = 0;
+                double tscore_avg = 0;
+                double gscore_avg = 0;
+                if (isClass)
+                {
+                    //能力年级平均分
+                    pscore_avg = dimensions.Average(x => x.pscore);
+                    //态度年级平均分
+                    tscore_avg = dimensions.Average(x => x.tscore);
+                    //合作年级平均分
+                    gscore_avg = dimensions.Average(x => x.gscore);
+                    var studentAchievementScores = dimensions.Select(z => new AchievementScore { id = z.studentId, name = z.studentName, gscore = z.gscore, pscore = z.pscore, tscore = z.tscore, type = "student" });
+                    achievementScores.AddRange(studentAchievementScores);
                 }
                 }
                 else
                 else
                 {
                 {
-                    dimensionScore.art = basic_Score;
+                    //能力年级平均分
+                    pscore_avg = grade_dimensions.Average(x => x.pscore);
+                    //态度年级平均分
+                    tscore_avg = grade_dimensions.Average(x => x.tscore);
+                    //合作年级平均分
+                    gscore_avg = grade_dimensions.Average(x => x.gscore);
                 }
                 }
+                #region
+                double data_count = overallEducations.Count;
+                double sports_count90 = data_count > 0 ? dimensions.Where(x => x.sports >= 90).Count() * 1.0 / data_count : 0;
+                double sports_count60 = data_count > 0 ? dimensions.Where(x => x.sports >= 60).Count() * 1.0 / data_count : 0;
+
+                double art_count90 = data_count > 0 ? dimensions.Where(x => x.art >= 90).Count() * 1.0 / data_count : 0;
+                double art_count60 = data_count > 0 ? dimensions.Where(x => x.art >= 60).Count() * 1.0 / data_count : 0;
+
+                double subject_music_count90 = data_count > 0 ? dimensions.Where(x => x.subject_music >= 90).Count() * 1.0 / data_count : 0;
+                double subject_music_count60 = data_count > 0 ? dimensions.Where(x => x.subject_music >= 60).Count() * 1.0 / data_count : 0;
+
+                double subject_painting_count90 = data_count > 0 ? dimensions.Where(x => x.subject_painting >= 90).Count() * 1.0 / data_count : 0;
+                double subject_painting_count60 = data_count > 0 ? dimensions.Where(x => x.subject_painting >= 60).Count() * 1.0 / data_count : 0;
+
+                double labour_count90 = data_count > 0 ? dimensions.Where(x => x.labour >= 90).Count() * 1.0 / data_count : 0;
+                double labour_count60 = data_count > 0 ? dimensions.Where(x => x.labour >= 60).Count() * 1.0 / data_count : 0;
+
+                double virtue_count90 = data_count > 0 ? dimensions.Where(x => x.virtue >= 90).Count() * 1.0 / data_count : 0;
+                double virtue_count60 = data_count > 0 ? dimensions.Where(x => x.virtue >= 60).Count() * 1.0 / data_count : 0;
+
+                double rate90 = data_count > 0 ? dimensions.Where(x => x.score >= 90).Count() * 1.0 / data_count : 0;
+                double rate60 = data_count > 0 ? dimensions.Where(x => x.score >= 60).Count() * 1.0 / data_count : 0;
+                #endregion
+                return Ok(new
+                {
+                    achievementScores,
+                    pscore_avg,
+                    tscore_avg,
+                    gscore_avg,
+                    classDimensions,
+                    dimensions,
+                    data_count,
+                    classCount = classes.Count,
+                    rate90,
+                    rate60,
+                    sports_count60,
+                    sports_count90,
+                    art_count60,
+                    art_count90,
+                    labour_count60,
+                    labour_count90,
+                    virtue_count60,
+                    virtue_count90,
+                    subject_music_count90,
+                    subject_music_count60,
+                    subject_painting_count90,
+                    subject_painting_count60
+                });
+            }
+            catch (Exception ex)
+            {
+              await  _dingDing.SendBotMsg($"{ex.Message}\n{ex.StackTrace}",GroupNames.成都开发測試群組);
+
             }
             }
             return Ok();
             return Ok();
         }
         }
-        //排名指数计算=( 当前值分数- 298) / (9992 - 298) * (99 - 60) + 60
-        //将每个人的积分转化为60-100
-        //排名 = (积分 - 最低积分) / (最高积分 - 最低积分) * (最大排名 - 最小排名) + 最小排名
-        public class DimensionScore
+        /// <summary>
+        /// 素养
+        /// </summary>
+
+        public class AchievementScore 
+        {
+
+            //class 班级,student 学生
+            public string type { get; set; } = "class";
+            /// <summary>
+            /// 班级名称 或者学生姓名
+            /// </summary>
+            public string name { get; set; }
+            /// <summary>
+            /// 班级id 或者学生id
+            /// </summary>
+            public string id { get; set; }
+            public double gscore { get; set; }
+            public double pscore { get; set; }
+            public double tscore { get; set; }
+
+        }
+
+        public class ClassDimensionScore
+        {
+            public string classId { get; set; }
+            public string className { get; set; }
+            public double score { get; set; }
+          
+            public double gscore { get; set; }
+            public double pscore { get; set; }
+            public double tscore { get; set; }
+            public double max { get; set; }
+            public double min { get; set; }
+            public string level { get; set; }
+        }
+        public class StudentDimensionScore
         {
         {
             public string classId { get; set; }
             public string classId { get; set; }
             public string studentId { get; set; }
             public string studentId { get; set; }
+            public string studentName { get; set; }
+            public string picture { get; set; }
             public double score { get; set; }
             public double score { get; set; }
             public double sports { get; set; }
             public double sports { get; set; }
             public double art { get; set; }
             public double art { get; set; }
+            public double subject_music { get; set; }
+            public double subject_painting { get; set; }
             public double labour { get; set; }
             public double labour { get; set; }
             public double intelligence { get; set; }
             public double intelligence { get; set; }
             public double virtue { get; set; }
             public double virtue { get; set; }
-            public double lesson { get; set; }
+            public double exam { get; set; }
+            public double gscore { get; set; }
+            public double pscore { get; set; }
+            public double tscore { get; set; }
+            public int classRanking { get; set; }
+            public int gradeRanking { get; set; }
+            public string level { get; set; }
         }
         }
 
 
         /*
         /*