瀏覽代碼

Merge branch 'develop' into PL/develop-BI

Li 2 年之前
父節點
當前提交
2f2116fe12
共有 49 個文件被更改,包括 44934 次插入813 次删除
  1. 1 1
      TEAMModelBI/ClientApp/package.json
  2. 8 4
      TEAMModelBI/ClientApp/src/api/index.js
  3. 6 0
      TEAMModelBI/ClientApp/src/router/index.js
  4. 25 7
      TEAMModelBI/ClientApp/src/view/areaServe/areamanage.vue
  5. 12 8
      TEAMModelBI/ClientApp/src/view/common/aside.vue
  6. 11 8
      TEAMModelBI/ClientApp/src/view/created/created.vue
  7. 6 6
      TEAMModelBI/ClientApp/src/view/index/index.vue
  8. 2 2
      TEAMModelBI/ClientApp/src/view/index/operateLog.vue
  9. 42850 0
      TEAMModelBI/ClientApp/src/view/index/test.json
  10. 167 0
      TEAMModelBI/ClientApp/src/view/index/test.vue
  11. 1 1
      TEAMModelBI/ClientApp/src/view/participation/copy.vue
  12. 199 49
      TEAMModelBI/ClientApp/src/view/participation/index.vue
  13. 3 3
      TEAMModelBI/ClientApp/src/view/participation/paper.vue
  14. 399 192
      TEAMModelBI/ClientApp/src/view/schoolServe/school.vue
  15. 19 4
      TEAMModelBI/ClientApp/src/view/schoolServe/setSchooladmin.vue
  16. 11 10
      TEAMModelBI/ClientApp/src/view/schoolServe/setschool.vue
  17. 8 6
      TEAMModelBI/ClientApp/src/view/schoolmanage/schoolManege.vue
  18. 359 8
      TEAMModelBI/ClientApp/src/view/systemConfig/pushmsg/createdpush.vue
  19. 3 3
      TEAMModelBI/ClientApp/src/view/systemConfig/pushmsg/index.vue
  20. 16 4
      TEAMModelBI/ClientApp/src/view/systemConfig/setAdmin.vue
  21. 14 7
      TEAMModelBI/ClientApp/src/view/teachermanage/manage.vue
  22. 1 1
      TEAMModelBI/Controllers/Census/SchoolController.cs
  23. 2 2
      TEAMModelOS.FunctionV4/ServiceBus/ActiveTaskTopic.cs
  24. 1 1
      TEAMModelOS.SDK/DI/CoreAPI/CoreAPIHttpService.cs
  25. 3 0
      TEAMModelOS/ClientApp/public/lang/en-US.js
  26. 3 0
      TEAMModelOS/ClientApp/public/lang/zh-CN.js
  27. 3 0
      TEAMModelOS/ClientApp/public/lang/zh-TW.js
  28. 1 1
      TEAMModelOS/ClientApp/src/api/http.js
  29. 8 0
      TEAMModelOS/ClientApp/src/api/schoolSetting.js
  30. 7 2
      TEAMModelOS/ClientApp/src/common/AbilityUpload.vue
  31. 48 0
      TEAMModelOS/ClientApp/src/common/BaseNotification.vue
  32. 4 0
      TEAMModelOS/ClientApp/src/common/BaseUpload.vue
  33. 4 4
      TEAMModelOS/ClientApp/src/components/research-dashboard/BaseTechBar.vue
  34. 4 3
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperViewBox/LessonTestReport.vue
  35. 24 10
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperViewBox/PaperTest.vue
  36. 1 0
      TEAMModelOS/ClientApp/src/view/Home.vue
  37. 1 1
      TEAMModelOS/ClientApp/src/view/classrecord/eventchart/PopQues.vue
  38. 2 1
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseImport.vue
  39. 434 432
      TEAMModelOS/ClientApp/src/view/login/page/Teacher.vue
  40. 44 1
      TEAMModelOS/ClientApp/src/view/settings/SchoolMgmt.vue
  41. 45 8
      TEAMModelOS/Controllers/OpenApi/Business/BizOverallEducationController.cs
  42. 97 11
      TEAMModelOS/Controllers/System/CoreController.cs
  43. 50 1
      TEAMModelOS/Controllers/Teacher/InitController.cs
  44. 17 7
      TEAMModelOS/Controllers/Third/Sc/ScDataPushController.cs
  45. 1 1
      TEAMModelOS/Controllers/XTest/FixDataController.cs
  46. 2 0
      TEAMModelOS/Lang/en-us.json
  47. 2 0
      TEAMModelOS/Lang/zh-cn.json
  48. 2 0
      TEAMModelOS/Lang/zh-tw.json
  49. 3 3
      TEAMModelOS/TEAMModelOS.csproj

+ 1 - 1
TEAMModelBI/ClientApp/package.json

@@ -20,7 +20,7 @@
         "echarts": "^5.2.2",
         "echarts-liquidfill": "^3.1.0",
         "el-plus-powerful-table-ts": "^1.0.5",
-        "element-plus": "^1.1.0-beta.24",
+        "element-plus": "^2.2.22",
         "elui-china-area-dht": "^1.0.4",
         "file-saver": "^2.0.5",
         "jwt-decode": "^3.1.2",

+ 8 - 4
TEAMModelBI/ClientApp/src/api/index.js

@@ -53,7 +53,7 @@ export default {
     setisAdmin(data) {
         return post('/tabledd/set-backend', data)
     },
-    //同步某个人员信息
+    //同步某个人员信息  已完善 V2.0
     updateAlone(data) {
         return post('/tabledd/set-usettmdinfo', data)
     },
@@ -163,11 +163,15 @@ export default {
     getSchooldata(data) {
         return post('/batchschool/get-schoolsinfo', data)
     },
+    //获取所有学校信息 V2.0
+    getSchool(data) {
+        return post('/school/get-scinfos', data)
+    },
     //进入学校管理,获取所有顾问列表(目前是说去  研发中心B)(也可替代其他 组织架构,一层人员的获取。)
     getAllassist(data) {
         return post('/dd/get-tmdandddusers', data)
     },
-    //对学校编辑提交更改 ***   Headers[x-auth-authtoken]   接口已对接
+    //对学校编辑提交更改 ***   Headers[x-auth-authtoken]   接口已对接  已完善V2.0
     updateSchoolinfo(data) {
         return post('/batchschool/upd-schoolassist', data)
     },
@@ -494,10 +498,10 @@ export default {
 
     //创建学校 BB验证数据,以及BB搜索学校信息
     verifyDatainbb(data) {
-        return post('https://bb-rc.teammodel.net/ies5/search-cs-school', data)
+        return post('https://bb.teammodel.cn/ies5/search-cs-school', data)
     },
     //创建学校成功,数据回传BB
     successBack(data) {
-        return post('https://bb-rc.teammodel.net/ies5/create-cs-school', data)
+        return post('https://bb.teammodel.net/ies5/create-cs-school ', data)
     }
 }

+ 6 - 0
TEAMModelBI/ClientApp/src/router/index.js

@@ -11,6 +11,12 @@ const routes = [{
         roles: "all",
         component: () => require.ensure([], (require) => require(`@/view/login.vue`))
     },
+    {
+        path: "/test",
+        name: "test",
+        roles: "all",
+        component: () => require.ensure([], (require) => require(`@/view/index/test.vue`))
+    },
     // {
     //     path: "/dashboard",
     //     name: "dashboard",

+ 25 - 7
TEAMModelBI/ClientApp/src/view/areaServe/areamanage.vue

@@ -11,14 +11,14 @@
         <div class="select-box-items">
           <div class="province-box">
             <!-- <span>{{$t('areaManages.selector.provinceName')}}:</span> -->
-            <el-select v-model="provinceOptions.provinceValue" :placeholder="$t('areaManages.selector.provinceDefault')" @change="areaSelctChange(provinceOptions.provinceValue, 'province')" size="small">
+            <el-select v-model="provinceOptions.provinceValue" :placeholder="$t('areaManages.selector.provinceDefault')" @change="areaSelctChange(provinceOptions.provinceValue, 'province')">
               <el-option v-for="item in provinceOptions.optionInfo" :key="item.code" :label="item.name" :value="item.name">
               </el-option>
             </el-select>
           </div>
           <div class="city-box">
             <!-- <span>{{$t('areaManages.selector.cityName')}}:</span> -->
-            <el-select v-model="cityOptions.cityValue" :placeholder="$t('areaManages.selector.cityDefault')" @change="areaSelctChange(cityOptions.cityValue, 'city')" size="small">
+            <el-select v-model="cityOptions.cityValue" :placeholder="$t('areaManages.selector.cityDefault')" @change="areaSelctChange(cityOptions.cityValue, 'city')">
               <el-option v-for="item in cityOptions.cityInfo" :key="item.code" :label="item.name" :value="item.name">
               </el-option>
             </el-select>
@@ -30,7 +30,7 @@
           </div>
         </div>
         <div class="areasearch-box">
-          <el-input v-model="areaValues" placeholder="搜索 学区名称" class="input-with-select" size="small" clearable>
+          <el-input v-model="areaValues" placeholder="搜索 学区名称" class="input-with-select" clearable>
             <template #prepend>
               <svg class="addrelevancy-icon" aria-hidden="true">
                 <use xlink:href="#icon-sousuo3-copy"></use>
@@ -61,7 +61,7 @@
                     </div>
                     <span class="text">{{$t(`areaManages.found.creation`)}}</span>
                 </a> -->
-        <el-button size="small" color="#81ecec" type="primary" @click="createArea">
+        <el-button type="primary" @click="createArea">
           <svg class="created-icon" aria-hidden="true">
             <use xlink:href="#icon-chuangjiandizhisuoyin"></use>
           </svg>
@@ -112,7 +112,7 @@
                 <div class="haveSchool-title">
                   <div>{{ $t(`areaManages.operational.areaAddSchool.schooltitle`) }}</div>
                   <div class="search-school">
-                    <el-input v-model="schoolSeach" placeholder="输入学校名称搜索" size="small" clearable>
+                    <el-input v-model="schoolSeach" placeholder="输入学校名称搜索" clearable>
                       <!-- <template #prepend>
                         <svg class="addrelevancy-icon" aria-hidden="true">
                           <use xlink:href="#icon-sousuo3-copy"></use>
@@ -291,7 +291,7 @@
                         <div class="hint"><span>请输入用户</span><span class="emphasize">手机号、醍摩豆账号</span><span>等相关信息进行搜索</span></div>
                         <div class="search-box">
                           <!-- <input class="search-txt" type="text" id="serachname" :value="filterText" placeholder="搜索相关人名" @oninput="personnelSearch()" @compositionend="personnelSearch()"> -->
-                          <el-input v-model="adminfilter" placeholder="Please input" class="search-txt" />
+                          <el-input v-model="adminfilter" placeholder="" class="search-txt" />
                           <svg class="serachbox-empty" aria-hidden="true" v-if="adminfilter !==''" @click="adminfilter=''">
                             <use xlink:href="#icon-qingkong"></use>
                           </svg>
@@ -303,7 +303,7 @@
                           <p>未搜索到相关用户信息,请检验后重新输入搜索</p>
                         </div>
                         <div class="submitbtn">
-                          <el-button type="primary" size="small" @click=serachPersonnel(adminfilter) class="anewbox-btn blue">搜索人员</el-button>
+                          <el-button type="primary" @click=serachPersonnel(adminfilter) class="anewbox-btn blue">搜索人员</el-button>
                         </div>
                       </div>
                       <div class="admin-text-box" v-else-if="searchState ===true">
@@ -2400,6 +2400,24 @@ export default {
   width: 55%;
   border-radius: 50%;
 }
+.schoolLeft .search-school .el-input__wrapper {
+  width: 100%;
+}
+.search-box .el-input__wrapper {
+  width: 100%;
+  padding: 0px;
+  /* background: #bdc3c7; */
+  background: transparent;
+  box-shadow: 0px 0px 0px 0px transparent;
+}
+.search-box .el-input__wrapper .is-focues {
+  border: 0px;
+  box-shadow: 0px 0px 0px 0px transparent;
+}
+.search-box .el-input__wrapper:hover {
+  border: 0px;
+  box-shadow: 0px 0px 0px 0px transparent;
+}
 @media screen and (max-width: 2600px) {
   .select-box-items {
     width: 25%;

+ 12 - 8
TEAMModelBI/ClientApp/src/view/common/aside.vue

@@ -117,14 +117,14 @@ export default {
             isShow: true,
             sort: 5,
           },
-          // {
-          //   name: '消息推送',
-          //   router: '/home/pushmsg',
-          //   icon: '#icon-xiaoxi',
-          //   permission: [],
-          //   isShow: true,
-          //   sort: 6,
-          // },
+          {
+            name: '消息推送',
+            router: '/home/pushmsg',
+            icon: '#icon-xiaoxi',
+            permission: [],
+            isShow: true,
+            sort: 6,
+          },
         ],
       },
       {
@@ -599,6 +599,10 @@ body > .el-container {
 #asidebox .el-menu-item {
   padding: 0px 20px !important;
 }
+#asidebox .el-menu-item,
+#asidebox .el-sub-menu__title {
+  display: block;
+}
 #asidebox .indexse {
   letter-spacing: 14px;
 }

+ 11 - 8
TEAMModelBI/ClientApp/src/view/created/created.vue

@@ -17,9 +17,9 @@
             <el-form-item label="学区名称" class="special" prop="areaname.value">
               <div class="areanames">
                 <!-- <el-input v-model="formArea.areaname.value" disabled
-                            :placeholder="$t(`areaManages.createdArea.namehint`)"
+                            :placeholder="$t(`areaManages.createdArea.namehint`)"  
                             v-show="formArea.areaname.state == false" size="medium" /> -->
-                <el-input v-model="formArea.areaname.value" size="medium" placeholder="创建学区名称" />
+                <el-input v-model="formArea.areaname.value" placeholder="创建学区名称" />
               </div>
               <!-- <div class="areanames-btn">
                         <el-button type="primary" icon="el-icon-edit"
@@ -40,9 +40,9 @@
             <el-form-item :label="$t(`areaManages.createdArea.project`)" class="capacity-box">
               <el-select v-model="formArea.capacityvalue" :placeholder="$t(`areaManages.createdArea.projecthint`)">
                 <el-option v-for="item in formArea.options" :key="item.id" :label="item.name + '——' + item.standardName" :value="item.id">
-                  <el-tag class="reminder" effect="dark" style="float: left" size="small" v-if="item.id ==='02944f32-f534-3397-ea56-e6f1fc6c3714' || item.id==='69e3d413-50a1-4f5e-844a-e0f7c9622ea3'">标准</el-tag>
-                  <el-tag class="reminder" type="info" effect="dark" style="float: left" size="small" v-else-if="(item.id !=='02944f32-f534-3397-ea56-e6f1fc6c3714' || item.id !=='69e3d413-50a1-4f5e-844a-e0f7c9622ea3') && item.id !=='bde5c011-2ae4-461a-b46c-5483ba72ae45'">普通</el-tag>
-                  <el-tag class="reminder" type="success" effect="dark" style="float: left" size="small" v-else-if="item.id ==='bde5c011-2ae4-461a-b46c-5483ba72ae45'">完整</el-tag>
+                  <el-tag class="reminder" effect="dark" style="float: left" v-if="item.id ==='02944f32-f534-3397-ea56-e6f1fc6c3714' || item.id==='69e3d413-50a1-4f5e-844a-e0f7c9622ea3'">标准</el-tag>
+                  <el-tag class="reminder" type="info" effect="dark" style="float: left" v-else-if="(item.id !=='02944f32-f534-3397-ea56-e6f1fc6c3714' || item.id !=='69e3d413-50a1-4f5e-844a-e0f7c9622ea3') && item.id !=='bde5c011-2ae4-461a-b46c-5483ba72ae45'">普通</el-tag>
+                  <el-tag class="reminder" type="success" effect="dark" style="float: left" v-else-if="item.id ==='bde5c011-2ae4-461a-b46c-5483ba72ae45'">完整</el-tag>
                   <span>{{ item.name}}</span>——<span>{{item.standardName}}</span>
                 </el-option>
               </el-select>
@@ -133,13 +133,13 @@
   <div class="schoolbox" v-else-if="model == 'schollC'">
     <div class="batchCreation">
       <!-- <el-upload class="upload-demo" :before-upload="handleBeforeUpload" :on-exceed="handleExceed"> -->
-      <el-button size="small" type="primary" icon="el-icon-document-add" @click="batchDialogState = true">
+      <el-button type="primary" @click="batchDialogState = true">
         {{ $t(`schoolManages.createSchools.batch`) }}</el-button>
       <!-- </el-upload> -->
       <!-- <button class="created-btninfo">批量创校</button> -->
     </div>
     <div class="backs">
-      <el-button size="small" @click="closeandreturn('close', 'school')">返回</el-button>
+      <el-button @click="closeandreturn('close', 'school')">返回</el-button>
     </div>
     <div class="schoolListbox" v-loading="loadingSchool" :element-loading-text="loadingTexts">
       <div class="school-libox" v-for="(item, index) in schoolForm">
@@ -247,7 +247,7 @@
       </div>
       <!--查询BB数据-->
       <div class="searchbox">
-        <el-input v-model="searchSchoolvalue" placeholder="搜索学校名称/简码 检验是否重复" size="small" @focus="searchboxState=true">
+        <el-input v-model="searchSchoolvalue" placeholder="搜索学校名称/简码 检验是否重复" @focus="searchboxState=true">
           <template #prefix>
             <el-icon class="el-input__icon">
               <search />
@@ -2186,6 +2186,9 @@ export default {
   margin-top: 5px;
   margin-right: 5px;
 }
+.institutionbox {
+  width: 100%;
+}
 </style>
 <style>
 .areabox .el-form {

+ 6 - 6
TEAMModelBI/ClientApp/src/view/index/index.vue

@@ -2327,12 +2327,12 @@ export default {
           let basicsData = []; let standardData = []; let majorData = [];
           //基础版
           schoolList.forEach((x) => {
-            x.scale === 0 && x.size <= 100 ? basicsData.push(x) : ''
+            x.scale === 0 && x.size < 300 ? basicsData.push(x) : ''
             // x.scale === 500 && x.hard === 0 && x.serial === 0 && x.service === 0 ? standardData.push(x) : ''
             // x.scale === 500 && (x.hard !== 0 || x.serial !== 0 || x.service !== 0) ? majorData.push(x) : ''
             // ((x.scale ===300 && x.size === 500) || (x.size >100)) && (!x.service.includes('YMPCVCIM') && !x.service.includes('VLY6J6N6') && !x.service.includes('VABAJ6NV') ) ? standardData.push(x):''
             // ((x.scale === 300 && x.size === 500) || (x.size >100)) ? standardData.push(x):''
-            x.scale === 300 && x.size === 500 ? standardData.push(x) : x.size > 100 && (!x.service.includes('YMPCVCIM') && !x.service.includes('VLY6J6N6') && !x.service.includes('VABAJ6NV')) ? standardData.push(x) : ''
+            x.scale >= 500 && x.size >= 300 ? standardData.push(x) : x.size > 100 && (!x.service.includes('YMPCVCIM') && !x.service.includes('VLY6J6N6') && !x.service.includes('VABAJ6NV')) ? standardData.push(x) : ''
             x.service.includes('YMPCVCIM') || x.service.includes('VLY6J6N6') || x.service.includes('VABAJ6NV') ? majorData.push(x) : ''
           })
           console.log(basicsData, standardData, majorData, 7777777)
@@ -3250,12 +3250,12 @@ export default {
   background: url("../../assets/img/bg-index.jpg") no-repeat;
   background-size: 100% 100%;
   position: relative;
-  height: 100%;
+  /* height: 100%; */
 }
 .statisticsbox,
 .statisticsbox-all {
-  /* width: 100%;
-  height: 100%; */
+  width: 100%;
+  height: 100%;
   padding: 0% 0%;
   line-height: 20px;
   position: relative;
@@ -4055,7 +4055,7 @@ export default {
   padding-right: 0px;
   height: 30px;
   line-height: 30px;
-  background-color: #dfe6e9;
+  /* background-color: #dfe6e9; */
   border: 0px;
 }
 /*处理header 切换*/

+ 2 - 2
TEAMModelBI/ClientApp/src/view/index/operateLog.vue

@@ -28,7 +28,7 @@
         </div>
       </div>
       <div class="exportFile">
-        <el-button type="primary" size="small" @click="exportExcel">{{$t(`log.export`)}}</el-button>
+        <el-button type="primary" @click="exportExcel">{{$t(`log.export`)}}</el-button>
       </div>
       <div class="block" v-if="models==='time'">
         <div class="block-title"><span class="demonstration">日期:</span></div>
@@ -87,7 +87,7 @@
         <el-table-column property="convertTime" :label="$t(`log.tables.time`)" sortable :sort-by="['time']" align="center" />
         <el-table-column label="" align="center">
           <template #default="scope">
-            <el-button type="primary" size="small" @click.prevent="details(scope.$index, scope.row)" plain>{{$t(`log.tables.details`)}}</el-button>
+            <el-button type="primary" @click.prevent="details(scope.$index, scope.row)" plain>{{$t(`log.tables.details`)}}</el-button>
           </template>
         </el-table-column>
       </el-table>

File diff suppressed because it is too large
+ 42850 - 0
TEAMModelBI/ClientApp/src/view/index/test.json


+ 167 - 0
TEAMModelBI/ClientApp/src/view/index/test.vue

@@ -0,0 +1,167 @@
+<template>
+  <div class="">
+    <div style="width: 100%; height: 600px">
+      <el-auto-resizer>
+        <template #default="{ height, width }">
+          <el-table-v2 :columns="columns" :data="tableData" :width="width" :height="height" :row-class="tableRowClassName" :sort-by="sortState" @column-sort="onSort" fixed />
+        </template>
+      </el-auto-resizer>
+    </div>
+    <!-- <div style="margin-top: 10px">
+      共
+      <el-link type="primary" style="font-size: 20px">{{
+        tableData.length
+      }}</el-link>
+      条数据
+    </div> -->
+  </div>
+</template>
+<script setup>
+import { ref, h } from "vue";
+import { ElMessageBox, ElMessage, ElButton, ElTag, ElCheckbox, TableV2SortOrder } from "element-plus";
+// import { request } from "../../api/request";
+import testJson from './test.json'
+import { Delete } from '@element-plus/icons-vue'
+//方式二
+// const ElButton = resolveComponent("ElButton");
+// const ElTag = resolveComponent("ElTag");
+const tableData = ref([]);
+//获取表格数据(mockjs生成)的方法
+// const getApiData = () => {
+//   setTimeout(tableData.value = testJson.schoolAssists, 5000)
+// };
+setTimeout(function () { tableData.value = testJson.schoolAssists }, 5000);
+// getApiData();
+//columns 是一个数组,里面的值为每一列的配置信息
+const columns = [
+  {
+    cellRenderer: (data) =>
+      h(
+        ElCheckbox,
+        // { onClick: () => handleDelete(data), type: "danger", icon: "Delete" },
+        { default: () => "" }
+      ),
+    width: 200,//当前列的宽度,必须设置
+    fixed: true,//是否固定列
+    align: 'center',
+  },
+  {
+    key: "id",
+    dataKey: "id",//需要渲染当前列的数据字段,如{id:9527,name:'Mike'},则填id
+    title: "id",//显示在单元格表头的文本
+    width: 200,//当前列的宽度,必须设置
+    fixed: false,//是否固定列
+    align: 'center',
+    sortable: true,
+  },
+  {
+    key: "name",
+    dataKey: "name",//需要渲染当前列的数据字段,如{id:9527,name:'Mike'},则填name
+    title: "姓名",
+    width: 200,
+    fixed: false,
+  },
+  {
+    key: "id_number",
+    dataKey: "id_number",
+    title: "证件号码",
+    width: 280,
+  },
+  {
+    key: "department",
+    dataKey: "department",
+    title: "部门",
+    minWidth: 100,
+    width: 110,
+  },
+  {
+    key: "position",
+    dataKey: "position",
+    title: "职位",
+    width: 140,
+  },
+  {
+    key: "grade",
+    dataKey: "grade",
+    title: "等级",
+    width: 120,
+  },
+  {
+    key: "serial",
+    dataKey: "serial",
+    title: "发放状态",
+    width: 80,
+    cellRenderer: (data) => (
+      <>
+        <div title="学情分析"><svg class="listicon" aria-hidden="true" v-show={data.rowData.serial.length > 0 ? true : false}><use xlink:href="#icon-tongjifenxi">{{ data }}</use></svg></div>
+      </>
+    ),
+  },
+  {
+    key: "handle",
+    title: "操作",
+    width: 100,
+    align: "center",
+    cellRenderer: (data) =>
+      h(
+        ElButton,
+        { onClick: () => handleDelete(data), type: "danger", icon: Delete, size: "small" },
+        { default: () => "删除" }
+      ),
+  },
+];
+//自定义渲染带状态的表格(每隔一行显示不同的背景色)
+// const tableRowClassName = ({ row, rowIndex }) => {
+//   let step = 4;
+//   for (let i in tableData.value) {
+//     if (rowIndex === step * i - 3) {
+//       return "warning-row";
+//     }
+//     if (rowIndex === step * i - 1) {
+//       return "success-row";
+//     }
+//   }
+//   return "";
+// };
+// //删除操作
+// const handleDelete = (data) => {
+//   console.log(data, '数据')
+//   ElMessageBox.confirm(`确定删除 ${data.rowData.name}?`, "提 示", {
+//     confirmButtonText: "确定",
+//     cancelButtonText: "取消",
+//     type: "warning",
+//   })
+//     .then(() => {
+//       tableData.value.splice(data.rowIndex, 1);
+//       ElMessage({
+//         type: "success",
+//         message: "删除成功",
+//       });
+//     })
+//     .catch(() => {
+//       ElMessage({
+//         type: "info",
+//         message: "取消删除",
+//       });
+//     });
+// };
+// const sortState = ref({
+//   key: 'id',
+//   order: TableV2SortOrder.ASC,
+// })
+// const onSort = (sortBy) => {
+//   console.log(sortBy)
+//   tableData.value = tableData.value.reverse()
+//   sortState.value = sortBy
+// }
+</script>
+<style >
+.listicon {
+  width: 1.8em;
+  height: 1.8em;
+  vertical-align: -0.6em;
+  fill: currentColor;
+  overflow: hidden;
+  margin-left: 8px;
+}
+</style>

+ 1 - 1
TEAMModelBI/ClientApp/src/view/participation/copy.vue

@@ -60,7 +60,7 @@
   </div>
 </template>
 <script setup>
-import { ref, getCurrentInstance, defineProps, watch, defineExpose, onMounted, } from 'vue'
+import { ref, getCurrentInstance, watch, onMounted, } from 'vue'
 import { ElMessageBox, ElMessage } from 'element-plus'
 import jwt_decode from 'jwt-decode'
 import { Document } from '@element-plus/icons-vue'

+ 199 - 49
TEAMModelBI/ClientApp/src/view/participation/index.vue

@@ -9,19 +9,19 @@
         </el-select>
       </div> -->
       <div class="province-box">
-        <el-select v-model="provinceOptions.provinceValue" :placeholder="$t(`areaManages.selector.provinceDefault`)" @change="areaSelctChange(provinceOptions.provinceValue, 'province')" size="small">
+        <el-select v-model="provinceOptions.provinceValue" :placeholder="$t(`areaManages.selector.provinceDefault`)" @change="areaSelctChange(provinceOptions.provinceValue, 'province')">
           <el-option v-for="item in provinceOptions.optionInfo" :key="item.code" :label="item.name" :value="item.name">
           </el-option>
         </el-select>
       </div>
       <div class="city-box">
-        <el-select v-model="cityOptions.cityValue" :placeholder="$t(`areaManages.selector.cityDefault`)" @change="areaSelctChange(cityOptions.cityValue, 'city')" size="small">
+        <el-select v-model="cityOptions.cityValue" :placeholder="$t(`areaManages.selector.cityDefault`)" @change="areaSelctChange(cityOptions.cityValue, 'city')">
           <el-option v-for="item in cityOptions.cityInfo" :key="item.code" :label="item.name" :value="item.name">
           </el-option>
         </el-select>
       </div>
       <div class="dist-box">
-        <el-select v-model="distOptions.distValue" filterable allow-create default-first-option :placeholder="$t(`areaManages.selector.areaDefault`)" @change="areaSelctChange(distOptions.distValue, 'dist')" size="small">
+        <el-select v-model="distOptions.distValue" filterable allow-create default-first-option :placeholder="$t(`areaManages.selector.areaDefault`)" @change="areaSelctChange(distOptions.distValue, 'dist')">
           <el-option v-for="item in distOptions.distInfo" :key="item.code" :label="item.name" :value="item.name">
           </el-option>
         </el-select>
@@ -40,8 +40,11 @@
                 创建学校
             </el-button>
         </div> -->
-    <div class="school-list">
-      <el-table :data="tableData" id="tableExclusive" style="width: 100%" height="75vh" v-loading="loading" element-loading-text="加载中..." empty-text="暂无相关数据">
+    <div class="boxselect">
+      <div class="schoolNums"><span>学校数量:</span><span>{{tablesccnt}}</span></div>
+    </div>
+    <div class="school-list" style="width: 96%; height: 74vh" v-loading="loading" element-loading-text="加载中...">
+      <!-- <el-table :data="tableData" id="tableExclusive" style="width: 100%" height="75vh" v-loading="loading" element-loading-text="加载中..." empty-text="暂无相关数据">
         <el-table-column prop="index" :label="$t(`schoolManages.tables.serialnum`)" type="index" sortable align="center" />
         <el-table-column :label="$t(`schoolManages.tables.badge`)" width="150" align="center">
           <template #default="scope">
@@ -50,18 +53,8 @@
           </template>
         </el-table-column>
         <el-table-column prop="name" :label="$t(`schoolManages.tables.name`)" sortable align="center" />
-        <!-- <el-table-column label="学段" width="150" align="center">
-                    <template #default="scope">
-                        <span>{{scope.row.period[0].name}}</span>
-                    </template>
-                </el-table-column> -->
         <el-table-column :label="$t(`schoolManages.tables.scale`)" class="school-table-edition" align="center">
           <template #default="scope">
-            <!-- <el-image style="width: 80px; height: 80px" :src="imgData.basics" fit="fill" v-if="scope.row.scale === 0"></el-image>
-            <el-image style="width: 80px; height: 80px" :src="imgData.standard" fit="fill" v-else-if="scope.row.scale === 500 && scope.row.hard.length === 0 && scope.row.serial.length === 0 && scope.row.service.length === 0">
-            </el-image>
-            <el-image style="width: 80px; height: 80px" :src="imgData.specialty" fit="fill" v-else-if="scope.row.scale === 500 && (scope.row.hard.length != 0 || scope.row.serial.length != 0 || scope.row.service.length != 0)">
-            </el-image> -->
             <div class="scalebox">
               <p class="scalebox-content basic" v-if="scope.row.scale === 0 && scope.row.size <=100">
                 基础版
@@ -88,8 +81,6 @@
           </template>
         </el-table-column>
         <el-table-column prop="location" label="位置" align="center" />
-        <!-- <el-table-column prop="city" :label="$t(`schoolManages.tables.city`)" align="center" />
-                <el-table-column prop="dist" :label="$t(`schoolManages.tables.area`)" align="center" /> -->
         <el-table-column prop="size" :label="$t(`schoolManages.tables.spacesize`)" align="center" />
         <el-table-column :label="$t(`schoolManages.tables.assis`)" align="center">
           <template #default="scope">
@@ -117,17 +108,20 @@
             </div>
           </template>
         </el-table-column>
-        <!-- <el-table-column prop="state" label="状态" width="110" align="center" /> -->
         <el-table-column :label="$t(`schoolManages.tables.operate`)" align="center">
           <template #default="scope">
-            <el-button type="primary" size="small" @click.prevent="deleteRow(scope.$index, scope.row)" v-if="userPower.roles.includes('sales')">
+            <el-button type="primary" @click.prevent="deleteRow(scope.$index, scope.row)" v-if="userPower.roles.includes('sales')">
               查看</el-button>
-            <!-- <el-button type="danger" size="small" @click="removeSchool(scope.row,scope.$index)">删除</el-button> -->
-            <el-button type="primary" size="small" @click.prevent="deleteRow(scope.$index, scope.row)" v-else>
+            <el-button type="primary" @click.prevent="deleteRow(scope.$index, scope.row)" v-else>
               {{ $t(`schoolManages.tables.operatecontent`) }}</el-button>
           </template>
         </el-table-column>
-      </el-table>
+      </el-table> -->
+      <el-auto-resizer>
+        <template #default="{ height, width }">
+          <el-table-v2 :columns="columns" :data="tableData" :width="width" :height="height" :estimated-row-height="40" :sort-by="sortState" @column-sort="onSort" fixed />
+        </template>
+      </el-auto-resizer>
     </div>
   </div>
   <!--学校列表end-->
@@ -140,7 +134,7 @@
         </svg>
         <span class="changebtn-title">{{ $t(`schoolManages.gradSet.save`) }}</span>
       </el-button>
-      <el-button type="primary" size="small" @click="schoolClose">
+      <el-button type="primary" @click="schoolClose">
         <svg class="back-icon" aria-hidden="true">
           <use xlink:href="#icon-fanhui"></use>
         </svg>
@@ -259,11 +253,11 @@
   <!--编辑学校页面end-->
 </template>
 <script>
-import { reactive, ref, getCurrentInstance, onMounted, watch } from 'vue'
+import { reactive, ref, getCurrentInstance, onMounted, watch, h } from 'vue'
 import option_cn from '@/static/regions/region_cn.json'
 import option_gl from '@/static/regions/region_gl.json'
 import { useStore } from 'vuex'
-import { ElMessage, ElLoading, ElMessageBox } from 'element-plus'
+import { ElMessage, ElLoading, ElMessageBox, TableV2SortOrder, ElCheckbox } from 'element-plus'
 import { useRouter } from 'vue-router'
 import jwt_decode from 'jwt-decode'
 import SetSchool from './setPhase.vue'
@@ -373,6 +367,7 @@ export default {
       { id: 5, name: '卷卡合一阅卷系统', icon: '#icon-pingtai_kaoshi', key: 'VABAJ6NV' },
       { id: 6, name: '教研中心模组', icon: '#icon-jiaoyan', key: 'VLY6J6N6' },
     ])
+    let tablesccnt = ref(0)
     provinceOptions.value.optionInfo = optionsData
     console.log(store.state.point)
     //下拉加载
@@ -387,14 +382,157 @@ export default {
       distCode: '',
     })
     let timer = ref()
+    const columns = [
+      // {
+      //   cellRenderer: (data) =>
+      //     h(
+      //       ElCheckbox,
+      //       // { onClick: () => handleDelete(data), type: "danger", icon: "Delete" },
+      //       { onChange: () => selectChange(data.rowData) },
+      //       { default: () => "" }
+      //     ),
+      //   width: 100,//当前列的宽度,必须设置
+      //   align: 'center',
+      // },
+      {
+        // key: "name",
+        // dataKey: "name",//需要渲染当前列的数据字段,如{id:9527,name:'Mike'},则填name
+        title: "校徽",
+        width: 200,
+        fixed: false,
+        align: 'center',
+        cellRenderer: (data) => (
+          <>
+            <el-image style="width: 55px; height: 55px;margin:5px" src={data.rowData.picture} fit="contain" v-show={data.rowData.picture ? true : false}></el-image>
+            <div style=" width: 55px;height: 55px;line-height: 55px;text-align: center;background-color: #bdc3c7;font-size: 10px;color: #ecf0f1;margin:5px;" v-show={!data.rowData.picture ? true : false}>暂无图片</div>
+          </>
+        )
+      },
+      {
+        key: "name",
+        dataKey: "name",//需要渲染当前列的数据字段,如{id:9527,name:'Mike'},则填name
+        title: "名称",
+        width: 200,
+        fixed: false,
+        align: 'center',
+      },
+      {
+        // key: "name",
+        // dataKey: "name",//需要渲染当前列的数据字段,如{id:9527,name:'Mike'},则填name
+        title: "规模版本",
+        width: 100,
+        fixed: false,
+        align: 'center',
+        // sortable: true,
+        cellRenderer: (data) => (
+          <>
+            <div style="color:#409EFF" v-show={data.rowData.scale === 0 && (data.rowData.size < 100 || data.rowData.size == 100) ? true : false}>基础版</div>
+            <div style="color:#67C23A" v-show={(data.rowData.scale === 300 && data.rowData.size === 500) || (data.rowData.size > 100 && (!data.rowData.service.includes('YMPCVCIM') && !data.rowData.service.includes('VLY6J6N6') && !data.rowData.service.includes('VABAJ6NV'))) ? true : false}>标准版</div>
+            <div style="color: #e6a23c;" v-show={data.rowData.service.includes('YMPCVCIM') || data.rowData.service.includes('VLY6J6N6') || data.rowData.service.includes('VABAJ6NV') ? true : false}>专业版</div>
+          </>
+        ),
+      },
+      {
+        key: "id",
+        dataKey: "id",//需要渲染当前列的数据字段,如{id:9527,name:'Mike'},则填id
+        title: "学校简码",//显示在单元格表头的文本
+        width: 150,//当前列的宽度,必须设置
+        align: 'center',
+      },
+      {
+        key: "location",
+        dataKey: "location",
+        title: "位置",
+        align: 'center',
+        width: 200,
+      },
+      {
+        key: "size",
+        dataKey: "size",
+        title: "空间大小",
+        width: 170,
+        align: 'center',
+        sortable: true,
+      },
+      // {
+      //   key: "assisName",
+      //   dataKey: "assisName",
+      //   title: "关联管家",
+      //   align: 'center',
+      //   width: 150,
+      // },
+      {
+        key: "serial",
+        dataKey: "serial",
+        title: "模组情况",
+        align: 'center',
+        width: 200,
+        cellRenderer: (data) => (
+          <>
+            <div title="学情分析" v-show={data.rowData.service.includes('YMPCVCIM') ? true : false}>
+              <svg style=" width: 1.8em;height: 1.8em;vertical-align: -0.5em;fill: currentColor;overflow: hidden;cursor: pointer;" aria-hidden="true" ><use xlink:href="#icon-tongjifenxi"></use></svg>
+            </div>
+            <div title="智慧学校管理服务" v-show={data.rowData.service.includes('IPDYZYLC') ? true : false}>
+              <svg style=" width: 1.8em;height: 1.8em;vertical-align: -0.5em;fill: currentColor;overflow: hidden;cursor: pointer;" aria-hidden="true" ><use xlink:href="#icon-zhihuixiaoyuan"></use></svg>
+            </div>
+            <div title="A Class ONE 智慧学伴" v-show={data.rowData.service.includes('3CLYJ6NP') ? true : false}>
+              <svg style=" width: 1.8em;height: 1.8em;vertical-align: -0.5em;fill: currentColor;overflow: hidden;cursor: pointer;" aria-hidden="true" ><use xlink:href="#icon-jxuexiao2"></use></svg>
+            </div>
+            <div title="数据存储服务空间" v-show={data.rowData.service.includes('IPALJ6NY') ? true : false}>
+              <svg style=" width: 1.8em;height: 1.8em;vertical-align: -0.5em;fill: currentColor;overflow: hidden;cursor: pointer;" aria-hidden="true" ><use xlink:href="#icon-yuncunchu"></use></svg>
+            </div>
+            <div title="卷卡合一阅卷系统" v-show={data.rowData.service.includes('VABAJ6NV') ? true : false}>
+              <svg style=" width: 1.8em;height: 1.8em;vertical-align: -0.5em;fill: currentColor;overflow: hidden;cursor: pointer;" aria-hidden="true" ><use xlink:href="#icon-pingtai_kaoshi"></use></svg>
+            </div>
+            <div title="教研中心模组" v-show={data.rowData.service.includes('VLY6J6N6') ? true : false}>
+              <svg style=" width: 1.8em;height: 1.8em;vertical-align: -0.5em;fill: currentColor;overflow: hidden;cursor: pointer;" aria-hidden="true" ><use xlink:href="#icon-jiaoyan"></use></svg>
+            </div>
+          </>
+        ),
+      },
+      {
+        key: "areaName",
+        dataKey: "areaName",
+        title: "所属学区",
+        width: 150,
+        align: 'center',
+      },
+      {
+        title: '数据统计',
+        width: 100,
+        cellRenderer: (data) => (
+          <>
+            <div title="查看学校相应分析">
+              <svg style=" width: 1.8em;height: 1.8em;vertical-align: -0.5em;fill: currentColor;overflow: hidden;cursor: pointer;" aria-hidden="true" ><use xlink:href="#icon-shujufenxi"></use></svg>
+            </div>
+          </>
+        )
+      },
+      {
+        key: "handle",
+        title: "操作",
+        width: 150,
+        align: "center",
+        // fixed: 'right',
+        cellRenderer: (data) =>
+        (
+          <>
+            <el-button type="primary" onClick={deleteRow.bind(this, data.rowData)} v-show={userVerify.roles.includes('admin') ? true : false}>编辑</el-button>
+            <el-button type="primary" onClick={deleteRow.bind(data.rowData)} v-show={userVerify.roles.includes('leader') ? true : false}>查看</el-button>
+            <el-button type="danger" onClick={removeSchool.bind(this, data.rowData)} v-show={userVerify.roles.includes('admin') ? true : false}>删除</el-button>
+          </>
+        ),
+      },
+    ];
+    let userVerify = jwt_decode(JSON.parse(localStorage.getItem('id_token')))
     //学校详情 
     let detailsSchool = ref()
     onMounted(() => {
       //监听表格滚动事件
       // let table = mutipleTable.value._value.layout.table.refs.bodyWrapper;
-      let table = document.getElementById('tableExclusive')
-      console.log(table, '查看是否获取到')
-      table.addEventListener("scroll", (res) => { loadmore(res) }, true);
+      // let table = document.getElementById('tableExclusive')
+      // console.log(table, '查看是否获取到')
+      // table.addEventListener("scroll", (res) => { loadmore(res) }, true);
     })
     const loadmore = (res) => {
       if (res.target.scrollTop && ((res.target.scrollHeight - 20) <= (res.target.scrollTop + res.target.clientHeight))) {
@@ -416,30 +554,32 @@ export default {
         roleA = user.roles[0]
       }
       let data = roleA === 'admin' || roleA === 'leader' ? {} : { tmdId: JSON.parse(localStorage.getItem('userData')).tmdId, role: roleA }
-      proxy.$api.getSchooldata(data).then((res) => {
-        console.log(res, '获取学校列表assist')
+      proxy.$api.getSchool(data).then((res) => {
+        console.log(res, '获取学校列表assistV2')
         //处理关联管家  拼内容
         // res.schoolAssists.splice(3)
-        for (let i in res.schoolAssists) {
-          res.schoolAssists[i].serviceData = []
-          if (res.schoolAssists[i].assists) {
-            res.schoolAssists[i].assisName = ''
-            res.schoolAssists[i].location = res.schoolAssists[i].dist !== null ? res.schoolAssists[i].province + res.schoolAssists[i].city + res.schoolAssists[i].dist : res.schoolAssists[i].province + res.schoolAssists[i].city
-            let datas = res.schoolAssists[i].assists
+        //处理关联管家  拼内容
+        for (let i in res.scInfos) {
+          res.scInfos[i].serviceData = []
+          res.scInfos[i].location = res.scInfos[i].dist !== null ? res.scInfos[i].province + res.scInfos[i].city + res.scInfos[i].dist : res.scInfos[i].province + res.scInfos[i].city
+          if (res.scInfos[i].assists) {
+            res.scInfos[i].assisName = ''
+            let datas = res.scInfos[i].assists
             for (let y in datas) {
-              res.schoolAssists[i].assisName = res.schoolAssists[i].assisName + datas[y].tmdName + ','
+              res.scInfos[i].assisName = res.scInfos[i].assisName + datas[y].name + ','
             }
           }
-          if (res.schoolAssists[i].service.length > 0) {
-            res.schoolAssists[i].service.forEach((x) => {
+          if (res.scInfos[i].service && res.scInfos[i].service.length > 0) {
+            res.scInfos[i].service.forEach((x) => {
               for (let m in patternIcon.value) {
-                patternIcon.value[m].key === x ? res.schoolAssists[i].serviceData.push(patternIcon.value[m]) : ''
+                patternIcon.value[m].key === x ? res.scInfos[i].serviceData.push(patternIcon.value[m]) : ''
               }
             })
           }
         }
         console.log(res)
-        res.state == 200 ? (tableData.value.push(...res.schoolAssists), (originalData.value = res.schoolAssists), (loading.value = false), tableNexttoken.value = res.continuationToken) : ''
+        res.state == 200 ? (tableData.value = [], originalData.value = [], tableData.value.push(...res.scInfos), (originalData.value = res.scInfos), tablesccnt.value = res.allCnt) : ''
+        loading.value = false
       })
     }
     //点击学校列表,详情
@@ -665,12 +805,14 @@ export default {
         areaId: nowPitchdata.value.areaId,
       }
       console.log(updateForm, '学校信息')
-      proxy.$api.updateSchoolinfo(updateForm).then((res) => {
-        console.log(res, '修改学校的返回')
-        res.state === 200
-          ? (ElMessage.success(proxy.$t(`commonMsg.schoolUpdateSuccess`), schoolClose()), updateSuccess())
-          : ElMessage.error(proxy.$t(`commonMsg.schoolUpdateError`))
-      })
+      console.log(nowPitchdata.value, '原本的学校信息')
+      console.log(assistData, '顾问信息')
+      // proxy.$api.updateSchoolinfo(updateForm).then((res) => {
+      //   console.log(res, '修改学校的返回')
+      //   res.state === 200
+      //     ? (ElMessage.success(proxy.$t(`commonMsg.schoolUpdateSuccess`), schoolClose()), updateSuccess())
+      //     : ElMessage.error(proxy.$t(`commonMsg.schoolUpdateError`))
+      // })
     }
     //学校加入区域或者修改
     async function schoolJoinarea () {
@@ -830,7 +972,7 @@ export default {
       })
       setTimeout(function () { loading.value = false }, 800);
     }
-    watch(scrollHeight, (newdata) => {
+    watch(scrollHeight, (newdata, olddata) => {
       if (newdata < olddata) {
         scrollHeight.value < 0 ? debounce(datascroll, 500) : ''
       }
@@ -887,7 +1029,10 @@ export default {
       tableNexttoken,
       selectValue,
       userPower,
-      detailsSchool
+      detailsSchool,
+      tablesccnt,
+      columns,
+      userVerify
     }
   },
 }
@@ -1197,6 +1342,11 @@ export default {
   font-size: 12px;
   margin-left: 1%;
 }
+.schoolNums {
+  margin-right: 30px;
+  font-size: 14px;
+  color: #636e72;
+}
 @media screen and (max-width: 1920px) {
   .school-form-size {
     width: 65% !important;

+ 3 - 3
TEAMModelBI/ClientApp/src/view/participation/paper.vue

@@ -12,7 +12,7 @@
         </div>
         <div class="header-info-operate">
           <div>
-            <el-button type="primary" size="small" @click="backDefault">
+            <el-button type="primary" @click="backDefault">
               <el-icon>
                 <Back />
               </el-icon>
@@ -20,7 +20,7 @@
             </el-button>
           </div>
           <div>
-            <el-button type="primary" size="small" @click="allUnfold">
+            <el-button type="primary" @click="allUnfold">
               <svg class="unfoldicons" aria-hidden="true">
                 <use :xlink:href="unfoldAll.icon"></use>
               </svg>
@@ -28,7 +28,7 @@
             </el-button>
           </div>
           <div v-if="userShow.roles.includes('admin') || userShow.roles.includes('assist')">
-            <el-button type="primary" size="small" @click="copyPapers">
+            <el-button type="primary" @click="copyPapers">
               <el-icon>
                 <DocumentCopy />
               </el-icon>

+ 399 - 192
TEAMModelBI/ClientApp/src/view/schoolServe/school.vue

@@ -10,21 +10,21 @@
       </div> -->
       <div class="province-box">
         <!-- <span>{{$t(`areaManages.selector.provinceName`)}}:</span> -->
-        <el-select v-model="provinceOptions.provinceValue" :placeholder="$t(`areaManages.selector.provinceDefault`)" @change="areaSelctChange(provinceOptions.provinceValue, 'province')" size="small">
+        <el-select v-model="provinceOptions.provinceValue" :placeholder="$t(`areaManages.selector.provinceDefault`)" @change="areaSelctChange(provinceOptions.provinceValue, 'province')">
           <el-option v-for="item in provinceOptions.optionInfo" :key="item.code" :label="item.name" :value="item.name">
           </el-option>
         </el-select>
       </div>
       <div class="city-box">
         <!-- <span>{{$t(`areaManages.selector.cityName`)}}:</span> -->
-        <el-select v-model="cityOptions.cityValue" :placeholder="$t(`areaManages.selector.cityDefault`)" @change="areaSelctChange(cityOptions.cityValue, 'city')" size="small" no-data-text="请筛选 省级 列表">
+        <el-select v-model="cityOptions.cityValue" :placeholder="$t(`areaManages.selector.cityDefault`)" @change="areaSelctChange(cityOptions.cityValue, 'city')" no-data-text="请筛选 省级 列表">
           <el-option v-for="item in cityOptions.cityInfo" :key="item.code" :label="item.name" :value="item.name">
           </el-option>
         </el-select>
       </div>
       <div class="dist-box">
         <!-- <span>{{$t(`areaManages.selector.areaName`)}}:</span> -->
-        <el-select v-model="distOptions.distValue" filterable allow-create default-first-option :placeholder="$t(`areaManages.selector.areaDefault`)" @change="areaSelctChange(distOptions.distValue, 'dist')" size="small" no-data-text="请筛选 市/县 列表">
+        <el-select v-model="distOptions.distValue" filterable allow-create default-first-option :placeholder="$t(`areaManages.selector.areaDefault`)" @change="areaSelctChange(distOptions.distValue, 'dist')" no-data-text="请筛选 市/县 列表">
           <el-option v-for="item in distOptions.distInfo" :key="item.code" :label="item.name" :value="item.name">
           </el-option>
         </el-select>
@@ -35,7 +35,7 @@
         </svg>
       </div>
       <div class="searchSchoolbox">
-        <el-input v-model="searchValues" placeholder="搜索 学校名称/学校简码" class="input-with-select" size="small" clearable>
+        <el-input v-model="searchValues" placeholder="搜索 学校名称/学校简码" class="input-with-select" clearable>
           <template #prepend>
             <svg class="addrelevancy-icon" aria-hidden="true">
               <use xlink:href="#icon-sousuo3-copy"></use>
@@ -46,7 +46,7 @@
     </div>
     <div class="boxselect">
       <div class="batchDelete" v-show="PowerShow && deleteSchoolArr.length !==0">
-        <el-button size="small" type="primary" @click="batchRemoveSchool">
+        <el-button type="danger" @click="batchRemoveSchool">
           <svg class="created-icon" aria-hidden="true">
             <use xlink:href="#icon-piliangshanchu"></use>
           </svg>
@@ -55,7 +55,7 @@
       </div>
       <div class="schoolNums"><span>学校数量:</span><span>{{tablesccnt}}</span></div>
       <div class="createschools" v-if="PowerShow">
-        <el-button size="small" @click="createdSchoolbtn" type="primary">
+        <el-button @click="createdSchoolbtn" type="primary">
           <svg class="created-icon" aria-hidden="true">
             <use xlink:href="#icon-chuangjianx"></use>
           </svg>
@@ -63,10 +63,9 @@
         </el-button>
       </div>
     </div>
-    <div class="school-list">
-      <el-table :data="tableData" :ref="tablesInfo" id="tablescroll" style="width: 100%" height="72vh" v-loading="loading" element-loading-text="加载中..." empty-text="暂无数据" @selection-change="selectChange" @sort-change="versionsSort">
+    <div class="school-list" style="width: 96%; height: 74vh" v-loading="loading" element-loading-text="加载中...">
+      <!-- <el-table :data="tableData" :ref="tablesInfo" id="tablescroll" style="width: 100%" height="72vh" v-loading="loading" element-loading-text="加载中..." empty-text="暂无数据" @selection-change="selectChange" @sort-change="versionsSort">
         <el-table-column type="selection" width="55" v-if="PowerShow" />
-        <!-- <el-table-column prop="index" :label="$t(`schoolManages.tables.serialnum`)" type="index" sortable align="center" /> -->
         <el-table-column :label="$t(`schoolManages.tables.badge`)" width="150" align="center">
           <template #default="scope">
             <el-image style="width: 70px; height: 70px" :src="scope.row.picture" fit="fill" v-if="scope.row.picture"></el-image>
@@ -74,18 +73,8 @@
           </template>
         </el-table-column>
         <el-table-column prop="name" :label="$t(`schoolManages.tables.name`)" sortable align="center" />
-        <!-- <el-table-column label="学段" width="150" align="center">
-                    <template #default="scope">
-                        <span>{{scope.row.period[0].name}}</span>
-                    </template>
-                </el-table-column> -->
         <el-table-column :label="$t(`schoolManages.tables.scale`)" class="school-table-edition" sortable="custom" align="center">
           <template #default="scope">
-            <!-- <el-image style="width: 80px; height: 80px" :src="imgData.basics" fit="fill" v-if="scope.row.scale === 0"></el-image>
-            <el-image style="width: 80px; height: 80px" :src="imgData.standard" fit="fill" v-else-if="scope.row.scale === 500 && scope.row.hard.length === 0 && scope.row.serial.length === 0 && scope.row.service.length === 0">
-            </el-image>
-            <el-image style="width: 80px; height: 80px" :src="imgData.specialty" fit="fill" v-else-if="scope.row.scale === 500 && (scope.row.hard.length != 0 || scope.row.serial.length != 0 || scope.row.service.length != 0)">
-            </el-image> -->
             <div class="scalebox">
               <p class="scalebox-content basic" v-if="scope.row.scale === 0 && (scope.row.size <100 || scope.row.size ==100)">
                 基础版
@@ -100,20 +89,7 @@
           </template>
         </el-table-column>
         <el-table-column prop="id" :label="$t(`schoolManages.tables.brevityCode`)" align="center" />
-        <!-- <el-table-column label="数据量" sortable :sort-method="schooldataSort" align="center">
-          <template #default="scope">
-            <div v-if="scope.row.lessonCount">
-              <svg class="created-icon" aria-hidden="true">
-                <use xlink:href="#icon-shuju"></use>
-              </svg>
-              {{ scope.row.lessonCount }}
-            </div>
-            <div v-else>暂无</div>
-          </template>
-        </el-table-column> -->
         <el-table-column prop="location" label="位置" align="center" />
-        <!-- <el-table-column prop="city" :label="$t(`schoolManages.tables.city`)" align="center" />
-                <el-table-column prop="dist" :label="$t(`schoolManages.tables.area`)" align="center" /> -->
         <el-table-column prop="size" :label="$t(`schoolManages.tables.spacesize`)" sortable align="center" />
         <el-table-column :label="$t(`schoolManages.tables.assis`)" align="center">
           <template #default="scope">
@@ -132,25 +108,20 @@
             </div>
           </template>
         </el-table-column>
-        <!-- <el-table-column label="数据统计" align="center">
-                    <template #default="scope">
-                        <div title="查看学校数据分析" @click="skipAnalyse">
-                            <svg class="school-analyse" aria-hidden="true">
-                                <use xlink:href="#icon-shujufenxi"></use>
-                            </svg>
-                        </div>
-                    </template>
-                </el-table-column> -->
-        <!-- <el-table-column prop="state" label="状态" width="110" align="center" /> -->
         <el-table-column prop="areaName" label="所属学区" align="center" sortable />
         <el-table-column :label="$t(`schoolManages.tables.operate`)" align="center">
           <template #default="scope">
-            <el-button type="primary" size="small" @click.prevent="deleteRow(scope.$index, scope.row)" v-if="PowerShow">{{ $t(`schoolManages.tables.operatecontent`) }}</el-button>
-            <el-button type="primary" size="small" @click.prevent="deleteRow(scope.$index, scope.row)" v-else-if="!PowerShow">查看</el-button>
-            <el-button class="deletebtns" type="danger" size="small" @click="removeSchool(scope.row, scope.$index)" v-if="PowerShow">删 除</el-button>
+            <el-button type="primary" @click.prevent="deleteRow(scope.$index, scope.row)" v-if="PowerShow">{{ $t(`schoolManages.tables.operatecontent`) }}</el-button>
+            <el-button type="primary" @click.prevent="deleteRow(scope.$index, scope.row)" v-else-if="!PowerShow">查看</el-button>
+            <el-button class="deletebtns" type="danger" @click="removeSchool(scope.row, scope.$index)" v-if="PowerShow">删 除</el-button>
           </template>
         </el-table-column>
-      </el-table>
+      </el-table> -->
+      <el-auto-resizer>
+        <template #default="{ height, width }">
+          <el-table-v2 :columns="columns" :data="tableData" :width="width" :height="height" :estimated-row-height="40" :sort-by="sortState" @column-sort="onSort" fixed />
+        </template>
+      </el-auto-resizer>
     </div>
   </div>
   <!--学校列表end-->
@@ -163,7 +134,7 @@
         </svg>
         <span class="changebtn-title">{{ $t(`schoolManages.gradSet.save`) }}</span>
       </el-button>
-      <el-button type="primary" size="small" @click="schoolClose">
+      <el-button type="primary" @click="schoolClose">
         <svg class="back-icon" aria-hidden="true">
           <use xlink:href="#icon-fanhui"></use>
         </svg>
@@ -229,7 +200,7 @@
                 </div>
               </el-form-item>
               <el-form-item :label="$t(`schoolManages.basicSet.nowAssistant`)" class="school-form-admin">
-                <div v-if="PowerShow">
+                <div v-if="PowerShow" class="admin-boxs-width">
                   <el-select v-model="adminvalue" multiple @change="assistChange" :placeholder="$t(`schoolManages.basicSet.nowAssistanthint`)">
                     <el-option v-for="item in adminoptions" :key="item.name" :label="item.mobile + '——' + item.name" :value="item.tmdId === null ? '' : item.tmdId" :disabled="!item.tmdId">
                     </el-option>
@@ -247,7 +218,7 @@
                 <el-input disabled :placeholder="$t(`schoolManages.basicSet.notCode`)" v-else="nowPitchdata.id ==null" />
               </el-form-item>
               <el-form-item label="所属学区:" class="school-form-area">
-                <div v-if="PowerShow">
+                <div v-if="PowerShow" class="area-width">
                   <el-select v-model="areaSelect.Selectvalue" :placeholder="$t(`schoolManages.basicSet.region`)">
                     <el-option v-for="item in areaSelect.data" :key="item.name" :label="item.name" :value="item.id" :disabled="item.cutArea">
                       <div class="areaname">{{item.name}}</div>
@@ -265,7 +236,7 @@
                 </div>
               </el-form-item>
               <el-form-item label="学校位置" class="school-form-area">
-                <el-cascader v-model="placeData.dataValue" :options="placeData.dataInfo" :props="schoolregionParams" placeholder="选择学校所在地" @change="schoolBelong" />
+                <el-cascader v-model="placeData.dataValue" :options="placeData.dataInfo" :props="schoolregionParams" placeholder="选择学校所在地" />
               </el-form-item>
               <el-form-item label="详细地址" class="school-form-name">
                 <el-input v-model="nowPitchdata.address" placeholder="编辑学校详细地址"></el-input>
@@ -302,7 +273,7 @@
         </div>
       </el-tab-pane>
       <el-tab-pane :label="$t(`schoolManages.redactGrading`)">
-        <SetSchool :schoolData="studyPhase" ref="setSchoolData"></SetSchool>
+        <SetSchool :schoolData="studyPhase" ref="setSchoolData" @schoolDetails="schoolDetails"></SetSchool>
       </el-tab-pane>
       <el-tab-pane label="学校管理员">
         <setSchooladmin :schoolinfo="nowPitchdata"></setSchooladmin>
@@ -318,17 +289,18 @@
   <!--编辑学校页面end-->
 </template>
 <script>
-import { reactive, ref, getCurrentInstance, toRef, onMounted, watch } from 'vue'
+import { reactive, ref, getCurrentInstance, toRef, onMounted, watch, h } from 'vue'
 // import option from '@/static/region.json'
 import option_cn from '@/static/regions/region_cn.json'
 import option_gl from '@/static/regions/region_gl.json'
 import { useStore } from 'vuex'
-import { ElMessage, ElLoading, ElMessageBox } from 'element-plus'
+import { ElMessage, ElLoading, ElMessageBox, TableV2SortOrder, ElButton, ElCheckbox, TableV2FixedDir } from 'element-plus'
 import { useRouter } from 'vue-router'
 import SetSchool from './setschool.vue'
 import Impower from './impower.vue'
 import Classpower from './classpower.vue'
 import setSchooladmin from './setSchooladmin.vue'
+import jwt_decode from 'jwt-decode'
 const siteValue = window.location.host === 'localhost:5001' ? 'cn' : window.location.host === 'bi.teammodel.cn' ? 'cn' : window.location.host === 'bitest.teammodel.cn' ? 'cn' : 'international'
 const optionsData = siteValue === 'cn' ? option_cn : option_gl
 //const optionsData = siteValue === 'cn' ? option_gl : option_gl
@@ -342,6 +314,8 @@ export default {
   setup () {
     let { proxy } = getCurrentInstance()
     let PowerShow = proxy.$access.identifyPosition(JSON.parse(localStorage.getItem('id_token')))
+    let userVerify = jwt_decode(JSON.parse(localStorage.getItem('id_token')))
+    console.log(PowerShow, userVerify, '!!!!333')
     // let PowerShow = false
     //根据部署站点不同的值
     const store = useStore()
@@ -376,7 +350,7 @@ export default {
     let adminvalue = ref([])
     const value2 = ref(true)
     //为了让表单呈现 暂时的数据,
-    let loading = ref(true)
+    let loading = ref(false)
     let scrollHeight = ref()
     let uploadHeader = ref({})
     let nowPitchdata = ref({
@@ -462,12 +436,12 @@ export default {
     //关于 修改学校所属位置
     let placeData = ref({
       dataInfo: [],
-      dataValue: '',
+      dataValue: [],
     })
     let schoolregionParams = ref({
       label: 'name', //这里可以配置你们后端返回的属性
       value: 'code',
-      checkStrictly: false,
+      checkStrictly: true,
     })
     //当前学校显示
     let nSchool = ref({
@@ -476,68 +450,217 @@ export default {
     })
     provinceOptions.value.optionInfo = optionsData
     placeData.value.dataInfo = optionsData
-    onMounted(() => {
-      //监听表格滚动事件
-      // let table = mutipleTable.value._value.layout.table.refs.bodyWrapper;
-      let table = document.getElementById('tablescroll')
-      console.log(table, '查看是否获取到')
-      table.addEventListener("scroll", (res) => { loadmore(res) }, true);
+    const columns = [
+      {
+        cellRenderer: (data) =>
+          h(
+            ElCheckbox,
+            // { onClick: () => handleDelete(data), type: "danger", icon: "Delete" },
+            { onChange: () => selectChange(data.rowData) },
+            { default: () => "" }
+          ),
+        width: 100,//当前列的宽度,必须设置
+        // fixed: true,//是否固定列
+        align: 'center',
+        // cellRenderer: ({ rowData }) => {
+        //   const onChange = (value: CheckboxValueType) => (rowData.checked = value)
+        //   return <SelectionCell value={rowData.checked} onChange={onChange} />
+        // },
+      },
+      {
+        // key: "name",
+        // dataKey: "name",//需要渲染当前列的数据字段,如{id:9527,name:'Mike'},则填name
+        title: "校徽",
+        width: 200,
+        fixed: false,
+        align: 'center',
+        cellRenderer: (data) => (
+          <>
+            <el-image style="width: 55px; height: 55px;margin:5px" src={data.rowData.picture} fit="contain" v-show={data.rowData.picture ? true : false}></el-image>
+            <div style=" width: 55px;height: 55px;line-height: 55px;text-align: center;background-color: #bdc3c7;font-size: 10px;color: #ecf0f1;margin:5px;" v-show={!data.rowData.picture ? true : false}>暂无图片</div>
+          </>
+        )
+      },
+      {
+        key: "name",
+        dataKey: "name",//需要渲染当前列的数据字段,如{id:9527,name:'Mike'},则填name
+        title: "名称",
+        width: 200,
+        fixed: false,
+        align: 'center',
+      },
+      {
+        // key: "name",
+        // dataKey: "name",//需要渲染当前列的数据字段,如{id:9527,name:'Mike'},则填name
+        title: "规模版本",
+        width: 100,
+        fixed: false,
+        align: 'center',
+        // sortable: true,
+        cellRenderer: (data) => (
+          <>
+            <div style="color:#409EFF" v-show={data.rowData.scale === 0 && (data.rowData.size < 100 || data.rowData.size == 100) ? true : false}>基础版</div>
+            <div style="color:#67C23A" v-show={(data.rowData.scale === 300 && data.rowData.size === 500) || (data.rowData.size > 100 && (!data.rowData.service.includes('YMPCVCIM') && !data.rowData.service.includes('VLY6J6N6') && !data.rowData.service.includes('VABAJ6NV'))) ? true : false}>标准版</div>
+            <div style="color: #e6a23c;" v-show={data.rowData.service.includes('YMPCVCIM') || data.rowData.service.includes('VLY6J6N6') || data.rowData.service.includes('VABAJ6NV') ? true : false}>专业版</div>
+          </>
+        ),
+      },
+      {
+        key: "id",
+        dataKey: "id",//需要渲染当前列的数据字段,如{id:9527,name:'Mike'},则填id
+        title: "学校简码",//显示在单元格表头的文本
+        width: 150,//当前列的宽度,必须设置
+        align: 'center',
+      },
+      {
+        key: "location",
+        dataKey: "location",
+        title: "位置",
+        align: 'center',
+        width: 200,
+      },
+      {
+        key: "size",
+        dataKey: "size",
+        title: "空间大小",
+        width: 170,
+        align: 'center',
+        sortable: true,
+      },
+      {
+        key: "assisName",
+        dataKey: "assisName",
+        title: "关联管家",
+        align: 'center',
+        width: 150,
+      },
+      {
+        key: "serial",
+        dataKey: "serial",
+        title: "模组情况",
+        align: 'center',
+        width: 200,
+        cellRenderer: (data) => (
+          <>
+            <div title="学情分析" v-show={data.rowData.service.includes('YMPCVCIM') ? true : false}>
+              <svg style=" width: 1.8em;height: 1.8em;vertical-align: -0.5em;fill: currentColor;overflow: hidden;cursor: pointer;" aria-hidden="true" ><use xlink:href="#icon-tongjifenxi"></use></svg>
+            </div>
+            <div title="智慧学校管理服务" v-show={data.rowData.service.includes('IPDYZYLC') ? true : false}>
+              <svg style=" width: 1.8em;height: 1.8em;vertical-align: -0.5em;fill: currentColor;overflow: hidden;cursor: pointer;" aria-hidden="true" ><use xlink:href="#icon-zhihuixiaoyuan"></use></svg>
+            </div>
+            <div title="A Class ONE 智慧学伴" v-show={data.rowData.service.includes('3CLYJ6NP') ? true : false}>
+              <svg style=" width: 1.8em;height: 1.8em;vertical-align: -0.5em;fill: currentColor;overflow: hidden;cursor: pointer;" aria-hidden="true" ><use xlink:href="#icon-jxuexiao2"></use></svg>
+            </div>
+            <div title="数据存储服务空间" v-show={data.rowData.service.includes('IPALJ6NY') ? true : false}>
+              <svg style=" width: 1.8em;height: 1.8em;vertical-align: -0.5em;fill: currentColor;overflow: hidden;cursor: pointer;" aria-hidden="true" ><use xlink:href="#icon-yuncunchu"></use></svg>
+            </div>
+            <div title="卷卡合一阅卷系统" v-show={data.rowData.service.includes('VABAJ6NV') ? true : false}>
+              <svg style=" width: 1.8em;height: 1.8em;vertical-align: -0.5em;fill: currentColor;overflow: hidden;cursor: pointer;" aria-hidden="true" ><use xlink:href="#icon-pingtai_kaoshi"></use></svg>
+            </div>
+            <div title="教研中心模组" v-show={data.rowData.service.includes('VLY6J6N6') ? true : false}>
+              <svg style=" width: 1.8em;height: 1.8em;vertical-align: -0.5em;fill: currentColor;overflow: hidden;cursor: pointer;" aria-hidden="true" ><use xlink:href="#icon-jiaoyan"></use></svg>
+            </div>
+          </>
+        ),
+      },
+      {
+        key: "areaName",
+        dataKey: "areaName",
+        title: "所属学区",
+        width: 150,
+        align: 'center',
+      },
+      {
+        key: "handle",
+        title: "操作",
+        width: 150,
+        align: "center",
+        // fixed: 'right',
+        cellRenderer: (data) =>
+        (
+          <>
+            <el-button type="primary" onClick={deleteRow.bind(this, data.rowData)} v-show={userVerify.roles.includes('admin') ? true : false}>编辑</el-button>
+            <el-button type="primary" onClick={deleteRow.bind(data.rowData)} v-show={userVerify.roles.includes('leader') ? true : false}>查看</el-button>
+            <el-button type="danger" onClick={removeSchool.bind(this, data.rowData)} v-show={userVerify.roles.includes('admin') ? true : false}>删除</el-button>
+          </>
+        ),
+      },
+    ];
+    const sortState = ref({
+      key: 'id',
+      order: TableV2SortOrder.ASC,
     })
-    const loadmore = (res) => {
-      if (res.target.scrollTop && ((res.target.scrollHeight - 20) <= (res.target.scrollTop + res.target.clientHeight))) {
-        scrollHeight.value = (res.target.scrollHeight - 20) - (res.target.scrollTop + res.target.clientHeight)
-        console.log(scrollHeight.value, '值')
-      }
+    const onSort = (sortBy) => {
+      console.log(sortBy)
+      tableData.value = tableData.value.reverse()
+      sortState.value = sortBy
     }
+    // onMounted(() => {
+    //   //监听表格滚动事件
+    //   // let table = mutipleTable.value._value.layout.table.refs.bodyWrapper;
+    //   let table = document.getElementById('tablescroll')
+    //   console.log(table, '查看是否获取到')
+    //   table.addEventListener("scroll", (res) => { loadmore(res) }, true);
+    // })
+    // const loadmore = (res) => {
+    //   if (res.target.scrollTop && ((res.target.scrollHeight - 20) <= (res.target.scrollTop + res.target.clientHeight))) {
+    //     scrollHeight.value = (res.target.scrollHeight - 20) - (res.target.scrollTop + res.target.clientHeight)
+    //     console.log(scrollHeight.value, '值')
+    //   }
+    // }
     //所有学校列表
     async function getAllschool () {
+      loading.value = true
       await getoption()
-      proxy.$api.getSchooldata({}).then((res) => {
-        console.log(res, '获取学校列表')
+      proxy.$api.getSchool({}).then((res) => {
+        console.log(res, '获取学校列表V2')
         //处理关联管家  拼内容
-        for (let i in res.schoolAssists) {
-          res.schoolAssists[i].serviceData = []
-          if (res.schoolAssists[i].assists) {
-            res.schoolAssists[i].assisName = ''
-            res.schoolAssists[i].location = res.schoolAssists[i].dist !== null ? res.schoolAssists[i].province + res.schoolAssists[i].city + res.schoolAssists[i].dist : res.schoolAssists[i].province + res.schoolAssists[i].city
-            let datas = res.schoolAssists[i].assists
+        for (let i in res.scInfos) {
+          res.scInfos[i].serviceData = []
+          res.scInfos[i].location = res.scInfos[i].dist !== null ? res.scInfos[i].province + res.scInfos[i].city + res.scInfos[i].dist : res.scInfos[i].province + res.scInfos[i].city
+          if (res.scInfos[i].assists) {
+            res.scInfos[i].assisName = ''
+            let datas = res.scInfos[i].assists
             for (let y in datas) {
-              res.schoolAssists[i].assisName = res.schoolAssists[i].assisName + datas[y].tmdName + ','
+              res.scInfos[i].assisName = res.scInfos[i].assisName + datas[y].name + ','
             }
           }
-          if (res.schoolAssists[i].service.length > 0) {
-            res.schoolAssists[i].service.forEach((x) => {
+          if (res.scInfos[i].service && res.scInfos[i].service.length > 0) {
+            res.scInfos[i].service.forEach((x) => {
               for (let m in patternIcon.value) {
-                patternIcon.value[m].key === x ? res.schoolAssists[i].serviceData.push(patternIcon.value[m]) : ''
+                patternIcon.value[m].key === x ? res.scInfos[i].serviceData.push(patternIcon.value[m]) : ''
               }
             })
           }
         }
         console.log(areaSelect, '当时的学区数据')
-        res.state == 200 ? (tableData.value = [], originalData.value = [], tableData.value.push(...res.schoolAssists), (originalNum.value = res.schoolAssists.length), (originalData.value = res.schoolAssists), tableNexttoken.value = res.continuationToken, tablesccnt.value = res.scCnt) : ''
-        tableData.value.forEach((item) => { item.areaName = ''; areaSelect.value.data.forEach((itema) => { item.areaId === itema.id ? item.areaName = itema.name : '' }) })
+        res.state == 200 ? (tableData.value = [], originalData.value = [], tableData.value.push(...res.scInfos), (originalNum.value = res.scInfos.length), (originalData.value = res.scInfos), tablesccnt.value = res.allCnt) : ''
+        //  tableData.value.forEach((item) => { item.areaName = ''; areaSelect.value.data.forEach((itema) => { item.areaId === itema.id ? item.areaName = itema.name : '' }) })
         loading.value = false
-        console.log(tableData, '区域的数据')
+        console.log(tableData, '完善后的数据')
       })
     }
     //点击学校列表,详情
-    function deleteRow (index, data) {
-      console.log(index, data, 'DATA')
+    function deleteRow (data, index) {
+      console.log(index, 'INDEX')
+      console.log(data, 'DATA')
       //处理的基础设置
       areaSelect.value.data = []
       studyPhase.value = data.id
       nowPitchdata.value = Object.assign(nowPitchdata.value, data)
       nowPitchdata.value.address = data.address
       nowPitchdata.value.name = data.name
-      nowPitchdata.value.type = data.type.toString()
+      nowPitchdata.value.address = data.address
+      // nowPitchdata.value.type = data.type.toString()
       nowPitchdata.value.scale = data.scale
       nowPitchdata.value.standard = data.standard
       nowPitchdata.value.areaId = data.areaId
       nSchool.value.img = data.picture
       nSchool.value.name = data.name
-      data.assists.length ? data.assists.forEach((element) => { adminvalue.value.push(element.tmdId) }) : ''
+      data.assists.length ? data.assists.forEach((element) => { adminvalue.value.push(element.id) }) : ''
       //处理现实学校所属位置
       let provinceValues = data.province; let cityValues = data.city; let distValues = data.dist;
+      console.log(provinceValues, cityValues, distValues, '位置')
       let belongValue = [];
       for (let p in options) {
         if (options[p].name === provinceValues || options[p].name.includes(provinceValues)) {
@@ -554,13 +677,17 @@ export default {
           }
         }
       }
+      console.log(belongValue, '位置结果')
+      belongValue.forEach((items) => { items = Number(items) })
       placeData.value.dataValue = belongValue
+      console.log(placeData.value.dataValue, '位置code')
       let token = JSON.parse(localStorage.getItem('id_token'))
       uploadHeader.value['x-auth-authtoken'] = token
       data.areaId !== null ? (areaSelect.value.Selectvalue = data.areaId) : ''
       store.state.point.length ? areaSelect.value.data.push(...store.state.point) : ''
       models.value = 'details'
       console.log(nowPitchdata.value, '查看当前学校的值')
+      console.log(adminoptions, '顾问合集')
     }
     //更换校徽
     function changeBadge (file) {
@@ -589,15 +716,8 @@ export default {
         })
         console.log(cityData, '筛选记过')
         cityOptions.value.cityInfo = cityData[0].hasOwnProperty('children') ? cityData[0].children : []
-        //遍历list
-        // let schoolData = originalData.value.filter((items) => {
-        //   // let provinceState = items.province.includes('自治区') || items.province.includes('市') ? true : false
-        //   // let names = provinceState === false && items.province.indexOf('省') === -1 ? items.province + '省' : items.province
-        //   return value.includes(items.province)
-        //   // return items.province === value
-        // })
         let disposeText = ''
-        if (siteValue.value === 'cn') {
+        if (siteValue === 'cn') {
           let textNums = value.indexOf('省') !== -1 ? value.indexOf('省') : value.indexOf('自治区') !== -1 ? value.indexOf('自治区') : value.indexOf('市') !== -1 ? value.indexOf('市') :
             value.indexOf('特别行政区') !== -1 ? value.indexOf('特别行政区') : value.indexOf('地區') !== -1 ? value.indexOf('地區') : value
           console.log(textNums, '数字')
@@ -606,14 +726,21 @@ export default {
         } else {
           disposeText = value
         }
-        let data = { province: disposeText }
-        await proxy.$api.getSchooldata(data).then((res) => {
-          console.log(res, '筛选结果')
-          // res.state === 200 ? tableData.value=res.schoolAssists:''
-          res.state === 200 ? (schoolListDatas = res.schoolAssists, selectValue.value.province = disposeText, nextPageToken = res.continuationToken, tablesccnt.value = res.scCnt) : ''
-        }).catch((error) => {
-          ElMessage.error('API异常,数据 省 筛选失败')
+        // let data = { province: disposeText }
+        console.log(disposeText, value, '省')
+        //遍历list
+        let schoolData = originalData.value.filter((items) => {
+          return items.province.includes(disposeText)
         })
+        console.log(schoolData, '123456')
+        tableData.value = schoolData
+        // await proxy.$api.getSchooldata(data).then((res) => {
+        //   console.log(res, '筛选结果')
+        //   // res.state === 200 ? tableData.value=res.schoolAssists:''
+        //   res.state === 200 ? (schoolListDatas = res.schoolAssists, selectValue.value.province = disposeText, nextPageToken = res.continuationToken, tablesccnt.value = res.scCnt) : ''
+        // }).catch((error) => {
+        //   ElMessage.error('API异常,数据 省 筛选失败')
+        // })
         // tableData.value = schoolData
         // console.log(schoolData, tableData.value)
       } else if (model === 'city') {
@@ -628,7 +755,7 @@ export default {
         // })
         // tableData.value = schoolData
         let disposeText = ''
-        if (siteValue.value === 'cn') {
+        if (siteValue === 'cn') {
           let cityNums = value.indexOf('市') !== -1 && value !== '直辖市' ? value.indexOf('市') : value.indexOf('县') !== -1 ? value.indexOf('县') :
             value.indexOf('自治州') !== -1 ? value.indexOf('自治州') : value.indexOf('縣') !== -1 ? value.indexOf('縣') : value.indexOf('直辖市') !== -1 ? value.length : ''
           disposeText = value.substr(0, cityNums)
@@ -636,12 +763,17 @@ export default {
         } else {
           disposeText = value
         }
-        let data = { province: selectValue.value.province ? selectValue.value.province : '', city: disposeText }
-        await proxy.$api.getSchooldata(data).then((res) => {
-          res.state === 200 ? (schoolListDatas = res.schoolAssists, selectValue.value.city = disposeText, nextPageToken = res.continuationToken, tablesccnt.value = res.scCnt) : ''
-        }).catch((error) => {
-          ElMessage.error('API异常,数据 市/县 筛选失败')
+        let CityschoolData = originalData.value.filter((items) => {
+          return items.province.includes(selectValue.value.province) && items.city.includes(disposeText)
         })
+        console.log(CityschoolData, '456789')
+        tableData.value = CityschoolData
+        // let data = { province: selectValue.value.province ? selectValue.value.province : '', city: disposeText }
+        // await proxy.$api.getSchooldata(data).then((res) => {
+        //   res.state === 200 ? (schoolListDatas = res.schoolAssists, selectValue.value.city = disposeText, nextPageToken = res.continuationToken, tablesccnt.value = res.scCnt) : ''
+        // }).catch((error) => {
+        //   ElMessage.error('API异常,数据 市/县 筛选失败')
+        // })
       } else if (model === 'dist') {
         let provinceData = provinceOptions.value.provinceValue
         let cityData = cityOptions.value.cityValue
@@ -652,43 +784,47 @@ export default {
         // })
         // tableData.value = schoolData
         let disposeText = ''
-        if (siteValue.value === 'cn') {
+        if (siteValue === 'cn') {
           let distNums = value.indexOf('区') !== -1 && value.length > 2 ? value.indexOf('区') : value.indexOf('县') !== -1 ? value.indexOf('县') : value.indexOf('市') !== -1 ? value.indexOf('市') : value.indexOf('直辖市') !== -1 || value.indexOf('天府新区') !== -1 ? value.length : ''
           disposeText = value.substr(0, distNums)
           console.log(distNums, disposeText, '位置')
         } else {
           disposeText = value
         }
-        let data = { province: selectValue.value.province ? selectValue.value.province : '', city: selectValue.value.city ? selectValue.value.city : '', dist: disposeText }
-        await proxy.$api.getSchooldata(data).then((res) => {
-          res.state === 200 ? (schoolListDatas = res.schoolAssists, nextPageToken = res.continuationToken, tablesccnt.value = res.scCnt) : ''
-        }).catch((error) => {
-          ElMessage.error('API异常,数据 地区 筛选失败')
+        let distschoolData = originalData.value.filter((items) => {
+          return items.province.includes(selectValue.value.province) && items.city.includes(selectValue.value.city) && (items.dist !== null ? items.dist.indexOf(disposeText) !== -1 : '')
         })
+        tableData.value = distschoolData
+        // let data = { province: selectValue.value.province ? selectValue.value.province : '', city: selectValue.value.city ? selectValue.value.city : '', dist: disposeText }
+        // await proxy.$api.getSchooldata(data).then((res) => {
+        //   res.state === 200 ? (schoolListDatas = res.schoolAssists, nextPageToken = res.continuationToken, tablesccnt.value = res.scCnt) : ''
+        // }).catch((error) => {
+        //   ElMessage.error('API异常,数据 地区 筛选失败')
+        // })
       }
       //统一处理
-      console.log(schoolListDatas, '处理前的')
-      for (let i in schoolListDatas) {
-        schoolListDatas[i].serviceData = []
-        if (schoolListDatas[i].assists) {
-          schoolListDatas[i].assisName = ''
-          schoolListDatas[i].location = schoolListDatas[i].dist !== null ? schoolListDatas[i].province + schoolListDatas[i].city + schoolListDatas[i].dist : schoolListDatas[i].province + schoolListDatas[i].city
-          let datas = schoolListDatas[i].assists
-          for (let y in datas) {
-            schoolListDatas[i].assisName = schoolListDatas[i].assisName + datas[y].tmdName + ','
-          }
-        }
-        if (schoolListDatas[i].service.length > 0) {
-          schoolListDatas[i].service.forEach((x) => {
-            for (let m in patternIcon.value) {
-              patternIcon.value[m].key === x ? schoolListDatas[i].serviceData.push(patternIcon.value[m]) : ''
-            }
-          })
-        }
-      }
-      tableData.value = schoolListDatas
-      tableData.value.forEach((item) => { item.areaName = ''; areaSelect.value.data.forEach((itema) => { item.areaId === itema.id ? item.areaName = itema.name : '' }) })
-      tableNexttoken.value = nextPageToken
+      // console.log(schoolListDatas, '处理前的')
+      // for (let i in schoolListDatas) {
+      //   schoolListDatas[i].serviceData = []
+      //   if (schoolListDatas[i].assists) {
+      //     schoolListDatas[i].assisName = ''
+      //     schoolListDatas[i].location = schoolListDatas[i].dist !== null ? schoolListDatas[i].province + schoolListDatas[i].city + schoolListDatas[i].dist : schoolListDatas[i].province + schoolListDatas[i].city
+      //     let datas = schoolListDatas[i].assists
+      //     for (let y in datas) {
+      //       schoolListDatas[i].assisName = schoolListDatas[i].assisName + datas[y].tmdName + ','
+      //     }
+      //   }
+      //   if (schoolListDatas[i].service.length > 0) {
+      //     schoolListDatas[i].service.forEach((x) => {
+      //       for (let m in patternIcon.value) {
+      //         patternIcon.value[m].key === x ? schoolListDatas[i].serviceData.push(patternIcon.value[m]) : ''
+      //       }
+      //     })
+      //   }
+      // }
+      // tableData.value = schoolListDatas
+      // tableData.value.forEach((item) => { item.areaName = ''; areaSelect.value.data.forEach((itema) => { item.areaId === itema.id ? item.areaName = itema.name : '' }) })
+      // tableNexttoken.value = nextPageToken
       loading.value = false
     }
     //学校详情 close
@@ -718,7 +854,7 @@ export default {
     }
     //管家发生变化
     function assistChange (val) {
-      console.log(val, adminvalue.value)
+      console.log(val, adminvalue.value, '管家发生变化')
     }
     //获取所有的顾问API访问
     function getAllassists () {
@@ -763,12 +899,20 @@ export default {
       //修改表单
       let assistData = adminvalue.value
       let periodData = []
+      //接口搜索顾问array
+      let assisArr = []
       for (let i in nowPitchdata.value.period) {
         let num = Number(i) + 1
         if (nowPitchdata.value.period[i].value === true) {
           periodData.push(nowPitchdata.value.period[i].name)
         }
       }
+      //处理管家列表
+      assistData.forEach((item) => {
+        for (let itemA of adminoptions.value) {
+          item === itemA.tmdId ? assisArr.push({ id: itemA.tmdId, name: itemA.name, picture: itemA.picture ? itemA.picture : null }) : ''
+        }
+      })
       //处理学校所谓位置 文字
       let provinceV = placeData.value.dataValue[0]; let cityV = placeData.value.dataValue[1]; let distV = placeData.value.dataValue[2];
       let placeArr = []
@@ -788,12 +932,19 @@ export default {
         }
       }
       console.log(placeArr)
+      //去重管家列表
+      // assisArr.forEach((item) => {
+      //   let ids = item.id
+      //   for (let i = assisArr.length - 1; i <= 0; i--) {
+      //     assisArr[i].id === ids ? assisArr.splice(i, 1) : ''
+      //   }
+      // })
       let updateForm = {
         name: nowPitchdata.value.name,
         schoolId: nowPitchdata.value.id,
         picture: nowPitchdata.value.picture,
         size: nowPitchdata.value.size,
-        assistId: assistData,
+        assist: assisArr,
         scale: nowPitchdata.value.scale,
         type: parseInt(nowPitchdata.value.type),
         standard: nowPitchdata.value.standard,
@@ -804,11 +955,16 @@ export default {
         address: nowPitchdata.value.address,
       }
       console.log(updateForm, '修改学校信息')
+      console.log(nowPitchdata.value, '原本的学校信息')
+      console.log(assistData, '顾问信息')
       proxy.$api.updateSchoolinfo(updateForm).then((res) => {
         console.log(res, '修改学校的返回')
         loadingUpdate.close()
         res.state === 200
-          ? (ElMessage.success(proxy.$t(`commonMsg.schoolUpdateSuccess`), schoolJoinarea(), schoolClose()), updateSuccess())
+          ? (ElMessage.success(proxy.$t(`commonMsg.schoolUpdateSuccess`),
+            // schoolJoinarea(), 
+            schoolClose()),
+            updateSuccess())
           : ElMessage.error(proxy.$t(`commonMsg.schoolUpdateError`))
       }).catch((error) => {
         loadingUpdate.close()
@@ -934,7 +1090,6 @@ export default {
         }).catch((error) => {
           ElMessage.error('删除失败,操作异常')
         })
-
       })
     }
     function batchRemoveSchool () {
@@ -959,6 +1114,7 @@ export default {
         proxy.$api.removeSchool(data).then((res) => {
           if (res.state === 200) {
             ElMessage.success('删除成功')
+            deleteSchoolArr.value = []
             getAllschool()
           }
         }).catch((error) => {
@@ -968,8 +1124,29 @@ export default {
     }
     function selectChange (value) {
       console.log(value)
-      deleteSchoolArr.value = value
-      console.log(deleteSchoolArr.value[0])
+      if (deleteSchoolArr.value.length === 0) {
+        deleteSchoolArr.value.push(value)
+      } else {
+        for (var i = deleteSchoolArr.value.length - 1; i >= 0; i--) {
+          console.log(i)
+          if (deleteSchoolArr.value[i].id === value.id) {
+            console.log('进入删除')
+            deleteSchoolArr.value.splice(i, 1)
+            break
+          } else {
+            console.log('进入添加')
+            deleteSchoolArr.value.push(value)
+            break
+          }
+        }
+      }
+      console.log(deleteSchoolArr.value)
+      // if (result !== -1) {
+      //   deleteSchoolArr.value.splice(result, 1)
+      // } else {
+      //   deleteSchoolArr.value.push(value)
+      // }
+      // console.log(deleteSchoolArr.value)
     }
     function datascroll () {
       console.log('触发了')
@@ -1021,51 +1198,57 @@ export default {
     }
     function personnelSearch () {
       loading.value = true
-      let searchstate = false
+      // let searchstate = false
       let values = searchValues.value
-      let cnLang = new RegExp("[\u4E00-\u9FA5]+");
-      let letter = new RegExp("[A-Za-z]+");
-      let numbers = new RegExp("[0-9]+");
-      let data = cnLang.test(values) || numbers.test(values) ? { name: values } : letter.test(values) ? { scId: values } : {}
-      Object.keys(data).length === 0 ? searchstate = true : searchstate = false
-      if (searchstate) {
-        loading.value = false
-        console.log('9999999999999999')
-        return
-      }
-      proxy.$api.getSchooldata(data).then((res) => {
-        console.log(res, '查询的返回')
-        // res.state === 200 ? tableData.value = res.schoolAssists : ''
-        if (res.state === 200) {
-          if (res.schoolAssists.length !== 0) {
-            for (let i in res.schoolAssists) {
-              res.schoolAssists[i].serviceData = []
-              if (res.schoolAssists[i].assists) {
-                res.schoolAssists[i].assisName = ''
-                res.schoolAssists[i].location = res.schoolAssists[i].dist !== null ? res.schoolAssists[i].province + res.schoolAssists[i].city + res.schoolAssists[i].dist : res.schoolAssists[i].province + res.schoolAssists[i].city
-                let datas = res.schoolAssists[i].assists
-                for (let y in datas) {
-                  res.schoolAssists[i].assisName = res.schoolAssists[i].assisName + datas[y].tmdName + ','
-                }
-              }
-              if (res.schoolAssists[i].service.length > 0) {
-                res.schoolAssists[i].service.forEach((x) => {
-                  for (let m in patternIcon.value) {
-                    patternIcon.value[m].key === x ? res.schoolAssists[i].serviceData.push(patternIcon.value[m]) : ''
-                  }
-                })
-              }
-            }
-          }
-          tableData.value = res.schoolAssists
-          tableData.value.forEach((item) => { item.areaName = ''; areaSelect.value.data.forEach((itema) => { item.areaId === itema.id ? item.areaName = itema.name : '' }) })
-          tablesccnt.value = res.scCnt
-          loading.value = false
-        }
-      }).catch((err) => {
-        ElMessage.error('查询学校API异常,请重试')
-        loading.value = false
+      // let cnLang = new RegExp("[\u4E00-\u9FA5]+");
+      // let letter = new RegExp("[A-Za-z]+");
+      // let numbers = new RegExp("[0-9]+");
+      // let data = cnLang.test(values) || numbers.test(values) ? { name: values } : letter.test(values) ? { scId: values } : {}
+      // Object.keys(data).length === 0 ? searchstate = true : searchstate = false
+      // if (searchstate) {
+      //   loading.value = false
+      //   return
+      // }
+      let arr = tableData.value
+      let newArr = arr.filter((item) => {
+        return item.name.includes(values) || item.id.includes(values)
       })
+      tableData.value = newArr
+      loading.value = false
+      // showPattern.value === 'all' ? notClassifydata.value = newArr : schooltableData.value = newArr
+      // proxy.$api.getSchooldata(data).then((res) => {
+      //   console.log(res, '查询的返回')
+      //   // res.state === 200 ? tableData.value = res.schoolAssists : ''
+      //   if (res.state === 200) {
+      //     if (res.schoolAssists.length !== 0) {
+      //       for (let i in res.schoolAssists) {
+      //         res.schoolAssists[i].serviceData = []
+      //         if (res.schoolAssists[i].assists) {
+      //           res.schoolAssists[i].assisName = ''
+      //           res.schoolAssists[i].location = res.schoolAssists[i].dist !== null ? res.schoolAssists[i].province + res.schoolAssists[i].city + res.schoolAssists[i].dist : res.schoolAssists[i].province + res.schoolAssists[i].city
+      //           let datas = res.schoolAssists[i].assists
+      //           for (let y in datas) {
+      //             res.schoolAssists[i].assisName = res.schoolAssists[i].assisName + datas[y].tmdName + ','
+      //           }
+      //         }
+      //         if (res.schoolAssists[i].service.length > 0) {
+      //           res.schoolAssists[i].service.forEach((x) => {
+      //             for (let m in patternIcon.value) {
+      //               patternIcon.value[m].key === x ? res.schoolAssists[i].serviceData.push(patternIcon.value[m]) : ''
+      //             }
+      //           })
+      //         }
+      //       }
+      //     }
+      //     tableData.value = res.schoolAssists
+      //     tableData.value.forEach((item) => { item.areaName = ''; areaSelect.value.data.forEach((itema) => { item.areaId === itema.id ? item.areaName = itema.name : '' }) })
+      //     tablesccnt.value = res.scCnt
+      //     loading.value = false
+      //   }
+      // }).catch((err) => {
+      //   ElMessage.error('查询学校API异常,请重试')
+      //   loading.value = false
+      // })
       // setTimeout(function () { loading.value = false }, 500);
     }
     function versionsSort (val) {
@@ -1094,11 +1277,15 @@ export default {
         ElMessage.error('API异常,规模版本排序失败')
       })
     }
-    watch(scrollHeight, (newdata, olddata) => {
-      if (newdata < olddata) {
-        scrollHeight.value < 0 ? debounce(datascroll, 500) : ''
-      }
-    })
+    function schoolDetails (val) {
+      nowPitchdata.value.type = val.type.toString()
+      nowPitchdata.value.standard = val.standard
+    }
+    // watch(scrollHeight, (newdata, olddata) => {
+    //   if (newdata < olddata) {
+    //     scrollHeight.value < 0 ? debounce(datascroll, 500) : ''
+    //   }
+    // })
     watch(searchValues, (newdata) => {
       if (newdata.trim().length !== 0) {
         debounce(personnelSearch, 500)
@@ -1160,7 +1347,6 @@ export default {
       batchRemoveSchool,
       datascroll,
       scrollHeight,
-      loadmore,
       tableNexttoken,
       tablesInfo,
       debounce,
@@ -1172,7 +1358,12 @@ export default {
       schoolregionParams,
       originalNum,
       nSchool,
-      versionsSort
+      versionsSort,
+      columns,
+      sortState,
+      onSort,
+      userVerify,
+      schoolDetails,
     }
   },
 }
@@ -1547,8 +1738,21 @@ export default {
   color: #00a8ff;
   margin-left: 2%;
 }
+.deletebtns {
+  margin-left: 2px !important;
+}
+.admin-boxs-width,
+.area-width {
+  width: 100%;
+}
+.el-table-v2__sort-icon {
+  display: block;
+}
 </style>
 <style>
+.el-table-v2__cell-text {
+  line-height: 20px !important;
+}
 .schoolboxea .el-cascader {
   width: 20%;
 }
@@ -1668,6 +1872,9 @@ export default {
   width: 100%;
   height: 100% !important;
 }
+.school-list .el-auto-resizer {
+  margin-top: 3%;
+}
 @media screen and (max-width: 2600px) {
   .school-formbox .school-form-badge {
     width: 15vw;
@@ -1681,7 +1888,7 @@ export default {
     width: 17.5%;
   }
   .searchSchoolbox {
-    width: 53% !important;
+    width: 54.5% !important;
   }
   .school-form-size {
     width: 65% !important;

+ 19 - 4
TEAMModelBI/ClientApp/src/view/schoolServe/setSchooladmin.vue

@@ -32,7 +32,7 @@
             <div class="hint"><span>请输入用户</span><span class="emphasize">手机号、醍摩豆账号</span><span>等相关信息进行搜索</span></div>
             <div class="search-box">
               <!-- <input class="search-txt" type="text" id="serachname" :value="filterText" placeholder="搜索相关人名" @oninput="personnelSearch()" @compositionend="personnelSearch()"> -->
-              <el-input v-model="adminfilter" placeholder="Please input" class="search-txt" />
+              <el-input v-model="adminfilter" placeholder="输入手机号、醍摩豆账号搜索" class="search-txt" />
               <svg class="serachbox-empty" aria-hidden="true" v-if="adminfilter !==''" @click="adminfilter=''">
                 <use xlink:href="#icon-qingkong"></use>
               </svg>
@@ -44,7 +44,7 @@
               <p>未搜索到相关用户信息,请检验后重新输入搜索</p>
             </div>
             <div class="submitbtn">
-              <el-button type="primary" size="small" @click=serachPersonnel(adminfilter) class="anewbox-btn blue">搜索人员</el-button>
+              <el-button type="primary" @click=serachPersonnel(adminfilter) class="anewbox-btn blue">搜索人员</el-button>
             </div>
           </div>
           <div class="admin-text-box" v-else-if="searchState ===true">
@@ -57,8 +57,8 @@
                 <p class="result-text-phone">{{searchData.mobile}}</p>
               </div>
               <div class="anewbox">
-                <el-button type="primary" size="small" @click="addAdmin()" class="anewbox-btn">加入到学校管理员</el-button>
-                <el-button type="primary" size="small" class="anewbox-btn" @click="searchState=false,searchData='',adminfilter=''">重新检索人员</el-button>
+                <el-button type="primary" @click="addAdmin()" class="anewbox-btn">加入到学校管理员</el-button>
+                <el-button type="primary" class="anewbox-btn" @click="searchState=false,searchData='',adminfilter=''">重新检索人员</el-button>
               </div>
             </div>
           </div>
@@ -526,4 +526,19 @@ export default {
 .headerPhoto .el-image {
   display: block;
 }
+.search-box .el-input__wrapper {
+  width: 100%;
+  padding: 0px;
+  /* background: #bdc3c7; */
+  background: transparent;
+  box-shadow: 0px 0px 0px 0px transparent;
+}
+.search-box .el-input__wrapper .is-focues {
+  border: 0px;
+  box-shadow: 0px 0px 0px 0px transparent;
+}
+.search-box .el-input__wrapper:hover {
+  border: 0px;
+  box-shadow: 0px 0px 0px 0px transparent;
+}
 </style>

+ 11 - 10
TEAMModelBI/ClientApp/src/view/schoolServe/setschool.vue

@@ -509,7 +509,7 @@ export default {
       default: '',
     },
   },
-  setup (props) {
+  setup (props, context) {
     let { proxy } = getCurrentInstance()
     let PowerShow = proxy.$access.identifyPosition(JSON.parse(localStorage.getItem('id_token')))
     const store = useStore()
@@ -761,8 +761,8 @@ export default {
       proxy.$api
         .getNowscholl({ schoolId: data })
         .then((res) => {
-          console.log(res, '返回的res内容')
-          res.state === 200 ? ((schoolData = res.schoolAssists), conductData(res.schoolAssists)) : ''
+          console.log(res, '返回的res内容CCCCC')
+          res.state === 200 ? ((schoolData = res.schoolAssists), conductData(res.schoolAssists), context.emit('schoolDetails', res.schoolAssists)) : ''
         })
         .catch((res) => {
           ElMessage.error('获取学校数据异常')
@@ -818,13 +818,14 @@ export default {
     //显示学段的tag标签
     function stageTags () {
       let data = nowschoolData.value
-      console.log(data, '当前数据')
-      for (let i in data.period) {
-        if (data.period[i].type !== null) {
-          data.period[i].typedata = []
-          data.period[i].type.forEach((a) => { stageTage.value.forEach((b) => { a === b.value ? data.period[i].typedata.push(b) : '' }) })
-        }
-      }
+      console.log(data, '当前数据tag')
+      //暂停服务,后面处理
+      // for (let i in data.period) {
+      //   if (data.period[i].type !== null) {
+      //     data.period[i].typedata = []
+      //     data.period[i].type.forEach((a) => { stageTage.value.forEach((b) => { a === b.value ? data.period[i].typedata.push(b) : '' }) })
+      //   }
+      // }
       console.log(data, '处理阶段的数据')
     }
     //切换学段(右边渲染数据切换)

+ 8 - 6
TEAMModelBI/ClientApp/src/view/schoolmanage/schoolManege.vue

@@ -506,12 +506,14 @@ export default {
         areaId: nowPitchdata.value.areaId,
       }
       console.log(updateForm, '学校信息')
-      proxy.$api.updateSchoolinfo(updateForm).then((res) => {
-        console.log(res, '修改学校的返回')
-        res.state === 200
-          ? (ElMessage.success(proxy.$t(`commonMsg.schoolUpdateSuccess`), schoolJoinarea(), schoolClose()), updateSuccess())
-          : ElMessage.error(proxy.$t(`commonMsg.schoolUpdateError`))
-      })
+      console.log(nowPitchdata.value, '原本的学校信息')
+      console.log(assistData, '顾问信息')
+      // proxy.$api.updateSchoolinfo(updateForm).then((res) => {
+      //   console.log(res, '修改学校的返回')
+      //   res.state === 200
+      //     ? (ElMessage.success(proxy.$t(`commonMsg.schoolUpdateSuccess`), schoolJoinarea(), schoolClose()), updateSuccess())
+      //     : ElMessage.error(proxy.$t(`commonMsg.schoolUpdateError`))
+      // })
     }
     //学校加入区域或者修改
     async function schoolJoinarea () {

+ 359 - 8
TEAMModelBI/ClientApp/src/view/systemConfig/pushmsg/createdpush.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="createdpush">
     <div class="backbtn">
-      <el-button size="small">返回列表</el-button>
+      <el-button>返回列表</el-button>
     </div>
     <div class="clearfix"></div>
     <div class="stepsshow">
@@ -36,11 +36,33 @@
               </el-radio>
             </el-radio-group>
           </el-form-item>
-          <!-- <el-form-item label="是否跳转" prop="content" class="skip-switch">
-            <el-switch v-model="value3" class="ml-2" style="--el-switch-on-color: #13ce66; --el-switch-off-color: #b2bec3" />
-            <el-input v-model="form.skip" placeholder="填写跳转地址" v-show="value3" />
+          <el-form-item label="是否跳转" prop="content" class="skip-switch">
+            <div class="skip-switch">
+              <!-- <div class="skip-title">是否跳转地址</div> -->
+              <div class="skip-content">
+                <div>
+                  <el-switch v-model="value3" class="ml-2" style="--el-switch-on-color: #13ce66; --el-switch-off-color: #b2bec3" />
+                </div>
+              </div>
+              <div class="skip-url" v-show="value3">
+                <el-input v-model="form.skip" placeholder="填写跳转地址" />
+              </div>
+            </div>
           </el-form-item>
-          <el-form-item label="发布时间" class="push-time">
+          <el-form-item label="回调执行" prop="content" class="skip-switch">
+            <div class="skip-switch">
+              <!-- <div class="skip-title">是否跳转地址</div> -->
+              <div class="skip-content">
+                <div>
+                  <el-switch v-model="value4" class="ml-2" style="--el-switch-on-color: #13ce66; --el-switch-off-color: #b2bec3" />
+                </div>
+              </div>
+              <div class="skip-functions" v-show="value4">
+                <el-input v-model="form.skip" placeholder="填写回调执行名称" />
+              </div>
+            </div>
+          </el-form-item>
+          <!-- <el-form-item label="发布时间" class="push-time">
             <el-radio-group v-model="form.radio3" class="radio-time" @change="timechange">
               <el-radio label="1">
                 立刻发布推送
@@ -57,6 +79,7 @@
         </el-form>
       </div>
       <!--基础信息end-->
+      <!--接受人群-->
       <div class="created-two" v-else-if="active===1">
         <p class="created-two-title">接收人群</p>
         <div class="candidate">
@@ -230,12 +253,156 @@
           <el-button type="primary" @click="active=2">下一步</el-button>
         </div>
       </div>
+      <!--接受人群end-->
+      <!--接收类型-->
+      <div class="created-three" v-else-if="active===2">
+        <p class="created-three-title">接收类型</p>
+        <div class="selecttype">
+          <div class="selectbox">
+            <div class="receivetype">
+              <div class="receivetype-title">接收类型:</div>
+              <div class="receivetype-select">
+                <el-checkbox-group v-model="checkList">
+                  <el-checkbox label="HiTeach" />
+                  <el-checkbox label="HiTA" />
+                  <el-checkbox label="IES5" />
+                </el-checkbox-group>
+              </div>
+            </div>
+            <!-- <div class="skip-switch">
+              <div class="skip-title">是否跳转地址</div>
+              <div class="skip-content">
+                <div>
+                  <el-switch v-model="value3" class="ml-2" style="--el-switch-on-color: #13ce66; --el-switch-off-color: #b2bec3" />
+                </div>
+              </div>
+              <div class="skip-url" v-show="value3">
+                <el-input v-model="form.skip" placeholder="填写跳转地址" />
+              </div>
+            </div> -->
+          </div>
+        </div>
+        <div class="guidebox">
+          <el-button @click="active=1">上一步</el-button>
+          <el-button type="primary" @click="active=3">下一步</el-button>
+        </div>
+      </div>
+      <!--接收类型end-->
+      <!--确认发布-->
+      <div class="notarizebox" v-else-if="active===3">
+        <p class="notarizebox-title">确认发布</p>
+        <div class="datumbox">
+          <div class="crowd">
+            <p class="result-title">接收人群</p>
+            <div class="crowdbox">
+              <el-tag class="crowd-tag" v-for="item in testpeople" :type="item.type" closable>
+                {{item.name}}
+              </el-tag>
+            </div>
+          </div>
+          <div class="type">
+            <p class="result-title">接收产品类型</p>
+            <div class="typebox">
+              <el-tag class="crowd-tag" v-for="item in testtype" :type="item.type" closable effect="dark" round>
+                {{item.name}}
+              </el-tag>
+            </div>
+          </div>
+          <div class="push-content">
+            <p class="result-title">消息内容</p>
+            <div class="pushbox-content">
+              <div class="pushcontent">
+                <el-form :model="form" class="created-one-form" label-position="left">
+                  <el-form-item label="消息主题" prop="theme">
+                    <el-input v-model="form.name" placeholder="请填写推送消息的主题" />
+                  </el-form-item>
+                  <el-form-item label="消息内容" prop="content">
+                    <el-input v-model="form.region" :autosize="{ minRows: 2, maxRows: 4 }" type="textarea" placeholder="推送消息的内容" />
+                  </el-form-item>
+                  <el-form-item label="消息类型" prop="content" class="form-type">
+                    <el-radio-group v-model="form.radio2" class="radio-type">
+                      <el-radio label="1">
+                        <el-tag type="info">普通型</el-tag>
+                      </el-radio>
+                      <el-radio label="2">
+                        <el-tag>提示型</el-tag>
+                      </el-radio>
+                      <el-radio label="3">
+                        <el-tag type="success">特殊型</el-tag>
+                      </el-radio>
+                    </el-radio-group>
+                  </el-form-item>
+                  <el-form-item label="是否跳转" prop="content" class="skip-switch">
+                    <div class="skip-switch">
+                      <!-- <div class="skip-title">是否跳转地址</div> -->
+                      <div class="skip-content">
+                        <div>
+                          <el-switch v-model="value3" class="ml-2" style="--el-switch-on-color: #13ce66; --el-switch-off-color: #b2bec3" />
+                        </div>
+                      </div>
+                      <div class="skip-url" v-show="value3">
+                        <el-input v-model="form.skip" placeholder="填写跳转地址" />
+                      </div>
+                    </div>
+                  </el-form-item>
+                  <el-form-item label="回调执行" prop="content" class="skip-switch">
+                    <div class="skip-switch">
+                      <!-- <div class="skip-title">是否跳转地址</div> -->
+                      <div class="skip-content">
+                        <div>
+                          <el-switch v-model="value4" class="ml-2" style="--el-switch-on-color: #13ce66; --el-switch-off-color: #b2bec3" />
+                        </div>
+                      </div>
+                      <div class="skip-functions" v-show="value4">
+                        <el-input v-model="form.skip" placeholder="填写回调执行名称" />
+                      </div>
+                    </div>
+                  </el-form-item>
+                </el-form>
+              </div>
+              <div class="pushtime">
+                <div class="source-box">
+                  <span>消息来源:</span>
+                  <el-radio-group v-model="form.radio3" class="radio-time" @change="timechange">
+                    <el-radio label="1">
+                      系统(BI)
+                    </el-radio>
+                    <el-radio label="2">
+                      IES5(代替)
+                    </el-radio>
+                    <el-radio label="2">
+                      HiTA(代替)
+                    </el-radio>
+                  </el-radio-group>
+                </div>
+                <div class="pushtime-box">
+                  <span>发布时间:</span>
+                  <el-radio-group v-model="form.radio3" class="radio-time" @change="timechange">
+                    <el-radio label="1">
+                      立刻发布推送
+                    </el-radio>
+                    <el-radio label="2">
+                      预约时间发布
+                    </el-radio>
+                  </el-radio-group>
+                  <el-date-picker v-model="form.timevalue" :locale="locale" type="datetime" placeholder="选择预约发布的时间" v-if="form.radio3 ==2" />
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="guidebox">
+          <el-button @click="active=2">上一步</el-button>
+          <el-button type="primary">确认发布</el-button>
+        </div>
+      </div>
+      <!--确认发布end-->
     </div>
   </div>
 
 </template>
 <script setup>
-import { ref, getCurrentInstance, defineProps, watch, defineExpose, onMounted, } from 'vue'
+import { ref, getCurrentInstance, watch, onMounted, } from 'vue'
 import { ArrowRight, Search } from '@element-plus/icons-vue'
 import zhCn from "element-plus/lib/locale/lang/zh-cn";
 let locale = zhCn
@@ -402,6 +569,58 @@ const options = [
     ],
   },
 ]
+const testpeople = [
+  { name: '人名测试', type: '' },
+  { name: '学校测试', type: 'success' },
+  { name: '学区测试', type: 'warning' },
+  { name: '人名测试', type: '' },
+  { name: '学校测试', type: 'success' },
+  { name: '学区测试', type: 'warning' },
+  { name: '人名测试', type: '' },
+  { name: '学校测试', type: 'success' },
+  { name: '学区测试', type: 'warning' },
+  { name: '人名测试', type: '' },
+  { name: '学校测试', type: 'success' },
+  { name: '学区测试', type: 'warning' },
+  { name: '人名测试', type: '' },
+  { name: '学校测试', type: 'success' },
+  { name: '学区测试', type: 'warning' },
+  { name: '人名测试', type: '' },
+  { name: '学校测试', type: 'success' },
+  { name: '学区测试', type: 'warning' },
+  { name: '人名测试', type: '' },
+  { name: '学校测试', type: 'success' },
+  { name: '学区测试', type: 'warning' },
+  { name: '人名测试', type: '' },
+  { name: '学校测试', type: 'success' },
+  { name: '学区测试', type: 'warning' },
+  { name: '人名测试', type: '' },
+  { name: '学校测试', type: 'success' },
+  { name: '学区测试', type: 'warning' },
+  { name: '学区测试', type: 'warning' },
+  { name: '人名测试', type: '' },
+  { name: '学校测试', type: 'success' },
+  { name: '学区测试', type: 'warning' },
+  { name: '人名测试', type: '' },
+  { name: '学校测试', type: 'success' },
+  { name: '学区测试', type: 'warning' },
+  { name: '人名测试', type: '' },
+  { name: '学校测试', type: 'success' },
+  { name: '学区测试', type: 'warning' },
+  { name: '学区测试', type: 'warning' },
+  { name: '人名测试', type: '' },
+  { name: '学校测试', type: 'success' },
+  { name: '学区测试', type: 'warning' },
+  { name: '人名测试', type: '' },
+  { name: '学校测试', type: 'success' },
+  { name: '学区测试', type: 'warning' },
+
+]
+const testtype = [
+  { name: 'HiTeach', type: '' },
+  { name: 'HiTA', type: 'success' },
+  { name: 'IES5', type: 'info' },
+]
 function timechange (val) {
   console.log(val)
 }
@@ -464,7 +683,7 @@ function searchSchool () {
   text-align: left !important;
 }
 .radio-time {
-  width: 50%;
+  /* width: 25%; */
   display: inline-block;
   text-align: left !important;
 }
@@ -602,6 +821,9 @@ function searchSchool () {
   height: 48.5vh;
   overflow-y: auto;
 }
+.next {
+  margin-top: 10%;
+}
 .result-item {
   display: flex;
   flex-wrap: nowrap;
@@ -649,6 +871,132 @@ function searchSchool () {
   align-items: center;
   margin-top: 2%;
 }
+.selecttype {
+  width: 90%;
+  height: 55vh;
+  margin: 0 auto;
+  border: 1px solid #ccc;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+/* .receivetype div,
+.skip-switch div {
+  display: inline-block;
+  line-height: 20px;
+  text-align: left;
+} */
+
+.skip-switch {
+  width: 100%;
+  display: flex;
+  line-height: 20px;
+  align-items: center;
+  /* padding-left: 30%; */
+  /* flex-wrap: wrap; */
+}
+.receivetype {
+  line-height: 20px;
+  align-items: center;
+}
+.skip-switch {
+  margin-top: 0%;
+}
+.selectbox {
+  width: 70%;
+  /* height: 20vh; */
+}
+.receivetype-title,
+.skip-title {
+  font-size: 16px;
+  color: #b2bec3;
+}
+.receivetype-select {
+  margin-left: 3%;
+  padding-top: 1%;
+}
+.skip-content {
+  display: flex;
+  flex-wrap: wrap;
+  width: 18%;
+}
+.skip-content div {
+  margin-left: 2%;
+  padding-top: 0.2%;
+}
+.skip-url {
+  width: 80%;
+}
+.notarizebox-title {
+  font-size: 16px;
+  font-weight: bold;
+}
+.datumbox {
+  width: 90%;
+  height: 55vh;
+  margin: 0 auto;
+  border: 1px solid #ccc;
+  display: flex;
+  flex-direction: row;
+  flex-wrap: wrap;
+  line-height: 20px;
+}
+
+.type {
+  width: 35%;
+  height: 35%;
+}
+.crowd {
+  width: 65%;
+  height: 35%;
+  overflow: hidden;
+}
+.crowd {
+  border-right: 1px solid #ccc;
+}
+.push-content {
+  width: 100%;
+  height: 65%;
+  border-top: 1px solid #ccc;
+}
+.result-title {
+  font-size: 14px;
+  color: #b2bec3;
+  line-height: 28px;
+  position: sticky;
+  margin-bottom: 10px;
+  border-bottom: 1px dashed #ccc;
+  box-shadow: 0 2px 5px #e9e9e9;
+}
+.crowdbox {
+  margin: 1%;
+  /* border: 1px solid #ccc; */
+  line-height: 20px;
+  overflow-y: auto;
+  height: 15vh;
+}
+.crowd-tag {
+  margin: 0.5% 0.2%;
+}
+.pushcontent {
+  width: 85%;
+  margin: 0 auto;
+}
+.pushtime {
+  width: 85%;
+  margin: 0 auto;
+  font-weight: bold;
+  color: #409eff;
+  display: flex;
+  justify-content: space-between;
+}
+.skip-functions {
+  width: 50%;
+}
+.source-box {
+  width: 45%;
+  text-align: left;
+}
 </style>
 <style>
 .skip-switch .el-form-item__content {
@@ -658,7 +1006,7 @@ function searchSchool () {
   text-align: left;
 }
 .created-one-form .el-form-item {
-  margin-bottom: 25px;
+  margin-bottom: 15px;
 }
 .next button {
   padding: 1% 15%;
@@ -688,4 +1036,7 @@ function searchSchool () {
 .result-item .el-checkbox {
   margin-bottom: 0px;
 }
+.next .el-form-item__content {
+  justify-content: center;
+}
 </style>

+ 3 - 3
TEAMModelBI/ClientApp/src/view/systemConfig/pushmsg/index.vue

@@ -2,10 +2,10 @@
   <div class="msgbox">
     <div class="header">
       <div class="block">
-        <el-date-picker v-model="value1" type="daterange" range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" size="small" :locale="locale" :disabled-date="disabledDate" />
+        <el-date-picker v-model="value1" type="daterange" range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" :locale="locale" :disabled-date="disabledDate" />
       </div>
       <div>
-        <el-button type="primary" size="small" @click="skipcreated">
+        <el-button type="primary" @click="skipcreated">
           <el-icon>
             <ChatDotSquare />
           </el-icon>
@@ -50,7 +50,7 @@
   </div>
 </template>
 <script setup>
-import { ref, getCurrentInstance, defineProps, watch, defineExpose, onMounted, } from 'vue'
+import { ref, getCurrentInstance, watch, onMounted, } from 'vue'
 import { ChatDotSquare } from '@element-plus/icons-vue'
 import zhCn from "element-plus/lib/locale/lang/zh-cn";
 import { useRouter } from 'vue-router'

+ 16 - 4
TEAMModelBI/ClientApp/src/view/systemConfig/setAdmin.vue

@@ -32,7 +32,7 @@
             <div class="hint"><span>请输入用户</span><span class="emphasize">手机号、醍摩豆账号</span><span>等相关信息进行搜索</span></div>
             <div class="search-box">
               <!-- <input class="search-txt" type="text" id="serachname" :value="filterText" placeholder="搜索相关人名" @oninput="personnelSearch()" @compositionend="personnelSearch()"> -->
-              <el-input v-model="adminfilter" placeholder="Please input" class="search-txt" />
+              <el-input v-model="adminfilter" placeholder="输入手机号、醍摩豆账号搜索" class="search-txt" />
               <svg class="serachbox-empty" aria-hidden="true" v-if="adminfilter !==''" @click="adminfilter=''">
                 <use xlink:href="#icon-qingkong"></use>
               </svg>
@@ -375,12 +375,12 @@ export default {
   opacity: 1;
   width: 100%;
   /* padding: 0px; */
-  height: 30px !important;
-  line-height: 30px;
+  height: 25px !important;
+  line-height: 25px;
   border: 0px;
   background-color: #bdc3c7;
   vertical-align: top;
-  border-radius: 8px;
+  /* border-radius: 8px; */
   padding-bottom: 10px;
   color: #333 !important;
 }
@@ -391,6 +391,18 @@ export default {
 .headerPhoto .el-image {
   display: block;
 }
+.search-box .el-input__wrapper {
+  background: #bdc3c7;
+  padding: 0px;
+}
+.search-box .el-input__wrapper:hover {
+  border: 0px;
+  box-shadow: 0px 0px 0px 0px transform;
+}
+.search-box .el-input__wrapper .is-focues {
+  border: 0px;
+  box-shadow: 0px 0px 0px 0px transform;
+}
 </style>
 
 

+ 14 - 7
TEAMModelBI/ClientApp/src/view/teachermanage/manage.vue

@@ -15,7 +15,7 @@
         </div> -->
     <div class="search-box">
       <!-- <input class="search-txt" type="text" id="serachname" :value="filterText" placeholder="搜索相关人名" @oninput="personnelSearch()" @compositionend="personnelSearch()"> -->
-      <el-input v-model="filterText" placeholder="Please input" class="search-txt" />
+      <el-input v-model="filterText" placeholder="搜索相关人名" class="search-txt" />
       <svg class="serachbox-empty" aria-hidden="true" @click="filterText='',valueinfo='all'">
         <use xlink:href="#icon-qingkong"></use>
       </svg>
@@ -38,7 +38,7 @@
   <div class="manage-table">
     <el-table :data="tableData" style="width: 100%" height="85vh" v-loading="loading" element-loading-text="数据加载中..." class="customer-table" :empty-text='$t(`personnelManagement.personnelTable.nodatas`)'>
       <el-table-column prop="id" :label="$t(`personnelManagement.personnelTable.serialnum`)" sortable align="center" class="tables-numstate" />
-      <el-table-column width="40">
+      <el-table-column width="60">
         <template #default="scope">
           <div class="tables-state" title="更新同步该人员信息" v-show="scope.row.tmdMobile !== scope.row.mobile && (scope.row.tmdMobile && scope.row.mobile)" @click="synchronizationAlone(scope.row)">
             <svg class="areaaddschool" aria-hidden="true">
@@ -86,7 +86,7 @@
       <el-table-column prop="title" label="公司职位" align="center" />
       <el-table-column :label="$t(`personnelManagement.personnelTable.operate`)" align="center">
         <template #default="scope">
-          <el-button type="primary" size="small" @click="handleClick(scope.$index,tableData)">
+          <el-button type="primary" @click="handleClick(scope.$index,tableData)">
             <svg class="qxmages" aria-hidden="true">
               <use xlink:href="#icon-quanxianguanli-"></use>
             </svg>
@@ -503,7 +503,7 @@ export default {
     function synchronizationAlone (val) {
       console.log(val, '8888')
       loading.value = true
-      let data = { "partitionKey": val.partitionKey, "rowKey": val.rowKey }
+      let data = { "partitionKey": val.partitionKey, "rowKey": val.rowKey, role: val.handleRoles[0] || '' }
       proxy.$api.updateAlone(data).then((res) => {
         console.log(res, '同步返回')
         if (res.state === 200) {
@@ -862,7 +862,7 @@ export default {
   border: 0px;
   background-color: #bdc3c7;
   vertical-align: top;
-  border-radius: 8px;
+  /* border-radius: 8px; */
   color: #333;
 }
 .search-box:hover .el-input__inner {
@@ -885,8 +885,8 @@ export default {
   right: 4px;
 }
 .personnel-drawer .el-drawer.rtl {
-  top: 5.5%;
-  height: 94.5vh;
+  top: 6%;
+  height: 94vh;
 }
 .personnel-drawer .el-drawer__header {
   line-height: 20px;
@@ -906,4 +906,11 @@ export default {
 .cell .tables-state {
   display: inline-block;
 }
+.search-box .el-input__wrapper {
+  background: #bdc3c7;
+  padding: 0px;
+}
+.search-txt .el-input__wrapper .is-focues {
+  border: 0px;
+}
 </style>

+ 1 - 1
TEAMModelBI/Controllers/Census/SchoolController.cs

@@ -751,7 +751,7 @@ namespace TEAMModelBI.Controllers.Census
             jsonElement.TryGetProperty("tmdId", out JsonElement tmdId);
             jsonElement.TryGetProperty("areaId", out JsonElement areaId);
 
-            StringBuilder sql = new($"select value(c.id) from c");
+            StringBuilder sql = new($"select value(c) from c");
 
             if (!string.IsNullOrEmpty($"{role}") && !string.IsNullOrEmpty($"{tmdId}") && string.IsNullOrEmpty($"{areaId}"))
             {

+ 2 - 2
TEAMModelOS.FunctionV4/ServiceBus/ActiveTaskTopic.cs

@@ -303,7 +303,7 @@ namespace TEAMModelOS.FunctionV4.ServiceBus
                         if (!exist)
                         {   ///key不存在则正常进行计算
                             bool condition = false;
-                            TimeSpan timeSpan = new TimeSpan(DateTimeOffset.UtcNow.AddMinutes(5).Ticks);
+                            TimeSpan timeSpan = new TimeSpan(DateTimeOffset.UtcNow.AddMinutes(15).Ticks);
                             timeSpan = timeSpan - new TimeSpan(DateTimeOffset.UtcNow.Ticks);
                             //准备处理Blob刷新时间
                             long action = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
@@ -327,7 +327,7 @@ namespace TEAMModelOS.FunctionV4.ServiceBus
                         else
                         {
                             ///key存在则,则刷新key对应的值
-                            TimeSpan timeSpan = new TimeSpan(DateTimeOffset.UtcNow.AddMinutes(5).Ticks);
+                            TimeSpan timeSpan = new TimeSpan(DateTimeOffset.UtcNow.AddMinutes(15).Ticks);
                             timeSpan = timeSpan - new TimeSpan(DateTimeOffset.UtcNow.Ticks);
                             long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
                             await _azureRedis.GetRedisClient(8).StringSetAsync(lockKey, now, expiry: timeSpan);

+ 1 - 1
TEAMModelOS.SDK/DI/CoreAPI/CoreAPIHttpService.cs

@@ -256,7 +256,7 @@ namespace TEAMModelOS.SDK
                             dynamic action  = new ExpandoObject();
                             //处理action
                             string urlAction = "";
-                            if (notifyCode.Equals("request_school") || notifyCode.Equals("invite_school")) {
+                            if (notifyCode.Equals("request_school") || notifyCode.Equals("invite_school")|| notifyCode.Equals("quit_school")) {
                                 if (site.Equals("Global")) {
                                     urlAction = "https://www.teammodel.net/core/process-notify";
                                 }

+ 3 - 0
TEAMModelOS/ClientApp/public/lang/en-US.js

@@ -2098,6 +2098,7 @@ const LANG_EN_US = {
         error401: 'Login status has expired! Please log in again!',
         error400: 'API ERROR',
         error404: 'API address not accessed!',
+        error501: 'Do not request frequently',
         error: 'Network Error! please try again later!',
         loading: 'Loading...',
         error403: 'Authorization expired or authorization abnormal, please try again later!'
@@ -3947,6 +3948,7 @@ const LANG_EN_US = {
         goSchool: 'Go to school',
         agreeJoin: 'Agree to join',
         cancelAdd: 'Decline to join',
+        exit: 'quit school',
         undoJoin: 'Withdraw request',
         requestJoin: 'Request to join',
         applyManager: 'Apply for School Management',
@@ -3959,6 +3961,7 @@ const LANG_EN_US = {
         modalTip7: 'Confirm to set',
         modalTip8: 'as your default school?',
         modalTip9: 'Are you sure you want to switch school?',
+        modalTip10: 'Are you sure to apply to quit',
         columnName: 'School Name',
         columnArea: 'Area',
         columnId: 'School Short Code',

+ 3 - 0
TEAMModelOS/ClientApp/public/lang/zh-CN.js

@@ -2098,6 +2098,7 @@ const LANG_ZH_CN = {
         error401: '登录状态已过期!请重新登录!',
         error404: '未访问到API地址!',
         error400: '请求异常,请稍后重试!',
+        error501: '请勿频繁发起请求',
         error: '网络异常,请稍后重试!',
         loading: '加载中',
         error403: '授权过期或授权异常,请稍后重试!'
@@ -3948,6 +3949,7 @@ const LANG_ZH_CN = {
         requestStatus: '送出添加邀请',
         setDefault: '设为预设学校',
         goSchool: '前往学校',
+        exit: '退出学校',
         agreeJoin: '同意加入',
         cancelAdd: '拒绝加入',
         undoJoin: '撤销申请',
@@ -3962,6 +3964,7 @@ const LANG_ZH_CN = {
         modalTip7: '确认将',
         modalTip8: '设置为您的默认学校?',
         modalTip9: '确定要切换学校吗?',
+        modalTip10: '确定要申请退出',
         columnName: '学校名称',
         columnArea: '地区',
         columnId: '校代码',

+ 3 - 0
TEAMModelOS/ClientApp/public/lang/zh-TW.js

@@ -2100,6 +2100,7 @@ const LANG_ZH_TW = {
         error401: '登入狀態已過期!請重新登入!',
         error404: '未呼叫到API位址!',
         error400: '請求異常,請稍後重試!',
+        error501: '請勿頻繁發起請求',
         error: '網路異常,請稍後重試!',
         loading: '處理中',
         error403: '授權過期或授權異常,請稍後重試!'
@@ -3963,6 +3964,8 @@ const LANG_ZH_TW = {
         modalTip7: '確認將',
         modalTip8: '設定為您的預設學校?',
         modalTip9: '確定要切換學校嗎?',
+        modalTip10: '確定要申請退出',
+        exit: '退出學校',
         columnName: '學校名稱',
         columnArea: '地區',
         columnId: '學校簡碼',

+ 1 - 1
TEAMModelOS/ClientApp/src/api/http.js

@@ -150,7 +150,7 @@ axios.interceptors.response.use(
         } else if (error.response.status === 404) {
             Message.error(app.$t('http.error404'))
         } else if (error.response.status === 501) {
-            Message.error(`请勿频繁发起请求`)
+            Message.error(app.$t('http.error501'))
         } else {
             Message.error(app.$t('http.error400'))
         }

+ 8 - 0
TEAMModelOS/ClientApp/src/api/schoolSetting.js

@@ -1,5 +1,8 @@
 import { fetch, post } from '@/api/http'
 export default {
+    notifyAction: function (data) {
+        return fetch('/core/process-notify', data)
+    },
     schoolSettingSaveOrUpdate: function (data) {
         return post('/school/init/upsert', data)
     },
@@ -43,6 +46,11 @@ export default {
         return post('/teacher/init/join-school', data)
     },
 
+    // 申请退出学校
+    exitSchool: function (data) {
+        return post('/teacher/init/set-teacher-info', data)
+    },
+
     //保存分组信息
     upsertGroup: function (data) {
         return post('/school/classroom/upsert-group', data)

+ 7 - 2
TEAMModelOS/ClientApp/src/common/AbilityUpload.vue

@@ -114,6 +114,11 @@ export default {
         return false;
       }
 
+      if (!file.name.includes('.')) {
+        this.$Message.warning('文件名异常,请检查后重试!');
+        return false;
+      }
+
       if (this.fileArr.length >= this.limit && this.mode === 'modal') {
         this.$Message.warning(`当前任务目前只能提交${this.limit}个文件!`);
         return false
@@ -133,7 +138,7 @@ export default {
         return false
       }
 
-      if(['mp4','mp3','ogg','wav','webm'].includes(nameType.toLowerCase())){
+      if (['mp4', 'mp3', 'ogg', 'wav', 'webm'].includes(nameType.toLowerCase())) {
         /* 检查上传媒体文件编码信息是否符合要求 */
         let checkMediaFile = await this.$tools.checkMediaFile(file)
         if (!checkMediaFile) {
@@ -141,7 +146,7 @@ export default {
           return false
         }
       }
-      
+
       if (this.classMemoir) {
         this.$emit('selectFinish', file);
       }

+ 48 - 0
TEAMModelOS/ClientApp/src/common/BaseNotification.vue

@@ -24,6 +24,11 @@
             <span>{{ item.content }}</span>
             <span class="item-time" :title="$tools.formatTime(item.ts * 1000)">{{ getMsgTime(item) }}</span>
           </p>
+          <div class="action" v-if="item.label === 'quit_school'">
+            <span class="action-item" v-for="(action,actionIndex) in item.action" @click.stop="doAction(action,item,index)">
+              <Icon :type="actionIndex === 0 ? 'md-checkmark' : 'md-close'" :color="actionIndex === 0 ? '#17ac5a' : '#ff0000'" />{{ action.label }}
+            </span>
+          </div>
         </div>
       </div>
     </Drawer>
@@ -62,6 +67,32 @@ export default {
     }
   },
   methods: {
+    doAction(item, msg, msgIndex) {
+      item.url = item.url.replaceAll(':', '=')
+      console.log(item.url)
+      console.log(this.getParam(item.url, 'data'))
+      this.$api.schoolSetting.notifyAction({
+        notifyCode: this.getParam(item.url, 'notifyCode'),
+        data: this.getParam(item.url, 'data'),
+        notifyEvent: this.getParam(item.url, 'notifyEvent'),
+        ticket: this.getParam(item.url, 'ticket'),
+        token: localStorage.getItem('auth_token')
+      }).then(res => {
+        if (res.code === 2) {
+          this.$Message.success(res.msg)
+        } else {
+          this.$Message.warning(res.msg)
+        }
+        this.doDeleteMsg(msg, msgIndex)
+      })
+    },
+    /* 获取URL参数 */
+    getParam(path, name) {
+      var reg = new RegExp("(^|\\?|&)" + name + "=([^&]*)(\\s|&|$)", "i");
+      if (reg.test(path))
+        return unescape(RegExp.$2.replace(/\+/g, " "));
+      return "";
+    },
     /* 打开抽屉 */
     openDrawer() {
       this.isOpen = true
@@ -358,6 +389,7 @@ export default {
           //   return i.body.location === curLocation
           // })
         }
+        console.error('通知', this.msgArr)
       }
     },
     '$store.state.studentWeb.lang'(language) {
@@ -450,6 +482,22 @@ export default {
       color: var(--primary-text-color);
       border-bottom: 1px solid #e8eaec;
       cursor: pointer;
+
+      .action {
+        position: absolute;
+        left: 10px;
+        bottom: 10px;
+
+        .action-item {
+          margin-left: 10px;
+
+          .ivu-icon {
+            font-size: 16px;
+            margin-right: 2px;
+          }
+        }
+      }
+
       .item-name {
         font-size: 16px;
         font-weight: bold;

+ 4 - 0
TEAMModelOS/ClientApp/src/common/BaseUpload.vue

@@ -68,6 +68,10 @@ export default {
   },
   methods: {
     async onBeforeUpload(file) {
+      if (!file.name.includes('.')) {
+        this.$Message.warning('文件名异常,请检查后重试!');
+        return false;
+      }
       let nameType = file.name.split('.')[file.name.split('.').length - 1]
       if (this.$GLOBAL.NotSupport.includes(nameType.toUpperCase())) {
         this.$Message.warning(this.$t('learnActivity.notSupportType')); // 黑名单文件格式不能上传

+ 4 - 4
TEAMModelOS/ClientApp/src/components/research-dashboard/BaseTechBar.vue

@@ -13,7 +13,7 @@ export default {
       let myChart = this.$echarts.init(document.getElementById('baseTechBar'))
       var echartsData = {
         title: 'title',
-        city: [this.$t('lessonRecord.mgt.cooperation'), this.$t('lessonRecord.mgt.diffential'), this.$t('lessonRecord.mgt.exam'), this.$t('lessonRecord.mgt.interaction'), this.$t('lessonRecord.mgt.task')],
+        city: [this.$t('lessonRecord.mgt.interaction'), this.$t('lessonRecord.mgt.cooperation'), this.$t('lessonRecord.mgt.exam'), this.$t('lessonRecord.mgt.task'), this.$t('lessonRecord.mgt.diffential')],
         legend: data.legend,
         data: data.data,
         total: data.total,
@@ -144,14 +144,14 @@ export default {
     let echartJson = {
       legend: pieJson.teachingCount.map(i => i.name),
       data: pieJson.teachingCount.map(i => {
-        return [i.cooperation, i.diffential, i.exam, i.interaction, i.task]
+        return [i.interaction, i.cooperation, i.exam, i.task, i.diffential]
       }),
       total: [
+        pieJson.teachingCount.reduce((a, b) => a + b.interaction, 0),
         pieJson.teachingCount.reduce((a, b) => a + b.cooperation, 0),
-        pieJson.teachingCount.reduce((a, b) => a + b.diffential, 0),
         pieJson.teachingCount.reduce((a, b) => a + b.exam, 0),
-        pieJson.teachingCount.reduce((a, b) => a + b.interaction, 0),
         pieJson.teachingCount.reduce((a, b) => a + b.task, 0),
+        pieJson.teachingCount.reduce((a, b) => a + b.diffential, 0),
       ]
     }
     console.error(echartJson)

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

@@ -1035,7 +1035,7 @@
                     return this.getItemTitle.progress
                 } */
                 // 艺术评测要求活动结束才能展示得分
-                if(this.getItemTitle.type === "Atr") {
+                /* if(this.getItemTitle.type === "Atr") {
                     return this.getItemTitle.progress
                 } else {
                     if(this.examInfo.taskStatus === 1) {
@@ -1043,8 +1043,9 @@
                     } else {
                         return this.getItemTitle.progress
                     }
-                }
-                
+                } */
+                // #2384 评测结束才能展示得分
+                return this.getItemTitle.progress
             },
         },
         watch: {

+ 24 - 10
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperViewBox/PaperTest.vue

@@ -660,19 +660,13 @@
                                 let codes = []
                                 let options = item.option.map(ans => {
                                     ans.key = ans.code
-                                    console.log(item.answer.includes(ans.code));
                                     codes.push(ans.code)
                                     return ans
                                 })
                                 // 打乱选项顺序
-                                let newOpt = []
-                                for (let i = 0; i < options.length; i++) {
-                                    let num = Math.floor(Math.random() * (options.length))
-                                    newOpt.push(options[num])
-                                    options.splice(num, 1)
-                                }
-                                // 得到新的选项顺序
-                                options = options.concat(newOpt)
+                                options = options.sort((a, b) => {
+                                    return Math.random() > 0.5 ? -1 : 1
+                                })
                                 // 重新编号
                                 options.forEach((option, index) => {
                                     option.code = codes[index]
@@ -694,12 +688,32 @@
                     }
                     this.examInfo = [...wrongData]
                 } else {
-                    // 艺术评测作答需要打乱题目顺序
+                    // #2382 艺术评测作答需要打乱题目顺序、选项顺序
                     let artExam = JSON.parse(localStorage.getItem("artExam"))
                     if(artExam === 1) {
                         let newExam = paper.sort((a, b) => {
                             return Math.random() > 0.5 ? -1 : 1
                         })
+                        newExam.forEach(item => {
+                            // 单选、多选
+                            if(item.type === "single" || item.type === "multiple") {
+                                let codes = []
+                                let options = item.option.map(ans => {
+                                    ans.key = ans.code
+                                    codes.push(ans.code)
+                                    return ans
+                                })
+                                // 打乱选项顺序
+                                options = options.sort((a, b) => {
+                                    return Math.random() > 0.5 ? -1 : 1
+                                })
+                                // 重新编号
+                                options.forEach((option, index) => {
+                                    option.code = codes[index]
+                                })
+                                item.option = options
+                            }
+                        })
                         this.examInfo = [...newExam]
                     } else {
                         this.examInfo = [...paper]

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

@@ -250,6 +250,7 @@ export default {
           i.content = i.body
           i.indexNum = i.index
           i.body = JSON.parse(this.getBodyJson(i.data)).value
+          i.action = JSON.parse(this.getBodyJson(i.data)).action
           i.label = i.body.notifyCode
 
         })

+ 1 - 1
TEAMModelOS/ClientApp/src/view/classrecord/eventchart/PopQues.vue

@@ -72,7 +72,7 @@ export default {
                 5: ['A', 'B', 'C', 'D', 'E'],
                 6: ['A', 'B', 'C', 'D', 'E', 'F'],
                 7: ['A', 'B', 'C', 'D', 'E', 'F', 'G'],
-                9: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'],
+                8: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'],
                 9: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']
             }
         }

+ 2 - 1
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseImport.vue

@@ -440,7 +440,8 @@ export default {
   computed: {
     headers() {
       let hd = {}
-      hd['Authorization'] = 'Bearer ' + localStorage.getItem('token')
+      hd['Authorization'] = 'Bearer ' + localStorage.getItem('access_token')
+      hd['X-Auth-AuthToken'] = localStorage.getItem('auth_token')
       return hd
     },
     /* 判断是否为国际站 */

+ 434 - 432
TEAMModelOS/ClientApp/src/view/login/page/Teacher.vue

@@ -4,208 +4,208 @@
 
 <style lang="less">
 .login-input-box .ivu-input {
-    border-radius: 25px;
-    line-height: 35px;
-    height: 35px;
-    padding: 0px 15px;
+  border-radius: 25px;
+  line-height: 35px;
+  height: 35px;
+  padding: 0px 15px;
 }
 .login-input-box .ivu-input-prefix i,
 .login-input-box .ivu-input-suffix i {
-    line-height: 35px;
+  line-height: 35px;
 }
 .loginBox {
-    .loginForm {
-        .formItem {
-            input,
-            select {
-                border-radius: 0;
-                font-size: 12px;
-            }
-            .ivu-select-selection {
-                border-radius: 0;
-            }
-        }
-        .schoolAutoComplete {
-            height: 170px;
-            .schoolsBox {
-                border-bottom: 1px solid #e9e9e9;
-                padding: 5px 5px 5px 15px;
-                .area {
-                    font-size: 12px;
-                    padding: 5px;
-                }
-            }
-        }
-        .ivu-select-dropdown {
-            border-radius: 0;
+  .loginForm {
+    .formItem {
+      input,
+      select {
+        border-radius: 0;
+        font-size: 12px;
+      }
+      .ivu-select-selection {
+        border-radius: 0;
+      }
+    }
+    .schoolAutoComplete {
+      height: 170px;
+      .schoolsBox {
+        border-bottom: 1px solid #e9e9e9;
+        padding: 5px 5px 5px 15px;
+        .area {
+          font-size: 12px;
+          padding: 5px;
         }
+      }
+    }
+    .ivu-select-dropdown {
+      border-radius: 0;
     }
+  }
 }
 .identityModal {
-    .ivu-modal {
-        .ivu-modal-content {
-            background-color: #2a292e;
-            padding: 12px;
-            border: 1px solid #ccc;
-            .ivu-modal-header,
-            .ivu-modal-footer {
-                border: 0;
-            }
-            .ivu-modal-footer {
-                padding: 0;
-            }
-            .ivu-modal-header {
-                padding: 5px 16px;
-                p {
-                    color: whitesmoke;
-                }
-            }
-            .identity-body {
-                display: flex;
-                justify-content: space-around;
-                align-items: center;
-                .ivu-btn {
-                    background-color: #1cc0f2;
-                    color: white;
-                    font-weight: bold;
-                    border: 0;
-                    padding: 0 22px;
-                }
-            }
+  .ivu-modal {
+    .ivu-modal-content {
+      background-color: #2a292e;
+      padding: 12px;
+      border: 1px solid #ccc;
+      .ivu-modal-header,
+      .ivu-modal-footer {
+        border: 0;
+      }
+      .ivu-modal-footer {
+        padding: 0;
+      }
+      .ivu-modal-header {
+        padding: 5px 16px;
+        p {
+          color: whitesmoke;
+        }
+      }
+      .identity-body {
+        display: flex;
+        justify-content: space-around;
+        align-items: center;
+        .ivu-btn {
+          background-color: #1cc0f2;
+          color: white;
+          font-weight: bold;
+          border: 0;
+          padding: 0 22px;
         }
+      }
     }
+  }
 }
 .demo-spin-col .ivu-spin-main {
-    background-color: transparent;
-    padding: 0;
+  background-color: transparent;
+  padding: 0;
 }
 .login-divider::before {
-    border-color: #aaaaaa !important;
+  border-color: #aaaaaa !important;
 }
 .login-divider::after {
-    border-color: #aaaaaa !important;
+  border-color: #aaaaaa !important;
 }
 
 @media (max-width: 600px) {
-  .left-box{
+  .left-box {
     display: none !important;
   }
 }
 </style>
 
 <template>
-    <div class="loginDiv">
-        <div class="left-box">
-            <!-- 这张图片需要裁剪顶部 -->
-            <img src="@/assets/login/icon_teacher.svg" class="teacher-login-img">
-            <p class="client-label">
-                {{$t('login.teaCli')}}
-            </p>
+  <div class="loginDiv">
+    <div class="left-box">
+      <!-- 这张图片需要裁剪顶部 -->
+      <img src="@/assets/login/icon_teacher.svg" class="teacher-login-img">
+      <p class="client-label">
+        {{$t('login.teaCli')}}
+      </p>
+    </div>
+    <div class="right-box" v-show="!qrloginFlag">
+      <p class="teacher-login-title">
+        {{$t('login.title.IDLogin')}}
+      </p>
+      <p class="teacher-login-decr">
+        {{$t('login.subTitle.IDLogin')}}
+      </p>
+      <Form class="loginForm" ref="loginForm" :model="loginForm" :rules="loginRule" :show-message="false" @keydown.enter.native="loginSubmit('loginForm')">
+        <FormItem class="formItem" prop="id">
+          <Input element-id="tmdID" class="login-input-box" v-model="loginForm.id" :placeholder="$t('login.placeholder.id')" />
+        </FormItem>
+        <FormItem class="formItem" prop="pass">
+          <Input element-id="tmdpw" class="login-input-box" type="password" v-model="loginForm.pass" :placeholder="$t('login.placeholder.psw')">
+          <Icon size="24" color="#2d8cf0" v-show="!loading && loginFormEnter" @click="loginSubmit('loginForm')" type="md-arrow-forward" slot="suffix" class="iconFrame" />
+          <div v-show="loading" class="demo-spin-col" slot="suffix">
+            <Spin>
+              <Icon type="ios-loading" size="18" class="demo-spin-icon-load"></Icon>
+            </Spin>
+          </div>
+          </Input>
+        </FormItem>
+        <div class="errlable">{{ loginErrText }}</div>
+      </Form>
+      <p class="form-bottom">
+        <span class="qrcode-login" @click="chgLoginType()">
+          <Icon size="14" custom="iconfont icon-qr-code" color="#2d8cf0" style="vertical-align: text-bottom;" />
+          {{ $t('login.link.QRLogin') }}
+        </span>
+        <router-link to="/forgotpw" href="" class="form-bottom-link">
+          {{$t('login.link.forgetPsw')}}
+        </router-link>
+        <router-link :to="{path:'/regist',query:routerData}" class="form-bottom-link">
+          {{$t('login.link.regist')}}
+        </router-link>
+      </p>
+      <!-- 分割线 -->
+      <Divider class="login-divider">{{$t('login.communy.title')}}</Divider>
+      <div class="other-login-box" style="margin-top:0px">
+        <!-- 钉钉暂时不加 -->
+        <div class="other-login-item" @click="oauthLogin('dingding')" v-if="srvAdr == 'China'">
+          <Icon custom="iconfont icon-dingding" class="other-login-icon" />
+          <p class="other-login-text">
+            {{$t('login.communy.dingding')}}
+          </p>
+        </div>
+        <!-- facebook -->
+        <div class="other-login-item" @click="oauthLogin('facebook')" v-if="srvAdr == 'Global'">
+          <Icon type="logo-facebook" class="other-login-icon" />
+          <p class="other-login-text">
+            {{$t('login.communy.fb')}}
+          </p>
         </div>
-        <div class="right-box" v-show="!qrloginFlag">
-            <p class="teacher-login-title">
-                {{$t('login.title.IDLogin')}}
-            </p>
-            <p class="teacher-login-decr">
-                {{$t('login.subTitle.IDLogin')}}
-            </p>
-            <Form class="loginForm" ref="loginForm" :model="loginForm" :rules="loginRule" :show-message="false" @keydown.enter.native="loginSubmit('loginForm')">
-                <FormItem class="formItem" prop="id">
-                    <Input element-id="tmdID" class="login-input-box" v-model="loginForm.id" :placeholder="$t('login.placeholder.id')" />
-                </FormItem>
-                <FormItem class="formItem" prop="pass">
-                    <Input element-id="tmdpw" class="login-input-box" type="password" v-model="loginForm.pass" :placeholder="$t('login.placeholder.psw')">
-                    <Icon size="24" color="#2d8cf0" v-show="!loading && loginFormEnter" @click="loginSubmit('loginForm')" type="md-arrow-forward" slot="suffix" class="iconFrame" />
-                    <div v-show="loading" class="demo-spin-col" slot="suffix">
-                        <Spin>
-                            <Icon type="ios-loading" size="18" class="demo-spin-icon-load"></Icon>
-                        </Spin>
-                    </div>
-                    </Input>
-                </FormItem>
-                <div class="errlable">{{ loginErrText }}</div>
-            </Form>
-            <p class="form-bottom">
-                <span class="qrcode-login" @click="chgLoginType()">
-                    <Icon size="14" custom="iconfont icon-qr-code" color="#2d8cf0" style="vertical-align: text-bottom;" />
-                    {{ $t('login.link.QRLogin') }}
-                </span>
-                <router-link to="/forgotpw" href="" class="form-bottom-link">
-                    {{$t('login.link.forgetPsw')}}
-                </router-link>
-                <router-link :to="{path:'/regist',query:routerData}" class="form-bottom-link">
-                    {{$t('login.link.regist')}}
-                </router-link>
-            </p>
-            <!-- 分割线 -->
-            <Divider class="login-divider">{{$t('login.communy.title')}}</Divider>
-            <div class="other-login-box" style="margin-top:0px">
-                <!-- 钉钉暂时不加 -->
-                <div class="other-login-item" @click="oauthLogin('dingding')" v-if="srvAdr == 'China'">
-                    <Icon custom="iconfont icon-dingding" class="other-login-icon" />
-                    <p class="other-login-text">
-                        {{$t('login.communy.dingding')}}
-                    </p>
-                </div>
-                <!-- facebook -->
-                <div class="other-login-item" @click="oauthLogin('facebook')" v-if="srvAdr == 'Global'">
-                    <Icon type="logo-facebook" class="other-login-icon" />
-                    <p class="other-login-text">
-                        {{$t('login.communy.fb')}}
-                    </p>
-                </div>
-                <!-- google -->
-                <div class="other-login-item" @click="oauthLogin('google')" v-if="srvAdr == 'Global'">
-                    <Icon custom="iconfont icon-google" class="other-login-icon" />
-                    <p class="other-login-text">
-                        {{$t('login.communy.google')}}
-                    </p>
-                </div>
-                <!-- 微信 -->
-                <div class="other-login-item" @click="oauthLogin('wechat')" v-if="srvAdr == 'China'">
-                    <Icon custom="iconfont icon-wechat" class="other-login-icon" />
-                    <p class="other-login-text">
-                        {{$t('login.communy.wechat')}}
-                    </p>
-                </div>
+        <!-- google -->
+        <div class="other-login-item" @click="oauthLogin('google')" v-if="srvAdr == 'Global'">
+          <Icon custom="iconfont icon-google" class="other-login-icon" />
+          <p class="other-login-text">
+            {{$t('login.communy.google')}}
+          </p>
+        </div>
+        <!-- 微信 -->
+        <div class="other-login-item" @click="oauthLogin('wechat')" v-if="srvAdr == 'China'">
+          <Icon custom="iconfont icon-wechat" class="other-login-icon" />
+          <p class="other-login-text">
+            {{$t('login.communy.wechat')}}
+          </p>
+        </div>
+      </div>
+    </div>
+    <div class="right-box" v-show="qrloginFlag">
+      <div style="width:fit-content;margin: auto;">
+        <div class="title">
+          <div class="logo">
+            <img width="15" height="15" src="@/assets/icon/tmd_account.svg">
+          </div>
+          <h4 class="text">
+            {{ qrloginFlag ? $t('login.title.QRLogin'): $t('login.title.IDLogin') }}
+          </h4>
+          <Tooltip class="tooltip" placement="right-end" :transfer="true" max-width="200">
+            <img src="@/assets/icon/icon_info.svg" width="15" height="15">
+            <div slot="content">
+              <p style="font-size: 12px;">{{ $t('login.tooltip.text1') }}</p>
             </div>
+          </Tooltip>
         </div>
-        <div class="right-box" v-show="qrloginFlag">
-            <div style="width:fit-content;margin: auto;">
-                <div class="title">
-                    <div class="logo">
-                        <img width="15" height="15" src="@/assets/icon/tmd_account.svg">
-                    </div>
-                    <h4 class="text">
-                        {{ qrloginFlag ? $t('login.title.QRLogin'): $t('login.title.IDLogin') }}
-                    </h4>
-                    <Tooltip class="tooltip" placement="right-end" :transfer="true" max-width="200">
-                        <img src="@/assets/icon/icon_info.svg" width="15" height="15">
-                        <div slot="content">
-                            <p style="font-size: 12px;">{{ $t('login.tooltip.text1') }}</p>
-                        </div>
-                    </Tooltip>
-                </div>
-                <h4 class="subTitle">
-                    {{ qrloginFlag ? $t('login.subTitle.QRLogin') : $t('login.subTitle.IDLogin')}}
-                </h4>
-                <div class="qrloginMode">
-                    <div class="qrcodeBox">
-                        <div id="qrcode" :class="{'qrcode': joinQRcode != undefined}" ref="qrcode"></div>
-                        <div class="expired" v-if="joinQRcode != undefined && !sseSurvive">
-                            <Icon size="40" type="md-refresh-circle" @click="SEELink()" />
-                        </div>
-                    </div>
-                    <div class="links">
-                        <div class="icon-a">
-                            <a @click="chgLoginType()">{{ $t('login.link.IDLogin') }}</a>
-                        </div>
-                        <router-link to="/regist">{{ $t('login.link.regist') }}</router-link>
-                    </div>
-                </div>
+        <h4 class="subTitle">
+          {{ qrloginFlag ? $t('login.subTitle.QRLogin') : $t('login.subTitle.IDLogin')}}
+        </h4>
+        <div class="qrloginMode">
+          <div class="qrcodeBox">
+            <div id="qrcode" :class="{'qrcode': joinQRcode != undefined}" ref="qrcode"></div>
+            <div class="expired" v-if="joinQRcode != undefined && !sseSurvive">
+              <Icon size="40" type="md-refresh-circle" @click="SEELink()" />
             </div>
+          </div>
+          <div class="links">
+            <div class="icon-a">
+              <a @click="chgLoginType()">{{ $t('login.link.IDLogin') }}</a>
+            </div>
+            <router-link to="/regist">{{ $t('login.link.regist') }}</router-link>
+          </div>
         </div>
+      </div>
     </div>
+  </div>
 </template>
 <script>
 import { EventSourcePolyfill } from 'event-source-polyfill';
@@ -213,283 +213,285 @@ import QRCode from 'qrcodejs2'
 import { User } from '@/service/User'
 import { mapState, mapGetters } from 'vuex'
 export default {
-    data() {
-        const validateID = (rule, value, callback) => {
-            if (value === '') {
-                callback(new Error());
-                this.loginErrText = this.$t('error.required')
-            } else if (value.search(/^\+/) == 0) {
-                callback(new Error());
-                this.loginErrText = this.$t('error.format.default')
-            } else {
-                if (value.indexOf('@') >= 0) { //是否為Email
-                    var emailRule = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z]+$/;
-                    if (value.search(emailRule) != -1) {
-                        callback();
-                        this.loginErrText = ''
-                    } else {
-                        callback(new Error());
-                        this.loginErrText = this.$t('error.format.email')
-                    }
-                } else {
-                    callback();
-                    this.loginErrText = ''
-                }
-            }
-        };
-        const validatePW = (rule, value, callback) => {
-            if (value === '') {
-                callback(new Error());
-                this.loginErrText = this.$t('error.required')
-            }
-            else {
-                callback();
-                this.loginErrText = ''
-            }
-        };
-        return {
-            routerData: {},
-            // loginType: '',
-            qrloginFlag: false,
-            loginForm: {
-                id: '',
-                pass: '',
-            },
-            loginRule: {
-                id: [
-                    { validator: validateID, trigger: 'blur' },
-                ],
-                pass: [
-                    { validator: validatePW, trigger: 'blur' },
-                ]
-            },
-            loginErrText: '',
-            schoolErrText: '',
-            userOauth: {        // 社群帳號
-                code: '',
-                state: ''
-            },
-            loading: false,
-            sseSurvive: false,
-            joinQRcode: undefined,
-            defaultSchool: {
-                name: '',
-                code: ''
-            },
-            identityFlag: false
+  data() {
+    const validateID = (rule, value, callback) => {
+      if (value === '') {
+        callback(new Error());
+        this.loginErrText = this.$t('error.required')
+      } else if (value.search(/^\+/) == 0) {
+        callback(new Error());
+        this.loginErrText = this.$t('error.format.default')
+      } else {
+        if (value.indexOf('@') >= 0) { //是否為Email
+          var emailRule = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z]+$/;
+          if (value.search(emailRule) != -1) {
+            callback();
+            this.loginErrText = ''
+          } else {
+            callback(new Error());
+            this.loginErrText = this.$t('error.format.email')
+          }
+        } else {
+          callback();
+          this.loginErrText = ''
         }
+      }
+    };
+    const validatePW = (rule, value, callback) => {
+      if (value === '') {
+        callback(new Error());
+        this.loginErrText = this.$t('error.required')
+      }
+      else {
+        callback();
+        this.loginErrText = ''
+      }
+    };
+    return {
+      routerData: {},
+      // loginType: '',
+      qrloginFlag: false,
+      loginForm: {
+        id: '',
+        pass: '',
+      },
+      loginRule: {
+        id: [
+          { validator: validateID, trigger: 'blur' },
+        ],
+        pass: [
+          { validator: validatePW, trigger: 'blur' },
+        ]
+      },
+      loginErrText: '',
+      schoolErrText: '',
+      userOauth: {        // 社群帳號
+        code: '',
+        state: ''
+      },
+      loading: false,
+      sseSurvive: false,
+      joinQRcode: undefined,
+      defaultSchool: {
+        name: '',
+        code: ''
+      },
+      identityFlag: false
+    }
+  },
+  computed: {
+    ...mapState({
+      config: state => state.config
+    }),
+    ...mapGetters({
+      srvAdr: 'config/getSrvAdr'
+    }),
+    loginFormEnter: function () {
+      let flag = false
+      if (this.loginForm.id && this.loginForm.pass) flag = true
+      return flag
     },
-    computed: {
-        ...mapState({
-            config: state => state.config
-        }),
-        ...mapGetters({
-            srvAdr: 'config/getSrvAdr'
-        }),
-        loginFormEnter: function () {
-            let flag = false
-            if (this.loginForm.id && this.loginForm.pass) flag = true
-            return flag
-        },
-        isDev() {
-            return process.env.NODE_ENV == 'development'
-        },
+    isDev() {
+      return process.env.NODE_ENV == 'development'
     },
-    created() {
-        // 此頁面為老師頁面
-        sessionStorage.setItem('identity', 'teacher')
+  },
+  created() {
+    // 此頁面為老師頁面
+    sessionStorage.setItem('identity', 'teacher')
 
-        // 取得學校設定簡碼
-        this.setDefSchool()
+    // 取得學校設定簡碼
+    this.setDefSchool()
 
-        //处理研修中心省平台跳转登录
-        // this.loginType = this.$route.query.loginType
-        this.routerData = this.$route.query
-        // console.log(this.loginType)
+    //处理研修中心省平台跳转登录
+    // this.loginType = this.$route.query.loginType
+    this.routerData = this.$route.query
+    // console.log(this.loginType)
+  },
+  methods: {
+    chgLoginType: function () { // 變更登入類型
+      this.qrloginFlag = !this.qrloginFlag
+      if (this.qrloginFlag && !this.sseSurvive) {
+        // SSE 連線
+        this.SEELink()
+      }
     },
-    methods: {
-        chgLoginType: function () { // 變更登入類型
-            this.qrloginFlag = !this.qrloginFlag
-            if (this.qrloginFlag && !this.sseSurvive) {
-                // SSE 連線
-                this.SEELink()
-            }
-        },
-        loginSubmit: function (name) {  // 登入
-            this.$refs[name].validate(async (valid) => {
-                if (valid) {
-                    this.loading = true // 登入中動畫
-                    let result; // 輸出暫存
-                    let isFail = false // 失敗flag
-                    // 詢問帳號是否有效
-                    await this.$api.login.verification({ id: this.loginForm.id, pass: this.loginForm.pass }).then(res => {
-                        result = res
-                    }).catch(err => {
-                        isFail = true
-                    })
-                    if (isFail) {
-                        this.loginErrText = this.$t('login.apiError.text1')
-                        this.loading = false
-                    } else {
-                        /* 进行教师登录 */
-                        this.$loginTools.teacherLogin(result).then(info => {
-                            // 前往区级平台
-                            if (info.toArea) {
-                                localStorage.setItem('platform', 'area')
-                                this.$router.push({ path: '/area' })
-                            } else {
-                                // 前往校级平台 判断是否有记录的目标地址 如果没有则按照站点来进行对应跳转固定页面
-                                let targetPath = localStorage.getItem('target_path')
-                                let defaultPath = '/home'
-                                let homePath = targetPath ? (targetPath.includes('home/') ? targetPath : defaultPath) : defaultPath
-                                localStorage.setItem('platform', 'school')
-                                localStorage.setItem('target_path', '')
-                                this.$router.push({ path: homePath })
-                            }
-                        })
-                    }
-                }
-            })
-        },
-        oauthLogin: function (provider) { // 第三方登入
-            let isDev = this.$store.state.config.srvAdrType != 'product'
-            if (provider === 'dingding' && !isDev) {
-                this.$Message.warning(this.$t('login.dingCloseTip'))
-                return
-            }
-            let redirect_uri = window.location.origin + '/login';
-            this.$api.BuildOauthUrl(provider, redirect_uri).then(res => {
-                console.log('三方登录', res)
-                window.location.href = res
+    loginSubmit: function (name) {  // 登入
+      this.$refs[name].validate(async (valid) => {
+        if (valid) {
+          this.loading = true // 登入中動畫
+          let result; // 輸出暫存
+          let isFail = false // 失敗flag
+          // 詢問帳號是否有效
+          await this.$api.login.verification({ id: this.loginForm.id, pass: this.loginForm.pass }).then(res => {
+            result = res
+          }).catch(err => {
+            isFail = true
+          })
+          if (isFail) {
+            this.loginErrText = this.$t('login.apiError.text1')
+            this.loading = false
+          } else {
+            /* 进行教师登录 */
+            this.$loginTools.teacherLogin(result).then(info => {
+              // 前往区级平台
+              if (info.toArea) {
+                localStorage.setItem('platform', 'area')
+                this.$router.push({ path: '/area' })
+              } else {
+                // 前往校级平台 判断是否有记录的目标地址 如果没有则按照站点来进行对应跳转固定页面
+                let targetPath = localStorage.getItem('target_path')
+                let defaultPath = '/home'
+                let homePath = targetPath ? (targetPath.includes('home/') ? targetPath : defaultPath) : defaultPath
+                localStorage.setItem('platform', 'school')
+                localStorage.setItem('target_path', '')
+                this.$router.push({ path: homePath })
+              }
+            }).catch(e => {
+              this.loading = false
             })
-        },
-        SEELink: function () { // 開啟SSE連結
-            if (!this.sseSurvive) {
-                let url = this.config[this.srvAdr].coreAPIUrl
+          }
+        }
+      })
+    },
+    oauthLogin: function (provider) { // 第三方登入
+      let isDev = this.$store.state.config.srvAdrType != 'product'
+      if (provider === 'dingding' && !isDev) {
+        this.$Message.warning(this.$t('login.dingCloseTip'))
+        return
+      }
+      let redirect_uri = window.location.origin + '/login';
+      this.$api.BuildOauthUrl(provider, redirect_uri).then(res => {
+        console.log('三方登录', res)
+        window.location.href = res
+      })
+    },
+    SEELink: function () { // 開啟SSE連結
+      if (!this.sseSurvive) {
+        let url = this.config[this.srvAdr].coreAPIUrl
 
-                let es = new EventSourcePolyfill(url + '/service/sse', { headers: { 'X-Auth-Name': 'IES5' } });
-                let _this = this;
+        let es = new EventSourcePolyfill(url + '/service/sse', { headers: { 'X-Auth-Name': 'IES5' } });
+        let _this = this;
 
-                var closeSSE = function () {
-                    if (_this.sseSurvive) {
-                        es.close();
-                        _this.sseSurvive = false
-                    }
-                }
+        var closeSSE = function () {
+          if (_this.sseSurvive) {
+            es.close();
+            _this.sseSurvive = false
+          }
+        }
 
-                es.addEventListener('open', function (e) {
-                    _this.sseSurvive = true
-                }, false);
+        es.addEventListener('open', function (e) {
+          _this.sseSurvive = true
+        }, false);
 
-                //取得登入網址
-                es.addEventListener('message', function (e) {
-                    if (e.data) {
-                        let data = JSON.parse(e.data)
-                        if (data.sid) {
-                            let qrcodeURL = url + '/qrcode/login?sid=' + encodeURIComponent(data.sid, "utf-8") + '&info=' + encodeURIComponent(_this.$t('login.sse.text1'), "utf-8")
-                            _this.crtQrcode(qrcodeURL)
-                        } else if (data.code) {
-                            closeSSE()
-                            _this.SSOLogin(data.code)
-                        }
+        //取得登入網址
+        es.addEventListener('message', function (e) {
+          if (e.data) {
+            let data = JSON.parse(e.data)
+            if (data.sid) {
+              let qrcodeURL = url + '/qrcode/login?sid=' + encodeURIComponent(data.sid, "utf-8") + '&info=' + encodeURIComponent(_this.$t('login.sse.text1'), "utf-8")
+              _this.crtQrcode(qrcodeURL)
+            } else if (data.code) {
+              closeSSE()
+              _this.SSOLogin(data.code)
+            }
 
-                    }
-                }, false);
+          }
+        }, false);
 
-                // 錯誤
-                es.addEventListener('error', function (e) {
-                    closeSSE()
-                }, false);
+        // 錯誤
+        es.addEventListener('error', function (e) {
+          closeSSE()
+        }, false);
 
-                // 設定五分鐘後關閉連接
-                setTimeout(() => {
-                    closeSSE()
-                }, 300000);
-            }
-        },
-        crtQrcode: function (url) { // 開啟QRCODE
-            this.$nextTick(() => {
-                if (this.joinQRcode == undefined) {
-                    let qrcode = new QRCode('qrcode', {
-                        width: 200, // 设置宽度,单位像素
-                        height: 200, // 设置高度,单位像素
-                        text: url, // 设置二维码内容或跳转地址
-                    })
-                    this.joinQRcode = qrcode
-                } else {
-                    this.joinQRcode.clear()
-                    this.joinQRcode.makeCode(url)
-                }
-                let dom = document.getElementById('qrcode')
-                if (dom) dom.title = ''
-            })
-        },
-        loginProcess: async function (item, schoolCode) { // 登入用function
-            let result;
+        // 設定五分鐘後關閉連接
+        setTimeout(() => {
+          closeSSE()
+        }, 300000);
+      }
+    },
+    crtQrcode: function (url) { // 開啟QRCODE
+      this.$nextTick(() => {
+        if (this.joinQRcode == undefined) {
+          let qrcode = new QRCode('qrcode', {
+            width: 200, // 设置宽度,单位像素
+            height: 200, // 设置高度,单位像素
+            text: url, // 设置二维码内容或跳转地址
+          })
+          this.joinQRcode = qrcode
+        } else {
+          this.joinQRcode.clear()
+          this.joinQRcode.makeCode(url)
+        }
+        let dom = document.getElementById('qrcode')
+        if (dom) dom.title = ''
+      })
+    },
+    loginProcess: async function (item, schoolCode) { // 登入用function
+      let result;
 
-            await this.$api.login.teacherLogin(item, schoolCode).then(res => {
-                result = res
-            })
-            //設定權限並登入
-            User.login(result).then(res => {
-                if (res) {
-                    this.saveUserCodes({
-                        TEAMModelId: result.id,
-                        name: result.name,
-                        schoolCode: result.defaultschool
-                    })
-                    if (result.toArea) {
-                        localStorage.setItem('platform', 'area')
-                        this.$router.push({ path: '/area' })
-                    } else {
-                        let targetPath = localStorage.getItem('target_path')
-                        let defaultPath = '/home'
-                        let homePath = targetPath ? (targetPath.includes('home/') ? targetPath : defaultPath) : defaultPath
-                        localStorage.setItem('platform', 'school')
-                        localStorage.setItem('target_path', '')
-                        this.$router.push({ path: homePath })
-                    }
-                }
-            })
-        },
-        saveUserCodes: function (res) {
-            this.$store.commit('setUserInfo', res)
-        },
-        setDefSchool: function () {
-            let defschool = sessionStorage.defaultSchool
-            if (defschool) {
-                defschool = JSON.parse(decodeURIComponent(defschool), "utf-8")
-                this.defaultSchool.code = defSchool.code
-                this.defaultSchool.name = defSchool.name
+      await this.$api.login.teacherLogin(item, schoolCode).then(res => {
+        result = res
+      })
+      //設定權限並登入
+      User.login(result).then(res => {
+        if (res) {
+          this.saveUserCodes({
+            TEAMModelId: result.id,
+            name: result.name,
+            schoolCode: result.defaultschool
+          })
+          if (result.toArea) {
+            localStorage.setItem('platform', 'area')
+            this.$router.push({ path: '/area' })
+          } else {
+            let targetPath = localStorage.getItem('target_path')
+            let defaultPath = '/home'
+            let homePath = targetPath ? (targetPath.includes('home/') ? targetPath : defaultPath) : defaultPath
+            localStorage.setItem('platform', 'school')
+            localStorage.setItem('target_path', '')
+            this.$router.push({ path: homePath })
+          }
+        }
+      })
+    },
+    saveUserCodes: function (res) {
+      this.$store.commit('setUserInfo', res)
+    },
+    setDefSchool: function () {
+      let defschool = sessionStorage.defaultSchool
+      if (defschool) {
+        defschool = JSON.parse(decodeURIComponent(defschool), "utf-8")
+        this.defaultSchool.code = defSchool.code
+        this.defaultSchool.name = defSchool.name
+      }
+    },
+    SSOLogin: function (code) { // 快速登入
+      this.$Spin.show(); //開啟加載畫面
+      this.$api.SSOLogin(code).then(async res => {
+        this.$Spin.hide(); // 關閉加載畫面
+        if (!res.error) {
+          /* 进行教师登录 */
+          this.$loginTools.teacherLogin(res).then(info => {
+            // 前往区级平台
+            if (info.toArea) {
+              localStorage.setItem('platform', 'area')
+              this.$router.push({ path: '/area' })
+            } else {
+              // 前往校级平台 判断是否有记录的目标地址 如果没有则按照站点来进行对应跳转固定页面
+              let targetPath = localStorage.getItem('target_path')
+              let defaultPath = '/home'
+              let homePath = targetPath ? (targetPath.includes('home/') ? targetPath : defaultPath) : defaultPath
+              localStorage.setItem('platform', 'school')
+              localStorage.setItem('target_path', '')
+              this.$router.push({ path: homePath })
             }
-        },
-        SSOLogin: function (code) { // 快速登入
-            this.$Spin.show(); //開啟加載畫面
-            this.$api.SSOLogin(code).then(async res => {
-                this.$Spin.hide(); // 關閉加載畫面
-                if (!res.error) {
-                    /* 进行教师登录 */
-                    this.$loginTools.teacherLogin(res).then(info => {
-                        // 前往区级平台
-                        if (info.toArea) {
-                            localStorage.setItem('platform', 'area')
-                            this.$router.push({ path: '/area' })
-                        } else {
-                            // 前往校级平台 判断是否有记录的目标地址 如果没有则按照站点来进行对应跳转固定页面
-                            let targetPath = localStorage.getItem('target_path')
-                            let defaultPath = '/home'
-                            let homePath = targetPath ? (targetPath.includes('home/') ? targetPath : defaultPath) : defaultPath
-                            localStorage.setItem('platform', 'school')
-                            localStorage.setItem('target_path', '')
-                            this.$router.push({ path: homePath })
-                        }
-                    })
-                    // this.loginProcess(res, this.defaultSchool.code)
-                } else {
-                    this.$Message.warning(this.$t('login.sse.error.text1'));
-                }
-            })
-        },
-    }
+          })
+          // this.loginProcess(res, this.defaultSchool.code)
+        } else {
+          this.$Message.warning(this.$t('login.sse.error.text1'));
+        }
+      })
+    },
+  }
 }
 </script>

+ 44 - 1
TEAMModelOS/ClientApp/src/view/settings/SchoolMgmt.vue

@@ -40,11 +40,16 @@
 										<Icon type="md-log-in" size="25" color="#00c4ff" />
 									</span>
 								</span> -->
-                <span class="school-item-btn" v-if="item.schoolId !== teacherInfo.defaultschool && item.status === 'join'" @click="onSetDefaultSchool(item)">
+                <span class="school-item-btn" style="right:60px" v-if="item.schoolId !== teacherInfo.defaultschool && item.status === 'join'" @click="onSetDefaultSchool(item)">
                   <span :title="$t('settings.setDefault')">
                     <Icon type="ios-settings" size="25" color="#00c67a" />
                   </span>
                 </span>
+                <span class="school-item-btn" v-if="item.status === 'join'" @click="exitRequest(item)">
+                  <span :title="$t('settings.exit')">
+                    <Icon type="md-exit" size="25" color="#ff0000" style="font-weight: bold;" />
+                  </span>
+                </span>
                 <span class="school-item-btn" v-if="item.status === 'request'" @click="undoRequest(item)">
                   <span :title="$t('settings.undoJoin')">
                     <Icon type="ios-close-circle-outline" size="25" color="#a9a9a9" style="font-weight: bold;" />
@@ -330,6 +335,44 @@ export default {
       })
     },
 
+    exitRequest(item) {
+      this.$Modal.confirm({
+        title: this.$t('settings.modalTip4'),
+        content: this.$t('settings.modalTip10') + item.name + ' ?',
+        onOk: () => {
+          this.$api.schoolSetting.exitSchool({
+            "opt": "QuitSchool",
+            "schoolCode": item.schoolId
+          }).then(
+            (res) => {
+              console.log(res)
+              if (res.status === 0) {
+                this.$Message.success(this.$t('settings.submitSucTips'))
+                this.initTeacherInfo()
+                this.getAllShoolList()
+              } else if (res.status === 4) {
+                this.$store.commit('user/resetSchoolProfile')
+                this.$store.commit('user/resetTeachers')
+                this.$store.commit('student/setStudents', [])
+                this.$User.logout()
+                this.$router.push({
+                  path: '/login'
+                })
+              } else {
+                this.$Message.warning(res.msg)
+              }
+            },
+            (err) => {
+              this.$Message.error(this.$t('settings.submitFailTips'))
+            }
+          )
+        },
+        onCancel: () => {
+          this.$refs.schoolSelect.setQuery(' ')
+        }
+      })
+    },
+
     /* 撤销加入学校申请 */
     undoRequest(item) {
       console.log(item)

File diff suppressed because it is too large
+ 45 - 8
TEAMModelOS/Controllers/OpenApi/Business/BizOverallEducationController.cs


+ 97 - 11
TEAMModelOS/Controllers/System/CoreController.cs

@@ -1,9 +1,13 @@
 using Azure.Cosmos;
 using Azure.Storage.Blobs.Models;
+using DocumentFormat.OpenXml.Spreadsheet;
+using DocumentFormat.OpenXml.Wordprocessing;
 using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Hosting;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Hosting;
 using Microsoft.Extensions.Options;
 using Microsoft.OData.UriParser;
 using StackExchange.Redis;
@@ -50,7 +54,9 @@ namespace TEAMModelOS.Controllers
         private readonly CoreAPIHttpService _coreAPIHttpService;
         private readonly IConfiguration _configuration;
         private readonly SnowflakeId _snowflakeId;
-        public CoreController(IHttpClientFactory httpClientFactory,AzureCosmosFactory azureCosmos, SnowflakeId snowflakeId,CoreAPIHttpService coreAPIHttpService,IConfiguration configuration,IPSearcher searcher, AzureRedisFactory azureRedis, AzureStorageFactory azureStorage, DingDing dingDing, IOptionsSnapshot<Option> option)
+        private readonly IWebHostEnvironment _environment;
+
+        public CoreController(IWebHostEnvironment environment, IHttpClientFactory httpClientFactory,AzureCosmosFactory azureCosmos, SnowflakeId snowflakeId,CoreAPIHttpService coreAPIHttpService,IConfiguration configuration,IPSearcher searcher, AzureRedisFactory azureRedis, AzureStorageFactory azureStorage, DingDing dingDing, IOptionsSnapshot<Option> option)
         {
             _azureCosmos = azureCosmos;
             _searcher = searcher;
@@ -62,22 +68,26 @@ namespace TEAMModelOS.Controllers
             _coreAPIHttpService = coreAPIHttpService;
             _snowflakeId = snowflakeId;
             _httpClientFactory = httpClientFactory;
+            _environment= environment;
         }
 
         public class NotifyData {
             public string notifyCode { get; set; }
             public string data { get; set; }
             public int notifyEvent { get; set; }
-            public string ticket { get; set; }
+            public string ticket { get; set; } 
+            public string token { get; set; }
         }
         [HttpGet("process-notify")]
         public async Task<IActionResult> ProcessNotify([FromQuery] NotifyData notifyData) {
             string msg = "";
             /// code =-1 参数异常,0 凭据失效 1不是管理员,2操作成功,3服务端异常
             int code = -1;
+            string scope = "";
             try {
                 //await _dingDing.SendBotMsg($"{notifyData.ToJsonString()}", GroupNames.成都开发測試群組);
                 string opttmdid = "";
+              
                 if (!string.IsNullOrWhiteSpace(notifyData.ticket))
                 {
                     var clientID = _configuration.GetValue<string>("HaBookAuth:CoreService:clientID");
@@ -88,12 +98,20 @@ namespace TEAMModelOS.Controllers
                         var jwt = new JwtSecurityToken(token.id_token);
                         opttmdid = jwt.Payload.Sub;
                     }
-                    else {
+                    else
+                    {
                         code = 0;
                         msg = "凭据失效";
                     }
+                    scope = "HiTA";
                 }
-                else {
+                else if (!string.IsNullOrWhiteSpace(notifyData.token) && string.IsNullOrWhiteSpace(opttmdid))
+                {
+                    var jwt = new JwtSecurityToken(notifyData.token);
+                    opttmdid = jwt.Payload.Sub;
+                    scope = "IES";
+                }
+                if (string.IsNullOrWhiteSpace(opttmdid)) {
                     code = -1;
                     msg = "凭据参数异常";
                 }
@@ -106,6 +124,69 @@ namespace TEAMModelOS.Controllers
                 {
                     switch (true)
                     {
+                        case bool when $"{notifyData.notifyCode}".Equals("quit_school"):
+                            {
+                                Azure.Response adminResponse = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School)
+                               .ReadItemStreamAsync(opttmdid, new Azure.Cosmos.PartitionKey($"Teacher-{_schoolId}"));
+                                //是否是管理员
+                                if (adminResponse.Status == 200)
+                                {
+                                    var adminTeacher = JsonDocument.Parse(adminResponse.Content).RootElement.Deserialize<SchoolTeacher>();
+                                    if (adminTeacher.roles.Contains("admin"))
+                                    {
+                                        Azure.Response teacherResponse = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher)
+                                        .ReadItemStreamAsync($"{_tmdid}", new Azure.Cosmos.PartitionKey("Base"));
+                                        Azure.Response schoolTeacherResponse = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School)
+                                               .ReadItemStreamAsync($"{_tmdid}", new Azure.Cosmos.PartitionKey($"Teacher-{_schoolId}"));
+                                        if (teacherResponse.Status == 200 && schoolTeacherResponse.Status == 200)
+                                        {
+                                            var teacher = JsonDocument.Parse(teacherResponse.Content).RootElement.Deserialize<Teacher>();
+                                            var schoolTeacher = JsonDocument.Parse(schoolTeacherResponse.Content).RootElement.Deserialize<SchoolTeacher>();
+                                            //同意
+                                            if (notifyData.notifyEvent == 1)
+                                            {
+                                                teacher.schools.RemoveAll(z =>!string.IsNullOrWhiteSpace($"{_schoolId}") && !string.IsNullOrWhiteSpace(z.schoolId) &&   z.schoolId.Equals($"{_schoolId}"));
+                                                try
+                                                {
+                                                    await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).DeleteItemStreamAsync( schoolTeacher.id, new Azure.Cosmos.PartitionKey(schoolTeacher.code));
+                                                    await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReplaceItemAsync(teacher, teacher.id, new Azure.Cosmos.PartitionKey(teacher.code));
+                                                    School qschool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>($"{_schoolId}", new PartitionKey("Base"));
+                                                    _coreAPIHttpService.PushNotify(new List<IdNameCode> { new IdNameCode {id= teacher.id,name= teacher.name,code= teacher.lang } }, $"quited_school", Constant.NotifyType_IES5_Management,
+                                                    new Dictionary<string, object> {   { "schoolName", qschool.name }, { "schoolId", $"{_schoolId}" } }, _option.Location, _configuration, _dingDing, _environment.ContentRootPath);
+                                                }
+                                                catch (CosmosException ex) when (ex.Status == 404)
+                                                {
+
+                                                }
+                                                code = 2;
+                                                msg = "操作成功";
+                                            }
+                                            //拒绝退出学校,直接不管。
+                                            if (notifyData.notifyEvent == 2)
+                                            {
+                                                code = 2;
+                                                msg = "操作成功";
+                                            }
+                                        }
+                                        else
+                                        {
+                                            code = -1;
+                                            msg = "老师已离开学校";
+                                        }
+                                    }
+                                    else
+                                    {
+                                        code = 1;
+                                        msg = "您已不是管理员";
+                                    }
+                                }
+                                else
+                                {
+                                    code = -1;
+                                    msg = "您已不是管理员";
+                                }
+                            }
+                            break;
                         case bool when $"{notifyData.notifyCode}".Equals("request_school"):
                             {
                                 Azure.Response adminResponse = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School)
@@ -172,20 +253,20 @@ namespace TEAMModelOS.Controllers
                                         else
                                         {
                                             code = -1;
-                                            msg = "教师不存在";
+                                            msg = "老师已离开学校";
                                         }
 
                                     }
                                     else
                                     {
                                         code = 1;
-                                        msg = "不是管理员";
+                                        msg = "您已不是管理员";
                                     }
                                 }
                                 else
                                 {
                                     code = -1;
-                                    msg = "管理员不存在";
+                                    msg = "您已不是管理员";
                                 }
                             }
                             break;
@@ -265,10 +346,15 @@ namespace TEAMModelOS.Controllers
                 code = 3;
                 msg = "服务端异常";
             }
-            string HostName = HttpContext.GetHostName();
-            var rurl = $"https://{HostName}/resultPage?code={code}&msg={HttpUtility.UrlEncode(msg)}";
-            return Redirect(rurl);
-            //return Ok(new { code,msg});
+            if (scope.Equals("HiTA"))
+            {
+                string HostName = HttpContext.GetHostName();
+                var rurl = $"https://{HostName}/resultPage?code={code}&msg={HttpUtility.UrlEncode(msg)}";
+                return Redirect(rurl);
+            }
+            else {
+                return Ok(new { code, msg });
+            }
         }
         [HttpPost("sendsms/pin")]
         public async Task<IActionResult> SendSmsPinCode(JsonElement request)

+ 50 - 1
TEAMModelOS/Controllers/Teacher/InitController.cs

@@ -33,6 +33,8 @@ using Microsoft.Azure.Cosmos.Table;
 using Microsoft.AspNetCore.Hosting;
 using DocumentFormat.OpenXml.Office2010.Excel;
 using DocumentFormat.OpenXml.Drawing.Charts;
+using static TEAMModelOS.Controllers.FixDataController;
+using IdCode = TEAMModelOS.SDK.Models.IdCode;
 
 namespace TEAMModelOS.Controllers
 {
@@ -250,7 +252,6 @@ namespace TEAMModelOS.Controllers
                                //保存日志
                                 Dictionary<string, object> replaceData = new() { { "oName" ,$"{name}" }, { "oId", $"{userid}" }, { "scName", $"{schoolBase.name}" }, { "scId", $"{schoolBase.id}" } , { "tName", $"{targetTeacher.name}" }, { "tId", $"{targetTeacher.id}" } };
                                 _ = _azureStorage.SaveLogLang("transfer-admin-role", _environment.ContentRootPath, replaceData, _dingDing, bizId: $"{userid}-{schoolBase.id}-{_targetTecher}", httpContext: HttpContext, scope: "school");
-
                                 //保存管理员移交至BI
                                 await AzureStorageBlobExtensions.SaveBILog(blobClient, tableClient, "school-transfer-admin", strMsg?.ToString(), _dingDing, twebsite: "IES5", httpContext: HttpContext);
                                 return Ok(new { status = 1 });
@@ -329,7 +330,55 @@ namespace TEAMModelOS.Controllers
                             }
                         }
                         return BadRequest(new { status = -1, msg = "参数异常!" });
+                    case bool when $"{_opt}".Equals("QuitSchool", StringComparison.OrdinalIgnoreCase)  && request.TryGetProperty("schoolCode", out JsonElement _schoolCode) :
 
+                        School qschool= await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>($"{_schoolCode}", new PartitionKey("Base"));
+                        string sql = $"select   value c from c    where c.code='Teacher-{_schoolCode}' and c.status='join'  and (c.id ='{userid}' or array_contains(c.roles,'admin'))";
+                        List<SchoolTeacher> adminTeachers = new List<SchoolTeacher>();
+                        await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetItemQueryIterator<SchoolTeacher>(queryText: sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"Teacher-{_schoolCode}") }))
+                        {
+                            adminTeachers.Add(item);
+                        }
+                        var steacher= adminTeachers.Find(z => z.id.Equals(userid));
+                        if (steacher != null)
+                        {
+                            if (!steacher.roles.Contains("admin"))
+                            {
+                                var tmdadmin = adminTeachers.FindAll(z => z.roles.Contains("admin") && !z.id.Equals(userid));
+                                if (tmdadmin.IsNotEmpty()) {
+                                    List<IdNameCode> ids = new List<IdNameCode>();
+                                    string sqlAdmin = $"select c.id,c.lang  as code ,c.name from c where c.id in ({string.Join(",",tmdadmin.Select(z=>$"'{z.id}'"))}) ";
+                                    await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher)
+                                        .GetItemQueryIterator<IdNameCode>(queryText: sqlAdmin, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"Base") }))
+                                    {
+                                        ids.Add(item);
+                                    }
+                                    _coreAPIHttpService.PushNotify(ids, $"quit_school", Constant.NotifyType_IES5_Management,
+                                    new Dictionary<string, object> { { "tmdname", name }, { "schoolName", qschool.name }, { "schoolId", $"{_schoolCode}" }, { "tmdid", userid } }, _option.Location, _configuration, _dingDing, _environment.ContentRootPath);
+                                    return Ok(new { status =0, msg = "申请成功!" });
+                                }
+                                else {
+                                    return Ok(new { status = 3, msg = "暂无管理员处理!" });
+                                }
+                            }
+                            else
+                            {
+                                return Ok(new { status = 2, msg = "请先移交管理员后再申请退出学校!" });
+                            }
+                        }
+                        else {
+                            Teacher qteacher = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReadItemAsync<Teacher>($"{userid}", new PartitionKey("Base"));
+                            var a = qteacher.schools.RemoveAll(z => z.schoolId.Equals($"{_schoolCode}"));
+                            if (a > 0)
+                            {
+                                qteacher.defaultSchool = null;
+                                await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReplaceItemAsync<Teacher>(qteacher,qteacher.id, new PartitionKey("Base"));
+                                return Ok(new { status = 4, msg = "退出成功!" });
+                            }
+                            else {
+                                return Ok(new { status = 1, msg = "未加入学校!" });
+                            }
+                        }
                 }
             }
             catch (Exception ex)

+ 17 - 7
TEAMModelOS/Controllers/Third/Sc/ScDataPushController.cs

@@ -371,15 +371,17 @@ namespace TEAMModelOS.Controllers
                     //推送数据
                 }
                 pushDatas.Keys.ToList().ForEach(x => {
-                   
-                    if (!string.IsNullOrWhiteSpace(x)&&  pushDatas.ContainsKey(x)) {
+
+                    if (!string.IsNullOrWhiteSpace(x) && pushDatas.ContainsKey(x))
+                    {
                         if (pushDatas[x].Keys.Any())
                         {
                             Dictionary<string, dynamic> dict = new Dictionary<string, dynamic>();
                             dict.Add($"tmdid", x);
 
                             List<string> types = new List<string>();
-                            pushDatas[x].Keys.ToList().ForEach(y => {
+                            pushDatas[x].Keys.ToList().ForEach(y =>
+                            {
                                 if (y.Contains("fail-"))
                                 {
                                     types.Add(y);
@@ -393,6 +395,9 @@ namespace TEAMModelOS.Controllers
                             }
                         }
                     }
+                    else { 
+                        Console.WriteLine("1111");
+                    }
                     
                 });
             }
@@ -436,15 +441,15 @@ namespace TEAMModelOS.Controllers
         [ProducesDefaultResponseType]
         [HttpPost("push")]
         public async Task<IActionResult> Push(JsonElement json) {
-             
-         
+
+            string force = $"{json.GetProperty("force")}";
             string areaIdJson = $"{json.GetProperty("areaId")}";
             List<string> schools = json.GetProperty("schools").ToObject<List<string>>();
             List<string> pushTeachers = json.GetProperty("pushTeachers").ToObject<List<string>>();
-            (List<ScsResult> results, List<PushFail> fails, List<Dictionary<string, object>> dicts)= await PushData(areaIdJson, schools, pushTeachers);
+            (List<ScsResult> results, List<PushFail> fails, List<Dictionary<string, object>> dicts)= await PushData(areaIdJson, schools, pushTeachers, force);
             return Ok(new { data = new { results, fails, dicts } });        
         }
-        private async Task<(List<ScsResult> results, List<PushFail> fails, List<Dictionary<string, object>> dicts)> PushData(string areaIdJson, List<string> schools, List<string> pushTeachers) {
+        private async Task<(List<ScsResult> results, List<PushFail> fails, List<Dictionary<string, object>> dicts)> PushData(string areaIdJson, List<string> schools, List<string> pushTeachers,string force="0") {
             var client = _azureCosmos.GetCosmosClient();
             Dictionary<string, Dictionary<string, object>> pushDatas = new Dictionary<string, Dictionary<string, object>>();
             List<Dictionary<string, object>> dicts = new List<Dictionary<string, object>>();
@@ -515,6 +520,9 @@ namespace TEAMModelOS.Controllers
                     await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<TeacherTrain>(queryText: queryText.ToString(),
                     requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"TeacherTrain-{school}") }))
                     {
+                        if (force.Equals("1")) {
+                            item.pushes = new HashSet<string>();
+                        }
                         trains.Add(item);
                     }
                 }
@@ -559,6 +567,8 @@ namespace TEAMModelOS.Controllers
                     List<Task> tasks = new List<Task>();
                     lists.ForEach(x =>
                     {
+                         
+                        
                         tasks.Add(CheckTeacher(x, scTeachers, scTeacherDiagnoses, $"{school}", schoolsas, list53112, list53113, list53117, list53122, teammodelossas, pushDatas, failse, updatePush));
                     });
                     await Task.WhenAll(tasks);

+ 1 - 1
TEAMModelOS/Controllers/XTest/FixDataController.cs

@@ -2689,7 +2689,7 @@ namespace TEAMModelOS.Controllers
             //金牛直属。
             if (!json.TryGetProperty("areaId", out JsonElement areaId)) { BadRequest(); }
             //string sql = $"SELECT  distinct  c.id,s.schoolId as code , c.name as nickname, s.name as name     FROM c  join s in  c.schools where s.areaId='f35e0031-a53f-45e5-b307-1cd39446a2cf'" +
-            //    $" and array_length(c.binds)>0  and s.schoolId in ({string.Join(",", schools.Select(s => $"'{s}'"))})";
+            //    $" and array_length(c.binds)>0  and s.schoolId in ({string.Join(",", schools.Select(s => $"'{s}'")  )})";
             string sql = $"SELECT  distinct  c.id,s.schoolId as code , c.name as nickname, s.name as name     FROM c  join s in  c.schools where s.areaId='{areaId}'" +
                $" and array_length(c.binds)>0  ";
             List<IdNameCode> tmdidSchooCode = new List<IdNameCode>();

+ 2 - 0
TEAMModelOS/Lang/en-us.json

@@ -1,4 +1,6 @@
 {
+  "quited_school": [ "Notice of quitting school", "The administrator of {schoolName} has agreed that you quit the school." ],
+  "quit_school": [ "Notice of teacher quitting school", "{tmdname}({tmdid}) applied to quit {schoolName}.", "Agree", "Refuse" ],
   "request_school": [ "Apply to join school", "{tmdname}({tmdid}) applying to join {schoolName}.", "Agree", "Refuse" ],
   "invite_school": [ "Invite to join school", "{schoolName} has invited you to join.", "Accept", "Decline" ],
   "remove_school": [ "Remove from school", "{schoolName} removed you from the school's teacher list." ],

+ 2 - 0
TEAMModelOS/Lang/zh-cn.json

@@ -1,4 +1,6 @@
 {
+  "quited_school": [ "退出学校通知", "{schoolName}管理员已同意您退出学校。" ],
+  "quit_school": [ "教师退出学校通知", "{tmdname}({tmdid})申请退出{schoolName}。", "同意", "拒绝" ],
   "request_school": [ "申请加入学校通知", "{tmdname}({tmdid})申请加入{schoolName}。", "同意", "拒绝" ],
   "invite_school": [ "邀请加入学校通知", "{schoolName}邀请您加入学校。", "接受", "婉拒" ],
   "remove_school": [ "从学校移除通知", "{schoolName}将您从学校教师名单中移除。" ],

+ 2 - 0
TEAMModelOS/Lang/zh-tw.json

@@ -1,4 +1,6 @@
 {
+  "quited_school": [ "退出學校通知", "{schoolName}管理員已同意您退出學校。" ],
+  "quit_school": [ "教師退出學校通知", "{tmdname}({tmdid})申請退出{schoolName}。 ", "同意", "拒絕" ],
   "request_school": [ "申請加入學校通知", "{tmdname}({tmdid})申請加入{schoolName}。", "同意", "拒絕" ],
   "invite_school": [ "邀請加入學校通知", "{schoolName}邀請您加入學校。", "接受", "婉拒" ],
   "remove_school": [ "從學校移除通知", "{schoolName}將您從學校教師名單中移除。" ],

+ 3 - 3
TEAMModelOS/TEAMModelOS.csproj

@@ -69,9 +69,9 @@
     <SpaRoot>ClientApp\</SpaRoot>
     <DefaultItemExcludes>$(DefaultItemExcludes);$(SpaRoot)node_modules\**</DefaultItemExcludes>
     <UserSecretsId>078b5d89-7d90-4f6a-88fc-7d96025990a8</UserSecretsId>
-    <Version>5.2211.23</Version>
-    <AssemblyVersion>5.2211.23.1</AssemblyVersion>
-    <FileVersion>5.2211.23.1</FileVersion>
+    <Version>5.2211.30</Version>
+    <AssemblyVersion>5.2211.30.1</AssemblyVersion>
+    <FileVersion>5.2211.30.1</FileVersion>
     <Description>TEAMModelOS(IES5)</Description>
     <PackageReleaseNotes>IES版本说明版本切换标记5.2211.16.1</PackageReleaseNotes>
     <PackageId>TEAMModelOS</PackageId>