Procházet zdrojové kódy

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

liqk před 3 roky
rodič
revize
96138c9121

+ 198 - 137
TEAMModeBI/Controllers/BIHome/HomeStatisController.cs

@@ -6,10 +6,11 @@ using System.Linq;
 using System.Threading.Tasks;
 using System.Text.Json;
 using TEAMModelOS.SDK.DI;
-using TEAMModelOS.Models;
 using Azure.Cosmos;
 using Microsoft.Extensions.Options;
 using TEAMModelOS.SDK.Models;
+using TEAMModelOS.Models;
+using System.Text;
 
 namespace TEAMModeBI.Controllers.BIHome
 {
@@ -29,18 +30,16 @@ namespace TEAMModeBI.Controllers.BIHome
         }
 
         /// <summary>
-        /// 依据学校编号,获取教师、学生数量
-        /// 没有传入学校编号,获取全部教师数量、学生数量、已创校数量、全部学校总空间大小
+        /// 获取全部教师数量、学生数量、已创校数量、全部学校总空间大小
         /// </summary>
         /// <param name="jsonElement"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
-        [HttpPost("get-numberpeople")]
-        public async Task<IActionResult> GetNumberPeople(JsonElement jsonElement)  
+        [HttpPost("get-allnumber")]
+        public async Task<IActionResult> GetAllNumber()
         {
             try
             {
-                jsonElement.TryGetProperty("schooolid", out JsonElement schoolId);
                 var client = _azureCosmos.GetCosmosClient();
 
                 //依据学校查询教师人数
@@ -51,146 +50,55 @@ namespace TEAMModeBI.Controllers.BIHome
                 List<string> schoolCount_List = new();
                 //学校空间大小
                 int schoolsize = 0;
-                //方案数
-                List<string> areaCount_List = new();
-                //册别数量
-                List<string> abilityCount = new List<string>();
-                //章节数量
-                List<string> abilityTaskCount = new List<string>();
-
-                if (!string.IsNullOrEmpty($"{schoolId}"))
-                {
-                    //查询学校教师人数
-                    await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryStreamIterator(queryText: $"select c.id from c join S1 in c.schools where S1.schoolId='{schoolId}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base") }))
-                    {
-                        using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                        if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
-                        {
-                            var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
-                            while (accounts.MoveNext())
-                            {
-                                JsonElement account = accounts.Current;
-                                teacherCount_list.Add(account.GetProperty("id").GetString());
-                            }
-                        }
-                    }
 
-                    //查询学校学生人数
-                    await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryStreamIterator(queryText: $"select c.id from c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base-{schoolId}") }))
-                    {
-                        using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                        if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
-                        {
-                            var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
-                            while (accounts.MoveNext())
-                            {
-                                JsonElement account = accounts.Current;
-                                studentCount_List.Add(account.GetProperty("id").GetString());
-                            }
-                        }
-                    }
-
-                    return Ok(new { teacherCount = teacherCount_list.Count, studentCount = studentCount_List.Count });
-                }
-                else
+                //查询全部教师人数
+                await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryStreamIterator(queryText: $"select * from c ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base") }))
                 {
-                    //查询全部教师人数
-                    await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryStreamIterator(queryText: $"select * from c ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base") }))
+                    using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
                     {
-                        using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                        if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                        var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
+                        while (accounts.MoveNext())
                         {
-                            var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
-                            while (accounts.MoveNext())
-                            {
-                                JsonElement account = accounts.Current;
-                                teacherCount_list.Add(account.GetProperty("id").GetString());
-                            }
+                            JsonElement account = accounts.Current;
+                            teacherCount_list.Add(account.GetProperty("id").GetString());
                         }
                     }
+                }
 
-                    //查询全部学生人数
-                    await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryStreamIterator(queryText: $"select c.id from c where c.pk='Base'"))
+                //查询全部学生人数
+                await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryStreamIterator(queryText: $"select c.id from c where c.pk='Base'"))
+                {
+                    using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
                     {
-                        using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                        if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                        var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
+                        while (accounts.MoveNext())
                         {
-                            var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
-                            while (accounts.MoveNext())
-                            {
-                                JsonElement account = accounts.Current;
-                                studentCount_List.Add(account.GetProperty("id").GetString());
-                            }
+                            JsonElement account = accounts.Current;
+                            studentCount_List.Add(account.GetProperty("id").GetString());
                         }
                     }
+                }
 
-                    //查询已创建多少学校
-                    await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: $"select c.id,c.size from c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") })) 
-                    {
-                        using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                        if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
-                        {
-                            var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
-                            while (accounts.MoveNext())
-                            {
-                                JsonElement account = accounts.Current;
-                                schoolCount_List.Add(account.GetProperty("id").GetString());
-                                schoolsize += int.Parse(account.GetProperty("size").ToString());
-                            }
-                        }
-                    }
-                    //查询微能力点方案
-                    await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Normal").GetItemQueryStreamIterator(queryText: $"select c.id,c.standard from c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base-Area") }))
+                //查询已创建多少学校
+                await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: $"select c.id,c.size from c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
+                {
+                    using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
                     {
-                        using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                        if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                        var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
+                        while (accounts.MoveNext())
                         {
-                            var area = json.RootElement.GetProperty("Documents").EnumerateArray();
-                            while (area.MoveNext()) 
-                            {
-                                JsonElement areacount = area.Current;
-                                areaCount_List.Add(areacount.GetProperty("standard").GetString());
-                            }
+                            JsonElement account = accounts.Current;
+                            schoolCount_List.Add(account.GetProperty("id").GetString());
+                            schoolsize += int.Parse(account.GetProperty("size").ToString());
                         }
                     }
-                    if (areaCount_List.Count > 0)
-                    {
-                        foreach (var tempItem in areaCount_List)
-                        {
-                            //册别数量
-                            await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Normal").GetItemQueryStreamIterator(queryText: $"select c.id from c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Ability-{tempItem}") }))
-                            {
-                                using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                                if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
-                                {
-                                    var tempAbility = json.RootElement.GetProperty("Documents").EnumerateArray();
-                                    while (tempAbility.MoveNext())
-                                    {
-                                        JsonElement jsonAbility = tempAbility.Current;
-                                        abilityCount.Add(jsonAbility.GetProperty("id").GetString());
-                                    }
-                                }
-                            }
+                }
 
-                            //章节数量
-                            await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Normal").GetItemQueryStreamIterator(queryText: $"select c.id from c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"AbilityTask-{tempItem}") }))
-                            {
-                                using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                                if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
-                                {
-                                    var tempAbilityTask = json.RootElement.GetProperty("Documents").EnumerateArray();
-                                    while (tempAbilityTask.MoveNext())
-                                    {
-                                        JsonElement jsonAbilityTask = tempAbilityTask.Current;
-                                        abilityTaskCount.Add(jsonAbilityTask.GetProperty("id").GetString());
-                                    }
-                                }
-                            }
-                        }
-                    }
+                return Ok(new { teacherCount = teacherCount_list.Count, studentCount = studentCount_List.Count, schoolCount = schoolCount_List.Count, schoolSize = schoolsize });
 
-                    return Ok(new { teacherCount = teacherCount_list.Count, studentCount = studentCount_List.Count, schoolCount = schoolCount_List.Count, schoolsize = schoolsize, areaCount = areaCount_List.Count, abilityCount = abilityCount.Count, abilityTaskCount = abilityTaskCount.Count });
-                }
             }
             catch (Exception ex)
             {
@@ -310,37 +218,190 @@ namespace TEAMModeBI.Controllers.BIHome
         }
 
         /// <summary>
-        /// 查询地区信息
+        /// 查询所有区级信息统计数据
         /// </summary>
         /// <param name="jsonElement"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
-        [HttpPost("get-regionnumber")]
-        public async Task<IActionResult> GetRegionNumber(JsonElement jsonElement) 
+        [HttpPost("get-alldiststics")]
+        public async Task<IActionResult> GetAllDistStics(JsonElement jsonElement) 
         {
             try
             {
-                jsonElement.TryGetProperty("country", out JsonElement _country);  //
-                jsonElement.TryGetProperty("province", out JsonElement _province);
-                jsonElement.TryGetProperty("city", out JsonElement _city);
-                jsonElement.TryGetProperty("county", out JsonElement _county);
+                var cosmosClient = _azureCosmos.GetCosmosClient();
+                List<SticsCity> standards = new List<SticsCity>();
+                StringBuilder stringBuder = new StringBuilder("select c.name,c.provName,c.cityName,c.standard from c");
+                //查询省份区域
+                await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Normal").GetItemQueryIterator<Area>(queryText: stringBuder.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base-Area") }))
+                {
+                    SticsCity sticsCity = new SticsCity
+                    {
+                        provName = item.provName,
+                        cityName = item.cityName,
+                        distName = item.name,
+                        standard = item.standard
+                    };
+                    standards.Add(sticsCity);
+                }
+                List<SticsDist> sticsDists = new List<SticsDist>();
+
+                //查询所有下面的学校数量
+                foreach (var itemStandrds in standards) 
+                {
+                    SticsDist sticsDist = new SticsDist();
+
+                    sticsDist.provName = itemStandrds.provName;
+                    sticsDist.cityName = itemStandrds.cityName;
+                    sticsDist.distName = itemStandrds.distName;
+                    sticsDist.standard = itemStandrds.standard;
+
+                    List<string> schoolIds = new List<string>();
+                    int schoolCount = 0;
 
+                    await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: $"select c.id from c where c.standard='{itemStandrds.standard}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base") }))
+                    {
+                        using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                        if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                        {
+                            var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
+                            while (accounts.MoveNext())
+                            {
+                                JsonElement account = accounts.Current;
+                                schoolIds.Add(account.GetProperty("id").GetString());
+                                schoolCount += 1;
+                            }
+                        }
+                    }
+
+                    sticsDist.schoolCount = schoolCount;
 
+                    int teacherCount = 0;  //教师数量
+                    int studentCount = 0;  //学生数量
+                    List<string> teacherIds = new List<string>();
 
+                    List<string> studentIds = new List<string>();
+
+                    //查询学校下面的教师人数
+                    foreach (var itemSchool in schoolIds)
+                    {
+                        string sqlTeacherTxt = $"select distinct value(c) from c join a1 in c.schools where a1.schoolId='{itemSchool}'";
+                        //查询全部教师人数
+                        await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryStreamIterator(queryText: sqlTeacherTxt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base") }))
+                        {
+                            using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                            if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                            {
+                                var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
+                                while (accounts.MoveNext())
+                                {
+                                    //JsonElement account = accounts.Current;
+                                    //teacherIds.Add(account.GetProperty("id").GetString());
+                                    teacherCount += 1;
+                                }
+                            }
+                        }
 
+                        //查询全部学生人数
+                        await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryStreamIterator(queryText: $"select c.id from c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base-{itemSchool}") }))
+                        {
+                            using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                            if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                            {
+                                var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
+                                while (accounts.MoveNext())
+                                {
+                                    //JsonElement account = accounts.Current;
+                                    //studentIds.Add(account.GetProperty("id").GetString());
+                                    studentCount += 1;
+                                }
+                            }
+                        }
+                    }
 
+                    sticsDist.teacherCount = teacherCount;
+                    sticsDist.studentCount = studentCount;
 
+                    sticsDists.Add(sticsDist);
+                }
 
-                return Ok(new { state = 200 });
+                return Ok(new { state = 200, sticsDists });
             }
             catch (Exception ex)
             {
-                await _dingDing.SendBotMsg($"BI,{_option.Location}  homestatis/get-regionnumber   \n {ex.Message}{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
+                await _dingDing.SendBotMsg($"BI,{_option.Location}  homestatis/get-alldiststics   \n {ex.Message}{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
 
                 return BadRequest();
             }
         }
 
 
+        /// <summary>
+        /// 区域
+        /// </summary>
+        public record SticsCity
+        {
+            /// <summary>
+            /// 省份
+            /// </summary>
+            public string provName { get; set; }
+
+            /// <summary>
+            /// 市名称
+            /// </summary>
+            public string cityName { get; set; }
+
+            /// <summary>
+            /// 区域名称
+            /// </summary>
+            public string distName { get; set; }
+
+            /// <summary>
+            /// 区域标准
+            /// </summary>
+            public string standard { get; set; }
+        }
+
+        /// <summary>
+        /// 返回统计数据
+        /// </summary>
+        public record SticsDist 
+        {
+            /// <summary>
+            /// 省份
+            /// </summary>
+            public string provName { get; set; }
+
+            /// <summary>
+            /// 市名
+            /// </summary>
+            public string cityName { get; set; }
+
+            /// <summary>
+            /// 区域标准名称
+            /// </summary>
+            public string distName { get; set; }
+
+            /// <summary>
+            /// 区域标准
+            /// </summary>
+            public string standard { get; set; }
+
+            /// <summary>
+            /// 学校数量
+            /// </summary>
+            public int schoolCount { get; set; }
+
+            /// <summary>
+            /// 教师人数
+            /// </summary>
+            public int teacherCount { get; set; }
+
+            /// <summary>
+            /// 学生人数
+            /// </summary>
+            public int studentCount { get; set; }
+        }
+
+
     }
 }

+ 2 - 3
TEAMModelOS/ClientApp/src/components/syllabus/DragTree.vue

@@ -1,7 +1,7 @@
 <template>
 	<div class="syllabus-tree-main">
 		<vuescroll>
-			<el-tree :data="treeDatas" :props="defaultProps" :allow-drop="allowDrop" class="tree" node-key="id"
+			<el-tree :data="treeDatas" :props="defaultProps"  class="tree" node-key="id"
 				default-expand-all highlight-current @node-drop="handleDrop" @node-click="onNodeClick"
 				:draggable="Boolean(editable)" :expand-on-click-node="false" ref="tree">
 				<span class="custom-tree-node" slot-scope="{ node, data }">
@@ -161,10 +161,9 @@
 					if(draggingNode.level !== 1 && dropNode.level !== 1){
 						return dropType === 'prev' || dropType === 'after' ||  dropType === 'inner'
 					}
-					
 				}
 			},
-			// 拖拽完成回调
+			/* 拖拽完成回调 */ 
 			handleDrop(draggingNode, dropNode, dropType) {
 				this.$emit('addModifyId',this.getChapterIdById(draggingNode.data.id))
 				this.$emit('addModifyId',this.getChapterIdById(dropNode.data.id))

+ 2 - 0
TEAMModelOS/ClientApp/src/view/research-center/ResearchCenter.less

@@ -202,4 +202,6 @@
 			color: #a8a8a8;
 		}
 	}
+
+	
 }

+ 112 - 3
TEAMModelOS/ClientApp/src/view/research-center/ResearchMgt.vue

@@ -49,6 +49,10 @@
 				<Icon type="ios-trash" />
 				<span>批量删除</span>
 			</div>
+			<div class="tool-item" @click="categoryModal = true">
+				<Icon type="md-settings" />
+				<span>类别管理</span>
+			</div>
 		</div>
 		<div class="table-box">
 			<Table stripe :columns="tableColumn" :data="tableData" :height="tableHeight" :loading="tableLoading">
@@ -61,15 +65,35 @@
 			</Table>
 			<Page :total="originList.length" :page-size="curPageSize" :current="curPage" :page-size-opts="[10,15,30,45]" @on-change="onPageChange" @on-page-size-change="onPageSizeChange" show-sizer></Page>
 		</div>
+		<!-- 类别管理弹窗 -->
+		<Modal v-model="categoryModal" transfer width="660" ok-text="保存变更" class="research-modal">
+			<div slot="header">
+				课例类别管理
+			</div>
+			<div class="tags-box">
+				<span class="tags-item" v-for="(item,index) in tags" :key="index">
+					<Input autofocus v-model="curEditTag" v-if="curEditIndex === index" @on-enter="onConfirmInput" @on-blur="onConfirmInput"></Input>
+					<span v-if="curEditIndex !== index">{{ item }}</span>
+					<Icon type="md-create" @click="onEditTag(item,index)"></Icon>
+					<Icon type="md-trash"  @click="onDeleteTag(item,index)">></Icon>
+				</span>
+				<span class="tags-item" @click="onAddTag">
+					<Icon type="md-add" style="margin: 0 5px 0 0;color: #70b1e7;"></Icon>
+					<span>添加新类别</span>
+				</span>
+			</div>
+		</Modal>
 	</div>
 </template>
-
 <script>
 	export default {
 		data(){
 			return {
+				categoryModal:false,
 				tableLoading:false,
 				tableHeight: document.documentElement.clientHeight * 0.75,
+				curEditTag:'',
+				curEditIndex:-1,
 				curPage:1,
 				curPageSize:15,
 				filterJson:{
@@ -78,6 +102,7 @@
 					gradeId:'',
 					subjectId:''
 				},
+				tags:['语文教研','数学教研','英文教研','特色教研','语文教研','数学教研','英文教研','特色教研'],
 				gradeList:[],
 				subjectList:[],
 				tableData:[],
@@ -95,8 +120,16 @@
 					},
 					{
 						title: '课例名称',
+						tooltip:true,
+						tooltipTheme:'light',
+						tooltipMaxWidth:200,
 						key: 'name'
 					},
+					{
+						title: '类别',
+						width:150,
+						key: 'category'
+					},
 					{
 						title: '科目',
 						key: 'subject',
@@ -139,6 +172,7 @@
 						tScore: 78,
 						pScore: 85,
 						isPro: true,
+						category:'特色教研',
 						subject: '语文',
 						grade: '三年级'
 					},
@@ -150,6 +184,7 @@
 						tScore: 78,
 						pScore: 85,
 						isPro: true,
+						category:'特色教研',
 						subject: '语文',
 						grade: '三年级'
 					},
@@ -161,6 +196,7 @@
 						tScore: 78,
 						pScore: 85,
 						isPro: true,
+						category:'特色教研',
 						subject: '语文',
 						grade: '三年级'
 					}]
@@ -174,23 +210,96 @@
 				}
 				this.onPageChange(1)
 				this.tableLoading = false
-			},2000)
+			},1000)
 			
 		},
 		methods:{
+			/* 切换页码 */
 			onPageChange(page){
 				this.curPage = page;
 				let start = this.curPageSize * (page - 1);
 				let end = this.curPageSize * page;
 				this.tableData = this.originList.slice(start, end)
 			},
+			/* 切换每页展示条数 */
 			onPageSizeChange(val){
 				this.curPageSize = val
 				this.onPageChange(this.curPage)
+			},
+			/* 编辑类别 */
+			onEditTag(item,index){
+				this.curEditTag = item
+				this.curEditIndex = index
+			},
+			/* 确认修改 */
+			onConfirmInput(){
+				if(!this.curEditTag.replace(/(^\s*)|(\s*$)/g, "")){
+					this.$Message.warning('请将类别填写完整!')
+					return
+				} 
+				if(this.tags.includes(this.curEditTag)){
+					this.$Message.warning('已存在相同类别!')
+					return
+				}
+				this.tags[this.curEditIndex] = this.curEditTag
+				this.curEditIndex = -1
+			},
+			/* 删除类别 */
+			onDeleteTag(item,index){
+				this.tags.splice(index,1)
+				this.curEditIndex = -1
+			},
+			/* 添加新类别 */
+			onAddTag(){
+				if(this.tags.some(i => i.replace(/(^\s*)|(\s*$)/g, "") == '')){
+					this.$Message.warning('不能存在空类别!')
+				}else{
+					this.tags.push('')
+					this.curEditTag = ''
+					this.curEditIndex = this.tags.length - 1
+				}
 			}
 		}
 		
 	}
 </script>
 
-<style lang="less" src="./ResearchMgt.less" scoped></style>
+<style lang="less" src="./ResearchMgt.less" scoped></style>
+<style lang="less" scoped>
+	.research-modal{
+		.tags-box{
+			display: flex;
+			flex-wrap: wrap;
+			
+			.tags-item{
+				display: flex;
+				align-items: center;
+				margin: 5px 10px;
+				padding: 5px 10px;
+				border: 1px solid #cfcfcf;
+				border-radius: 5px;
+				cursor: pointer;
+				&:not(:last-child){
+					&::before{
+						content: '';
+						display: inline-block;
+						border: 4px solid var(--assist-color-light);
+						border-radius: 50%;
+						margin-right: 5px;
+					}
+				}
+				
+				.ivu-icon{
+					margin-left: 5px;
+					color: #b6b6b6;
+					cursor: pointer;
+				}
+				
+				.ivu-input{
+					max-width: -webkit-fit-content;
+					display: inline-block;
+				}
+			}
+		}
+	}
+</style>

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 2186 - 2109
TEAMModelOS/ClientApp/src/view/syllabus/Syllabus.vue


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

@@ -1476,6 +1476,7 @@ namespace TEAMModelOS.Controllers.Analysis
                 {
                     for (int i = range.range[0]; i <= range.range[1]; i++)
                     {
+                        //判断推送的数据中,学生正常得分数据
                         if (result.studentScores[i].Count > 0)
                         {
                             if (result.studentScores[i][num] < point)