瀏覽代碼

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

liqk 3 年之前
父節點
當前提交
9c5ff3bdd8
共有 23 個文件被更改,包括 454 次插入219 次删除
  1. 2 0
      TEAMModelOS.SDK/Models/Cosmos/Common/Homework.cs
  2. 108 0
      TEAMModelOS.SDK/Models/Service/GroupListService.cs
  3. 10 0
      TEAMModelOS/ClientApp/src/assets/student-web/component_styles/course-list.less
  4. 1 1
      TEAMModelOS/ClientApp/src/common/BaseSelectSchool.vue
  5. 1 1
      TEAMModelOS/ClientApp/src/components/questionnaire/BaseSsTable.vue
  6. 1 1
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/ClassmateCommentPages.vue
  7. 3 0
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/Homework.vue
  8. 4 4
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/LessonTestReport.vue
  9. 34 9
      TEAMModelOS/ClientApp/src/components/student-web/HomeView/CourseListView.vue
  10. 1 1
      TEAMModelOS/ClientApp/src/components/vote/BaseVoteForm.less
  11. 143 128
      TEAMModelOS/ClientApp/src/components/vote/BaseVoteForm.vue
  12. 11 0
      TEAMModelOS/ClientApp/src/locale/lang/en-US/researchCenter.js
  13. 2 1
      TEAMModelOS/ClientApp/src/locale/lang/en-US/studentWeb.js
  14. 11 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/researchCenter.js
  15. 2 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/studentWeb.js
  16. 21 10
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/researchCenter.js
  17. 2 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/studentWeb.js
  18. 30 1
      TEAMModelOS/ClientApp/src/view/assessment/Assessment.vue
  19. 7 7
      TEAMModelOS/ClientApp/src/view/dashboard/Index.vue
  20. 4 4
      TEAMModelOS/ClientApp/src/view/dashboard/Research.vue
  21. 8 5
      TEAMModelOS/ClientApp/src/view/vote/ManageVote.vue
  22. 47 43
      TEAMModelOS/Controllers/Analysis/ClassAnalysisController.cs
  23. 1 1
      TEAMModelOS/Controllers/Common/HomeworkController.cs

+ 2 - 0
TEAMModelOS.SDK/Models/Cosmos/Common/Homework.cs

@@ -115,6 +115,8 @@ namespace TEAMModelOS.SDK.Models
         public List<Submits> teachers { get; set; } = new List<Submits>();
         public string recordUrl { get; set; }
         public int? publish { get; set; } = 0;
+
+        public bool mustSubmit { get; set; } = false;
     }
 
     public class Submits

+ 108 - 0
TEAMModelOS.SDK/Models/Service/GroupListService.cs

@@ -21,6 +21,114 @@ namespace TEAMModelOS.SDK
 {
     public class GroupListService
     {
+
+        /// <summary>
+        /// 查询名单成员所在的名单列表,
+        /// </summary>
+        /// <param name="_coreAPIHttpService"></param>
+        /// <param name="client"></param>
+        /// <param name="_dingDing"></param>
+        /// <param name="memberId">成员id </param>
+        /// <param name="memberType">成员类型</param>
+        /// <param name="school">成员所在的学校 ,可为空</param>
+        /// <param name="groupTypes">过滤名单的类型集合,不传则是全部</param>
+        /// <returns></returns>
+        public static async Task<List<GroupListGrp>> GetMemberInGroupList(CoreAPIHttpService _coreAPIHttpService, CosmosClient client, DingDing _dingDing, string memberId, int memberType, string school,List<string> groupTypes) {
+
+            List<GroupListGrp> groupLists = new List<GroupListGrp>();
+
+            if (groupTypes.IsEmpty() || groupTypes.Contains("class")) {
+                if (string.IsNullOrWhiteSpace(school) && memberType == 2)
+                {
+                    Student student = null;
+                    try
+                    {
+                        student = await client.GetContainer(Constant.TEAMModelOS, Constant.Student).ReadItemAsync<Student>(memberId, new PartitionKey($"Base-{school}"));
+                    }
+                    catch (CosmosException ex) when (ex.Status == 404)
+                    {
+                        return null;
+                    }
+                    if (!string.IsNullOrWhiteSpace(student.classId))
+                    {
+                        try
+                        {
+                            Class clazz = await client.GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<Class>(memberId, new PartitionKey($"Class-{school}"));
+                            GroupListGrp groupList = new GroupListGrp
+                            {
+                                id = clazz.id,
+                                code = $"GroupList-{clazz.school}",
+                                name = clazz.name,
+                                periodId = clazz.periodId,
+                                pk = "GroupList",
+                                year = clazz.year,
+                                school = clazz.school,
+                                scope = "school",
+                                type = "class",
+                                no = clazz.no,
+                                leader = clazz.teacher?.id,
+                            };
+                            groupLists.Add(groupList);
+                        }
+                        catch (CosmosException ex) when (ex.Status == 404)
+                        {
+                        }
+                    }
+                }
+            }
+            string SummarySql = " c.id,c.code,c.name,c.no,c.periodId,c.scope,c.school,c.creatorId,c.type,c.year,c.tcount,c.scount,c.leader ";
+            if (groupTypes.IsEmpty() || groupTypes.Contains("teach")) {
+                //教学班
+                StringBuilder teachsql = new StringBuilder();
+                if (string.IsNullOrWhiteSpace(school) && memberType == 2) {
+                    teachsql.Append($"SELECT distinct {SummarySql} FROM c join  m  in c.members   where c.type='teach' and  m.id='{memberId}' and m.school='{school}' and m.type=2 ");
+                }
+                if (memberType == 1)
+                {
+                    teachsql.Append($"SELECT distinct {SummarySql} FROM c join  m  in c.members   where c.type='teach' and  m.id='{memberId}' and m.type=1 ");
+                }
+                await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").
+                    GetItemQueryIterator<GroupList>(queryText: teachsql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"GroupList-{school}") }))
+                {
+                    HashSet<string> groupName = item.members.Where(x => !string.IsNullOrEmpty(x.groupName)).Select(y => y.groupName).ToHashSet();
+                    groupLists.Add(new GroupListGrp(item, groupName));
+                }
+                //个人名单
+                await foreach (var item in client.GetContainer(Constant.TEAMModelOS, Constant.Teacher).
+                    GetItemQueryIterator<GroupList>(queryText: teachsql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"GroupList") }))
+                {
+                    HashSet<string> groupName = item.members.Where(x => !string.IsNullOrEmpty(x.groupName)).Select(y => y.groupName).ToHashSet();
+                    groupLists.Add(new GroupListGrp(item, groupName));
+                }
+            }
+
+            if (!string.IsNullOrWhiteSpace(school) && (groupTypes.IsEmpty() || groupTypes.Contains("research")))
+            {
+                //教研组
+                StringBuilder teachsql = new StringBuilder();
+                teachsql.Append($"SELECT distinct {SummarySql} FROM c join  m  in c.members   where c.type='research' and  m.id='{memberId}' and m.type=1 ");
+                await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").
+                    GetItemQueryIterator<GroupList>(queryText: teachsql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"GroupList-{school}") }))
+                {
+                    HashSet<string> groupName = item.members.Where(x => !string.IsNullOrEmpty(x.groupName)).Select(y => y.groupName).ToHashSet();
+                    groupLists.Add(new GroupListGrp(item, groupName));
+                }
+            }
+            if (!string.IsNullOrWhiteSpace(school) && (groupTypes.IsEmpty() || groupTypes.Contains("yxtrain")))
+            {
+                //研修名单
+                StringBuilder teachsql = new StringBuilder();
+                teachsql.Append($"SELECT distinct {SummarySql} FROM c join  m  in c.members   where c.type='yxtrain' and  m.id='{memberId}' and m.type=1 ");
+                await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").
+                    GetItemQueryIterator<GroupList>(queryText: teachsql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"GroupList-{school}") }))
+                {
+                    HashSet<string> groupName = item.members.Where(x => !string.IsNullOrEmpty(x.groupName)).Select(y => y.groupName).ToHashSet();
+                    groupLists.Add(new GroupListGrp(item, groupName));
+                }
+            }
+            return groupLists;      
+        }
+
         public static async Task<(int status, GroupList stuList)> CodeJoinList(CosmosClient client, string _stuListNo, string userid, int type, string school)
         {
             var queryNo = $"SELECT  value(c)  FROM c where  c.no ='{_stuListNo}'";

+ 10 - 0
TEAMModelOS/ClientApp/src/assets/student-web/component_styles/course-list.less

@@ -72,6 +72,16 @@
                 float: right;
             }
         }
+
+        .tag-style {
+            border: 1px solid;
+            padding: 0 5px;
+            border-radius: 3px;
+            margin-right: 10px;
+            border-color: rgb(143, 135, 135);
+            color: rgb(143, 135, 135);
+            font-size: 12px;
+        }
     }
     .ivu-tabs-tabpane {
         padding-bottom: 100px;

+ 1 - 1
TEAMModelOS/ClientApp/src/common/BaseSelectSchool.vue

@@ -105,7 +105,7 @@
 				this.areaList = [...new Set(this.joinSchools.map(i => i.area).map(j => j.name))]
 				this.areaSchs = this.joinSchools.filter(i => i.area.name === this.curSchool.area.name)
 				this.periods = this.$store.state.user.schoolProfile.school_base.period
-				this.periods && (this.curPeriod = this.periods[localPeriodInfo ? localPeriodInfo.periodIndex : 0])
+				this.periods && (this.curPeriod = this.periods[localPeriodInfo && localPeriodInfo.periodIndex ? localPeriodInfo.periodIndex : 0])
 				if(!localPeriodInfo){
 					this.curPeriod.periodIndex = 0
 					// 保存Vuex

+ 1 - 1
TEAMModelOS/ClientApp/src/components/questionnaire/BaseSsTable.vue

@@ -43,7 +43,7 @@
 					    key: 'id'
 					},
                     {
-                        title: vm.$t('survey.questionaire.className'),
+                        title: vm.$t('vote.className'),
                         render: (h, params) => {
                             return h('span', params.row.classroomName === 'TeacherAll' ? vm.$t('vote.allTeacher') : params.row.classroomName)
                         },

+ 1 - 1
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/ClassmateCommentPages.vue

@@ -115,7 +115,7 @@
                                 <span class="homework-rate-num">{{ starNum }}</span>
                             </Rate>
                             <div v-show="lateComment" style="margin-bottom: 10px; margin-left: 5px; font-size: 17px">
-                                最近评语:{{ lateComment }}
+                                {{ $t('studentWeb.classmatesComment.recentComments') }}:{{ lateComment }}
                             </div>
                             <textarea
                                 class="comment-ungiven"

+ 3 - 0
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/Homework.vue

@@ -547,6 +547,9 @@ export default {
         },
         // 下载附件、作业
         async loadAttach(file) {
+            let code = this.homeworkInfo.scope == "private" ? this.homeworkInfo.creatorId : this.homeworkInfo.school
+            let sas = await this.$tools.getBlobSas(code)
+            let curFile = file.url + "?" + sas.sas
             const downloadRes = async () => {
                 let response = await fetch(curFile); // 内容转变成blob地址
                 let blob = await response.blob();  // 创建隐藏的可下载链接

+ 4 - 4
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/LessonTestReport.vue

@@ -258,10 +258,10 @@
                                         <span style="font-size: 20px; color:#00ad6c;">{{ children.getScore }}</span>
                                             / <span style="font-size: 12px;">{{ children.score }}{{ $t("studentWeb.exam.score111") }}</span>
                                         <span v-show="children.open" @click="closeDetail(index, indexs, indexC)">
-                                            <Icon type="ios-arrow-dropdown" class="ansDetail" size="25" :title="$t('studentWeb.exam.report.openExam')" />
+                                            <Icon type="ios-arrow-dropup" class="ansDetail" size="25" :title="$t('studentWeb.exam.report.closeExam')" />
                                         </span>
                                         <span v-show="!children.open" @click="closeDetail(index, indexs, indexC)">
-                                            <Icon type="ios-arrow-dropup" class="ansDetail" size="25" :title="$t('studentWeb.exam.report.closeExam')" />
+                                            <Icon type="ios-arrow-dropdown" class="ansDetail" size="25" :title="$t('studentWeb.exam.report.openExam')" />
                                         </span>
                                     </div>
                                 </div>
@@ -348,10 +348,10 @@
                             <span style="font-size: 12px;">{{ exam.score }}{{ $t("studentWeb.exam.score111") }}</span>
                             <span v-if="exam.type !== 'compose'">
                                 <span v-show="exam.open" @click="closeDetail(index, indexs)">
-                                    <Icon type="ios-arrow-dropdown" class="ansDetail" size="25" :title="$t('studentWeb.exam.report.openExam')" />
+                                    <Icon type="ios-arrow-dropup" class="ansDetail" size="25" :title="$t('studentWeb.exam.report.closeExam')" />
                                 </span>
                                 <span v-show="!exam.open" @click="closeDetail(index, indexs)">
-                                    <Icon type="ios-arrow-dropup" class="ansDetail" size="25" :title="$t('studentWeb.exam.report.closeExam')" />
+                                    <Icon type="ios-arrow-dropdown" class="ansDetail" size="25" :title="$t('studentWeb.exam.report.openExam')" />
                                 </span>
                             </span>
                         </div>

+ 34 - 9
TEAMModelOS/ClientApp/src/components/student-web/HomeView/CourseListView.vue

@@ -182,6 +182,7 @@
                                                 <p class="list-item-title">
                                                     <span class="list-item-typeMark">{{ person.no }}</span>
                                                     {{ person.name }}({{ person.teaName }})
+                                                    <span class="tag-style" v-if="person.className">{{ person.className }}</span>
                                                 </p>
                                             </li>
                                         </ul>
@@ -205,9 +206,10 @@
             <p class="info-icon">
                 <span>{{ courseNow.teaName }}</span>
                 <span>
-                    <Icon type="ios-paper-outline" :title="$t('studentWeb.courseContent.baseInfo')" size="20" @click="showBasicInfo = true" />
-                    <!-- <Icon type="ios-book-outline" title="课件" size="20" /> -->
-                    <Icon type="ios-contacts-outline" :title="$t('studentWeb.courseContent.nameList')" size="20" @click="showStuList = true" />
+                    <Icon custom="iconfont icon-info" :title="$t('studentWeb.courseContent.baseInfo')" size="20" @click="showBasicInfo = true" />
+                    <Icon custom="iconfont icon-mingdan" :title="$t('studentWeb.courseContent.nameList')" size="20" @click="showStuList = true" />
+                    <!-- <Icon type="ios-paper-outline" :title="$t('studentWeb.courseContent.baseInfo')" size="20" @click="showBasicInfo = true" />
+                    <Icon type="ios-contacts-outline" :title="$t('studentWeb.courseContent.nameList')" size="20" @click="showStuList = true" /> -->
                 </span>
             </p>
             <!-- <h3 class="course-subject">國中/二年級/{{courseNow.courseSubject}}</h3> -->
@@ -396,7 +398,7 @@
                 </TabPane>
             </Tabs>
         </div>
-        <Modal v-model="showBasicInfo" :title="$t('studentWeb.courseContent.baseInfo')">
+        <Modal v-model="showBasicInfo" :title="$t('studentWeb.courseContent.baseInfo')" width="800">
             <p style="margin-bottom: 10px; font-weight: bold;">{{ $t("studentWeb.courseContent.classID") }}:{{ courseNow.no }}</p>
 
             <p style="margin-bottom: 10px; font-weight: bold;">{{ $t("studentWeb.courseContent.classTime") }}:{{ courseNow.classTime }}</p>
@@ -408,7 +410,7 @@
             <!-- <h4 class="basic-title">{{ $t("studentWeb.courseContent.co-teacher") }}</h4> -->
             <p style="margin-bottom: 10px; font-weight: bold;">{{ $t("studentWeb.courseContent.addedTime") }}:{{ courseNow.courseAddDate }}</p>
         </Modal>
-        <Modal v-model="showStuList" :title="$t('studentWeb.courseContent.nameList')">
+        <Modal v-model="showStuList" :title="$t('studentWeb.courseContent.nameList')" width="800">
             <div @click="changeGroupView()" :class="{ 'group-on': isChangeGroupView }" v-if="list === 'stuList'">
                 <svg-icon icon-class="group" class="group-btn" />
             </div>
@@ -698,6 +700,7 @@ export default {
                     // 临时课程
                     var personList = []
                     var list = res.courses
+                    var classIds = []
                     list.forEach(item => {
                         if(item.course) {
                             item.course.schedule.forEach((sch, sIn) => {
@@ -741,7 +744,7 @@ export default {
                                             personList.push(data)
                                         }
                                     }
-                                    
+                                    classIds.push(sch.stulist)
                                 }
                             })
                         }
@@ -749,6 +752,7 @@ export default {
                     this.fixList = fixList
                     this.personList = personList
                     this.getClassTime()
+                    this.getClassName(classIds)
                 }
             }).finally(()=>{
                 this.isLoad = false
@@ -776,13 +780,13 @@ export default {
                     }
                 })
                 // 拼接得到一个唯一的标识
-                data.unique = attribute + subject.course.no + sIndex + m
+                data.unique = attribute + subject.course.id + sIndex + m
             }
             // 没有时间的情况
             else {
                 data.timeId = 0
                 data.timeWeek = 0
-                data.unique = attribute + subject.course.no + sIndex
+                data.unique = attribute + subject.course.id + sIndex
             }
             data.roomName = schedule.roomName ? schedule.roomName : this.$t("studentWeb.courseContent.noRoom")
             data.teaName = schedule.teacherName ? schedule.teacherName : this.$t('studentWeb.courseContent.noTeacher')
@@ -854,6 +858,24 @@ export default {
                 }
             }
         },
+        getClassName(ids) {
+            // return new Promise((r, j) => {
+                this.$api.learnActivity.getClassNameByIds({ids}).then(res => {
+                    if(res.groups) {
+                        for (const item of this.personList) {
+                            item.className = ""
+                            let names = res.groups.filter(groups => {
+                                return groups.id === item.stuList
+                            })
+                            item.className = names ? names[0].name : ""
+                        }
+                        this.$forceUpdate()
+                    }
+                }).catch(e => {
+                    console.log(e);
+                })
+            // })
+        },
         // 点击单节课,显示基本信息
         /*  row:timeTable的某一个
             index:fixList/personList中的当前这一数据的下标
@@ -1010,6 +1032,9 @@ export default {
     }
 }
 
+.ivu-modal-body{
+    min-height: 420px !important;
+}
     
 /* iview样式修改 */
 .course-content {
@@ -1104,7 +1129,7 @@ export default {
     }
     
     .info-icon .ivu-icon{
-        font-weight: bold;
+        // font-weight: bold;
         margin-right: 10px;
         cursor: pointer;
     }

+ 1 - 1
TEAMModelOS/ClientApp/src/components/vote/BaseVoteForm.less

@@ -79,7 +79,7 @@
     }
 
     .ivu-form .btn-save {
-        width: 48%;
+        width: 100%;
         background: @primary-color;
         border: none;
         height: 38px;

+ 143 - 128
TEAMModelOS/ClientApp/src/components/vote/BaseVoteForm.vue

@@ -2,114 +2,118 @@
 	<div class="component-vote-form light-iview-form light-el-input">
 		<Form ref="voteForm" :model="voteForm" label-position="top" :rules="ruleValidate" :disabled="!voteFormEdit"
 			hide-required-mark>
-			<FormItem :label="$t('vote.form.name')" prop="name">
-				<Input v-special-char :class="!voteFormEdit ? 'vote-form-disabled':''" v-model="voteForm.name"
-					:placeholder="$t('vote.form.namePlace')"></Input>
-			</FormItem>
-			<FormItem :label="$t('vote.form.target')" prop="classes">
-				<!-- 预览状态 -->
-				<div v-if="!voteFormEdit && curVoteItem" class="vote-class">
-					<span v-for="item in classNameArr" class="vote-class-item">{{ item.name }}</span>
-				</div>
-				<!-- 编辑状态 -->
-				<div v-else>
-					<!-- 区级选学校 -->
-					<div v-if="isAreaVote">
-						<el-cascader size="small" :show-all-levels="false" clearable filterable v-model="schoolTarget"
-							:options="csOptions" :props="props" @change="treeChange" style="width:100%;">
-						</el-cascader>
-					</div>
-					<div v-else>
-						<!-- 校级选教研组或者学生名单 -->
-						<BaseClassSelect :classes="classTargets" :type="targetType" @onChange="onTargetChange"
-							ref="classSelectRef" v-if="getCurScope === 'school' && curVoteItem"></BaseClassSelect>
-						<BaseClassSelectPri :classes="classTargets" :scope="classType" @onChange="onTargetChange"
-							ref="classSelectRef" v-if="getCurScope === 'private' && curVoteItem"></BaseClassSelectPri>
-					</div>
-				</div>
-			</FormItem>
-			<FormItem :label="$t('learnActivity.createEv.publishType')" prop="publishModel" v-show="voteFormEdit && !isAreaVote">
-				<Checkbox v-model="isImmediate">{{$t('global.publishType1')}}</Checkbox>
-			</FormItem>
-			<FormItem :label="$t('learnActivity.createEv.startTime')" v-if="!isImmediate || !voteFormEdit"
-				prop="startTime">
-				<DatePicker v-show="voteFormEdit" type="datetime" :options="startOption" format="yyyy/MM/dd HH:mm"
-					v-model="voteForm.startTime" split-panels :placeholder="$t('learnActivity.createEv.sTimeHolder')"
-					style="width:100%" @on-change="onChangeSTime"></DatePicker>
-				<div v-show="!voteFormEdit" style="margin:10px;font-size:16px;font-weight:bold;">
-					{{ $tools.formatTime(voteForm.startTime,'yyyy-MM-dd hh:mm') }}
-				</div>
-			</FormItem>
-			<FormItem :label="$t('learnActivity.createEv.endTime')" prop="endTime">
-				<DatePicker v-show="voteFormEdit" type="datetime" :options="endOption" format="yyyy/MM/dd HH:mm"
-					v-model="voteForm.endTime" split-panels @on-change="onChangeEndTime"
-					:placeholder="$t('learnActivity.createEv.eTimeHolder')" style="width:100%"></DatePicker>
-				<div v-show="!voteFormEdit" style="margin:10px;font-size:16px;font-weight:bold;">
-					{{ $tools.formatTime(voteForm.endTime,'yyyy-MM-dd hh:mm') }}
-				</div>
-			</FormItem>
-
-			<FormItem :label="$t('vote.form.description')" prop="description">
-				<div ref="descriptionEditor" style="text-align:left" v-show="voteFormEdit"></div>
-				<div v-html="voteForm.description" v-show="!voteFormEdit"
-					style="margin:10px;font-size:16px;font-weight:bold;word-break: break-all;"></div>
-			</FormItem>
-
-			<FormItem :label="$t('vote.form.optionSetting')" prop="attachment" ref="optionsBox">
-				<div v-if="voteOptions.length">
-					<div v-for="(item,index) in voteOptions" :key="index" class="option-editor-wrap">
-						<div v-show="voteFormEdit" style="display: flex;">
-							<span class="option-order">{{ index + 1 }}
-								<Icon type="md-trash" @click="deleteOption(index)" />
-							</span>
-							<div :ref="'voteOption'+index" style="text-align:left" class="option-editor"
-								@click="optionClick(index)"></div>
+			<div style="display: flex;">
+				<div style="width: 48%;">
+					<FormItem :label="$t('vote.form.name')" prop="name">
+						<Input v-special-char :class="!voteFormEdit ? 'vote-form-disabled':''" v-model="voteForm.name"
+							:placeholder="$t('vote.form.namePlace')"></Input>
+					</FormItem>
+					<FormItem :label="$t('vote.form.target')" prop="classes">
+						<!-- 预览状态 -->
+						<div v-if="!voteFormEdit && curVoteItem" class="vote-class">
+							<span v-for="item in classNameArr" class="vote-class-item">{{ item.name }}</span>
 						</div>
-						<div v-show="!voteFormEdit">
-							<span style="margin-left: 10px;">{{ index + 1 }} .</span>
-							<div v-html="(voteOptionsContent[index]) ? voteOptionsContent[index].value : ''"
-								v-show="!voteFormEdit"
-								style="margin:10px;font-size:16px;font-weight:bold;display: inline-block;vertical-align: middle;">
+						<!-- 编辑状态 -->
+						<div v-else>
+							<!-- 区级选学校 -->
+							<div v-if="isAreaVote">
+								<el-cascader size="small" :show-all-levels="false" clearable filterable
+									v-model="schoolTarget" :options="csOptions" :props="props" @change="treeChange"
+									style="width:100%;">
+								</el-cascader>
+							</div>
+							<div v-else>
+								<!-- 校级选教研组或者学生名单 -->
+								<BaseClassSelect :classes="classTargets" :type="targetType" @onChange="onTargetChange"
+									ref="classSelectRef" v-if="getCurScope === 'school' && curVoteItem">
+								</BaseClassSelect>
+								<BaseClassSelectPri :classes="classTargets" :scope="classType"
+									@onChange="onTargetChange" ref="classSelectRef"
+									v-if="getCurScope === 'private' && curVoteItem"></BaseClassSelectPri>
 							</div>
 						</div>
-					</div>
+					</FormItem>
+					<FormItem :label="$t('learnActivity.createEv.publishType')" prop="publishModel"
+						v-show="voteFormEdit && !isAreaVote">
+						<Checkbox v-model="isImmediate">{{$t('global.publishType1')}}</Checkbox>
+					</FormItem>
+					<FormItem :label="$t('learnActivity.createEv.startTime')" v-if="!isImmediate || !voteFormEdit"
+						prop="startTime">
+						<DatePicker v-show="voteFormEdit" type="datetime" :options="startOption"
+							format="yyyy/MM/dd HH:mm" v-model="voteForm.startTime" split-panels
+							:placeholder="$t('learnActivity.createEv.sTimeHolder')" style="width:100%"
+							@on-change="onChangeSTime"></DatePicker>
+						<div v-show="!voteFormEdit" style="margin:10px;font-size:16px;font-weight:bold;">
+							{{ $tools.formatTime(voteForm.startTime,'yyyy-MM-dd hh:mm') }}
+						</div>
+					</FormItem>
+					<FormItem :label="$t('learnActivity.createEv.endTime')" prop="endTime">
+						<DatePicker v-show="voteFormEdit" type="datetime" :options="endOption" format="yyyy/MM/dd HH:mm"
+							v-model="voteForm.endTime" split-panels @on-change="onChangeEndTime"
+							:placeholder="$t('learnActivity.createEv.eTimeHolder')" style="width:100%"></DatePicker>
+						<div v-show="!voteFormEdit" style="margin:10px;font-size:16px;font-weight:bold;">
+							{{ $tools.formatTime(voteForm.endTime,'yyyy-MM-dd hh:mm') }}
+						</div>
+					</FormItem>
+					<FormItem :label="$t('vote.form.description')" prop="description">
+						<div ref="descriptionEditor" style="text-align:left" v-show="voteFormEdit"></div>
+						<div v-html="voteForm.description" v-show="!voteFormEdit"
+							style="margin:10px;font-size:16px;font-weight:bold;word-break: break-all;"></div>
+					</FormItem>
 				</div>
-
-				<p style="float:right;color:#757575;cursor:pointer" @click="onAddOption" v-show="voteFormEdit">
-					<Icon type="md-add" />{{ $t('vote.form.addOption') }}
-				</p>
-			</FormItem>
-
-			<FormItem :label="$t('vote.form.times')">
-				<Select v-model="voteForm.times" :class="!voteFormEdit ? 'vote-form-disabled':''">
-					<Option value="once">{{ $t('vote.form.once') }}</Option>
-					<Option value="day">{{ $t('vote.form.day') }}</Option>
-					<Option value="week">{{ $t('vote.form.week') }}</Option>
-					<Option value="month">{{ $t('vote.form.month') }}</Option>
-					<Option value="year">{{ $t('vote.form.year') }}</Option>
-				</Select>
-			</FormItem>
-
-			<FormItem :label="$t('vote.form.selectNum')" prop="selectMax">
-				<!--<Input :class="!voteFormEdit ? 'vote-form-disabled':''" v-model="voteForm.count" placeholder="请输入投票名称"></Input>-->
-				<InputNumber :min="1" v-model="voteForm.selectMax"></InputNumber>
-			</FormItem>
-
-			<FormItem :label="$t('vote.form.other')" prop="secret">
-				<CheckboxGroup v-model="voteForm.secret">
-					<Checkbox label="secret">{{ $t('vote.form.openSecret') }}</Checkbox>
-				</CheckboxGroup>
-				<CheckboxGroup v-model="voteForm.repeat" v-if="voteForm.selectMax > 1">
-					<Checkbox label="repeat">{{ $t('vote.form.openRepeat') }}</Checkbox>
-				</CheckboxGroup>
-			</FormItem>
-
-			<FormItem v-show="voteFormEdit">
-				<Button type="primary" class="btn-save" @click="handleSubmit('voteForm')"
-					:loading="isBtnLoading">{{ $t('vote.form.save') }}</Button>
-				<Button @click="handleCancel('voteForm')" class="btn-reset"
-					style="margin-left: 8px">{{ $t('vote.form.cancel') }}</Button>
-			</FormItem>
+				<div style="width: 48%;padding-left: 2%;margin-left:2%;border-left: 1px dashed #D2D2D2;">
+					<FormItem :label="$t('vote.form.optionSetting')" prop="attachment" ref="optionsBox">
+						<div v-if="voteOptions.length">
+							<div v-for="(item,index) in voteOptions" :key="index" class="option-editor-wrap">
+								<div v-show="voteFormEdit" style="display: flex;">
+									<span class="option-order">{{ index + 1 }}
+										<Icon type="md-trash" @click="deleteOption(index)" />
+									</span>
+									<div :ref="'voteOption'+index" style="text-align:left" class="option-editor"
+										@click="optionClick(index)"></div>
+								</div>
+								<div v-show="!voteFormEdit">
+									<span style="margin-left: 10px;">{{ index + 1 }} .</span>
+									<div v-html="(voteOptionsContent[index]) ? voteOptionsContent[index].value : ''"
+										v-show="!voteFormEdit"
+										style="margin:10px;font-size:16px;font-weight:bold;display: inline-block;vertical-align: middle;">
+								</div>
+									</div>
+							</div>
+						</div>
+						<p style="float:right;color:#757575;cursor:pointer" @click="onAddOption" v-show="voteFormEdit">
+							<Icon type="md-add" />{{ $t('vote.form.addOption') }}
+						</p>
+					</FormItem>
+					<FormItem :label="$t('vote.form.times')">
+						<Select v-model="voteForm.times" :class="!voteFormEdit ? 'vote-form-disabled':''">
+							<Option value="once">{{ $t('vote.form.once') }}</Option>
+							<Option value="day">{{ $t('vote.form.day') }}</Option>
+							<Option value="week">{{ $t('vote.form.week') }}</Option>
+							<Option value="month">{{ $t('vote.form.month') }}</Option>
+							<Option value="year">{{ $t('vote.form.year') }}</Option>
+						</Select>
+					</FormItem>
+					<FormItem :label="$t('vote.form.selectNum')" prop="selectMax">
+						<!--<Input :class="!voteFormEdit ? 'vote-form-disabled':''" v-model="voteForm.count" placeholder="请输入投票名称"></Input>-->
+						<InputNumber :min="1" v-model="voteForm.selectMax"></InputNumber>
+					</FormItem>
+					<FormItem :label="$t('vote.form.other')" prop="secret">
+						<CheckboxGroup v-model="voteForm.secret">
+							<Checkbox label="secret">{{ $t('vote.form.openSecret') }}</Checkbox>
+						</CheckboxGroup>
+						<CheckboxGroup v-model="voteForm.repeat" v-if="voteForm.selectMax > 1">
+							<Checkbox label="repeat">{{ $t('vote.form.openRepeat') }}</Checkbox>
+						</CheckboxGroup>
+					</FormItem>
+					<FormItem v-show="voteFormEdit">
+						<Button type="primary" class="btn-save" @click="handleSubmit('voteForm')"
+							:loading="isBtnLoading">{{ $t('vote.form.save') }}</Button>
+						<!-- <Button @click="handleCancel('voteForm')" class="btn-reset"
+							style="margin-left: 8px">{{ $t('vote.form.cancel') }}</Button> -->
+					</FormItem>
+				</div>
+			</div>
 		</Form>
 	</div>
 </template>
@@ -258,7 +262,7 @@
 									name: sItem.sname,
 									children: []
 								}
-								sItem.name.forEach((gItem,gIndex) => {
+								sItem.name.forEach((gItem, gIndex) => {
 									i.children.push({
 										id: sItem.sname + '-' + gItem,
 										name: sItem.sname + '-' + gItem,
@@ -307,10 +311,13 @@
 			/* 提交保存 */
 			async handleSubmit(name) {
 				this.isBtnLoading = true
-				let hasTargets = (!this.isAreaVote && this.voteForm.classes.length) || (this.isAreaVote && this.schoolTarget.length)
-				let optionComplete = this.voteOptionsContent.length && this.voteOptionsContent.every(i => i.value !== '')
+				let hasTargets = (!this.isAreaVote && this.voteForm.classes.length) || (this.isAreaVote && this
+					.schoolTarget.length)
+				let optionComplete = this.voteOptionsContent.length && this.voteOptionsContent.every(i => i.value !==
+					'')
 				this.$refs[name].validate(async (valid) => {
-					if (valid && this.getSimpleText(this.voteForm.description) && optionComplete && hasTargets) {
+					if (valid && this.getSimpleText(this.voteForm.description) && optionComplete &&
+						hasTargets) {
 						if (this.voteForm.selectMax > this.voteOptionsContent.length && this.voteForm
 							.repeat.indexOf('repeat') === -1) {
 							this.$Message.warning(this.$t('vote.optionMaxTip'))
@@ -322,7 +329,9 @@
 							console.log(this.voteForm)
 							let classSelectScope = this.isAreaVote ? 'school' : this.$refs.classSelectRef
 								.evaluationInfo.scope
-							let isSchoolClass = this.isAreaVote ? false : (this.$refs.classSelectRef.evaluationInfo.scope === 'school' && this.$refs.classSelectRef.privateClassType === 'school')
+							let isSchoolClass = this.isAreaVote ? false : (this.$refs.classSelectRef
+								.evaluationInfo.scope === 'school' && this.$refs.classSelectRef
+								.privateClassType === 'school')
 							let params = Object.assign({}, this.defaultParams)
 							let areaParams = null
 							let target = []
@@ -335,7 +344,8 @@
 							params.code = this.getCurCode
 							params.scope = isPersonal ? 'private' : 'school'
 							params.name = this.voteForm.name
-							params.startTime = !this.isImmediate ? new Date(this.voteForm.startTime).getTime() : -1
+							params.startTime = !this.isImmediate ? new Date(this.voteForm.startTime)
+								.getTime() : -1
 							params.endTime = new Date(this.voteForm.endTime).getTime()
 							params.description = this.voteForm.description
 							params.targets = this.voteForm.targets
@@ -348,7 +358,8 @@
 							params.creatorId = this.$store.state.userInfo.TEAMModelId
 							params.voteNum = this.voteForm.selectMax
 							params.times = this.voteForm.times
-							params.school = params.scope === 'school' ? this.$store.state.userInfo.schoolCode : null
+							params.school = params.scope === 'school' ? this.$store.state.userInfo
+								.schoolCode : null
 							params.tchLists = []
 							params.classes = []
 							params.stuLists = []
@@ -365,7 +376,7 @@
 										sId: i,
 										sName: this.schList.find(j => j.id === i).sname,
 										gName: [],
-										gId:[]
+										gId: []
 									})
 									// 如果是区级活动 需要拼接学校加教研组信息
 									this.schoolTarget.forEach(j => {
@@ -375,8 +386,10 @@
 												para[index].gName = []
 												para[index].gId = ['default']
 											} else {
-												let curSch = this.schList.find(sch => sch.id === i)
-												let groupId = curSch.gId[curSch.name.indexOf(groupName)]
+												let curSch = this.schList.find(sch => sch
+													.id === i)
+												let groupId = curSch.gId[curSch.name
+													.indexOf(groupName)]
 												para[index].gName.push(groupName)
 												para[index].gId.push(groupId)
 											}
@@ -392,7 +405,7 @@
 									"para": para,
 									"vote": params
 								}
-							}else{
+							} else {
 								// 如果是校本投票 则需要进一步确定发布对象是教研组还是学生名单
 								if (isSchool && this.$refs.classSelectRef.targetType === 'research') {
 									params.tchLists = this.voteForm.classes
@@ -405,7 +418,7 @@
 									params.targetType = 'student'
 								}
 							}
-							
+
 							let finalParams = this.isAreaVote ? areaParams : params
 							console.log('提交的投票对象', finalParams)
 							/* 保存BLOB以及COSMOS */
@@ -426,7 +439,7 @@
 							this.$Message.error(this.$t('vote.form.noOptionTip'))
 						} else if (!hasTargets) {
 							this.$Message.error(this.$t('vote.form.ruleClasses'))
-						} else if(!this.getSimpleText(this.voteForm.description)){
+						} else if (!this.getSimpleText(this.voteForm.description)) {
 							this.$Message.error(this.$t('homework.noDes'))
 						} else {
 							this.$Message.error(this.$t('vote.form.noCompleteTip'))
@@ -605,17 +618,19 @@
 				console.log('需要渲染的投票对象', item)
 				// await this.findResearchList()
 				// 如果是区级投票
-				if(this.isAreaVote){
+				if (this.isAreaVote) {
 					this.classNameArr = item.targets.map(i => {
 						return {
-							name:i
+							name: i
 						}
 					})
-				}else{
+				} else {
 					if (item.targetType === 'research') {
-						if(item.tchLists.includes('TeacherAll')){
-							this.classNameArr = [{ name:this.$t('vote.allTeacher') }]
-						}else{
+						if (item.tchLists.includes('TeacherAll')) {
+							this.classNameArr = [{
+								name: this.$t('vote.allTeacher')
+							}]
+						} else {
 							let groupNameArr = []
 							item.tchLists.forEach(i => {
 								let findObj = this.groupList.find(j => j.id === i)
@@ -630,10 +645,10 @@
 							.stuLists.length ? await this.getClassNameByIds(item.stuLists) : []
 					}
 				}
-				
+
 				console.log(this.classNameArr);
-				
-				
+
+
 				this.classType = item.classes.length ? 'school' : 'private'
 				this.classTargets = item.targetType === 'research' ? item.tchLists : this.getCurScope === 'school' ?
 					item.classes : item.targets
@@ -689,7 +704,7 @@
 			},
 			/* 查找学校检验组信息 */
 			findResearchList() {
-				return new Promise((r,j) => {
+				return new Promise((r, j) => {
 					this.$api.common.getActivityTarget({
 						tmdid: this.$store.state.userInfo.TEAMModelId,
 						schoolId: this.$store.state.userInfo.schoolCode,
@@ -699,7 +714,7 @@
 						r(200)
 					})
 				})
-				
+
 			},
 		},
 		mounted() {

+ 11 - 0
TEAMModelOS/ClientApp/src/locale/lang/en-US/researchCenter.js

@@ -1,4 +1,15 @@
 export default{
+	dashboard: {
+		title: '智慧校園大數據駕駛艙',
+		block1: '教學教研',
+		block2: '教室物聯',
+		block3: '德育評價',
+		block4: '學情分析',
+		comingSoon: '即將上線',
+		loading: '加載中',
+		quit: '退出',
+		title2: '教學大數據',
+	},
     // 播放视频
     video: {
         order: "次",

+ 2 - 1
TEAMModelOS/ClientApp/src/locale/lang/en-US/studentWeb.js

@@ -431,7 +431,8 @@ export default {
         inputSomething: 'Input comments and other suggestions',
         previous: 'Previous',
         next: 'Next',
-        submitBtn: 'Submit'
+        submitBtn: 'Submit',
+        recentComments: "最近評語",
     },
     exam: {
         info: {

+ 11 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/researchCenter.js

@@ -1,4 +1,15 @@
 export default{
+	dashboard:{
+		title:'智慧校园大数据驾驶舱',
+		block1:'教学教研',
+		block2:'教室物联',
+		block3:'德育评价',
+		block4:'学情分析',
+		comingSoon:'即将上线',
+		loading:'加载中',
+		quit:'退出',
+		title2:'教学大数据',
+	},
     // 播放视频
     video: {
         order: "次",

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

@@ -431,7 +431,8 @@ export default {
         inputSomething: '输入评语与其他建议',
         previous: '上一位',
         next: '下一位',
-        submitBtn: '送出'
+        submitBtn: '送出',
+        recentComments: "最近评语",
     },
     exam: {
         info: {

+ 21 - 10
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/researchCenter.js

@@ -1,10 +1,21 @@
-export default{
-    // 播放视频
-    video: {
-        order: "次",
-        part: "分",
-        scienceScore: "科技互動指數",
-        TScore: "教學應用",
-        noVideo: "暫沒有影片資源",
-    }
-}
+export default {
+	dashboard: {
+		title: '智慧校園大數據駕駛艙',
+		block1: '教學教研',
+		block2: '教室物聯',
+		block3: '德育評價',
+		block4: '學情分析',
+		comingSoon: '即將上線',
+		loading: '加載中',
+		quit: '退出',
+		title2: '教學大數據',
+	},
+	// 播放视频
+	video: {
+		order: "次",
+		part: "分",
+		scienceScore: "科技互動指數",
+		TScore: "教學應用",
+		noVideo: "暫沒有影片資源",
+	}
+}

+ 2 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/studentWeb.js

@@ -431,7 +431,8 @@ export default {
         inputSomething: '輸入評語與其他建議',
         previous: '上一位',
         next: '下一位',
-        submitBtn: '送出'
+        submitBtn: '送出',
+        recentComments: "最近評語",
     },
     exam: {
         info: {

+ 30 - 1
TEAMModelOS/ClientApp/src/view/assessment/Assessment.vue

@@ -323,7 +323,36 @@
 									className: 'train-header'
 								}
 							}, [
-								h('strong', '认证材料'),
+								h('div', [
+									h('strong', '认证材料'),
+									h('Tooltip', {
+										props: {
+											placement: 'right',
+											transfer: true,
+											theme: "light"
+										},
+									}, [h('Icon', {
+											props: {
+												type: 'ios-information-circle-outline',
+												color: '#17d9af'
+											},
+											style: {
+												marginLeft: '5px',
+												fontSize: '16px',
+												fontWeight: 'bolder',
+												cursor: 'pointer'
+											}
+										}),
+										h('span', {
+											slot: 'content',
+											style: {
+												whiteSpace: 'normal',
+												wordBreak: 'break-all'
+											}
+										}, '认证材料必须全部通过才能获得学时')
+									])
+													
+								]),
 								h('Button', {
 									props:{
 										size:'small',

+ 7 - 7
TEAMModelOS/ClientApp/src/view/dashboard/Index.vue

@@ -2,7 +2,7 @@
     <div class="dashboard-container">
         <p class="dashboard-title">
 			<!-- <dv-border-box-12>大数据驾驶舱</dv-border-box-12> -->
-			智慧校园大数据驾驶舱
+			{{ $t('researchCenter.dashboard.title') }}
 		</p>
 		<div class="dashboard-menu">
 			<div class="block-item" v-for="item in blocks" :index="item.name" @click="onSelect(item)">
@@ -17,27 +17,27 @@
 </template>
 <script>
 export default {
-    data() {
+    data(vm) {
         return {
 			blocks:[
 				{
 					icon:'iconfont icon-teacher-mgt',
-					name:'教学教研',
+					name:vm.$t('researchCenter.dashboard.block1'),
 					path:'researchDashboard',
 				},
 				{
 					icon:'iconfont icon-school',
-					name:'教室物联',
+					name:vm.$t('researchCenter.dashboard.block2'),
 					path:'research',
 				},
 				{
 					icon:'iconfont icon-study',
-					name:'德育评价',
+					name:vm.$t('researchCenter.dashboard.block3'),
 					path:'research',
 				},
 				{
 					icon:'iconfont icon-shujufenxi',
-					name:'学情分析',
+					name:vm.$t('researchCenter.dashboard.block4'),
 					path:'research',
 				}
 			]
@@ -48,7 +48,7 @@ export default {
 			if(item.path === 'researchDashboard'){
 				this.$router.push('/researchDashboard')
 			}else{
-				this.$Message.warning('即将上线')
+				this.$Message.warning(this.$t('researchCenter.dashboard.comingSoon'))
 			}
 		}
 	}

+ 4 - 4
TEAMModelOS/ClientApp/src/view/dashboard/Research.vue

@@ -1,12 +1,12 @@
 <template>
 	<div id="index" ref="appRef">
 		<div class="bg">
-			<dv-loading v-if="loading">加载中</dv-loading>
+			<dv-loading v-if="loading">{{ $t('researchCenter.dashboard.loading') }}</dv-loading>
 			<div v-else class="host-body">
 				<div class="tools">
-					<span class="time-text">{{ dateYear }}  <span style="display: inline-block; margin: 0 5px;color: #0fa2fe;">{{ dateDay }}</span>   {{ dateWeek }} </span>
+					<span class="time-text">{{ dateYear }}  <span style="display: inline-block; margin: 0 5px;color: #0fa2fe;">{{ dateDay }}</span>    </span>
 					<!-- <span type="iconfont icon-tuichuquanping" @click="goBack" color="#0fa2fe"/> -->
-					<span class="icon iconfont icon-tuichuquanping" style="font-size: 22px;" title="退出" @click="goBack"></span>
+					<span class="icon iconfont icon-tuichuquanping" style="font-size: 22px;" :title="$t('researchCenter.dashboard.quit')" @click="goBack"></span>
 					<!-- <span class="icon iconfont icon-tuichuquanping" @click="goBack" style="width: 20px;"></span> -->
 				</div>
 				<div class="school-info">
@@ -20,7 +20,7 @@
 					<div class="d-flex jc-center">
 						<dv-decoration-8 class="dv-dec-8" :color="['#568aea', '#000000']" />
 						<div class="title">
-							<span class="title-text">教研大数据</span>
+							<span class="title-text">{{ $t('researchCenter.dashboard.title2') }}</span>
 							<dv-decoration-6 class="dv-dec-6" :reverse="true" :color="['#50e3c2', '#67a1e5']" />
 						</div>
 						<dv-decoration-8 class="dv-dec-8" :reverse="true" :color="['#568aea', '#000000']" />

+ 8 - 5
TEAMModelOS/ClientApp/src/view/vote/ManageVote.vue

@@ -59,8 +59,7 @@
 					</div>
 				</div>
 				<div slot="right" class="demo-split-pane">
-					<Split v-model="split2">
-						<div slot="left" class="demo-split-pane" ref="voteFormBox">
+						<div class="demo-split-pane" ref="voteFormBox"  v-show="isAddActivity">
 							<!-- 投票基础信息展示 -->
 							<div class="hw-col hw-info-box">
 								<div class="hw-box-header">
@@ -85,7 +84,7 @@
 								</vuescroll>
 							</div>
 						</div>
-						<div slot="right" class="demo-split-pane">
+						<div class="demo-split-pane"  v-show="!isAddActivity">
 							<!-- 投票提交数据 -->
 							<div class="hw-col hw-data-box">
 								<div class="hw-box-header">
@@ -127,7 +126,6 @@
 								</div>
 							</div>
 						</div>
-					</Split>
 				</div>
 			</Split>
 		</div>
@@ -175,6 +173,7 @@
 		},
 		data() {
 			return {
+				isAddActivity:false,
 				editTime:null,
 				editTimeStatus:false,
 				editNameStatus:false,
@@ -356,6 +355,7 @@
 					this.activeVoteIndex = 0;
 					this.editable = true
 					this.hasNewAdd = true
+					this.isAddActivity = true
 					this.$refs.voteForm.voteFormEdit = true
 					this.$refs.voteForm.classTargets = []
 					this.$EventBus.$emit('onCreateVote')
@@ -517,6 +517,7 @@
 					);
 					this.hasNewAdd = false
 					this.isOptionView = true
+					this.isAddActivity = false
 				}
 			},
 			
@@ -654,7 +655,7 @@
 
 			/* 取消编辑投票(无ID状态) */
 			onCancelVote() {
-				this.voteList.splice(this.voteList.indexOf(this.currentVote), 1)
+				// this.voteList.splice(this.voteList.indexOf(this.currentVote), 1)
 				if (this.voteList.length > 0) {
 					this.onVoteClick(this.voteList[0], 0)
 				} else {
@@ -718,6 +719,7 @@
 									let newIndex = this.activeVoteIndex === this.voteList.length - 1 ? (this.activeVoteIndex - 1) : this.activeVoteIndex
 									this.voteList.splice(this.activeVoteIndex, 1)
 									this.activeVoteIndex = newIndex
+									this.isAddActivity = false
 									if (this.voteList.length) this.onVoteClick(this.voteList[newIndex], newIndex, false)
 									setTimeout(() => {
 										this.isLoading = false
@@ -908,6 +910,7 @@
 				//this.addHwModal = false
 				this.handleTabClick(this.$route.name === 'manageVote' ? 0 : 1)
 				this.hasNewAdd = false
+				this.isAddActivity = false
 			},
 			
 			/* 获取当前教师的所有个人课程以及学校分配的课程 */

+ 47 - 43
TEAMModelOS/Controllers/Analysis/ClassAnalysisController.cs

@@ -97,15 +97,22 @@ namespace TEAMModelOS.Controllers.Analysis
                     var subs = records.GroupBy(x => x.subjectId).Select(y => new { key = y.Key, count = y.ToList().Count }).ToList();
 
                     List<string> groupIds = new List<string>();
+                    List<(string name, int count)> groc = new List<(string name, int count)>();
                     foreach (var item in groups)
                     {
-                        groupIds.Add(item.name);
+                        List<GroupListGrp>  grps  = await GroupListService.GetMemberInGroupList(_coreAPIHttpService, client, _dingDing, item.name,1, code.GetString(), new List<string> { "research" });
+                        //groupIds.Add(item.name);
+                        //List<(string name, int count)> groc = new List<(string name, int count)>();
+                        foreach (var grp in grps) {
+                            groc.Add((grp.name,item.count));
+                        }
                     }
+                    //var gyc  =  groc.GroupBy(x => x.name).Select(y => new {name = y.Key, count = y.Sum(c => c.count) });
                     //var gs = sc.period.Where(s => s.id == pId.GetString()).Select(x => x.grades);
                     (List<RMember> tchList, List<RGroupList> classLists) = await GroupListService.GetStutmdidListids(_coreAPIHttpService, client, _dingDing, groupIds, code.GetString(), null);
                     var total = rc.Select(x => new { x.name, value = x.count });
                     var trend = tpc.Select(x => new { name = x.week, value = x.count });
-                    var classify_group = groups.Select(x => new { name = classLists.Where(c => c.id == x.name).Select(y => y.name), value = x.count });
+                    var classify_group = groc.GroupBy(x => x.name).Select(y => new { name = y.Key, value = y.Sum(c => c.count) });
                     var classify_grade = grades.Select(x => new { x.name, value = x.count });
                     var classify_type = types.Select(x => new { x.name, value = x.count });
                     var classify_sub = subs.Select(x => new { name = x.key, value = x.count });
@@ -212,19 +219,21 @@ namespace TEAMModelOS.Controllers.Analysis
                 //if (!requert.TryGetProperty("periodId", out JsonElement pId)) return BadRequest();
                 long st = 0;
                 long et = 0;
-                try {
+                try
+                {
                     stime.TryGetInt64(out st);
                     etime.TryGetInt64(out et);
                 }
-                catch (Exception e) {
+                catch (Exception e)
+                {
                     //await _dingDing.SendBotMsg($"OS,{_option.Location},analysis/analysisRecordTeacher()\n{e.Message}{e.StackTrace}", GroupNames.成都开发測試群組);
                 }
-                
+
                 /*if (null != stime.GetString() && null != etime.GetString()) {
                      st = stime.GetInt64();
                      et = etime.GetInt64();
                 }*/
-                
+
                 //获取当前学期所有的课程记录
                 List<LessonRecord> records = new List<LessonRecord>();
                 var client = _azureCosmos.GetCosmosClient();
@@ -267,20 +276,14 @@ namespace TEAMModelOS.Controllers.Analysis
         {
             List<string> groupIds = new();
             List<(string name, int count)> grCount = new();
-            foreach (var record in records)
-            {
-                foreach (string gId in record.groupIds)
-                {
-                    if (!groupIds.Contains(gId))
-                    {
-                        groupIds.Add(gId);
-                    }
-                }
-            }
-            foreach (var groupId in groupIds)
+            var subs = records.GroupBy(x => x.tmdid).Select(y => new { key = y.Key, count = y.ToList().Count }).ToList();
+            /*foreach (var groupId in groupIds)
             {
                 var c = records.Where(r => r.groupIds.Contains(groupId)).Count();
                 grCount.Add((groupId, c));
+            }*/
+            foreach (var gr in subs) {
+                grCount.Add((gr.key, gr.count));
             }
             return grCount;
         }
@@ -384,7 +387,8 @@ namespace TEAMModelOS.Controllers.Analysis
                     var pmatrix = DenseMatrix.OfColumns(p);
                     var ptmatrix = DenseMatrix.OfColumns(pt);
                     //开学第一周周内开课                   
-                    if (dayOfweek == 0) {
+                    if (dayOfweek == 0)
+                    {
                         dayOfweek = 7;
                     }
                     //补齐第一周
@@ -411,14 +415,15 @@ namespace TEAMModelOS.Controllers.Analysis
                                 sday += dd;
                                 wks.Add((i, new List<double>() { bsum, tsum, psum, ptsum }));
                             }
-                            else {
+                            else
+                            {
                                 var bsum = bmatrix.SubMatrix(sday - 1, 7, 0, bmatrix.ColumnCount).ColumnSums().Sum();
                                 var tsum = tmatrix.SubMatrix(sday - 1, 7, 0, tmatrix.ColumnCount).ColumnSums().Sum();
                                 var psum = pmatrix.SubMatrix(sday - 1, 7, 0, pmatrix.ColumnCount).ColumnSums().Sum();
                                 var ptsum = ptmatrix.SubMatrix(sday - 1, 7, 0, ptmatrix.ColumnCount).ColumnSums().Sum();
                                 sday += 7;
                                 wks.Add((i, new List<double>() { bsum, tsum, psum, ptsum }));
-                            }                                                      
+                            }
                         }
                     }
                     if (rweeks > 0)
@@ -477,7 +482,7 @@ namespace TEAMModelOS.Controllers.Analysis
                                 if (eweeks > 0)
                                 {
                                     for (int i = 1; i <= eweeks; i++)
-                                    {                                        
+                                    {
                                         var newbsum = tbmatrix.SubMatrix(day, 7, 0, tbmatrix.ColumnCount).ColumnSums().Sum();
                                         var newtsum = ttmatrix.SubMatrix(day, 7, 0, ttmatrix.ColumnCount).ColumnSums().Sum();
                                         var newpsum = tpmatrix.SubMatrix(day, 7, 0, tpmatrix.ColumnCount).ColumnSums().Sum();
@@ -581,11 +586,13 @@ namespace TEAMModelOS.Controllers.Analysis
                 {
                     begin.Add(lesson.beginCount);
                 }
-                var matrix = DenseMatrix.OfColumns(begin);             
+                var matrix = DenseMatrix.OfColumns(begin);
                 //求本周
                 int sday = (int)DateTimeOffset.UtcNow.DayOfWeek;
                 //本月
                 var tmonth = DateTimeOffset.UtcNow.Day;
+                //求本学期
+                var sdays = DateTimeOffset.FromUnixTimeMilliseconds(stime).DayOfYear;
                 if (tyear > syear)
                 {
                     //今日
@@ -608,28 +615,14 @@ namespace TEAMModelOS.Controllers.Analysis
                         var pysum = matrix.SubMatrix(pydays - (sday - tday) - 1, sday - tday + 1, 0, matrix.ColumnCount).ColumnSums().Sum();
                         counts.Add(("week", tsum + pysum));
                     }
-                    else {
+                    else
+                    {
                         var subDay = dense.SubMatrix(tday - sday - 1, sday + 1, 0, dense.ColumnCount).ColumnSums().Sum();
                         counts.Add(("week", subDay));
                     }
                     var subMonth = dense.SubMatrix(tday - tmonth - 1, tmonth + 1, 0, dense.ColumnCount).ColumnSums().Sum();
                     counts.Add(("month", subMonth));
-                }
-                else
-                {
-                    //今日
-                    double tcounts = matrix.Row(tday - 1).Sum();
-                    counts.Add(("today", tcounts));
-                    var subDay = matrix.SubMatrix(tday - sday - 1, sday + 1, 0, matrix.ColumnCount).ColumnSums().Sum();
-                    counts.Add(("week", subDay));
-                    var subMonth = matrix.SubMatrix(tday - tmonth - 1, tmonth + 1, 0, matrix.ColumnCount).ColumnSums().Sum();
-                    counts.Add(("month", subMonth));
-                }               
-                //求本学期
-                var sdays = DateTimeOffset.FromUnixTimeMilliseconds(stime).DayOfYear;
-                //var edays = DateTimeOffset.FromUnixTimeMilliseconds(etime).DayOfYear;
-                if (tday - sdays < 0)
-                {
+
                     //var tmatrix = DenseMatrix.OfColumns(scount.beginCount);
                     //跨年后开始到本学期结束
                     double endMonth = 0;
@@ -642,13 +635,24 @@ namespace TEAMModelOS.Controllers.Analysis
                 }
                 else
                 {
+                    //今日
+                    double tcounts = matrix.Row(tday - 1).Sum();
+                    counts.Add(("today", tcounts));
+                    var subDay = matrix.SubMatrix(tday - sday - 1, sday + 1, 0, matrix.ColumnCount).ColumnSums().Sum();
+                    counts.Add(("week", subDay));
+                    var subMonth = matrix.SubMatrix(tday - tmonth - 1, tmonth + 1, 0, matrix.ColumnCount).ColumnSums().Sum();
+                    counts.Add(("month", subMonth));
                     var allMonth = matrix.SubMatrix(sdays - 1, tday - sdays + 1, 0, matrix.ColumnCount).ColumnSums().Sum();
                     counts.Add(("semester", allMonth));
                 }
-               /* //本月
-                var tmonth = DateTimeOffset.UtcNow.Day;
-                var subMonth = matrix.SubMatrix(tmonth - 1, tmonth + 1, 0, matrix.ColumnCount).ColumnSums().Sum();
-                counts.Add(("month", subMonth));*/
+                //求本学期
+                //var sdays = DateTimeOffset.FromUnixTimeMilliseconds(stime).DayOfYear;
+                //var edays = DateTimeOffset.FromUnixTimeMilliseconds(etime).DayOfYear;
+
+                /* //本月
+                 var tmonth = DateTimeOffset.UtcNow.Day;
+                 var subMonth = matrix.SubMatrix(tmonth - 1, tmonth + 1, 0, matrix.ColumnCount).ColumnSums().Sum();
+                 counts.Add(("month", subMonth));*/
                 //求今年
                 var subYear = matrix.SubMatrix(0, tdays, 0, matrix.ColumnCount).ColumnSums().Sum();
 

+ 1 - 1
TEAMModelOS/Controllers/Common/HomeworkController.cs

@@ -269,7 +269,7 @@ namespace TEAMModelOS.Controllers.Learn
                     }
                 };
                 List<Homework> homeworks = new List<Homework>();
-                var query = $"select c.owner, c.id,c.name,c.code,c.startTime,c.endTime,c.progress,c.classes,c.scope,c.school from c where (c.status<>404 or IS_DEFINED(c.status) = false ) and   c.createTime >= {stimestamp} and c.createTime <= {etimestamp}  {progresssql } and c.ttl=-1 ";
+                var query = $"select c.owner, c.id,c.name,c.code,c.startTime,c.endTime,c.progress,c.classes,c.scope,c.school,c.mustSubmit from c where (c.status<>404 or IS_DEFINED(c.status) = false ) and   c.createTime >= {stimestamp} and c.createTime <= {etimestamp}  {progresssql } and c.ttl=-1 ";
                 if (string.IsNullOrEmpty(school))
                 {
                     query = $"{query} and c.scope='private' ";