소스 검색

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

CrazyIter_Bin 3 년 전
부모
커밋
68b92dee61
27개의 변경된 파일745개의 추가작업 그리고 424개의 파일을 삭제
  1. 30 19
      TEAMModelFunction/ActivityHttpTrigger.cs
  2. 14 5
      TEAMModelFunction/CourseServiceBus.cs
  3. 8 5
      TEAMModelFunction/TriggerExam.cs
  4. 8 5
      TEAMModelFunction/TriggerHomework.cs
  5. 1 0
      TEAMModelOS/ClientApp/src/common/BaseClassSelect.vue
  6. 10 10
      TEAMModelOS/ClientApp/src/common/BaseLayout.vue
  7. 130 0
      TEAMModelOS/ClientApp/src/common/PrivateTargetMultiple.vue
  8. 156 0
      TEAMModelOS/ClientApp/src/common/PrivateTargetSingle.vue
  9. 148 0
      TEAMModelOS/ClientApp/src/common/SchoolTarget.vue
  10. 5 5
      TEAMModelOS/ClientApp/src/components/questionnaire/BaseProgress.vue
  11. 11 9
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/LessonTestReportCharts/KeyPointPerformChart.vue
  12. 6 4
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/LessonTestReportCharts/RecognizePerformChart.vue
  13. 5 0
      TEAMModelOS/ClientApp/src/locale/lang/en-US/teachermgmt.js
  14. 2 2
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/survey.js
  15. 5 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/teachermgmt.js
  16. 5 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/teachermgmt.js
  17. 1 1
      TEAMModelOS/ClientApp/src/store/module/answerSheet.js
  18. 1 1
      TEAMModelOS/ClientApp/src/utils/html2pdf.js
  19. 11 7
      TEAMModelOS/ClientApp/src/view/abilityMgmt/Index.vue
  20. 17 1
      TEAMModelOS/ClientApp/src/view/areaSetting/AreaSetting.vue
  21. 32 6
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseExerciseList.vue
  22. 63 13
      TEAMModelOS/ClientApp/src/view/jyzx/application.vue
  23. 14 171
      TEAMModelOS/ClientApp/src/view/learnactivity/CreatePrivEva.vue
  24. 20 153
      TEAMModelOS/ClientApp/src/view/learnactivity/CreateSchoolEva.vue
  25. 3 2
      TEAMModelOS/ClientApp/src/view/newsheet/index.vue
  26. 3 2
      TEAMModelOS/ClientApp/src/view/syllabus/Syllabus.vue
  27. 36 2
      TEAMModelOS/ClientApp/src/view/teachermgmt/components/group/Group.vue

+ 30 - 19
TEAMModelFunction/ActivityHttpTrigger.cs

@@ -72,8 +72,11 @@ namespace TEAMModelFunction
                     {
                         if (!string.IsNullOrEmpty(sc.stulist))
                         {
-                            (List<TmdInfo> tmdids, List<StuInfo> students, List<ClassListInfo> classLists) = await TriggerStuActivity.GetStuList(client, _dingDing, new List<string>() { sc.stulist }, course.school);
-                            foreach (var addStu in students)
+                            (List<RMember> tchList, List<RGroupList> classLists) = await GroupListService.GetStutmdidListids(client, _dingDing, new List<string>() { sc.stulist }, course.school);
+                            var addStudentsCls = tchList.FindAll(x => x.type == 2);
+                            var addTmdidsCls = tchList.FindAll(x => x.type == 1);
+                            //(List<TmdInfo> tmdids, List<StuInfo> students, List<ClassListInfo> classLists) = await TriggerStuActivity.GetStuList(client, _dingDing, new List<string>() { sc.stulist }, course.school);
+                            foreach (var addStu in addStudentsCls)
                             {
                                 var stuCourse = new StuCourse
                                 {
@@ -89,7 +92,7 @@ namespace TEAMModelFunction
                                 };
                                 await client.GetContainer("TEAMModelOS", "Student").UpsertItemAsync(stuCourse, new PartitionKey(stuCourse.code));
                             }
-                            foreach (var addTmd in tmdids)
+                            foreach (var addTmd in addTmdidsCls)
                             {
                                 var tmdCourse = new StuCourse
                                 {
@@ -153,12 +156,15 @@ namespace TEAMModelFunction
                     {
                         sub.Add(subject.id);
                     }
-                    (List<TmdInfo> tmdids, List<StuInfo> studentss, List<ClassListInfo> classLists) = await TriggerStuActivity.GetStuList(client, _dingDing, classes, info.school);
+                    (List<RMember> tchList, List<RGroupList> classLists) = await GroupListService.GetStutmdidListids(client, _dingDing, classes, info.school);
+                    var addStudentsCls = tchList.FindAll(x => x.type == 2);
+                    var addTmdidsCls = tchList.FindAll(x => x.type == 1);
+                    //(List<TmdInfo> tmdids, List<StuInfo> studentss, List<ClassListInfo> classLists) = await TriggerStuActivity.GetStuList(client, _dingDing, classes, info.school);
                     List<StuActivity> stuActivities = new List<StuActivity>();
                     List<StuActivity> tmdActivities = new List<StuActivity>();
-                    if (tmdids.IsNotEmpty())
+                    if (addTmdidsCls.IsNotEmpty())
                     {
-                        tmdids.ForEach(x => {
+                        addTmdidsCls.ForEach(x => {
                             tmdActivities.Add(new StuActivity
                             {
                                 pk = "Activity",
@@ -182,9 +188,9 @@ namespace TEAMModelFunction
                             });
                         });
                     }
-                    if (studentss.IsNotEmpty())
+                    if (addStudentsCls.IsNotEmpty())
                     {
-                        studentss.ForEach(x => {
+                        addStudentsCls.ForEach(x => {
                             stuActivities.Add(new StuActivity
                             {
                                 pk = "Activity",
@@ -253,13 +259,15 @@ namespace TEAMModelFunction
                     {
                         continue;
                     }
-
-                    (List<TmdInfo> tmdids, List<StuInfo> studentss, List<ClassListInfo> classLists) = await TriggerStuActivity.GetStuList(client, _dingDing, classes, info.school);
+                    (List<RMember> tchList, List<RGroupList> classLists) = await GroupListService.GetStutmdidListids(client, _dingDing, classes, info.school);
+                    var addStudentsCls = tchList.FindAll(x => x.type == 2);
+                    var addTmdidsCls = tchList.FindAll(x => x.type == 1);
+                    //(List<TmdInfo> tmdids, List<StuInfo> studentss, List<ClassListInfo> classLists) = await TriggerStuActivity.GetStuList(client, _dingDing, classes, info.school);
                     List<StuActivity> stuActivities = new List<StuActivity>();
                     List<StuActivity> tmdActivities = new List<StuActivity>();
-                    if (tmdids.IsNotEmpty())
+                    if (addTmdidsCls.IsNotEmpty())
                     {
-                        tmdids.ForEach(x => {
+                        addTmdidsCls.ForEach(x => {
                             tmdActivities.Add(new StuActivity
                             {
                                 pk = "Activity",
@@ -283,9 +291,9 @@ namespace TEAMModelFunction
                             });
                         });
                     }
-                    if (studentss.IsNotEmpty())
+                    if (addStudentsCls.IsNotEmpty())
                     {
-                        studentss.ForEach(x => {
+                        addStudentsCls.ForEach(x => {
                             stuActivities.Add(new StuActivity
                             {
                                 pk = "Activity",
@@ -354,12 +362,15 @@ namespace TEAMModelFunction
                     {
                         continue;
                     }
-                    (List<TmdInfo> tmdids, List<StuInfo> studentss, List<ClassListInfo> classLists) = await TriggerStuActivity.GetStuList(client, _dingDing, classes, info.school);
+                    (List<RMember> tchList, List<RGroupList> classLists) = await GroupListService.GetStutmdidListids(client, _dingDing, classes, info.school);
+                    var addStudentsCls = tchList.FindAll(x => x.type == 2);
+                    var addTmdidsCls = tchList.FindAll(x => x.type == 1);
+                    //(List<TmdInfo> tmdids, List<StuInfo> studentss, List<ClassListInfo> classLists) = await TriggerStuActivity.GetStuList(client, _dingDing, classes, info.school);
                     List<StuActivity> stuActivities = new List<StuActivity>();
                     List<StuActivity> tmdActivities = new List<StuActivity>();
-                    if (tmdids.IsNotEmpty())
+                    if (addTmdidsCls.IsNotEmpty())
                     {
-                        tmdids.ForEach(x => {
+                        addTmdidsCls.ForEach(x => {
                             tmdActivities.Add(new StuActivity
                             {
                                 pk = "Activity",
@@ -383,9 +394,9 @@ namespace TEAMModelFunction
                             });
                         });
                     }
-                    if (studentss.IsNotEmpty())
+                    if (addStudentsCls.IsNotEmpty())
                     {
-                        studentss.ForEach(x => {
+                        addStudentsCls.ForEach(x => {
                             stuActivities.Add(new StuActivity
                             {
                                 pk = "Activity",

+ 14 - 5
TEAMModelFunction/CourseServiceBus.cs

@@ -119,16 +119,19 @@ namespace TEAMModelFunction
 
                 foreach (var list in courseChange.addList)
                 {
-                    (List<TmdInfo> addTmdidsCls, List<StuInfo> addStudentsCls, List<ClassListInfo> classLists) = await TriggerStuActivity.GetStuList(client, _dingDing, new List<string> { list }, courseChange.school);
+                    //(List<TmdInfo> addTmdidsCls, List<StuInfo> addStudentsCls, List<ClassListInfo> classLists) = await TriggerStuActivity.GetStuList(client, _dingDing, new List<string> { list }, courseChange.school);
+                    (List<RMember> tchList, List<RGroupList> classLists) = await GroupListService.GetStutmdidListids(client, _dingDing, new List<string> { list }, courseChange.school);
+                    var addStudentsCls = tchList.FindAll(x => x.type == 2);
+                    var addTmdidsCls = tchList.FindAll(x => x.type == 1);
                     foreach (var stu in addStudentsCls)
                     {
                         try
                         {
-                            ItemResponse<StuCourse> stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{stu.schoolId}-{stu.id}"));
+                            ItemResponse<StuCourse> stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{stu.code}-{stu.id}"));
                             if (!stuCourse.Value.stulist.Contains(list))
                             {
                                 stuCourse.Value.stulist.Add(list);
-                                await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{stu.schoolId}-{stu.id}"));
+                                await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{stu.code}-{stu.id}"));
                             }
                         }
                         catch (CosmosException ex)
@@ -189,7 +192,10 @@ namespace TEAMModelFunction
 
                 foreach (var delCls in courseChange.delClass)
                 {
-                    (List<TmdInfo> delTmdidsCls, List<StuInfo> delStudentsCls, List<ClassListInfo> classLists) = await TriggerStuActivity.GetStuList(client, _dingDing, new List<string> { delCls }, courseChange.school);
+                    //(List<TmdInfo> delTmdidsCls, List<StuInfo> delStudentsCls, List<ClassListInfo> classLists) = await TriggerStuActivity.GetStuList(client, _dingDing, new List<string> { delCls }, courseChange.school);
+                    (List<RMember> tchList, List<RGroupList> classLists) = await GroupListService.GetStutmdidListids(client, _dingDing, new List<string> { delCls }, courseChange.school);
+                    var delStudentsCls = tchList.FindAll(x => x.type == 2);
+                    var delTmdidsCls = tchList.FindAll(x => x.type == 1);
                     foreach (var stu in delStudentsCls)
                     {
                         try
@@ -247,7 +253,10 @@ namespace TEAMModelFunction
                 }
                 foreach (var delList in courseChange.delList)
                 {
-                    (List<TmdInfo> delTmdidsCls, List<StuInfo> delStudentsCls, List<ClassListInfo> classLists) = await TriggerStuActivity.GetStuList(client, _dingDing, new List<string> { delList }, courseChange.school);
+                    //(List<TmdInfo> delTmdidsCls, List<StuInfo> delStudentsCls, List<ClassListInfo> classLists) = await TriggerStuActivity.GetStuList(client, _dingDing, new List<string> { delList }, courseChange.school);
+                    (List<RMember> tchList, List<RGroupList> classLists) = await GroupListService.GetStutmdidListids(client, _dingDing, new List<string> { delList }, courseChange.school);
+                    var delStudentsCls = tchList.FindAll(x => x.type == 2);
+                    var delTmdidsCls = tchList.FindAll(x => x.type == 1);
                     foreach (var stu in delStudentsCls)
                     {
                         try

+ 8 - 5
TEAMModelFunction/TriggerExam.cs

@@ -102,12 +102,15 @@ namespace TEAMModelFunction
                             try
                             {
                                 List<string> classes = ExamService.getClasses(info.classes, info.stuLists);
-                                (List<TmdInfo> tmdids, List<StuInfo> studentss, List<ClassListInfo> classLists) = await TriggerStuActivity.GetStuList(client, _dingDing, classes, info.school);
+                                (List<RMember> tchList, List<RGroupList> classLists) = await GroupListService.GetStutmdidListids(client, _dingDing, classes, info.school);
+                                var addStudentsCls = tchList.FindAll(x => x.type == 2);
+                                var addTmdidsCls = tchList.FindAll(x => x.type == 1);
+                                //(List<TmdInfo> tmdids, List<StuInfo> studentss, List<ClassListInfo> classLists) = await TriggerStuActivity.GetStuList(client, _dingDing, classes, info.school);
                                 List<StuActivity> stuActivities = new List<StuActivity>();
                                 List<StuActivity> tmdActivities = new List<StuActivity>();
-                                if (tmdids.IsNotEmpty())
+                                if (addTmdidsCls.IsNotEmpty())
                                 {
-                                    tmdids.ForEach(x =>
+                                    addTmdidsCls.ForEach(x =>
                                     {
                                         tmdActivities.Add(new StuActivity
                                         {
@@ -133,9 +136,9 @@ namespace TEAMModelFunction
                                         });
                                     });
                                 }
-                                if (studentss.IsNotEmpty())
+                                if (addStudentsCls.IsNotEmpty())
                                 {
-                                    studentss.ForEach(x =>
+                                    addStudentsCls.ForEach(x =>
                                     {
                                         stuActivities.Add(new StuActivity
                                         {

+ 8 - 5
TEAMModelFunction/TriggerHomework.cs

@@ -72,13 +72,16 @@ namespace TEAMModelFunction
                             break;
                         case "going":
                             List<string> classes = ExamService.getClasses(work.classes, work.stuLists);
-                            (List<TmdInfo> tmdids, List<StuInfo> students, List<ClassListInfo> classLists) = await TriggerStuActivity.GetStuList(client, _dingDing, classes, work.school);
+                            //(List<TmdInfo> tmdids, List<StuInfo> students, List<ClassListInfo> classLists) = await TriggerStuActivity.GetStuList(client, _dingDing, classes, work.school);
+                            (List<RMember> tmdids, List<RGroupList> classLists) = await GroupListService.GetStutmdidListids(client, _dingDing, classes, work.school);
+                            var addStudentsCls = tmdids.FindAll(x => x.type == 2);
+                            var addTmdidsCls = tmdids.FindAll(x => x.type == 1);
                             List<StuActivity> stuActivities = new List<StuActivity>();
                             List<StuActivity> tmdActivities = new List<StuActivity>();
                             List<StuActivity> tchActivities = new List<StuActivity>();
-                            if (tmdids.IsNotEmpty())
+                            if (addTmdidsCls.IsNotEmpty())
                             {
-                                tmdids.ForEach(x =>
+                                addTmdidsCls.ForEach(x =>
                                 {
                                     tmdActivities.Add(new StuActivity
                                     {
@@ -102,9 +105,9 @@ namespace TEAMModelFunction
                                     });
                                 });
                             }
-                            if (students.IsNotEmpty())
+                            if (addStudentsCls.IsNotEmpty())
                             {
-                                students.ForEach(x =>
+                                addStudentsCls.ForEach(x =>
                                 {
                                     stuActivities.Add(new StuActivity
                                     {

+ 1 - 0
TEAMModelOS/ClientApp/src/common/BaseClassSelect.vue

@@ -223,6 +223,7 @@
 							children: this.getClassesDataByPeriodId(i.id)
 						}
 					})
+					console.log(periodList)
 					return periodList
 				} else {
 					return []

+ 10 - 10
TEAMModelOS/ClientApp/src/common/BaseLayout.vue

@@ -393,16 +393,16 @@ export default {
                         menuName: 'TrainMgt',
                         isShow: true
                     },
-                    {
-                        icon: 'iconfont icon-test',
-                        name: this.$t('system.menu.appAbility'),
-                        router: '/home/ability',
-                        tag: '',
-                        role: 'admin',
-                        permission: 'train-read|train-upd',
-                        menuName: 'ability',
-                        isShow: true
-                    },
+                    // {
+                    //     icon: 'iconfont icon-test',
+                    //     name: this.$t('system.menu.appAbility'),
+                    //     router: '/home/ability',
+                    //     tag: '',
+                    //     role: 'admin',
+                    //     permission: 'train-read|train-upd',
+                    //     menuName: 'ability',
+                    //     isShow: false
+                    // },
                     {
                         icon: 'iconfont icon-test',
                         name: this.$t('system.menu.classRecord'),

+ 130 - 0
TEAMModelOS/ClientApp/src/common/PrivateTargetMultiple.vue

@@ -0,0 +1,130 @@
+<template>
+    <!-- 1、挑选名单与课程无关,可以跨课程挑选名单; 2、个人名单、教学班、行政班只能选择其中一种。**使用投票、问卷、作业 -->
+    <div>
+        <RadioGroup v-model="scope" @on-change="scopeChange" style="margin-bottom: 10px;">
+            <Radio label="private">{{ $t('survey.form.privateClass') }}</Radio>
+            <Radio label="school" v-if="hasSchool">{{ $t('survey.form.schoolClass') }}</Radio>
+        </RadioGroup>
+        <el-cascader ref="evtarget" size="small" :options="targetData" :show-all-levels="false" clearable filterable v-model="targets" @visible-change="visibleChange" :props="props" @change="treeChange" style="width:100%;" :popper-class="cascaderClass">
+        </el-cascader>
+    </div>
+</template>
+<script>
+export default {
+    data() {
+        return {
+            scope: 'private',
+            targets: [],
+            allList: [],
+            selectBefore: [],
+            props: {
+                multiple: true,
+                value: 'id',
+                label: 'name'
+            }
+        }
+    },
+    methods: {
+        scopeChange() {
+            this.targets = []
+            this.$emit('on-scope-change', this.scope)
+            this.$emit('on-target-change', this.targets)
+        },
+        visibleChange(status) {
+            if (status) {
+                this.selectBefore = this._.cloneDeep(this.targets)
+            }
+        },
+        treeChange(data) {
+            // 实现教学班和行政班二选一
+            if (this.selectBefore.length && this.scope === 'school') {
+                let curType = new Set()
+                data.forEach(item => {
+                    curType.add(item[0])
+                })
+                if (curType.size > 1) {
+                    let oldType = this.selectBefore[0][0]
+                    let newData = data.filter(item => {
+                        return item[0] != oldType
+                    })
+                    this.targets = []
+                    this.$refs.evtarget.panel.clearCheckedNodes()
+                    this.$refs.evtarget.panel.activePath = []
+                    this.selectBefore = newData
+                    this.targets = newData
+                }
+            } else {
+                this.selectBefore = data
+            }
+
+            this.$emit('on-target-change', this.targets)
+        },
+        getTargetList() {
+            let params = {
+                tmdid: this.$store.state.userInfo.TEAMModelId,
+                schoolId: this.$store.state.userInfo.schoolCode,
+                opt: 'teach'
+            }
+            this.$api.common.getActivityTarget(params).then(
+                res => {
+                    this.allList = res.groupLists
+                },
+                err => {
+                    this.$Messag.error('查询发布对象失败')
+                }
+            )
+        }
+    },
+    created() {
+        this.getTargetList()
+        this.$emit('on-scope-change', this.scope)
+        this.$emit('on-target-change', this.targets)
+    },
+    computed: {
+        hasSchool() {
+            return this.$store.state.userInfo.hasSchool
+        },
+        cascaderClass() {
+            return this.scope == 'school' ? 'one-hidden-check-box' : ''
+        },
+        targetData() {
+            let nodes = []
+            let curCus = this.allList.filter(item => item.scope === this.scope)
+            if (this.scope === 'school') {
+                let classes = []
+                let lists = []
+                curCus.forEach(item => {
+                    item.groups.forEach(group => {
+                        if (group.type === 'class') {
+                            classes.push(group)
+                        } else if (group.type === 'teach') {
+                            lists.push(group)
+                        }
+                    })
+                })
+                nodes.push({
+                    id: 'class',
+                    name: this.$t('cusMgt.listType1'),
+                    children: classes
+                })
+                nodes.push({
+                    id: 'teach',
+                    name: this.$t('cusMgt.listType2'),
+                    children: lists
+                })
+            } else {
+                let ids = []
+                curCus.forEach(item => {
+                    item.groups.forEach(group => {
+                        if (!ids.includes(group.id)) {
+                            ids.push(group.id)
+                            nodes.push(group)
+                        }
+                    })
+                })
+            }
+            return nodes
+        }
+    }
+}
+</script>

+ 156 - 0
TEAMModelOS/ClientApp/src/common/PrivateTargetSingle.vue

@@ -0,0 +1,156 @@
+<template>
+    <!-- 1、挑选名单与课程相关,只能选择单个课程;2、教学班行政班二选一; **适用评测 -->
+    <div>
+        <RadioGroup v-model="scope" @on-change="scopeChange" style="margin-bottom: 10px;">
+            <Radio label="private">{{ $t('learnActivity.createEv.cusLabel2') }}</Radio>
+            <Radio label="school" v-if="hasSchool">{{ $t('learnActivity.createEv.cusLabel1') }}</Radio>
+        </RadioGroup>
+        <el-cascader ref="evtarget" size="small" :options="targetData" :show-all-levels="false" clearable filterable v-model="targets" @visible-change="visibleChange" :props="props" @change="treeChange" style="width:100%;" :popper-class="cascaderClass">
+        </el-cascader>
+    </div>
+</template>
+<script>
+export default {
+    data() {
+        return {
+            scope: 'private',
+            targets: [],
+            allList: [],
+            selectBefore: [],
+            props: {
+                multiple: true,
+                value: 'id',
+                label: 'name'
+            }
+        }
+    },
+    methods: {
+        scopeChange() {
+            this.targets = []
+            this.$emit('on-scope-change', this.scope)
+            this.$emit('on-target-change', {
+                targets: this.targets,
+                course: null
+            })
+        },
+        visibleChange(status) {
+            if (status) {
+                this.selectBefore = this._.cloneDeep(this.targets)
+            }
+        },
+        treeChange(data) {
+            if (this.selectBefore.length) {
+                // 实现课程单选
+                let curCus = new Set()
+                data.forEach(item => {
+                    curCus.add(item[0])
+                })
+                if (curCus.size > 1) {
+                    let oldCus = this.selectBefore[0][0]
+                    let newData = data.filter(item => {
+                        return item[0] != oldCus
+                    })
+                    this.targets = []
+                    this.$refs.evtarget.panel.clearCheckedNodes()
+                    this.$refs.evtarget.panel.activePath = []
+                    this.selectBefore = newData
+                    this.targets = newData
+                }
+                // 实现教学班和行政班二选一
+                if (this.scope === 'school') {
+                    let curType = new Set()
+                    this.targets.forEach(item => {
+                        curType.add(item[1])
+                    })
+                    if (curType.size > 1) {
+                        let oldType = this.selectBefore[0][1]
+                        let newData = this.targets.filter(item => {
+                            return item[1] != oldType
+                        })
+                        this.targets = []
+                        this.$refs.evtarget.panel.clearCheckedNodes()
+                        this.$refs.evtarget.panel.activePath = []
+                        this.selectBefore = newData
+                        this.targets = newData
+                    }
+                }
+            } else {
+                this.selectBefore = data
+            }
+            let course
+            if (this.targets.length) {
+                course = this.allList.find(item => item.id === this.targets[0][0])
+            }
+            this.$emit('on-target-change', {
+                targets: this.targets,
+                course: course
+            })
+        },
+        getTargetList() {
+            let params = {
+                tmdid: this.$store.state.userInfo.TEAMModelId,
+                schoolId: this.$store.state.userInfo.schoolCode,
+                opt: 'teach'
+            }
+            this.$api.common.getActivityTarget(params).then(
+                res => {
+                    this.allList = res.groupLists
+                },
+                err => {
+                    this.$Messag.error('查询发布对象失败')
+                }
+            )
+        }
+    },
+    created() {
+        this.getTargetList()
+        this.$emit('on-scope-change', this.scope)
+        this.$emit('on-target-change', {
+            targets: this.targets,
+            course: null
+        })
+    },
+    computed: {
+        hasSchool() {
+            return this.$store.state.userInfo.hasSchool
+        },
+        cascaderClass() {
+            return 'one-hidden-check-box'
+            // return this.scope == 'school' ? 'one-hidden-check-box' : ''
+        },
+        targetData() {
+            let nodes = this.allList.filter(item => item.scope === this.scope)
+            if (this.scope === 'school') {
+                nodes.forEach(item => {
+                    let classes = []
+                    let lists = []
+                    item.groups.forEach(group => {
+                        if (group.type === 'class') {
+                            classes.push(group)
+                        } else if (group.type === 'teach') {
+                            lists.push(group)
+                        }
+                    })
+                    item.children = []
+                    item.children.push({
+                        id: 'class',
+                        name: this.$t('cusMgt.listType1'),
+                        children: classes
+                    })
+                    item.children.push({
+                        id: 'teach',
+                        name: this.$t('cusMgt.listType2'),
+                        children: lists
+                    })
+                })
+
+            } else {
+                nodes.forEach(item => {
+                    item.children = item.groups
+                })
+            }
+            return nodes
+        }
+    }
+}
+</script>

+ 148 - 0
TEAMModelOS/ClientApp/src/common/SchoolTarget.vue

@@ -0,0 +1,148 @@
+<template>
+    <!-- 教学班和行政班二选 -->
+    <div>
+        <el-cascader ref="evtarget" size="small" :show-all-levels="false" clearable filterable v-model="targets" :options="csOptions" :props="props" @change="treeChange" style="width:100%;">
+        </el-cascader>
+    </div>
+</template>
+<script>
+export default {
+    data() {
+        return {
+            curPeriod: '',
+            curPdInfo: {},
+            targets: [],
+            selectBefore: [],
+            props: {
+                multiple: true,
+                value: 'id',
+                label: 'name'
+            },
+            allList: []
+        }
+    },
+    methods: {
+        visibleChange(status) {
+            if (status) {
+                this.selectBefore = this._.cloneDeep(this.targets)
+            }
+        },
+        treeChange(data) {
+            // 实现教学班和行政班二选一
+            if (this.selectBefore.length) {
+                let curType = new Set()
+                data.forEach(item => {
+                    curType.add(item[0])
+                })
+                if (curType.size > 1) {
+                    let oldType = this.selectBefore[0][0]
+                    let newData = data.filter(item => {
+                        return item[0] != oldType
+                    })
+                    this.targets = []
+                    this.$refs.evtarget.panel.clearCheckedNodes()
+                    this.$refs.evtarget.panel.activePath = []
+                    this.selectBefore = newData
+                    this.targets = newData
+                }
+            } else {
+                this.selectBefore = data
+            }
+            this.$emit('on-change',this.targets)
+        },
+        getTargetList() {
+            let params = {
+                tmdid: this.$store.state.userInfo.TEAMModelId,
+                schoolId: this.$store.state.userInfo.schoolCode,
+                periodId: this.curPeriod,
+                opt: 'manage'
+            }
+            this.$api.common.getActivityTarget(params).then(
+                res => {
+                    this.allList = res.groupLists
+                },
+                err => {
+                    this.$Messag.error('查询发布对象失败')
+                }
+            )
+        }
+    },
+    created() {
+
+    },
+    computed: {
+        //级联选择年级班级
+        csOptions() {
+            let data = []
+            
+            data = [
+                {
+                    id: 'class',
+                    name: this.$t('cusMgt.listType1'),
+                    children: []
+                },
+                {
+                    id: 'stulist',
+                    name: this.$t('cusMgt.listType2'),
+                    // disabled: true,
+                    children: []
+                }
+            ]
+            //填充行政班数据
+            if (this.curPdInfo.id) {
+                //计算学级逻辑
+                let date = new Date()
+                let curYear = date.getFullYear()
+                let month = date.getMonth() + 1
+                let start = this.curPdInfo.semesters.find(item => {
+                    return item.start == 1
+                })
+                // 根据入学月份确定当前年级和学级的关系
+                if (start && month < start.month) {
+                    curYear--
+                }
+                this.curGrades.forEach((item, index) => {
+                    let dataItem = {
+                        id: index,  //年级使用index
+                        name: `${item}(${curYear - index}${this.$t('unit.gradeYear')})`,
+                        year: curYear - index,
+                        children: []
+                    }
+                    let child = this.allList.filter(classItem => {
+                        return (classItem.year == curYear - index) && classItem.type == 'class'
+                    })
+                    dataItem.children = child.length ? child : undefined
+                    data[0].children.push(dataItem)
+                })
+            }
+            // 填充教学班数据
+            let curStuList = this.allList.filter(item => {
+                return item.type == 'teach'
+            })
+            data[1].children.push(...curStuList)
+            return data
+        },
+        //计算当前学段下面的年级信息
+        curGrades() {
+            if (this.curPdInfo.grades) {
+                return this.curPdInfo.grades
+            } else {
+                return []
+            }
+        },
+    },
+    watch: {
+        '$store.state.user.curPeriod': {
+            deep: true,
+            immediate: true,
+            handler(n, o) {
+                if (n) {
+                    this.curPeriod = n.id
+                    this.curPdInfo = n
+                    this.getTargetList()
+                }
+            }
+        }
+    }
+}
+</script>

+ 5 - 5
TEAMModelOS/ClientApp/src/components/questionnaire/BaseProgress.vue

@@ -82,7 +82,7 @@
 							type: 'gauge',
 							splitNumber: 0,
 							radius: '30%', //中间装饰环
-							center: ['30%', '30%'],
+							center: ['50%', '45%'],
 							startAngle: 0,
 							endAngle: 359.9999,
 							axisLine: {
@@ -131,7 +131,7 @@
 							},
 							coordinateSystem: 'polar',
 							roundCap: true,
-							barWidth: 20, //大的占比环
+							barWidth: 24, //大的占比环
 							itemStyle: {
 							    normal: {
 							        color: new this.$echarts.graphic.LinearGradient(0, 1, 0, 0, [{
@@ -147,7 +147,7 @@
 						{
 							type: 'pie',
 							name: '内层细圆环',
-							radius: ['50%', '40%'],
+							radius: ['50%', '35%'],
 							// radius: '50%',
 							startAngle: 90,
 							hoverAnimation: false,
@@ -156,10 +156,10 @@
 								normal: {
 									color: new that.$echarts.graphic.LinearGradient(0, 0, 1, 1, [{
 										offset: 0,
-										color: '#dfdfdf'
+										color: '#ffffff'
 									}, {
 										offset: 1,
-										color: '#dfdfdf'
+										color: '#ffffff'
 									}]),
 									shadowBlur: 5,
 									shadowColor: '#66666a',

+ 11 - 9
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/LessonTestReportCharts/KeyPointPerformChart.vue

@@ -110,16 +110,18 @@ export default {
         getknowledge() {
             let kps = []
             let ckps = []
-            this.knowledge.kn.map((item, index) => {
-                kps.push({
-                    value: this.knowledge.kps[index] ? this.knowledge.kps[index].toFixed(2) : 0,
-                    name: item
+            if (this.knowledge.kn) {
+                this.knowledge.kn.map((item, index) => {
+                    kps.push({
+                        value: this.knowledge.kps[index] ? this.knowledge.kps[index].toFixed(2) : 0,
+                        name: item
+                    })
+                    ckps.push({
+                        value: this.knowledge.ckps[index] ? this.knowledge.ckps[index].toFixed(2) : 0,
+                        name: item
+                    })
                 })
-                ckps.push({
-                    value: this.knowledge.ckps[index] ? this.knowledge.ckps[index].toFixed(2) : 0,
-                    name: item
-                })
-            })
+            }
             this.kps = kps
             this.ckps = ckps
         },

+ 6 - 4
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/LessonTestReportCharts/RecognizePerformChart.vue

@@ -94,10 +94,12 @@ export default {
         getFiled() {
             let fps = []
             let cfps = []
-            this.filed.fs.map((item, index) => {
-                fps.push(this.filed.fps[index] ? this.filed.fps[index].toFixed(2) : 0)
-                cfps.push(this.filed.cfps[index] ? this.filed.cfps[index].toFixed(2) : 0)
-            })
+            if (this.filed.fs) {
+                this.filed.fs.map((item, index) => {
+                    fps.push(this.filed.fps[index] ? this.filed.fps[index].toFixed(2) : 0)
+                    cfps.push(this.filed.cfps[index] ? this.filed.cfps[index].toFixed(2) : 0)
+                })
+            }
             this.fps = fps
             this.cfps = cfps
         },

+ 5 - 0
TEAMModelOS/ClientApp/src/locale/lang/en-US/teachermgmt.js

@@ -182,4 +182,9 @@ export default {
     rmvErr:'Failed to remove',
     groupInfoErr:'Failed to search for the group',
     delGroup:'Delete Pedagogical Research Team',
+    leader:'組長:',
+    notSet:'未設置',
+    setLeader:'設置為組長',
+    setOk:'設置成功',
+    setErr:'設置失敗'
 }

+ 2 - 2
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/survey.js

@@ -31,8 +31,8 @@ export default {
 		name:'问卷名称',
 		namePlace:'请输入问卷名称',
 		target:'问卷对象',
-		privateClass:'个人课程',
-		schoolClass:'学校课程',
+		privateClass:'个人班级',
+		schoolClass:'学校班级',
 		targetPlace:'请选择问卷发布对象',
 		noFoundText:'暂未创建班级',
 		time:'起止时间',

+ 5 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/teachermgmt.js

@@ -182,5 +182,9 @@ export default {
     rmvErr:'移除失败',
     groupInfoErr:'教研组查询失败',
     delGroup:'删除教研组',
-
+    leader:'组长:',
+    notSet:'未设置',
+    setLeader:'设置为组长',
+    setOk:'设置成功',
+    setErr:'设置失败'
 }

+ 5 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/teachermgmt.js

@@ -182,4 +182,9 @@ export default {
     rmvErr:'移除失敗',
     groupInfoErr:'教研組查詢失敗',
     delGroup:'刪除教研組',
+    leader:'組長:',
+    notSet:'未設置',
+    setLeader:'設置為組長',
+    setOk:'設置成功',
+    setErr:'設置失敗'
 }

+ 1 - 1
TEAMModelOS/ClientApp/src/store/module/answerSheet.js

@@ -206,7 +206,7 @@ export default {
 			let curTypeContentArr = state.config.newContents.filter(i => i.type ===  val.type)
 			let newContent = curTypeContentArr[curTypeContentArr.length - 1]
 			newContent.points.push({
-				ans:val.id,
+				ans:val.id + '',
 				row:val.startOrder,
 				pos:$tools.getBoxPos(val.x,val.y,val.width,val.height)
 			})

+ 1 - 1
TEAMModelOS/ClientApp/src/utils/html2pdf.js

@@ -98,7 +98,7 @@ export default {
 										putOnlyUsedFonts: true
 									})
 									PDF.setFont('Times New Roman')
-									PDF.setFontSize(12);
+									PDF.setFontSize(10);
 									let curPage = 1
 									// 如果是一页的情况
 									if (leftHeight <= pageHeight) {

+ 11 - 7
TEAMModelOS/ClientApp/src/view/abilityMgmt/Index.vue

@@ -24,11 +24,11 @@
 							<Icon type="md-search" :title="$t('syllabus.search')" @click="doSearchVolume"
 								v-if="volumeList.length" />
 							<Icon type="md-settings" title="设置选修/必修/通识" @click="doSetCompulsory"
-								v-if="!inSchoolAbility && volumeList.length" />
+								v-if="hasAbilityAuth && volumeList.length" />
 							<!-- <Icon type="ios-paper" title="查看检测试卷" @click="onShowPaper"
 								v-if="volumeList.length" />	 -->
 							<Icon type="md-create" :title="$t('syllabus.edit')" @click="doEditVolume"
-								v-if="!inSchoolAbility && volumeList.length" />
+								v-if="hasAbilityAuth && volumeList.length" />
 							<!-- <Icon type="md-trash" :title="$t('syllabus.delete')" @click="doDeleteVolume"
 								v-if="!inSchoolAbility && volumeList.length" />
 							<Icon type="md-add" :title="$t('syllabus.add')" @click="doAddVolume"
@@ -74,7 +74,7 @@
 					<!--<span>{{ $t('syllabus.syllabusMenu') }}</span>-->
 					{{ $t('ability.mgmt.paper') }}
 					<span class="syllabus-content-header-tools"
-						v-if="volumeList.length && curVolume.id && !inShareView &&  !inSchoolAbility">
+						v-if="volumeList.length && curVolume.id && !inShareView &&  hasAbilityAuth">
 						<span style="margin-right: 20px;font-weight: 400;font-size: 12px;cursor: pointer;" @click="isShowPaper = false"><Icon type="md-reorder" size="16" style="margin-right: 5px;"/>切换到章节视图</span>
 						<Dropdown @on-click="onAddQues" style="font-weight: 400;">
 							<a href="javascript:void(0)" style="color: #6b6b6b;font-size: 12px;">
@@ -103,7 +103,7 @@
 					{{ $t('ability.mgmt.chapter') }}
 					<span class="syllabus-content-header-tools"
 						v-if="volumeList.length && curVolume.id && !inShareView">
-						<Icon type="md-add" @click="isAddTreeModal = true" v-if="(hasSyllabusAuth || hasVolumeAuth(curVolume.auth)) &&  !inSchoolAbility" />
+						<Icon type="md-add" @click="isAddTreeModal = true" v-if="(hasSyllabusAuth || hasVolumeAuth(curVolume.auth)) &&  hasAbilityAuth" />
 					</span>
 				</div>
 				<div class="syllabus-tree-box">
@@ -118,7 +118,7 @@
 				<div class="syllabus-content-header">
 					<!--<span>{{ $t('syllabus.relate') }}</span>-->
 					{{ $t('ability.mgmt.resource') }}({{ curNode.rnodes.length }})
-					<span class="syllabus-content-header-tools" v-if="!inSchoolAbility">
+					<span class="syllabus-content-header-tools" v-if="hasAbilityAuth">
 						<!-- <Icon type="md-add" @click="onAddResource" v-if="curNode.id"/> -->
 						<!-- <Tooltip :content="$t('tip.addVolumeResource')" class="common-toolTip" placement="bottom" theme="light" max-width="200">
 						    <Icon type="ios-information-circle-outline"/>
@@ -161,12 +161,12 @@
 							<img src="../../assets/source/unknow.png" v-else="item.type === 'other'" />
 							<span v-html="item.title" style="max-width: 70%;cursor: pointer;"
 								@click="onPreview(item)"></span>
-							<div class="node-resource-tools"  v-if="!inSchoolAbility || $access.can('area.*')">
+							<div class="node-resource-tools"  v-if="hasAbilityAuth || $access.can('area.*')">
 								<!-- <div class="node-resource-tool" >
 									<Icon type="md-eye" />
 									<span>{{ $t('syllabus.preview') }}</span>
 								</div> -->
-								<div class="node-resource-tool" @click="onDeleteResource(item,index)" v-if="!inSchoolAbility">
+								<div class="node-resource-tool" @click="onDeleteResource(item,index)" v-if="hasAbilityAuth">
 									<Icon type="md-trash" />
 									<span>{{ $t('syllabus.remove') }}</span>
 								</div>
@@ -2037,6 +2037,10 @@
 			isAreaAbility(){
 				return this.$route.name === 'areaAbilityMgmt'
 			},
+			// 判断是否有能力点的编辑权限(区级管理 + 未对接省平台)
+			hasAbilityAuth(){
+				return this.$route.name === 'areaAbilityMgmt'
+			}
 		},
 		watch: {
 			volumeList: {

+ 17 - 1
TEAMModelOS/ClientApp/src/view/areaSetting/AreaSetting.vue

@@ -86,6 +86,21 @@
 					</div>
 				</div>
 			</div>
+			<div class="setting-block">
+				<p class="title">接口配置
+				<!-- <span>
+					<Tooltip content="设置教师各方面研修合格所需达到的学时" class="common-toolTip" placement="right" theme="light" max-width="200">
+					    <Icon type="ios-help-circle-outline" />
+					</Tooltip>
+				</span> -->
+				</p>
+				<div class="content">
+					<div class="setting-item">
+						<p>配置内容</p>
+						<Input v-model="areaSetting.accessConfig" style="width: 80%;margin-left: 10px;"/>
+					</div>
+				</div>
+			</div>
         </div>
 		<Button type="info" size="large" @click="saveAreaSetting" :loading="btnLoading">保存变更</Button>
 	</div>
@@ -113,7 +128,8 @@ export default {
 				video:['mp4','webm'],
 				audio:[],
 				image:[],
-				gzip:[]
+				gzip:[],
+				accessConfig:'',
 			}
         }
     },

+ 32 - 6
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseExerciseList.vue

@@ -11,9 +11,8 @@
 				<p v-show="viewModel === 'type' && typeItem.list.length" class="type-name">
 					{{ $tools.numberConvertToUppercase(getLatestTypeIndex(typeItem.type) + 1) }}
 					: {{ exersicesType[typeItem.type] }}
-					<span style="font-size: 14px;font-weight: 600;">({{$t('answerSheet.tip9')}}
-						{{ typeItem.list.length }} {{$t('answerSheet.tip17')}} {{ typeItem.score || 0 }}
-						{{$t('evaluation.paperList.score')}})</span>
+					<span style="font-size: 14px;font-weight: 600;">({{ typeSummaryInfo[typeItem.type] }})</span>
+					<Icon type="md-create" color="#6c6c6c" size="16" style="margin-left: 10px;cursor: pointer;" @click="onEditTypeSummary(typeItem.type)"></Icon>	
 				</p>
 
 				<div v-for="(item,index) of typeItem.list" :key="index"
@@ -259,6 +258,12 @@
 				<Button type="success">{{$t('evaluation.confirm')}}</Button>
 			</div>
 		</Modal>
+		
+		<!-- 编辑题型说明弹窗 -->
+		<Modal v-model="editSumaryModal" class-name="ex-score-modal" width="600px"
+			:title="exersicesType[curEditType] + '说明文本'" @on-visible-change="editModalChange">
+			<Input v-model="typeSummaryInfo[curEditType]" />
+		</Modal>
 	</div>
 </template>
 
@@ -285,6 +290,9 @@
 		data() {
 			let that = this
 			return {
+				typeSummaryInfo:{
+					single:'共4题'
+				},
 				scoreCol:[
 					{
 						title: '题号',
@@ -380,10 +388,20 @@
 				curErrorSingleAnswer: 'A',
 				curErrorMulAnswer: [],
 				noAnswerList: [],
-				answerModal: false
+				answerModal: false,
+				curEditType:'',
+				editSumaryModal:false,
+				curSummary:''
 			}
 		},
 		methods: {
+			
+			/* 编辑题型的描述文字 */
+			onEditTypeSummary(type){
+				this.editSumaryModal = true
+				this.curEditType = type
+				this.curSummary = this.typeSummaryInfo[type]
+			},
 			/**
 			 * 题干展开与收缩
 			 * @param index
@@ -790,6 +808,7 @@
 					this.groupList = [] // 题型排序的数据
 					this.orderList = [] //顺序排列的数据
 					this.exerciseList = []
+					this.typeSummaryInfo = {}
 					this.paperInfo = newPaper
 					this.multipleRule = newPaper.multipleRule || 1 // 配分规则
 					if (newPaper.item.length) {
@@ -809,12 +828,14 @@
 							this._.mapKeys(this._.groupBy(newPaper.item, 'type'), function(value, key) {
 								if (key === item) {
 									/* 按照题型排序,并且计算每种题型的总分 */
-									that.groupList.push({
+									let typeInfo = {
 										type: key,
 										list: value,
 										score: value.reduce((p, e) => p + e.score, 0)
-									})
+									}
+									that.groupList.push(typeInfo)
 									that.exerciseList = that.exerciseList.concat(value)
+									that.typeSummaryInfo[key] = `${that.$t('answerSheet.tip9')}${typeInfo.list.length}${that.$t('answerSheet.tip17')}${typeInfo.score || 0}${that.$t('evaluation.paperList.score')}`
 								}
 							})
 						});
@@ -865,6 +886,11 @@
 					return arr.reduce((a, b) => a + this.getComposeScore(b), 0)  / 2
 				}
 			},
+			// getTypeSummary(typeItem){
+			// 	return typeItem => {
+			// 		return `${this.$t('answerSheet.tip9')}${typeItem.list.length}${this.$t('answerSheet.tip17')}${typeItem.score || 0}${this.$t('evaluation.paperList.score')}`
+			// 	}
+			// }
 		},
 		watch: {
 			paper: {

+ 63 - 13
TEAMModelOS/ClientApp/src/view/jyzx/application.vue

@@ -48,8 +48,8 @@
                             </Table>
                         </div>
                     </TabPane>
-                    <TabPane :label="$t('jyzx.application.discuss')" name="name2">
-                        <EmptyData :textContent="$t('jyzx.common.noData')" v-if="!otherList.length"></EmptyData>
+                    <TabPane label="组员互评" name="name2">
+                        <EmptyData textContent="暂无数据" v-if="!otherList.length"></EmptyData>
                         <div v-else class="app-table">
                             <Table :columns="comCol" :data="otherList">
 								 <template slot-scope="{ row }" slot="myAppraise">
@@ -64,6 +64,22 @@
                             </Table>
                         </div>
                     </TabPane>
+					<TabPane label="小组评价" name="name3" v-if="isGroupLeader">
+					    <EmptyData textContent="暂无数据" v-if="!groupMemberList.length"></EmptyData>
+					    <div v-else class="app-table">
+					        <Table :columns="comCol" :data="groupMemberList">
+								 <template slot-scope="{ row }" slot="myAppraise">
+					                <span v-show="row.myAppraise === 2" style="color: #007700;">{{ $t('jyzx.application.fine') }}</span>
+					                <span v-show="row.myAppraise === 1" style="color: orangered;">{{ $t('jyzx.application.qualified') }}</span>
+					                <span v-show="row.myAppraise === 0" style="color: red;">{{ $t('jyzx.application.unqualified') }}</span>
+					                <span v-show="row.myAppraise === -1">{{ $t('jyzx.application.noEvaluate') }}</span>
+					            </template>
+								<template slot-scope="{ row }" slot="action">
+								    <Button :type="row.myAppraise === -1 ? 'primary':'info'" size="small" @click="appraiseOther(row)">{{ row.myAppraise === -1 ? $t('jyzx.application.score') : $t('jyzx.application.againScore') }}</Button>
+								</template>
+					        </Table>
+					    </div>
+					</TabPane>
                 </Tabs>
             </Card>
         </div>
@@ -73,7 +89,7 @@
                 <span>{{ $store.state.userInfo.name }} 【 {{ curData.name }} 】</span>
             </div>
             <Table :columns="appraiseColumns" :data="appraiseArr" border>
-                <template slot-scope="{ row }" slot="result">
+                <template slot-scope="{ row, index }" slot="result">
                     <span v-show="row.result === '优秀'" style="color: #007700;">{{ $t('jyzx.application.fine') }}</span>
                     <span v-show="row.result === '合格'" style="color: orangered;">{{ $t('jyzx.application.qualified') }}</span>
                     <span v-show="row.result === '不合格'" style="color: red;">{{ $t('jyzx.application.unqualified') }}</span>
@@ -99,6 +115,7 @@ export default {
             isShowDetail: false,
             curReviewMode: 'self',
 			curTab:'name1',
+			groupMemberList:[],
             appraiseColumns: [
                 {
                     title: this.$t('jyzx.application.evaName'),
@@ -131,26 +148,36 @@ export default {
                 title: this.$t('jyzx.common.loadTime'),
                 slot: "time",
             },
-            {
-                title: this.$t('jyzx.application.disNum'),
-                key: "num",
-				width:100
-            },
+    //         {
+    //             title: this.$t('jyzx.application.disNum'),
+    //             key: "num",
+				// width:100
+    //         },
             {
                 title: this.$t('jyzx.application.disByMe'),
                 slot: "result",
 				width:100
             },
 			{
-			    title: this.$t('jyzx.application.disBySchool'),
-			    slot: "schoolAppraise",
+			    title: '互评结果',
+			    slot: "num",
 				width:100
 			},
 			{
-			    title: this.$t('jyzx.application.spotCheck'),
-			    key: "teacherAppraise",
+			    title: '小组评价',
+			    slot: "schoolAppraise",
 				width:100
 			},
+			// {
+			//     title: this.$t('jyzx.application.disBySchool'),
+			//     slot: "schoolAppraise",
+			// 	width:100
+			// },
+			// {
+			//     title: this.$t('jyzx.application.spotCheck'),
+			//     key: "teacherAppraise",
+			// 	width:100
+			// },
 			{
 			    title: this.$t('jyzx.application.testByMe'),
 			    slot: "exerciseScore",
@@ -331,6 +358,27 @@ export default {
 				console.log(this.otherList)
             })
         },
+		
+		getGroupMembers(){
+			this.groupMemberList = []
+			this.$api.jyzx.getOtherSubs({
+			    "tmdid": this.$store.state.userInfo.TEAMModelId,
+			    "school": this.$store.state.userInfo.schoolCode,
+			    "all": "0"
+			}).then(res => {
+				let myId = this.$store.state.userInfo.TEAMModelId
+			    res.groupMembers.forEach(i => {
+					if(i.sub.uploads.length){
+						i.dimension = this.$GLOBAL.DIMENSIONS().find(j => j.code === res.abilities.find(k => k.id === i.sub.abilityId).dimension).val
+						i.abilityName = res.abilities.find(j => j.id === i.sub.abilityId).no + ' ' + res.abilities.find(j => j.id === i.sub.abilityId).name
+						i.time = i.sub.uploads.length ? this.$tools.formatTime(i.sub.uploads[0].time) : '-'
+						i.myAppraise = i.sub.otherScore.find(j => j.tmdid === myId && j.roleType === 'member') ? i.sub.otherScore.find(j => j.tmdid === myId && j.roleType === 'member').score : -1
+						this.otherList.push(i)
+					}
+			    })
+				console.log(this.otherList)
+			})
+		},
 
         doUpload(data) {
             this.reviewData = data
@@ -374,7 +422,9 @@ export default {
         this.getOtherSubs()
     },
     computed: {
-
+		isGroupLeader(){
+			return true
+		}
     }
 }
 </script>

+ 14 - 171
TEAMModelOS/ClientApp/src/view/learnactivity/CreatePrivEva.vue

@@ -34,12 +34,6 @@
                                     <Option v-for="(item,index) in $GLOBAL.EV_TYPE()" :value="item.value" :key="index">{{ item.label }}</Option>
                                 </Select>
                             </FormItem>
-                            <FormItem :label="$t('learnActivity.createEv.courseType')" prop="course">
-                                <Select v-model="evaluationInfo.scope" @on-change="resetCourse">
-                                    <Option value="school" v-show="$store.state.userInfo.hasSchool">{{$t('learnActivity.createEv.cusLabel1')}}</Option>
-                                    <Option value="private">{{$t('learnActivity.createEv.cusLabel2')}}</Option>
-                                </Select>
-                            </FormItem>
                             <!-- 使用级联选择 课程--》班级 -->
                             <FormItem :label="$t('learnActivity.createEv.evTarget')" prop="targets">
                                 <label slot="label">
@@ -48,8 +42,7 @@
                                         <Icon type="ios-information-circle-outline" color="#1cc0f3" style="margin-left:5px" />
                                     </Tooltip>
                                 </label>
-                                <el-cascader size="small" :options="targetData" :show-all-levels="false" clearable filterable v-model="evaluationInfo.targets" @visible-change="visibleChange" :props="props" @change="treeChange" style="width:100%;" :popper-class="cascaderClass">
-                                </el-cascader>
+                                <PrivateTargetSingle @on-scope-change="getScope" @on-target-change="treeChange"></PrivateTargetSingle>
                             </FormItem>
                             <FormItem :label="$t('learnActivity.createEv.publishType')" prop="publish">
                                 <Checkbox v-model="evaluationInfo.publish" :true-value="$GLOBAL.PUBLISH_TYPE()[0].value" :false-value="$GLOBAL.PUBLISH_TYPE()[1].value" @on-change="publishChange">
@@ -103,15 +96,6 @@ export default {
         const _this = this
         return {
             isEdit: false,
-            props: {
-                multiple: true,
-                value: 'id',
-                label: 'name',
-                children: 'classes'
-            },
-            schoolBase: {
-                period: []
-            },
             dateOpt: {
                 disabledDate(date) {
                     return date && date.valueOf() < Date.now() - 86400000
@@ -123,9 +107,6 @@ export default {
                     return d && d > date.valueOf() + 86400000
                 }
             },
-            schoolTree: [],
-            privateTree: [],
-            schoolClassList: [],
             createType: 'manualPaper',
             startTime: '',
             endTime: '',
@@ -180,30 +161,12 @@ export default {
             mode: '',
             selectBefore: [],
             stuList: [],
-            showBack: false,
-            allTargets: []
+            showBack: false
         }
     },
     methods: {
-        //查询发布对象数据结构
-        findTargetData() {
-            let params = {
-                code: this.$store.state.userInfo.TEAMModelId,
-                schoolId: this.$store.state.userInfo.schoolCode
-            }
-            this.$api.courseMgmt.findAllByTeahcer(params).then(
-                res => {
-                    if (res.obj) {
-                        this.allTargets = []
-                        this.allTargets.push(...res.obj)
-                    } else {
-                        this.$Message.error('API error!')
-                    }
-                },
-                err => {
-                    this.$Message.error('API error!')
-                }
-            )
+        getScope(data) {
+            this.evaluationInfo.scope = data
         },
         /**vuescroll回到顶部 */
         handleBackToTop() {
@@ -233,58 +196,9 @@ export default {
                 this.evaluationInfo.startTime = Date.now()
             }
         },
-        //重置课程类型
-        resetCourse() {
-            this.evaluationInfo.targets = []
-            this.evaluationInfo.classes = []
-        },
-        visibleChange(status) {
-            if (status) {
-                this.selectBefore = this._.cloneDeep(this.evaluationInfo.targets)
-            }
-        },
         treeChange(data) {
-            //1、处理班级类型和课程单选效果
-            if (this.selectBefore.length) {
-                let curCus = new Set()
-                let classType = new Set()
-                data.forEach(item => {
-                    if (this.evaluationInfo.scope == 'school') {
-                        curCus.add(item[1])
-                        classType.add(item[0])
-                    } else {
-                        curCus.add(item[0])
-                    }
-                })
-                // 检查班级类型是否唯一
-                if (classType.size > 1) {
-                    let originType = this.selectBefore[0][0]
-                    let filterData = data.filter(item => {
-                        return item[0] != originType
-                    })
-                    this.selectBefore = filterData
-                    this.evaluationInfo.targets = filterData
-                    data = JSON.parse(JSON.stringify(filterData))
-                    curCus.clear()
-                    data.forEach(item => {
-                        curCus.add(item[1])
-                    })
-                }
-                // 检查课程是否唯一
-                if (curCus.size > 1) {
-                    let originCus = this.evaluationInfo.scope == 'school' ? this.selectBefore[0][1] : this.selectBefore[0][0]
-                    let filterData = data.filter(item => {
-                        let d = this.evaluationInfo.scope == 'school' ? item[1] : item[0]
-                        return d != originCus
-                    })
-                    this.selectBefore = filterData
-                    this.evaluationInfo.targets = filterData
-                }
-            } else {
-                this.selectBefore = data
-            }
-
-            // 2、设置发布对象
+            this.evaluationInfo.targets = data.targets
+            // 1、设置发布对象
             //个人课程
             if (this.evaluationInfo.scope == 'private') {
                 this.evaluationInfo.stuLists = this.evaluationInfo.targets.map(item => {
@@ -293,7 +207,7 @@ export default {
                 this.evaluationInfo.classes = []
             }
             //学校课程教学班
-            else if (this.evaluationInfo.scope == 'school' && this.evaluationInfo.targets.length && this.evaluationInfo.targets[0][0] == 'stulist') {
+            else if (this.evaluationInfo.scope == 'school' && this.evaluationInfo.targets.length && this.evaluationInfo.targets[0][1] == 'stulist') {
                 this.evaluationInfo.stuLists = this.evaluationInfo.targets.map(item => {
                     return item[2]
                 })
@@ -307,19 +221,13 @@ export default {
                 this.evaluationInfo.stuLists = []
             }
 
-            //3、设置评测“学科”
+            //2、设置评测“学科”
             this.evaluationInfo.subjects = []
-            if (this.evaluationInfo.targets.length) {
-                let cus = this.allTargets.find(item => {
-                    let cusId = this.evaluationInfo.scope == 'school' ? this.evaluationInfo.targets[0][1] : this.evaluationInfo.targets[0][0]
-                    return item.id == cusId
+            if (this.evaluationInfo.targets.length && data.course) {
+                this.evaluationInfo.subjects.push({
+                    id: data.course.id,
+                    name: data.course.name
                 })
-                if (cus) {
-                    this.evaluationInfo.subjects.push({
-                        id: cus.id,
-                        name: cus.name
-                    })
-                }
             }
         },
         /*
@@ -420,7 +328,7 @@ export default {
                     return {
                         sheetId: item.sheet,
                         paperId: item.id,
-                        code: item.code.replace('Paper-',''),
+                        code: item.code.replace('Paper-', ''),
                         scope: item.scope
                     }
                 })
@@ -618,20 +526,8 @@ export default {
         this.evaluationInfo.startTime = new Date().getTime()
         this.endTime = new Date(new Date(new Date().toLocaleDateString()).getTime() + 2 * 24 * 60 * 60 * 1000 - 1)
         this.evaluationInfo.endTime = new Date(new Date().toLocaleDateString()).getTime() + 2 * 24 * 60 * 60 * 1000 - 1
-
-        this.$store.dispatch('user/getSchoolProfile').then(
-            res => {
-                this.schoolBase = res.school_base
-                this.schoolClassList = res.school_classes
-            }
-        )
         //判断创建个人还是校本评测
-        if (this.$route.name == 'createSchoolEva') {
-            this.mode = 'school'
-        } else {
-            this.mode = 'private'
-        }
-        this.evaluationInfo.scope = this.$store.state.userInfo.hasSchool ? 'school' : 'private'
+        this.mode = 'private'
         //编辑评测逻辑
         let routerData = this.$route.params.evaluationInfo
         if (routerData !== undefined) {
@@ -648,59 +544,6 @@ export default {
             this.evaluationInfo = routerData
             this.activeTab = 'preview'
         }
-        this.findTargetData()
-    },
-    computed: {
-        cascaderClass() {
-            return this.evaluationInfo.scope == 'school' ? 'one-hidden-check-box' : ''
-        },
-        targetData() {
-            let nodes = []
-            if (this.evaluationInfo.scope == 'school') {
-                nodes = [
-                    {
-                        id: 'class',
-                        name: this.$t('cusMgt.listType1'),
-                        classes: []
-                    },
-                    {
-                        id: 'stulist',
-                        name: this.$t('cusMgt.listType2'),
-                        classes: []
-                    }
-                ]
-                let schoolCus = this.allTargets.filter(item => {
-                    return item.scope == this.evaluationInfo.scope
-                })
-                schoolCus.forEach(item => {
-                    let c = item.classes.filter(i => {
-                        return i.type == 'class'
-                    })
-                    let s = item.classes.filter(i => {
-                        return i.type == 'stuList'
-                    })
-                    if (c && c.length) {
-                        nodes[0].classes.push({
-                            id: item.id,
-                            name: item.name,
-                            classes: c
-                        })
-                    }
-                    if (s && s.length) {
-                        nodes[1].classes.push({
-                            id: item.id,
-                            name: item.name,
-                            classes: s
-                        })
-                    }
-                })
-            } else {
-                nodes = this.allTargets.filter(item => {
-                    return item.scope == this.evaluationInfo.scope
-                })
-            }
-            return nodes
-        }
     },
     beforeRouteLeave(to, from, next) {
         if (to.name == 'answerSheet') {

+ 20 - 153
TEAMModelOS/ClientApp/src/view/learnactivity/CreateSchoolEva.vue

@@ -15,11 +15,6 @@
                 <div style="width:100%; height:calc(100% - 45px);padding-top:30px;" class="ivu-select-nochoose">
                     <vuescroll>
                         <Form ref="evaForm" :model="evaluationInfo" label-position="top" class="evaluation-attr-form light-iview-select light-iview-input light-el-input light-iview-input-number" label-colon :rules="ruleValidate">
-                            <!-- <FormItem :label="$t('learnActivity.createEv.evPeriod')" prop="period.id" v-if="mode == 'school'">
-                                <Select v-model="evaluationInfo.period.id" @on-change="setPeriodName" @on-open-change="checkChangePeriod" label-in-value>
-                                    <Option v-for="(item,index) in $store.state.user.schoolProfile.periods" :value="item.id" :key="index">{{ item.name }}</Option>
-                                </Select>
-                            </FormItem> -->
                             <FormItem :label="$t('learnActivity.createEv.evName')" prop="name">
                                 <Input v-special-char v-model="evaluationInfo.name" :placeholder="$t('learnActivity.createEv.evName')"></Input>
                             </FormItem>
@@ -46,8 +41,7 @@
                             </FormItem>
                             <!-- 校园评测施测对象为教学班或行政班 -->
                             <FormItem :label="$t('learnActivity.createEv.evTarget')" prop="targets">
-                                <el-cascader ref="evtarget" @visible-change="visibleChange" size="small" :show-all-levels="false" clearable filterable v-model="evaluationInfo.targets" :options="csOptions" :props="props" @change="treeChange" style="width:100%;">
-                                </el-cascader>
+                                <SchoolTarget @on-change="treeChange"></SchoolTarget>
                             </FormItem>
                             <FormItem :label="$t('learnActivity.createEv.publishType')" prop="publish">
                                 <Checkbox v-model="evaluationInfo.publish" :true-value="$GLOBAL.PUBLISH_TYPE()[0].value" :false-value="$GLOBAL.PUBLISH_TYPE()[1].value" @on-change="publishChange">
@@ -150,17 +144,8 @@ export default {
     data() {
         let _this = this
         return {
-            selectBefore: [],
             showBack: false,
-            schoolClasses: [],
-            props: {
-                multiple: true,
-                value: 'id',
-                label: 'name'
-            },
-            schoolBase: {
-                period: []
-            },
+            curPdInfo: {},
             dateOpt: {
                 disabledDate(date) {
                     return date && date.valueOf() < Date.now() - 86400000
@@ -174,7 +159,6 @@ export default {
             },
             startTime: '',
             endTime: '',
-            privClassList: [],
             examAnalysisStatus: false,
             comfirmPreviewStatus: false,
             addSubjectStatus: false,
@@ -247,8 +231,7 @@ export default {
             befPeriod: {
                 id: '',
                 name: ''
-            },
-            stuList: []
+            }
         }
     },
     mounted() {
@@ -286,20 +269,6 @@ export default {
                 this.showBack = false
             }
         },
-        findStuList() {
-            let params = {
-                code: this.$store.state.userInfo.schoolCode,
-                scope: 'school'
-            }
-            this.$api.courseMgmt.findStulist(params).then(
-                res => {
-                    this.stuList = res.stuList
-                },
-                err => {
-                    this.$Message.error('API error')
-                }
-            )
-        },
         test() {
             console.log(this.evaluationInfo)
         },
@@ -351,40 +320,11 @@ export default {
             }
             // this.evaluationInfo.period.name = data.label
         },
-        //学段选择展开时
-        checkChangePeriod(status) {
-            if (status) {
-                this.befPeriod = this._.cloneDeep(this.evaluationInfo.period)
-            }
-        },
-        visibleChange(status) {
-            if (status) {
-                this.selectBefore = this._.cloneDeep(this.evaluationInfo.targets)
-            }
-        },
         treeChange(data) {
-            // 实现教学班和行政班二选一
+            this.evaluationInfo.targets = data
+            console.log('对象数据', data)
+            // 组件内部已实现教学班和行政班二选一
             let finalData = data
-            if (this.selectBefore.length) {
-                let curType = new Set()
-                data.forEach(item => {
-                    curType.add(item[0])
-                })
-                if (curType.size > 1) {
-                    let oldType = this.selectBefore[0][0]
-                    let newData = data.filter(item => {
-                        return item[0] != oldType
-                    })
-                    this.evaluationInfo.targets = []
-                    this.$refs.evtarget.panel.clearCheckedNodes()
-                    this.$refs.evtarget.panel.activePath = []
-                    this.selectBefore = newData
-                    this.evaluationInfo.targets = newData
-                    finalData = newData
-                }
-            } else {
-                this.selectBefore = data
-            }
             let classData = finalData.filter(item => {
                 return item[0] == 'class'
             })
@@ -392,6 +332,11 @@ export default {
                 return item[0] == 'stulist'
             })
 
+            if (!data.length) {
+                this.evaluationInfo.stuLists = []
+                this.evaluationInfo.classes = []
+                this.evaluationInfo.grades = []
+            }
             // 如果是行政班
             if (classData.length) {
                 //获取classIds
@@ -413,12 +358,13 @@ export default {
                 this.evaluationInfo.stuLists = []
             }
             //教学班
-            else if (listData.length) {
+            if (listData.length) {
                 // 处理教学班对象
                 this.evaluationInfo.stuLists = listData.map(item => {
                     return item[1]
                 })
                 this.evaluationInfo.classes = []
+                this.evaluationInfo.grades = []
             }
         },
         /*
@@ -858,13 +804,6 @@ export default {
         this.evaluationInfo.startTime = new Date().getTime()
         this.endTime = new Date(new Date(new Date().toLocaleDateString()).getTime() + 2 * 24 * 60 * 60 * 1000 - 1)
         this.evaluationInfo.endTime = new Date(new Date().toLocaleDateString()).getTime() + 2 * 24 * 60 * 60 * 1000 - 1
-
-        this.$store.dispatch('user/getSchoolProfile').then(
-            res => {
-                this.schoolBase = res.school_base
-                this.schoolClasses = res.school_classes
-            }
-        )
         //判断创建个人还是校本评测
         if (this.$route.name == 'createSchoolEva') {
             this.mode = 'school'
@@ -904,101 +843,28 @@ export default {
             )
             this.activeTab = 'preview'
         }
-        this.findStuList()
     },
     computed: {
-        //级联选择年级班级
-        csOptions() {
-            let data = []
-            //填充行政班数据
-            if (this.evaluationInfo.period.id && this.schoolBase.period.length && this.schoolClasses.length) {
-                let curPd = this.schoolBase.period.find((item) => {
-                    return item.id == this.evaluationInfo.period.id
-                })
-                data = [
-                    {
-                        id: 'class',
-                        name: this.$t('cusMgt.listType1'),
-                        children: []
-                    },
-                    {
-                        id: 'stulist',
-                        name: this.$t('cusMgt.listType2'),
-                        // disabled: true,
-                        children: []
-                    }
-                ]
-                if (curPd) {
-                    //计算学级逻辑
-                    let date = new Date()
-                    let curYear = date.getFullYear()
-                    let month = date.getMonth() + 1
-                    let start = curPd.semesters.find(item => {
-                        return item.start == 1
-                    })
-                    // 根据入学月份确定当前年级和学级的关系
-                    if (start && month < start.month) {
-                        curYear--
-                    }
-                    curPd.grades.forEach((item, index) => {
-                        let dataItem = {
-                            id: index,  //年级使用index
-                            name: `${item}(${curYear - index}${this.$t('unit.gradeYear')})`,
-                            year: curYear - index,
-                            children: []
-                        }
-                        let child = this.schoolClasses.filter(classItem => {
-                            return (classItem.year == curYear - index) && classItem.periodId == this.evaluationInfo.period.id
-                        })
-                        dataItem.children = child.length ? child : undefined
-                        data[0].children.push(dataItem)
-                    })
-                }
-                // 填充教学班数据
-                let curStuList = this.stuList.filter(item => {
-                    return item.periodId == this.evaluationInfo.period.id
-                })
-                data[1].children.push(...curStuList)
-            }
-            return data
-        },
         //计算当前学段下面的年级信息
         curGrades() {
-            if (this.evaluationInfo.period) {
-                let res = this.schoolBase.period.filter((item) => {
-                    return item.id == this.evaluationInfo.period.id
-                })
-                if (res.length > 0) {
-                    return res[0].grades
-                } else {
-                    return []
-                }
+            if (this.evaluationInfo.period && this.curPdInfo.grades) {
+                return this.curPdInfo.grades
             } else {
                 return []
             }
         },
         //计算当前学段下面的学科信息
         curSubjects() {
-            if (this.evaluationInfo.period) {
-                let res = this.schoolBase.period.filter((item) => {
-                    return item.id == this.evaluationInfo.period.id
-                })
-                if (res.length > 0) {
-                    return res[0].subjects
-                } else {
-                    return []
-                }
+            if (this.evaluationInfo.period && this.curPdInfo.subjects) {
+                return this.curPdInfo.subjects
             } else {
                 return []
             }
         },
         //学校定义的考试类型
         testType() {
-            let curPeriod = this.schoolBase.period.filter(item => {
-                return item.id == this.evaluationInfo.period.id
-            })
-            if (curPeriod.length > 0) {
-                return curPeriod[0].analysis.type
+            if (this.curPdInfo.analysis && this.curPdInfo.analysis.type) {
+                return this.curPdInfo.analysis.type
             } else {
                 return []
             }
@@ -1010,6 +876,7 @@ export default {
             immediate: true,
             handler(n, o) {
                 if (n) {
+                    this.curPdInfo = n
                     console.log(n)
                     this.setPeriodName(n)
                     this.evaluationInfo.income = n.analysis ? n.analysis.income : 0

+ 3 - 2
TEAMModelOS/ClientApp/src/view/newsheet/index.vue

@@ -427,7 +427,7 @@
 					let curScope = this.examId ? paperInfo.examScope : paperInfo.scope
 					let sasData = curScope === 'school' ? await this.$tools.getSchoolSas() : await this.$tools.getPrivateSas()
 					let containerClient = new blobTool(sasData.url, sasData.name, sasData.sas, curScope)
-					let path = this.examId ? `exam/${this.examId}/paper/${paperInfo.name}` : `paper/${paperInfo.name}`
+					let path = this.examId ? `exam/${this.examId}/paper/${paperInfo.subjectId}` : `paper/${paperInfo.name}`
 					try {
 						// 等待上传blob的返回结果
 						let blobFile = await containerClient.upload(file, path)
@@ -477,12 +477,13 @@
 					configParams.contents = this._.cloneDeep(configParams.newContents)
 					let curCode = paperInfo.examCode || paperInfo.code
 					let curScope = paperInfo.examScope || paperInfo.scope
+					let cropCount = this.$store.state.answerSheet.pages
 					if (paperInfo.sheet && withId) {
 						configParams.id = paperInfo.sheet
 					}
 					configParams.pageHeight = Number(configParams.pageHeight.toFixed())
 					configParams.pageWidth = Number(configParams.pageWidth.toFixed())
-					configParams.pageCount = this.$store.state.answerSheet.pages
+					configParams.pageCount = this.curMode === 'A4' ? cropCount : ( (cropCount % 2 === 0) ? (cropCount / 2) : ((cropCount + 1) / 2) )
 					configParams.itemCount = this.$store.state.answerSheet.paperItem.item.length
 					configParams.code = curCode.replace('Paper-', '').replace('Exam-', '') //如果是评测修改code会有问题
 					configParams.school = curScope === 'school' ? this.$store.state.userInfo.schoolCode : ''

+ 3 - 2
TEAMModelOS/ClientApp/src/view/syllabus/Syllabus.vue

@@ -242,7 +242,7 @@
 		</Modal>
 
 		<!-- 关联内容弹窗 -->
-		<Modal v-model="isRelateContentModal" width="900" class="tree-modal add-volume-modal choose-content-modal">
+		<Modal v-model="isRelateContentModal" width="1200" class="tree-modal add-volume-modal choose-content-modal">
 			<ChooseContent v-if="isRelateContentModal" ref="chooseContentRef" :showSyllabus="false"
 				@previewPaper="onPreviewPaper"></ChooseContent>
 			<Button slot="footer" @click="onRelateContent" style="margin-bottom: 20px;" class="modal-btn"
@@ -1588,10 +1588,11 @@
 					console.log(result)
 					this.isRelateLoading = false
 					this.isRelateContentModal = false
-					this.hasModify = true
+					// this.hasModify = true
 					this.modifyIdArr.push(this.curChapter.data.id)
 					this.$refs.treeRef.curData.creatorId = this.curTeammodelId
 					this.$refs.treeRef.curData.creatorName = this.curName
+					this.onSaveSyllabus()
 				}).catch(err => {
 					console.log(err)
 					this.isRelateLoading = false

+ 36 - 2
TEAMModelOS/ClientApp/src/view/teachermgmt/components/group/Group.vue

@@ -6,12 +6,15 @@
                     <div class="group-info-wrap">
                         <div class="group-img-start" :style="{backgroundImage:`radial-gradient(${colorList[index % 9]},#fff)`}">
                         </div>
-                        <div>
+                        <div style="text-align:center">
                             <h6 class="group-name">{{item.name}}</h6>
                             <p class="group-info">
                                 {{$t('teachermgmt.peopleNum')}}
                                 {{item.members.length}}
                                 {{$t('teachermgmt.peopleUnit')}}
+                                <!-- 组长 -->
+                                <span style="margin-left:10px">{{`${$t('teachermgmt.leader')}${item.leader || ''}`}}</span>
+                                <span v-show="!item.leader" style="color:red">{{$t('teachermgmt.notSet')}}</span>
                             </p>
                             <p class="group-info">
                                 <span class="view-member" @click="addMember(item.id)">
@@ -26,7 +29,8 @@
                                 <div class="student-info-item" v-for="(teaItem,index) in item.members" :key="index">
                                     <PersonalPhoto :name="teaItem.name" :picture="teaItem.picture"></PersonalPhoto>
                                     <p class="teacher-name">{{`${teaItem.name}(${teaItem.id})`}}</p>
-                                    <Icon type="md-remove-circle" class="remove-member-icon" @click="delMember(item.id,teaItem.id)" />
+                                    <Icon type="md-remove-circle" class="remove-member-icon" @click="delMember(item.id,teaItem.id)" :title="$t('teachermgmt.rmvTch')"/>
+                                    <Icon type="md-checkmark" class="remove-member-icon" style="right:30px" @click="setLeader(item.id,teaItem.id)" :title="$t('teachermgmt.setLeader')"/>
                                 </div>
                                 <EmptyData :textContent="$t('teachermgmt.noTeacher')" style="opacity:0.5" v-if="item.members.length == 0"></EmptyData>
                             </Draggable>
@@ -121,6 +125,29 @@ export default {
         }),
     },
     methods: {
+        setLeader(groupId, teaId) {
+            let gIndex = this.groupList.findIndex(item => {
+                return item.id == groupId
+            })
+            let leader
+            this.groupList[gIndex].members.forEach(teacher => {
+                if (teacher.id === teaId) {
+                    teacher.tag = 'leader'
+                    leader = teacher.name
+                } else {
+                    teacher.tag = ''
+                }
+            })
+            this.$api.common.upsertGroupInfo(this.groupList[gIndex]).then(
+                res => {
+                    this.$Message.success(this.$t('teachermgmt.setOk'))
+                    this.$set(this.groupList[gIndex], 'leader', leader)
+                },
+                err => {
+                    this.$Message.error(this.$t('teachermgmt.setErr'))
+                }
+            )
+        },
         //移除教研组成员
         delMember(groupId, teaId) {
             let gIndex = this.groupList.findIndex(item => {
@@ -163,6 +190,13 @@ export default {
             this.$api.common.getGroupListInfo(params).then(
                 res => {
                     if (res && res.groups) {
+                        res.groups.forEach(group=>{
+                            group.members.forEach(teacher=>{
+                                if(teacher.tag === 'leader'){
+                                    group.leader = teacher.name
+                                }
+                            })
+                        })
                         this.groupList = res.groups
                     } else {
                         this.$Message.error(this.$t('teachermgmt.groupInfoErr'))