Prechádzať zdrojové kódy

Merge branch 'develop5.0-tmd' of http://106.12.23.251:10000/TEAMMODEL/TEAMModelOS into develop5.0-tmd

OnePsycho 4 rokov pred
rodič
commit
f1ad412080

+ 21 - 1
TEAMModelFunction/TriggerCorrect.cs

@@ -10,6 +10,8 @@ using TEAMModelOS.SDK.Extension;
 using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
 using TEAMModelOS.SDK.Models;
 using TEAMModelOS.SDK.Models.Cosmos;
+using TEAMModelOS.SDK.Models.Cosmos.Common;
+using TEAMModelOS.SDK.Models.Table;
 
 namespace TEAMModelFunction
 {
@@ -129,12 +131,30 @@ namespace TEAMModelFunction
                                     }
                                 }
                                 List<Task<bool>> tasks = new List<Task<bool>>();
+                                //初始化老师阅卷记录
+                                List<tmdInfo> tmds = new List<tmdInfo>();
+                                for (int i = 0; i < correct.num; i++) {
+                                    tmdInfo fo = new tmdInfo();
+                                    tmds.Add(fo);
+                                }
                                 foreach (ExamClassResult examClass in classResults)
                                 {
                                     foreach (string stuId in examClass.studentIds)
                                     {
                                         int index = examClass.studentIds.IndexOf(stuId);
-                                        tasks.Add(redisClient.HashSetAsync($"Exam:Scoring:{eid}-{subjectId}", stuId, new { tmdId = "" , ans = examClass.studentAnswers[index].Count > 0 ? examClass.studentAnswers[index][0] : "", score = examClass.studentScores[index] }.ToJsonString()));
+                                        if (index > -1) {
+                                            Scoring sc = new Scoring
+                                            {
+                                                blob = examClass.studentAnswers[index].Count > 0 ? examClass.studentAnswers[index][0] : "",
+                                                stuId =stuId,
+                                                examId = eid,
+                                                subjectId = subjectId,
+                                                scores = examClass.studentScores[index]
+                                            };
+                                        }
+                                        
+
+                                        tasks.Add(redisClient.HashSetAsync($"Exam:Scoring:{eid}-{subjectId}", stuId, new { tmdId = tmds, ans = examClass.studentAnswers[index].Count > 0 ? examClass.studentAnswers[index][0] : "", score = examClass.studentScores[index] }.ToJsonString()));
                                     }
 
                                 }

+ 8 - 0
TEAMModelOS.SDK/Models/Cosmos/Api/OpenApi.cs

@@ -45,6 +45,10 @@ namespace TEAMModelOS.SDK.Models
         /// </summary>
         public string descr { get; set; }
         public int auth { get; set; }
+        /// <summary>
+        /// r,w,d,l
+        /// </summary>
+        public string type { get; set; }
     }
     [TableName(Name = "OpenApi")]
     public class Webhook : TableEntity
@@ -71,6 +75,10 @@ namespace TEAMModelOS.SDK.Models
         /// </summary>
         public string descr { get; set; }
         public int auth { get; set; }
+        /// <summary>
+        /// r,w,d,l
+        /// </summary>
+        public string type { get; set; }
     }
     public class OpenApp : CosmosEntity {
         /// <summary>

+ 61 - 0
TEAMModelOS.SDK/Models/Cosmos/Common/Scoring.cs

@@ -0,0 +1,61 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace TEAMModelOS.SDK.Models.Cosmos.Common
+{
+    public class Scoring : CosmosEntity
+    {
+        public Scoring()
+        {
+            pk = "Scoring";
+        }
+        public string stuId { get; set; }
+        public string examId { get; set; }
+        public string subjectId { get; set; }
+        public List<Item> items { get; set; } = new List<Item>();
+        public string blob { get; set; }
+        public List<string> tIds { get; set; } = new List<string>();
+        public List<string> marks { get; set; } = new List<string>();
+        public List<double> scores { get; set; } = new List<double>();
+    }
+
+    public class Item
+    {
+        public List<Info> scores { get; set; } = new List<Info>();
+        //原题的配分
+        public double ssc { get; set; }
+        //public string tmdId { get; set; }
+        public bool flag
+        {
+            get
+            {
+                if (scores.Count > 2)
+                {
+                    //List<double> sc = scores.Select(s => s.sc).ToList();
+                    double diff = Math.Abs(scores.Select(s => s.sc).ToList().Aggregate((i, j) => (i - j) * 6));
+                    if (diff > ssc)
+                    {
+                        return false;
+                    }
+                    else {
+                        return true;
+                    }
+                    
+                }
+                else
+                {
+                    return true;
+                }
+
+            }
+        }
+
+    }
+    public class Info { 
+        public double sc { get; set; }
+        public string tmdId { get; set; }
+    }
+
+}

+ 1 - 1
TEAMModelOS.SDK/Models/Cosmos/School/Class.cs

@@ -41,7 +41,7 @@ namespace TEAMModelOS.SDK.Models
         /// </summary>
         public string periodId { get; set; }
         /// <summary>
-        /// 年级
+        /// 年级 此字段再入学年的情况下已经无用,现阶段只是用来处理历史数据
         /// </summary>
         public string gradeId { get; set; }
         //入学年

+ 14 - 0
TEAMModelOS.SDK/Models/Table/tmdInfo.cs

@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace TEAMModelOS.SDK.Models.Table
+{
+
+    public class tmdInfo
+    {
+        public string tmdId { get; set; }
+        public List<double> tScore { get; set; } = new List<double>();
+        public string mark { get; set; }
+    }
+}

+ 26 - 3
TEAMModelOS/ClientApp/src/assets/iconfont/demo_index.html

@@ -54,6 +54,12 @@
       <div class="content unicode" style="display: block;">
           <ul class="icon_lists dib-box">
           
+            <li class="dib">
+              <span class="icon iconfont">&#xe6c3;</span>
+                <div class="name">开放</div>
+                <div class="code-name">&amp;#xe6c3;</div>
+              </li>
+          
             <li class="dib">
               <span class="icon iconfont">&#xe718;</span>
                 <div class="name">在籍学生</div>
@@ -810,9 +816,9 @@
 <pre><code class="language-css"
 >@font-face {
   font-family: 'iconfont';
-  src: url('iconfont.woff2?t=1623427872430') format('woff2'),
-       url('iconfont.woff?t=1623427872430') format('woff'),
-       url('iconfont.ttf?t=1623427872430') format('truetype');
+  src: url('iconfont.woff2?t=1624327216353') format('woff2'),
+       url('iconfont.woff?t=1624327216353') format('woff'),
+       url('iconfont.ttf?t=1624327216353') format('truetype');
 }
 </code></pre>
           <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
@@ -838,6 +844,15 @@
       <div class="content font-class">
         <ul class="icon_lists dib-box">
           
+          <li class="dib">
+            <span class="icon iconfont icon-open"></span>
+            <div class="name">
+              开放
+            </div>
+            <div class="code-name">.icon-open
+            </div>
+          </li>
+          
           <li class="dib">
             <span class="icon iconfont icon-student1"></span>
             <div class="name">
@@ -1972,6 +1987,14 @@
       <div class="content symbol">
           <ul class="icon_lists dib-box">
           
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-open"></use>
+                </svg>
+                <div class="name">开放</div>
+                <div class="code-name">#icon-open</div>
+            </li>
+          
             <li class="dib">
                 <svg class="icon svg-icon" aria-hidden="true">
                   <use xlink:href="#icon-student1"></use>

+ 7 - 3
TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.css

@@ -1,8 +1,8 @@
 @font-face {
   font-family: "iconfont"; /* Project id 2000444 */
-  src: url('iconfont.woff2?t=1623427872430') format('woff2'),
-       url('iconfont.woff?t=1623427872430') format('woff'),
-       url('iconfont.ttf?t=1623427872430') format('truetype');
+  src: url('iconfont.woff2?t=1624327216353') format('woff2'),
+       url('iconfont.woff?t=1624327216353') format('woff'),
+       url('iconfont.ttf?t=1624327216353') format('truetype');
 }
 
 .iconfont {
@@ -13,6 +13,10 @@
   -moz-osx-font-smoothing: grayscale;
 }
 
+.icon-open:before {
+  content: "\e6c3";
+}
+
 .icon-student1:before {
   content: "\e718";
 }

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 1 - 1
TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.js


+ 7 - 0
TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.json

@@ -5,6 +5,13 @@
   "css_prefix_text": "icon-",
   "description": "",
   "glyphs": [
+    {
+      "icon_id": "20587121",
+      "name": "开放",
+      "font_class": "open",
+      "unicode": "e6c3",
+      "unicode_decimal": 59075
+    },
     {
       "icon_id": "8827519",
       "name": "在籍学生",

BIN
TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.ttf


BIN
TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.woff


BIN
TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.woff2


+ 11 - 1
TEAMModelOS/ClientApp/src/common/BaseLayout.vue

@@ -335,7 +335,17 @@ export default {
                     menuName: 'totalIndex',
                     child: []
                 },
-
+                //开放平台
+                {
+                    icon: 'iconfont icon-open',
+                    name: this.$t('settings.setting_title3'),
+                    router: '/home/OpenPlat',
+                    tag: '',
+                    role: 'admin',
+                    permission: '',
+                    menuName: 'OpenPlat',
+                    child: []
+                }
             ] : []
             this.teacherMenu = [
                 // 我的班级

+ 7 - 1
TEAMModelOS/ClientApp/src/common/BaseUserPoptip.vue

@@ -17,7 +17,7 @@
             <Dropdown placement="bottom-end">
                 <PersonalPhoto style="cursor: pointer;" :name="userInfo.username" :picture="user.picture" :color="userInfo.nameColor" />
                 <DropdownMenu slot="list" class="user-center-wrap">
-                    <DropdownItem class="user-info-wrap">
+                    <DropdownItem class="user-info-wrap" @click.native="toUserCenter()">
                         <p>{{userInfo.username}}</p>
                         <p class="user-id">{{`ID: ${user.id}`}}</p>
                         <Icon class="user-info-arrow" type="ios-arrow-forward" color="#1cc0f3" />
@@ -138,6 +138,12 @@ export default {
                 path: '/home/settings',
                 query: { tab }
             })
+        },
+		// 这里可以携带参数,直接跳转到对应的tab
+        toUserCenter() {
+            this.$router.push({
+                name: 'userCenter'
+            })
         },
         doRefresh() {
             this.user = JSON.parse(decodeURIComponent(localStorage.userInfo, "utf-8"));

+ 18 - 0
TEAMModelOS/ClientApp/src/router/routes.js

@@ -660,6 +660,24 @@ export const routes = [
 				activeName: 'settings'
 			}
 		},
+		//设置
+		{
+			path: 'OpenPlat',
+			name: 'OpenPlat',
+			component: resolve => require(['@/view/settings/OpenMgmt2.vue'], resolve),
+			meta: {
+				activeName: 'OpenPlat'
+			}
+		},
+		//设置
+		{
+			path: 'userCenter',
+			name: 'userCenter',
+			component: resolve => require(['@/view/user/UserCenter.vue'], resolve),
+			meta: {
+				
+			}
+		},
 		//课堂记录
 		{
 			path: 'classRecord',

+ 1 - 1
TEAMModelOS/ClientApp/src/view/Home.vue

@@ -6,7 +6,7 @@
             <div class="header-right-box fl-around" slot="header-content">
                 <Icon style="display:block" custom="iconfont icon-home" :color="routerName == 'homePage' ? '#1CC0F3':'#d0d0d0'" @click="toHome" />
                 <BaseNotification :msgs="msgs"></BaseNotification>
-                <span class="header-split">|</span>
+                <span class="header-split"></span>
                 <!-- <Icon type="ios-settings" :color="routerName == 'settings' ? '#1CC0F3':'#d0d0d0'" @click="toSettings" /> -->
                 <!-- 问题答疑页面暂未开发 暂时注释 -->
                 <!-- <Icon type="md-help-circle" :color="routerName == 'feedback' ? '#1CC0F3':'#d0d0d0'" @click="toFeedback"/> -->

+ 5 - 4
TEAMModelOS/ClientApp/src/view/settings/Index.vue

@@ -3,7 +3,7 @@
         <div class="settings-header">
             <span :class="['settings-header-item',activeTab === '1' ?  'active-item' : '']" @click="onTabChange('1')">{{ $t('settings.setting_title1')}}</span>
             <span :class="['settings-header-item',activeTab === '0' ?  'active-item' : '']" @click="onTabChange('0')">{{ $t('settings.setting_title2')}}</span>
-            <span :class="['settings-header-item',activeTab === '2' ?  'active-item' : '']" @click="onTabChange('2')">{{ $t('settings.setting_title3')}}</span>
+            <!-- <span :class="['settings-header-item',activeTab === '2' ?  'active-item' : '']" @click="onTabChange('2')">{{ $t('settings.setting_title3')}}</span> -->
         </div>
 
         <div class="settings-body">
@@ -54,7 +54,8 @@
             </div>
             <SchoolMgmt v-if="activeTab === '1'" class="animated fadeIn"></SchoolMgmt>
             <!-- <OpenMgmt v-if="activeTab === '2'" class="animated fadeIn"></OpenMgmt> -->
-            <OpenMgmt2 v-if="activeTab === '2'" class="animated fadeIn"></OpenMgmt2>
+            <!-- 换成独立菜单了 -->
+            <!-- <OpenMgmt2 v-if="activeTab === '2'" class="animated fadeIn"></OpenMgmt2> -->
         </div>
     </div>
 </template>
@@ -63,12 +64,12 @@
 //import "@/css/less-variable.less"
 import SchoolMgmt from './SchoolMgmt.vue'
 import OpenMgmt from './OpenMgmt.vue'
-import OpenMgmt2 from './OpenMgmt2.vue';
+// import OpenMgmt2 from './OpenMgmt2.vue';
 export default {
     components: {
         SchoolMgmt,
         OpenMgmt,
-        OpenMgmt2
+        // OpenMgmt2
     },
     data() {
         return {

+ 20 - 0
TEAMModelOS/ClientApp/src/view/user/UserCenter.vue

@@ -0,0 +1,20 @@
+<template>
+    <div class="user-center-container">
+        <h1 style="color:white;text-align:center;margin-top:120px;color:#AAA">账号信息</h1>
+    </div>
+</template>
+<script>
+export default {
+    data(){
+        return{
+
+        }
+    }
+}
+</script>
+<style lang="less" scoped>
+
+</style>
+<style lang="less">
+
+</style>

+ 33 - 6
TEAMModelOS/Controllers/Analysis/AnalysisController.cs

@@ -420,6 +420,7 @@ namespace TEAMModelOS.Controllers.Analysis
                     ClassAys classAys = new ClassAys
                     {
                         gradeId = classroom.gradeId,
+                        year = classroom.year,
                         studentIds = studentIds,
                         stuCount = stuCount,
                         classId = classId,
@@ -493,19 +494,20 @@ namespace TEAMModelOS.Controllers.Analysis
                     classes.Add(classAys);
                 }
                 //处理年级
-                var tgrades = classes.GroupBy(x => x.gradeId).Select(x => x.Key);
+                var tgrades = classes.GroupBy(x => x.year).Select(x => x.Key);
                 foreach (var greade in tgrades)
                 {
-                    var clases = classes.Where(x => x.gradeId.Equals(greade));
+                    string gid = await getGId(greade, info.period.id, info.school);
+                    var clases = classes.Where(x => x.year.Equals(greade));
                     var classCount = clases.Count();
                     var stu = clases.SelectMany(x => x.studentIds).ToList();
                     var lineCount = clases.Select(x => x.lineCount).Sum();
                     var totalAverage = clases.Select(x => x.totalAverage).Sum() * 1.0 / classCount;
                     GradeAys gradeAys = new GradeAys
                     {
-                        gradeId = greade,
+                        gradeId = gid,
                         studentIds = stu,
-                        gradeName = info.grades.Where(x => x.id == greade).FirstOrDefault().name,
+                        gradeName = info.grades.Where(x => x.id == gid).FirstOrDefault().name,
                         stuCount = stu.Count,
                         lineCount = lineCount,
                         totalAverage = totalAverage,
@@ -524,13 +526,13 @@ namespace TEAMModelOS.Controllers.Analysis
                             passPercent = passPercent,
                             average = average,
                             name = info.subjects.Where(x => x.id == key).FirstOrDefault().name,
-                            item = gscores.Where(x => x.Key == key).FirstOrDefault().Value.Where(cls => cls.Key == greade).FirstOrDefault().Value
+                            item = gscores.Where(x => x.Key == key).FirstOrDefault().Value.Where(cls => cls.Key == gid).FirstOrDefault().Value
                         };
                         gradeAys.subjects.Add(subject);
                     }
                     grades.Add(gradeAys);
                     //处理学生年级相关的pr值
-                    var studentAys = students.Where(x => x.gradeId.Equals(greade)).ToList();
+                    var studentAys = students.Where(x => x.gradeId.Equals(gid)).ToList();
                     var stuGradeTotal = studentAys.Select(x => x.total).ToList();
                     stuGradeTotal.Sort((s1, s2) => { return s2.CompareTo(s1); });
                     var stuCount = stuGradeTotal.Count;
@@ -1625,5 +1627,30 @@ namespace TEAMModelOS.Controllers.Analysis
             }
         }
 
+        public async Task<string> getGId(int cyear,string periodId,string code) {
+            var client = _azureCosmos.GetCosmosClient();
+            School sc = await client.GetContainer("TEAMModelOS", "School").ReadItemAsync<School>(code, new Azure.Cosmos.PartitionKey("Base"));
+            string gradeId = "";
+            foreach (Period period in sc.period)
+            {
+                if (period.id.Equals(periodId))
+                {
+                    foreach (Semester semester in period.semesters)
+                    {
+                        if (semester.start == 1)
+                        {
+                            int year = DateTimeOffset.UtcNow.Year;
+                            int month = DateTimeOffset.UtcNow.Month;
+                            int day = DateTimeOffset.UtcNow.Day;
+                            int time = month > semester.month ? 0 : 1;
+                            int eyear = cyear - time;
+                            gradeId = (year - eyear).ToString();
+                        }
+                    }
+                }
+            }
+            return gradeId;
+        }
+
     }
 }

+ 1 - 0
TEAMModelOS/Controllers/Analysis/ClassAys.cs

@@ -21,6 +21,7 @@ namespace TEAMModelOS.Controllers.Analysis
         public double totalAverage { get; set; }
         public double standardDeviation { get; set; }
         public string gradeId { get; set; }
+        public int year { get; set; }
         //记录班级得分率
         public double csRate { get; set; }
     }

+ 91 - 23
TEAMModelOS/Controllers/Common/ExamController.cs

@@ -1517,19 +1517,24 @@ namespace TEAMModelOS.Controllers
                 ExamInfo info = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<ExamInfo>(id.ToString(), new PartitionKey($"Exam-{code}"));
                 List<ExamClassResult> classResults = new();
                 List<dynamic> attr = new List<dynamic>();
-                //List<dynamic> all = new List<dynamic>();
                 var record = await redisClient.HashGetAllAsync($"Exam:Scoring:{id}-{subjectId}");
                 foreach (var rcd in record)
                 {
                     var value = JsonDocument.Parse(rcd.Value.ToString());
-                    value.RootElement.TryGetProperty("tmdId", out JsonElement tmdId);
-                    if (tId.ToString().Equals(tmdId.ToString()))
+                    value.RootElement.TryGetProperty("info", out JsonElement json);
+                    List<tmdInfo> tmds = json.ToObject<List<tmdInfo>>();
+                    foreach (tmdInfo tmd in tmds)
                     {
-                        attr.Add(new { stuId = rcd.Name.ToString(), info = value });
+                        if (!string.IsNullOrEmpty(tmd.tmdId) && tmd.tmdId.Equals(tId.ToString()))
+                        {
+                            attr.Add(new { stuId = rcd.Name.ToString(), info = value });
+                            break;
+                        }
                     }
-
-
-
+                    /*                    if (tId.ToString().Equals(tmdId.ToString()))
+                                        {
+                                            attr.Add(new { stuId = rcd.Name.ToString(), info = value });
+                                        }*/
                 }
                 int index = 0;
                 foreach (ExamSubject subject in info.subjects)
@@ -1576,15 +1581,29 @@ namespace TEAMModelOS.Controllers
                 foreach (var rcd in record)
                 {
                     var value = JsonDocument.Parse(rcd.Value.ToString());
-                    value.RootElement.TryGetProperty("tmdId", out JsonElement tmdId);
-                    if (tId.ToString().Equals(tmdId.ToString()))
+                    value.RootElement.TryGetProperty("info", out JsonElement json);
+                    List<tmdInfo> tmds = json.ToObject<List<tmdInfo>>();
+                    foreach (tmdInfo tmd in tmds)
+                    {
+                        if (!string.IsNullOrEmpty(tmd.tmdId) && tmd.tmdId.Equals(tId.ToString()))
+                        {
+                            recs.Add(new { stuId = rcd.Name.ToString(), info = value });
+                            break;
+                        }
+                        if (string.IsNullOrEmpty(tmd.tmdId))
+                        {
+                            all.Add(new { stuId = rcd.Name.ToString(), ans = value });
+                            break;
+                        }
+                    }
+                    /*if (tId.ToString().Equals(tmdId.ToString()))
                     {
                         recs.Add(new { stuId = rcd.Name.ToString(), ans = value });
                     }
                     if (string.IsNullOrEmpty(tmdId.ToString()))
                     {
                         all.Add(new { stuId = rcd.Name.ToString(), ans = value });
-                    }
+                    }*/
                 }
                 if (requert.TryGetProperty("stuId", out JsonElement stuId))
                 {
@@ -1594,7 +1613,17 @@ namespace TEAMModelOS.Controllers
                     //保证此学生与该老师绑定
                     value.RootElement.TryGetProperty("ans", out JsonElement blob);
                     value.RootElement.TryGetProperty("score", out JsonElement sc);
-                    await redisClient.HashSetAsync($"Exam:Scoring:{id}-{subjectId}", stuId.ToString(), new { ans = blob, score = sc, tmdId = tId }.ToJsonString());
+                    value.RootElement.TryGetProperty("info", out JsonElement json);
+                    List<tmdInfo> tmds = json.ToObject<List<tmdInfo>>();
+                    foreach (tmdInfo tmd in tmds)
+                    {
+                        if (string.IsNullOrEmpty(tmd.tmdId))
+                        {
+                            tmd.tmdId = tId.ToString();
+                            break;
+                        }
+                    }
+                    await redisClient.HashSetAsync($"Exam:Scoring:{id}-{subjectId}", stuId.ToString(), new { info = tmds, ans = blob, score = sc }.ToJsonString());
 
                     return Ok(value);
                 }
@@ -1621,8 +1650,18 @@ namespace TEAMModelOS.Controllers
                         json.RootElement.TryGetProperty("ans", out JsonElement ans);
                         ans.TryGetProperty("score", out JsonElement sc);
                         ans.TryGetProperty("ans", out JsonElement blob);
+                        ans.TryGetProperty("info", out JsonElement element);
+                        List<tmdInfo> tmds = element.ToObject<List<tmdInfo>>();
+                        foreach (tmdInfo tmd in tmds)
+                        {
+                            if (string.IsNullOrEmpty(tmd.tmdId))
+                            {
+                                tmd.tmdId = tId.ToString();
+                                break;
+                            }
+                        }
                         //选取后,缓存池相应的减少,以便于分配给其他的老师
-                        await redisClient.HashSetAsync($"Exam:Scoring:{id}-{subjectId}", sId.ToString(), new { ans = blob, score = sc, tmdId = tId }.ToJsonString());
+                        await redisClient.HashSetAsync($"Exam:Scoring:{id}-{subjectId}", sId.ToString(), new { info = tmds, ans = blob, score = sc }.ToJsonString());
                         return Ok(item);
                     }
 
@@ -1686,29 +1725,40 @@ namespace TEAMModelOS.Controllers
                 if (!requert.TryGetProperty("stuId", out JsonElement sId)) return BadRequest();
                 if (!requert.TryGetProperty("subjectId", out JsonElement subjectId)) return BadRequest();
                 if (!requert.TryGetProperty("tmdId", out JsonElement tId)) return BadRequest();
-                if (!requert.TryGetProperty("score", out JsonElement score)) return BadRequest(); 
+                if (!requert.TryGetProperty("score", out JsonElement score)) return BadRequest();
                 if (!requert.TryGetProperty("count", out JsonElement count)) return BadRequest();
                 if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
                 //if (!requert.TryGetProperty("mark", out JsonElement mark)) return BadRequest();
                 //requert.TryGetProperty("mark", out JsonElement mark);
                 var client = _azureCosmos.GetCosmosClient();
-				var redisClient = _azureRedis.GetRedisClient(8);
+                var redisClient = _azureRedis.GetRedisClient(8);
                 List<ExamClassResult> classResults = new();
                 List<dynamic> recs = new List<dynamic>();
                 var record = await redisClient.HashGetAllAsync($"Exam:Scoring:{id}-{subjectId}");
                 foreach (var rcd in record)
                 {
                     var values = JsonDocument.Parse(rcd.Value.ToString());
-                    values.RootElement.TryGetProperty("tmdId", out JsonElement tmdId);
-                    if (tId.ToString().Equals(tmdId.ToString()))
+                    values.RootElement.TryGetProperty("info", out JsonElement json);
+                    List<tmdInfo> tmdInfos = json.ToObject<List<tmdInfo>>();
+                    foreach (tmdInfo tmd in tmdInfos)
                     {
-                        recs.Add(new { stuId = rcd.Name.ToString(), ans = values });
+                        if (!string.IsNullOrEmpty(tmd.tmdId) && tmd.tmdId.Equals(tId.ToString()))
+                        {
+                            recs.Add(new { stuId = rcd.Name.ToString(), info = values });
+                            break;
+                        }
                     }
+                    /*if (tId.ToString().Equals(tmdId.ToString()))
+                    {
+                        recs.Add(new { stuId = rcd.Name.ToString(), ans = values });
+                    }*/
                 }
                 var stuAns = await redisClient.HashGetAsync($"Exam:Scoring:{id}-{subjectId}", sId.ToString());
                 var value = JsonDocument.Parse(stuAns.ToString());
                 value.RootElement.TryGetProperty("ans", out JsonElement blob);
-                value.RootElement.TryGetProperty("mark", out JsonElement element);
+                value.RootElement.TryGetProperty("info", out JsonElement element);
+                List<tmdInfo> tmds = element.ToObject<List<tmdInfo>>();
+
                 StringBuilder builder = new StringBuilder();
                 if (requert.TryGetProperty("mark", out JsonElement mark))
                 {
@@ -1718,12 +1768,30 @@ namespace TEAMModelOS.Controllers
                     builder.Append(sId).Append("mark").Append("/");
                     builder.Append("ans.json");
                     await _azureStorage.UploadFileByContainer(code.ToString(), mark.ToJsonString(), "exam", builder.ToString(), false);
-                    await redisClient.HashSetAsync($"Exam:Scoring:{id}-{subjectId}", sId.ToString(), new { ans = blob, score = score, tmdId = tId, mark = builder.ToString() }.ToJsonString());
+                    foreach (tmdInfo tmd in tmds)
+                    {
+                        if (string.IsNullOrEmpty(tmd.tmdId))
+                        {
+                            tmd.tmdId = tId.ToString();
+                            tmd.mark = builder.ToString();
+                            break;
+                        }
+                    }
+                    await redisClient.HashSetAsync($"Exam:Scoring:{id}-{subjectId}", sId.ToString(), new { info = tmds, ans = blob, score = score }.ToJsonString());
                 }
-                else {
-                    await redisClient.HashSetAsync($"Exam:Scoring:{id}-{subjectId}", sId.ToString(), new { ans = blob, score = score, tmdId = tId, mark = element }.ToJsonString());
-                }                
-                
+                else
+                {
+                    foreach (tmdInfo tmd in tmds)
+                    {
+                        if (string.IsNullOrEmpty(tmd.tmdId))
+                        {
+                            tmd.tmdId = tId.ToString();
+                            break;
+                        }
+                    }
+                    await redisClient.HashSetAsync($"Exam:Scoring:{id}-{subjectId}", sId.ToString(), new { info = tmds, ans = blob, score = score }.ToJsonString());
+                }
+
                 if (recs.Count == count.GetInt32())
                 {
                     await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryIterator<ExamClassResult>(

+ 1 - 1
TEAMModelOS/Controllers/Syllabus/ShareController.cs

@@ -300,7 +300,7 @@ namespace TEAMModelOS.Controllers
                                 {
                                     x.agree = 0;
                                 }
-                                else if ($"{opt}".Equals("ignore"))
+                                else if ($"{opt}".Equals("agree"))
                                 {
                                     x.agree = 1;
                                 }