Ver código fonte

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

Li 3 anos atrás
pai
commit
da6931f2c4

+ 134 - 1
TEAMModelOS.SDK/Models/Service/SchoolService.cs

@@ -1,4 +1,5 @@
-using Microsoft.AspNetCore.Hosting;
+using HTEXLib.COMM.Helpers;
+using Microsoft.AspNetCore.Hosting;
 using Microsoft.International.Converters.PinYinConverter;
 using Microsoft.International.Converters.TraditionalChineseToSimplifiedConverter;
 using System;
@@ -9,13 +10,145 @@ using System.Text;
 using System.Text.Json;
 using System.Text.RegularExpressions;
 using System.Threading.Tasks;
+using TEAMModelOS.Models;
 using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.Extension;
+using TEAMModelOS.SDK.Models;
 
 namespace TEAMModelOS.SDK
 {
     public class SchoolService
     {
+
+        public static async Task<object> DoScsApiSchool(HttpTrigger _httpTrigger,Dictionary<string,object> dict, Option _option, List<IdNameCode> ignore,
+            string areaId,string city,string dist, AzureStorageFactory _azureStorage ,DingDing _dingDing, IWebHostEnvironment _environment
+            )
+        {
+            List<ScSchool> tbschools = null;
+            List<ScSchool> matchSchools = null;
+            List<ScSchool> schools = null;
+            List<ScSchool> saveschools = null;
+            // 5.3.1.18根据机构ID、项目ID、子项目ID返回学校列表
+            (  int status, string json) = await _httpTrigger.RequestHttpTrigger(dict, _option.Location, "GetSchoolList");
+            if (status == 200)
+            {
+                schools = json.ToObject<List<ScSchool>>(new JsonSerializerOptions { PropertyNameCaseInsensitive = false });
+                if (ignore.IsNotEmpty())
+                {
+                    matchSchools = schools.FindAll(x => ignore.Select(y => y.name).Contains(x.schoolname));
+                    if (matchSchools.IsNotEmpty())
+                    {
+                        if (matchSchools.Count != ignore.Count)
+                        {
+                            var matched = matchSchools.Select(x => x.schoolname);
+                            var unmatch = ignore.Select(y => y.name).Except(matched);
+                            List<string> scschoolUnmatch = schools.Select(y => y.schoolname).Except(matched).ToList();
+                            if (scschoolUnmatch.IsNotEmpty())
+                            {
+                                return new { matched, unmatch, scschoolUnmatch };
+                            }
+                        }
+                        else
+                        {
+                            matchSchools.ForEach(x => {
+                                var exschool = ignore.Find(y => y.name.Equals(x.schoolname));
+                                if (exschool != null)
+                                {
+                                    x.schoolCode = exschool.id;
+                                    x.areaId = $"{areaId}";
+                                    x.city = $"{city}";
+                                    x.dist = $"{dist}";
+                                }
+                            });
+                        }
+                    }
+                    else
+                    {
+                        return new { unmatch = ignore, schools };
+                    }
+                }
+                //数据校验
+                tbschools = await _azureStorage.FindListByDict<ScSchool>(new Dictionary<string, object>() { { "PartitionKey", "ScSchool" } });
+                if (tbschools.IsNotEmpty())
+                {
+
+                    var a = tbschools.Select(y => $"{y.RowKey}").ToList();
+                    saveschools = schools.Where(x => !a.Exists(z => z.Equals($"{x.schoolid}"))).ToList();
+                    List<SchoolData> schoolDatas = new List<SchoolData>();
+                    saveschools.ForEach(x =>
+                    {
+                        x.RowKey = $"{x.schoolid}";
+                        x.PartitionKey = "ScSchool";
+                        x.areaId = $"{areaId}";
+                        x.city = $"{city}";
+                        x.dist = $"{dist}";
+                        if (string.IsNullOrEmpty(x.schoolCode))
+                        {
+                            if (string.IsNullOrEmpty(x.schoolCode))
+                            {
+                                schoolDatas.Add(new SchoolData { uid = $"{x.schoolid}", province = "四川省", city = $"{city}", name = x.schoolname });
+                            }
+                           
+                        }
+                    });
+                    schoolDatas = await SchoolService.GenerateSchoolCode(schoolDatas, _dingDing, _environment);
+                    saveschools.ForEach(x => {
+
+                        var schoolData = schoolDatas.Find(y => y.uid.Equals($"{x.schoolid}"));
+                        if (schoolData != null && !string.IsNullOrEmpty(schoolData.id))
+                        {
+                            x.schoolCode = schoolData.id;
+                            x.areaId = $"{areaId}";
+                            x.city = $"{city}";
+                            x.dist = $"{dist}";
+                        }
+                    });
+                    saveschools.RemoveAll(x => string.IsNullOrEmpty(x.schoolCode));
+                    saveschools.RemoveAll(x => tbschools.FindAll(z => !string.IsNullOrEmpty(z.schoolCode)).Exists(y => y.schoolCode.Equals(x.schoolCode)));
+                    saveschools = await _azureStorage.SaveAll(saveschools);
+                }
+                else
+                {
+                    List<SchoolData> schoolDatas = new List<SchoolData>();
+                    schools.ForEach(x =>
+                    {
+                        x.RowKey = $"{x.schoolid}";
+                        x.PartitionKey = "ScSchool";
+                        x.areaId = $"{areaId}";
+                        x.city = $"{city}";
+                        x.dist = $"{dist}";
+                        var a = ignore.Find(z => z.name.Equals(x.schoolname));
+                        if (a != null)
+                        {
+                            x.schoolCode = a.id;
+                        }
+                        else
+                        {
+                            if (string.IsNullOrEmpty(x.schoolCode))
+                            {
+                                schoolDatas.Add(new SchoolData { uid = $"{x.schoolid}", province = "四川省", city = $"{city}", name = x.schoolname });
+                            }
+                        }
+                    });
+                    schoolDatas = await SchoolService.GenerateSchoolCode(schoolDatas, _dingDing, _environment);
+                    schools.ForEach(x => {
+                        var schoolData = schoolDatas.Find(y => y.uid.Equals($"{x.schoolid}"));
+                        if (schoolData != null && !string.IsNullOrEmpty(schoolData.id))
+                        {
+                            x.schoolCode = schoolData.id;
+                            x.areaId = $"{areaId}";
+                            x.city = $"{city}";
+                            x.dist = $"{dist}";
+                        }
+                    });
+
+                    schools.RemoveAll(x => string.IsNullOrEmpty(x.schoolCode));
+                    saveschools = await _azureStorage.SaveOrUpdateAll(schools);
+                }
+            }
+            return null;
+        }
+
         public static async Task<List<SchoolData>> GenerateSchoolCode(List<SchoolData> schools, DingDing _dingDing, IWebHostEnvironment _environment)
         {
             string path = $"{_environment.ContentRootPath}/JsonFile/Core/region.json";

+ 12 - 0
TEAMModelOS.SDK/Models/Service/Third/ThirdService.cs

@@ -27,9 +27,21 @@ namespace TEAMModelOS.SDK.Models
                 {
                     try
                     {
+                       
                         School school = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>(scSchool.schoolCode, new PartitionKey("Base"));
+                        
                         if (school != null)
                         {
+                            if (scTeachers.IsNotEmpty())
+                            {
+                                if (string.IsNullOrEmpty(scTeachers[0].tmdid))
+                                {
+                                    scTeachers[0].tmdid = teacher.id;
+                                    scTeachers[0].schoolCode = scSchool.schoolCode;
+                                    scTeachers[0].areaId = school.areaId;
+                                    await _azureStorage.Update<ScTeacher>(scTeachers[0]);
+                                }
+                            }
                             var sc = teacher.schools.Find(x => x.schoolId.Equals(scSchool.schoolCode));
                             if (sc != null)
                             {

+ 2 - 1
TEAMModelOS/ClientApp/babel.config.js

@@ -9,6 +9,7 @@ module.exports = {
                 'libraryName': 'element-ui',
                 'styleLibraryName': 'theme-chalk'
             }
-        ]
+        ],
+        '@babel/plugin-proposal-optional-chaining'
     ]
 }

+ 1 - 0
TEAMModelOS/ClientApp/package.json

@@ -17,6 +17,7 @@
     "@azure/abort-controller": "^1.0.4",
     "@azure/storage-blob": "^12.8.0",
     "@azure/storage-file-datalake": "^12.2.0",
+    "@babel/plugin-proposal-optional-chaining": "^7.16.5",
     "@ckeditor/ckeditor5-build-inline": "^12.3.1",
     "@jiaminghi/data-view": "^2.10.0",
     "@lywzx/vue.access.control": "^1.0.10",

+ 2 - 2
TEAMModelOS/ClientApp/src/api/login.js

@@ -240,11 +240,11 @@ export default {
 	bandOpenAccount(data) {
 		return new Promise((resolve,reject) => {
 			let srvAdr = localStorage.getItem('srvAdr')
-			let url = config.state[srvAdr].coreAPIUrl
+			let url = store.state.config[srvAdr].coreAPIUrl
 			let nonceStr = 'habook'  // 檢查項目
 			let params = {
 				"grant_type": "create",
-				'client_id': config.state[srvAdr].clientID,
+				'client_id': store.state.config[srvAdr].clientID,
 				'nonce': nonceStr,
 				"name": data.name,
 				"pin_code": data.pinCode,

+ 3 - 0
TEAMModelOS/ClientApp/src/api/schoolUser.js

@@ -25,5 +25,8 @@ export default {
     },
     getUserFromCoreId: function (data) {
         return post('/school/teacher/get-coreuser', data)
+    },
+    setTeacherInfo: function (data) {
+        return post('/teacher/init/set-teacher-info', data)
     }
 }

+ 2 - 2
TEAMModelOS/ClientApp/src/components/evaluation/ExerciseList.vue

@@ -218,7 +218,7 @@
 				return new Promise(async (r,j) => {
 					if(list.length){
 						/* 如果是评测里面的试题 则不需要从getFullItem取 */
-						let blobList = this.examPropScope && !this.inSyllabus ? list : await this.$evTools.getFullItem(list,undefined,this.inSyllabus)
+						let blobList = this.examPropScope ? list : await this.$evTools.getFullItem(list,undefined,this.inSyllabus)
 						r(blobList)
 					}else{
 						r([])
@@ -389,9 +389,9 @@
 				handler(n,o){
 					if(n){
 						if(n.length){
-							console.log(n);
 							this.originData = n
 							this.totalNum = n.length
+							this.examPropScope = this.examScope
 							this.pageChange(1)
 						}else{
 							this.dataLoading = true

+ 6 - 2
TEAMModelOS/ClientApp/src/locale/lang/en-US/teachermgmt.js

@@ -15,6 +15,7 @@ export default {
         th3: 'Title',
         th4: 'Authorization Status',
         th5: 'Pedagogical Research Team',
+        th6: '學科',
     },
     authSet:{
         title:'Authorization Settings',
@@ -37,7 +38,7 @@ export default {
         },
         warning:{
             title: 'Reminder',
-            text1: 'Please check the box on the left side first'
+            text1: 'Please check the teacher first'
         }
     },
     message:{
@@ -192,5 +193,8 @@ export default {
     groupName:'組名',
     gNameWarning:'請輸入組名',
     editOk:'修改成功',
-    editErr:'修改失敗'
+    editErr:'修改失敗',
+    batchSetSubj:'批量設置學科',
+    setSubjTitle:'設置學科',
+    sltSubjTips:'請選擇學科'
 }

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

@@ -15,6 +15,7 @@ export default {
         th3: '职称',
         th4: '权限状态',
         th5: '教研组',
+        th6: '学科',
     },
     authSet:{
         title:'权限设定',
@@ -37,7 +38,7 @@ export default {
         },
         warning:{
             title: '提醒',
-            text1: '请先勾选左侧的老师'
+            text1: '请先勾选老师'
         }
     },
     message:{
@@ -192,5 +193,8 @@ export default {
     groupName:'组名',
     gNameWarning:'请输入组名',
     editOk:'修改成功',
-    editErr:'修改失败'
+    editErr:'修改失败',
+    batchSetSubj:'批量设置学科',
+    setSubjTitle:'设置学科',
+    sltSubjTips:'请选择学科'
 }

+ 6 - 2
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/teachermgmt.js

@@ -15,6 +15,7 @@ export default {
         th3: '職稱',
         th4: '權限狀態',
         th5: '教研組',
+        th6: '學科',
     },
     authSet:{
         title:'權限設定',
@@ -37,7 +38,7 @@ export default {
         },
         warning:{
             title: '提醒',
-            text1: '請先勾選左側的教師'
+            text1: '請先勾選教師'
         }
     },
     message:{
@@ -192,5 +193,8 @@ export default {
     groupName:'組名',
     gNameWarning:'請輸入組名',
     editOk:'修改成功',
-    editErr:'修改失敗'
+    editErr:'修改失敗',
+    batchSetSubj:'批量設置學科',
+    setSubjTitle:'設置學科',
+    sltSubjTips:'請選擇學科'
 }

+ 45 - 3
TEAMModelOS/ClientApp/src/utils/js-fn.js

@@ -1,3 +1,6 @@
+
+import store from '@/store'
+
 /*
  * 根据某个属性进行分组
  */
@@ -146,7 +149,7 @@ function createVideoPoster(url, name, quality) {
     return new Promise(
         (r, j) => {
             try {
-				console.error(...arguments)
+                console.error(...arguments)
                 let video = document.createElement('video')
                 video.setAttribute('crossOrigin', 'Anonymous')
                 video.setAttribute('width', '300')
@@ -165,7 +168,7 @@ function createVideoPoster(url, name, quality) {
                     r(newVideoData)
                 })
                 video.addEventListener('error', (e) => {
-					console.error(e)
+                    console.error(e)
                     j('Format Error')
                 })
             }
@@ -340,6 +343,44 @@ function getYearByGrade(data, curPd, grade) {
         return curYear
     }
 }
+/**
+ * 根据教师绑定的学科id获取学科和学段名称
+ * @param ids 学科ids
+ * @returns 
+ * [
+ *  {
+ *      periodId:'ddd'
+ *      periodName:'小学',
+ *      subjectId:'wwww',
+ *      subjectName:'语文'
+ *  }
+ * ]
+ */
+function getTeacherSubjects(ids) {
+    console.log(store)
+    let schoolPeriod = store.state.user?.schoolProfile?.school_base?.period
+    if (ids && ids.length && schoolPeriod) {
+        let data = []
+        ids.forEach(sid => {
+            for (let i = 0; i < schoolPeriod.length; i++) {
+                let subjectInfo = schoolPeriod[i].subjects.find(subject => subject.id === sid)
+                if (subjectInfo) {
+                    data.push({
+                        periodId:schoolPeriod[i].id,
+                        periodName:schoolPeriod[i].name,
+                        subjectId:subjectInfo.id,
+                        subjectName:subjectInfo.name
+                    })
+                    break
+                }
+            }
+        })
+        return data
+    } else {
+        return []
+    }
+
+}
 
 export default {
     groupBy,
@@ -362,5 +403,6 @@ export default {
     getGradeNameByYear,
     getYearByGrade,
     dateFormat,
-    timeFormat
+    timeFormat,
+    getTeacherSubjects
 }

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

@@ -641,6 +641,7 @@
 					rnodes: []
 				}
 				this.hasModify = false
+				this.activeVolumeIndex = 0
 				type === 'fromCreate' ? this.getVolumeList(true) : this.getShareVolumeList(true)
 			},
 			/* 获取册别列表 */
@@ -2037,6 +2038,7 @@
 						this.isLoading = true
 						this.previewPaper = null
 						let tmdId = item.code.replace('Item-', '')
+						console.log(tmdId,this.curTeammodelId)
 						// 如果不是当前用户自己的试题 则需要去获取他人BLOB内部的试题JSON文件
 						if (tmdId !== this.curTeammodelId) {
 							this.isFullList = 'true'

+ 4 - 0
TEAMModelOS/ClientApp/src/view/teachermgmt/components/userList/Index.less

@@ -194,4 +194,8 @@
          }
           
       }
+}
+.subject-tag{
+    cursor: pointer;
+    user-select: none;
 }

+ 120 - 153
TEAMModelOS/ClientApp/src/view/teachermgmt/components/userList/Index.vue

@@ -8,105 +8,17 @@
     max-width: 300px;
     .ivu-input {
         font-size: 13px;
-        // background-color: #f5f5f5;
-        // border: none;
-        // color: var(--primary-text-color);
     }
 }
 .multiSet {
-    // &:hover {
-        span {
-            color: #40a8f0;
-        }
-    // }
+    span {
+        color: #40a8f0;
+    }
     .icon {
         vertical-align: middle;
         margin-right: 7px;
     }
 }
-.userListContent {
-    .ivu-table {
-        // background-color: transparent;
-        .ivu-table-header {
-            tr:first-child {
-                /* background: -webkit-linear-gradient(left, #272727, #222222);
-                background: -o-linear-gradient(right, #272727, #222222);
-                background: -moz-linear-gradient(right, #272727, #222222);
-                background: linear-gradient(to right, #272727, #222222); */
-                background: var(--body-bg);
-            }
-        }
-        th {
-            // background-color: transparent;
-            border-bottom: 1px solid var(--border-color);
-            color: var(--second-text-color);
-            font-size: 12px;
-        }
-        td {
-            // background-color: transparent;
-        }
-        .ivu-table-tbody {
-            td {
-                // background-color: transparent;
-                border-bottom: 1px solid var(--border-color);
-                color: var(--primary-text-color);
-                font-size: 12px;
-            }
-            .ivu-table-row {
-                td:nth-child(8) {
-                    .ivu-table-cell {
-                        display: none;
-                    }
-                }
-            }
-        }
-        .ivu-table-row-hover {
-            /* background: -webkit-linear-gradient(left, #272727, #373737);
-            background: -o-linear-gradient(right, #272727, #373737);
-            background: -moz-linear-gradient(right, #272727, #373737);
-            background: linear-gradient(to right, #272727, #373737); */
-            background: var(--active-item-start);
-            td:last-child {
-                .ivu-table-cell {
-                    display: block !important;
-                }
-            }
-        }
-        .ivu-checkbox-inner {
-            background-color: transparent;
-            border: 2px solid var(--border-color);
-            border-radius: 3px;
-        }
-        .ivu-checkbox-checked .ivu-checkbox-inner:after {
-            width: 8px;
-            height: 14px;
-            top: -2px;
-            left: 4px;
-            border-color: #0094ff;
-            border-right-width: 3px;
-            border-bottom-width: 3px;
-        }
-        .ivu-table-overflowY {
-            &::-webkit-scrollbar {
-                width: 5px;
-            }
-            &::-webkit-scrollbar-track {
-                // margin: 0px;
-                background: transparent;
-            }
-            &::-webkit-scrollbar-thumb {
-                border-radius: 10px;
-                background: #94998a;
-            }
-            &::-webkit-scrollbar-thumb:hover {
-                /* background: #555; */
-            }
-            &::-webkit-scrollbar-button {
-                display: none;
-            }
-        }
-    }
-}
 .authSetting {
     .ivu-btn {
         background-color: #1cc0f2;
@@ -114,22 +26,10 @@
         border-radius: 2px;
         border: 0;
     }
-    .users {
-        .jobInp {
-            // .ivu-input {
-            //     background-color: transparent;
-            //     border: 0;
-            //     border-bottom: 1px solid #6b6a6a;
-            //     padding-left: 0;
-            //     color: #fefefe;
-            // }
-        }
-    }
 }
 .ids {
     .ivu-tooltip-inner {
         opacity: 0.5;
-        // background: rgba(100, 100, 100, 0.2);
         background: #010101;
         border: 1px rgba(160, 160, 160, 0.5) solid;
     }
@@ -167,7 +67,6 @@
 .jobModal {
     .ivu-modal {
         .ivu-modal-content {
-            // background-color: #2a292e;
             .ivu-modal-header,
             .ivu-modal-footer {
                 border: 0;
@@ -231,12 +130,20 @@
                 <Button v-if="$access.can('admin.*|teacher-upd') && !authMulti && isOpenSpaceAuth == false" class="multiSet" type="text" @click="multiSet()">
                     <icon class="icon" icon="shield-alt" /> {{ $t('teachermgmt.mulitSet') }}
                 </Button>
+                <Button v-if="$access.can('admin.*|teacher-upd')" class="multiSet" type="text" @click="batchSetSubject()">
+                    <Icon class="icon" type="ios-settings" size="18" />{{ $t('teachermgmt.batchSetSubj') }}
+                </Button>
             </div>
             <div class="userListContent">
-                <Table v-if="isMockReloadAlive" class="scrollstyle" :height="tableHeight" ref="selection" :columns="tableColumns" :data="tableData" @on-selection-change="setTeachers" @on-sort-change="changeSort">
+                <Table v-if="isMockReloadAlive" stripe class="scrollstyle" :height="tableHeight" ref="selection" :columns="tableColumns" :data="tableData" @on-selection-change="setTeachers" @on-sort-change="changeSort">
                     <template slot-scope="{ row }" slot="picture">
                         <PersonalPhoto :name="row.name" :picture="row.picture" />
                     </template>
+                    <template slot-scope="{ row,index }" slot="subject">
+                        <span :style="{color:row.subjectIds && row.subjectIds.length? '':'red'}" class="subject-tag" @click="showSetSubj(index)">
+                            {{row.subjectIds && row.subjectIds.length ? getSubjectNames(row.subjectIds) : $t('teachermgmt.notSet')}}
+                        </span>
+                    </template>
                     <template slot-scope="{ row }" slot="action" v-if="isOpenSpaceAuth == false">
                         <icon v-show="!row.roles.includes('admin')" icon="shield-alt" style="font-size: 14px; color: var(--normal-icon-color); margin-right: 20px; cursor: pointer;" @click="showAuth(row)" />
                         <icon v-show="!row.roles.includes('admin')" icon="trash" style="color: var(--normal-icon-color); font-size: 14px; cursor: pointer" @click="removeUser(row)" />
@@ -361,6 +268,11 @@
                 </Option>
             </Select>
         </Modal>
+        <!-- 设置教师学科 -->
+        <Modal v-model="setSubjStatus" :title="$t('teachermgmt.setSubjTitle')" @on-ok="confirmSetSubj" :loading="modalLoading">
+            <el-cascader ref="subjects" size="small" :options="targetData" clearable filterable v-model="setSubj" :props="props" style="width:100%;">
+            </el-cascader>
+        </Modal>
     </div>
 </template>
 
@@ -374,6 +286,12 @@ export default {
     name: 'userList',
     data() {
         return {
+            props: {
+                multiple: true,
+                value: 'id',
+                label: 'name'
+            },
+            setSubj: [],
             columns: [
                 {
                     type: 'selection',
@@ -387,9 +305,8 @@ export default {
                     align: 'center'
                 },
                 {
-                    // title: this.$t('teachermgmt.table.th1'),
                     title: 'ID',
-                    minWidth:160,
+                    minWidth: 160,
                     key: 'id',
                     sortable: true
                 },
@@ -412,6 +329,12 @@ export default {
                         }
                     }
                 },
+                {
+                    title: this.$t('teachermgmt.table.th6'),
+                    slot: 'subject',
+                    minWidth: 160,
+                    sortable: true
+                },
                 {
                     title: this.$t('teachermgmt.table.th4'),
                     sortable: true,
@@ -447,9 +370,9 @@ export default {
                     slot: 'action',
                     minWidth: 150,
                     align: 'center'
-                    // show: true
                 }
             ],
+            setSubjStatus: false,
             transferStatus: false,
             modalLoading: true,
             curTeaId: '',//当前教师id
@@ -489,6 +412,21 @@ export default {
             isKeyInSpace: 'spaceAuth/getIsKeyInSpace',
             maxFixedAssignedValue: 'spaceAuth/getMaxFixedAssignedValue'
         }),
+        targetData() {
+            let nodes = []
+            let schoolBase = this.$store.state.user.schoolProfile.school_base
+            if (schoolBase) {
+                schoolBase.period.forEach(item => {
+                    let dataItem = {
+                        id: item.id,
+                        name: item.name,
+                        children: item.subjects
+                    }
+                    nodes.push(dataItem)
+                })
+            }
+            return nodes
+        },
         authListAll: function () {
             // 所有權限列表(階層構造)
             console.log('auth', this.authData.authListFormed)
@@ -503,9 +441,6 @@ export default {
                 return newAuthdisable
             }
         },
-        //authstatus: function() { // (i-switch用)權限開關控制value資料
-        //    return this.authData.authStatus
-        //},
         authIdToPath: function () {
             // 權限ID <=> 權限路徑 對照表
             return this.authData.authIdToPath
@@ -689,19 +624,6 @@ export default {
                             } else {
                                 return h('span', this.$t('teachermgmt.table.text1'))
                             }
-                            // if (params.row.permissionCount > 0) {
-                            //     return h(
-                            //         'span',
-                            //         {
-                            //             style: {
-                            //                 color: '#1CC0F3'
-                            //             }
-                            //         },
-                            //         this.$t('teachermgmt.table.text2')
-                            //     )
-                            // } else {
-                            //     return h('span', this.$t('teachermgmt.table.text1'))
-                            // }
                         }
                     },
                     {
@@ -722,23 +644,7 @@ export default {
                         title: ' ',
                         width: 80,
                         slot: 'picture',
-                        // key: 'picture',
                         align: 'center'
-                        // render: (h, params) => {
-                        //     return h('img', {
-                        //         attrs: {
-                        //             src: params.row.picture
-                        //         },
-                        //         style: {
-                        //             display: 'inline-block',
-                        //             width: '36px',
-                        //             'border-radius': '50%',
-                        //             'align-items': 'center',
-                        //             'justify-content': 'center',
-                        //             'overflow': 'hidden'
-                        //         }
-                        //     })
-                        // }
                     },
                     {
                         title: this.$t('teachermgmt.table.th1'),
@@ -790,19 +696,6 @@ export default {
                             } else {
                                 return h('span', this.$t('teachermgmt.table.text1'))
                             }
-                            // if (params.row.permissionCount > 0) {
-                            //     return h(
-                            //         'span',
-                            //         {
-                            //             style: {
-                            //                 color: '#1CC0F3'
-                            //             }
-                            //         },
-                            //         this.$t('teachermgmt.table.text2')
-                            //     )
-                            // } else {
-                            //     return h('span', this.$t('teachermgmt.table.text1'))
-                            // }
                         }
                     },
                     {
@@ -817,6 +710,80 @@ export default {
         }
     },
     methods: {
+        //批量设置学科
+        batchSetSubject() {
+            if (this.teachers && this.teachers.length) {
+                this.setSubj = []
+                this.setSubjIndex = -1
+                this.setSubjStatus = true
+            } else {
+                this.$Modal.warning({
+                    title: this.$t('teachermgmt.model.warning.title'),
+                    content: this.$t('teachermgmt.model.warning.text1')
+                })
+            }
+        },
+        //获取教师学科信息
+        getSubjectNames(ids) {
+            let data = this.$jsFn.getTeacherSubjects(ids)
+            console.log(ids, data)
+            if (data && data.length) {
+                return data.map(item => item.subjectName).join(',')
+            } else {
+                return ''
+            }
+        },
+        //确认设置教师学科
+        confirmSetSubj() {
+            console.log(this.setSubj)
+            if (this.setSubj.length) {
+                let teacherIds
+                if (this.setSubjIndex > -1) {
+                    teacherIds = [this.tableData[this.setSubjIndex].id]
+                } else {
+                    teacherIds = this.teachers.map(item => item.id)
+                }
+                let params = {
+                    "opt": "SetTeacherSubject",
+                    "targerTecher": teacherIds,
+                    "subjectIds": this.setSubj.map(item => item[1])
+                }
+                console.log(params)
+                this.$api.schoolUser.setTeacherInfo(params).then(
+                    res => {
+                        this.$Message.success(this.$t('teachermgmt.setOk'))
+                        this.setSubjStatus = false
+                        //更新UI
+                        teacherIds.forEach(tid => {
+                            let index = this.data.findIndex(item => item.id == tid)
+                            if (index > -1) {
+                                this.$set(this.data[index], 'subjectIds', this.setSubj.map(item => item[1]))
+                            }
+                        })
+                    },
+                    err => {
+                        this.$Message.error(this.$t('teachermgmt.setErr'))
+                    }
+                )
+            } else {
+                this.$Message.warning(this.$t('teachermgmt.sltSubjTips'))
+                this.modalLoading = false
+                setTimeout(() => {
+                    this.modalLoading = true
+                })
+            }
+        },
+        //显示设置教师学科
+        showSetSubj(index) {
+            this.setSubjIndex = index
+            if (this.tableData[index].subjectIds && this.tableData[index].subjectIds.length) {
+                let subjectInfos = this.$jsFn.getTeacherSubjects(this.tableData[index].subjectIds)
+                this.setSubj = subjectInfos.map(item => [item.periodId, item.subjectId])
+            } else {
+                this.setSubj = []
+            }
+            this.setSubjStatus = true
+        },
         //确认转让
         confirmTransfer() {
             if (!this.toAdminId) {

+ 1 - 0
TEAMModelOS/ClientApp/src/view/user/BandPhone.vue

@@ -241,6 +241,7 @@ export default {
                             )
                         },
                         err => {
+                            console.error(err)
                             this.$Message.error(this.$t('login.banderr'))
                         }
                     )

+ 31 - 9
TEAMModelOS/Controllers/Teacher/InitController.cs

@@ -127,17 +127,39 @@ namespace TEAMModelOS.Controllers
                         && request.TryGetProperty("subjectIds", out JsonElement _subjectIds):
                         if (_subjectIds.ValueKind.Equals(JsonValueKind.Array))
                         {
-                            try
+
+                            if (_targetTecher.ValueKind.Equals(JsonValueKind.Array))
                             {
-                                SchoolTeacher schoolTeacher = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<SchoolTeacher>($"{_targetTecher}", new PartitionKey($"Teacher-{school}"));
-                                schoolTeacher.subjectIds = _subjectIds.ToObject<List<string>>();
-                                await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<SchoolTeacher>(schoolTeacher, $"{_targetTecher}", new PartitionKey($"Teacher-{school}"));
-                                return Ok(new { status = 1 , schoolTeacher });
+                                List<string> targetTechers = _targetTecher.ToObject<List<string>>();
+                                List<SchoolTeacher> schoolTeachers = new List<SchoolTeacher>();
+                                foreach (string targetTecher in targetTechers) {
+                                    try
+                                    {
+                                        SchoolTeacher schoolTeacher = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<SchoolTeacher>($"{targetTecher}", new PartitionKey($"Teacher-{school}"));
+                                        schoolTeacher.subjectIds = _subjectIds.ToObject<List<string>>();
+                                        await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<SchoolTeacher>(schoolTeacher, $"{targetTecher}", new PartitionKey($"Teacher-{school}"));
+                                        schoolTeachers.Add(schoolTeacher);
+                                    }
+                                    catch (Exception ex) {
+                                        await _dingDing.SendBotMsg($"IES5,{_option.Location},Teacher/init/set-teacher-info:SetTeacherSubject()\n{ex.Message}{ex.StackTrace}{request.ToJsonString()}-{targetTecher}", GroupNames.醍摩豆服務運維群組);
+                                    }
+                                }
+                                return Ok(new { status = 1, schoolTeachers });
                             }
-                            catch (Exception ex)
-                            {
-                                await _dingDing.SendBotMsg($"IES5,{_option.Location},Teacher/init/set-teacher-info:SetTeacherSubject()\n{ex.Message}{ex.StackTrace}{request.ToJsonString()}", GroupNames.醍摩豆服務運維群組);
-                                return Ok(new { error = -1, msg = "设置失败" });
+                            else {
+                                try
+                                {
+                                    SchoolTeacher schoolTeacher = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<SchoolTeacher>($"{_targetTecher}", new PartitionKey($"Teacher-{school}"));
+                                    schoolTeacher.subjectIds = _subjectIds.ToObject<List<string>>();
+                                    await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<SchoolTeacher>(schoolTeacher, $"{_targetTecher}", new PartitionKey($"Teacher-{school}"));
+                                    return Ok(new { status = 1, schoolTeacher });
+                                }
+                                catch (Exception ex)
+                                {
+                                    await _dingDing.SendBotMsg($"IES5,{_option.Location},Teacher/init/set-teacher-info:SetTeacherSubject()\n{ex.Message}{ex.StackTrace}{request.ToJsonString()}", GroupNames.醍摩豆服務運維群組);
+                                    return Ok(new { error = -1, msg = "设置失败" });
+                                }
+
                             }
                         }
                         else {

+ 57 - 12
TEAMModelOS/Controllers/Third/ScController.cs

@@ -95,7 +95,21 @@ namespace TEAMModelOS.Controllers.Third
             _httpTrigger = httpTrigger;
             _environment = environment;
         }
-
+        /// <summary>
+        /// 检查醍摩豆id存在多个学校的情况
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [ProducesDefaultResponseType]
+        [HttpPost("sc/delete-school-teacher")]
+        [AllowAnonymous]
+        public async Task<IActionResult> DeleteSchoolTeacher(JsonElement request) {
+            List<ScSchool> delScSchool = await _azureStorage.FindListByDict<ScSchool>(new Dictionary<string, object>() { { "PartitionKey", "ScSchool" }, { "areaId", "99a4a33b-e21b-44ac-80a1-b31dc40496e0" } });
+            await _azureStorage.DeleteAll(delScSchool);
+            List<ScTeacher> delScTeacher = await _azureStorage.FindListByDict<ScTeacher>(new Dictionary<string, object>() { { "PartitionKey", "ScTeacher" }, { "areaId", "99a4a33b-e21b-44ac-80a1-b31dc40496e0" } });
+            await _azureStorage.DeleteAll(delScTeacher);
+            return Ok(request);
+        }
 
 
         /// <summary>
@@ -107,10 +121,6 @@ namespace TEAMModelOS.Controllers.Third
         [HttpPost("sc/get-project-school-teacher")]
         [AllowAnonymous]
         public async Task<IActionResult> GetProjectSchoolTeacher(JsonElement request) {
-            List<ScSchool > delScSchool = await _azureStorage.FindListByDict<ScSchool>(new Dictionary<string, object>() { { "PartitionKey", "ScSchool" },{ "areaId", "99a4a33b-e21b-44ac-80a1-b31dc40496e0" } });
-            await _azureStorage.DeleteAll(delScSchool);
-            List <ScTeacher> delScTeacher = await _azureStorage.FindListByDict<ScTeacher>(new Dictionary<string, object>() { { "PartitionKey", "ScTeacher" }, { "areaId", "99a4a33b-e21b-44ac-80a1-b31dc40496e0" } });
-            await _azureStorage.DeleteAll(delScTeacher);
             if (!request.TryGetProperty("accessConfig", out JsonElement accessConfig)) return BadRequest();
             if (!request.TryGetProperty("ignoreSchools", out JsonElement ignoreSchools)) return BadRequest();
             if (!request.TryGetProperty("city", out JsonElement city)) return BadRequest();
@@ -181,9 +191,17 @@ namespace TEAMModelOS.Controllers.Third
                         x.areaId = $"{areaId}";
                         x.city = $"{city}";
                         x.dist = $"{dist}";
-                        if (string.IsNullOrEmpty(x.schoolCode))
+                        var a = ignore.Find(z => z.name.Equals(x.schoolname));
+                        if (a != null)
+                        {
+                            x.schoolCode = a.id;
+                        }
+                        else
                         {
-                            schoolDatas.Add(new SchoolData { uid = $"{x.schoolid}", province = "四川省", city = $"{city}", name = x.schoolname });
+                            if (string.IsNullOrEmpty(x.schoolCode))
+                            {
+                                schoolDatas.Add(new SchoolData { uid = $"{x.schoolid}", province = "四川省", city = $"{city}", name = x.schoolname });
+                            }
                         }
                     });
 
@@ -331,6 +349,7 @@ namespace TEAMModelOS.Controllers.Third
             List<ScTeacher> teachers = new();
             // Table获取的学生
             List<ScTeacher> areaTeacher = new();
+            List<ScTeacher> repeat = new();
             // 5.3.1.2获取学员名单
             (status, json) = await _httpTrigger.RequestHttpTrigger(dict, _option.Location, "GetTeachersListByProject");
             if (status == 200)
@@ -378,7 +397,7 @@ namespace TEAMModelOS.Controllers.Third
                             if (binds.IsNotEmpty()) {
                                 List<ScTeacher> update = new List<ScTeacher>();
                                 binds.ForEach(x => {
-                                   var exs= unbindtmdid.FindAll(z => z.TID.Equals(x.userid));
+                                   var exs= unbindtmdid.FindAll(z => $"{z.TID}".Equals(x.userid));
                                     if (exs.IsNotEmpty()) {
                                         exs.ForEach(y => {
                                             y.tmdid = x.id;
@@ -386,7 +405,19 @@ namespace TEAMModelOS.Controllers.Third
                                         update.AddRange(exs);
                                     }
                                 });
-                                update = await _azureStorage.SaveOrUpdateAll(update);
+                                var group= update.GroupBy(x => x.RowKey).Select(z=>new { z.Key ,list= z.ToList()});
+                                List<ScTeacher> scTeachers = new();
+                                group.ToList().ForEach(x => {
+                                    if (x.list.Count() == 1)
+                                    {
+                                        scTeachers.Add(x.list[0]);
+                                    }
+                                    else if(x.list.Count>1) {
+                                        scTeachers.Add(x.list[0]);
+                                        repeat.AddRange(x.list);
+                                    }
+                                });
+                                scTeachers = await _azureStorage.SaveOrUpdateAll(scTeachers);
                             }
                         }
                     }
@@ -407,7 +438,7 @@ namespace TEAMModelOS.Controllers.Third
                             {
                                 
                                 binds.ForEach(x => {
-                                    var exs = teachers.FindAll(z => z.TID.Equals(x.userid));
+                                    var exs = teachers.FindAll(z => $"{z.TID}".Equals(x.userid));
                                     if (exs.IsNotEmpty())
                                     {
                                         exs.ForEach(y => {
@@ -417,7 +448,20 @@ namespace TEAMModelOS.Controllers.Third
                                 });
                             }
                         }
-                        teachers = await _azureStorage.SaveAll(teachers);
+                        var group = teachers.GroupBy(x => x.RowKey).Select(z => new { z.Key, list = z.ToList() });
+                        List<ScTeacher> scTeachers = new();
+                        group.ToList().ForEach(x => {
+                            if (x.list.Count() == 1)
+                            {
+                                scTeachers.Add(x.list[0]);
+                            }
+                            else if (x.list.Count > 1)
+                            {
+                                scTeachers.Add(x.list[0]);
+                                repeat.AddRange(x.list);
+                            }
+                        });
+                        scTeachers = await _azureStorage.SaveOrUpdateAll(scTeachers);
                   }
                 }
             }
@@ -429,7 +473,8 @@ namespace TEAMModelOS.Controllers.Third
                 schoolsfailed,
                 failedmsg,
                 schoolsScucess,
-                tbsch= tbschools.Select(x=>new { x.schoolname,x.schoolCode})
+                tbsch= tbschools.Select(x=>new { x.schoolname,x.schoolCode}),
+                repeat
             });
         }
         public class  DbBind{

+ 37 - 0
TEAMModelOS/Controllers/XTest/FixDataController.cs

@@ -76,6 +76,43 @@ namespace TEAMModelOS.Controllers
                     {
                         sc.status = "join";
                     }
+                    try
+                    {
+                        SchoolTeacher schoolTeacher = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<SchoolTeacher>(teacher.id, new PartitionKey($"Teacher-{sc.schoolId}"));
+                        if (schoolTeacher != null)
+                        {
+                            if (schoolTeacher.roles.IsEmpty() || !schoolTeacher.roles.Contains("admin"))
+                            {
+                                schoolTeacher.roles = new List<string> { "admin" };
+                            }
+                            schoolTeacher.status = "join";
+                            schoolTeacher.pk = "Teacher";
+                            schoolTeacher.name = teacher.name;
+                            schoolTeacher.picture = teacher.picture;
+                            schoolTeacher.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                            schoolTeacher.ttl = -1;
+                            schoolTeacher.permissions = schoolTeacher.permissions.IsNotEmpty() ? schoolTeacher.permissions : new List<string>();
+                            await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").UpsertItemAsync(schoolTeacher);
+                        }
+                    }
+                    catch (CosmosException ex)
+                    {
+                        SchoolTeacher schoolTeacher = new SchoolTeacher
+                        {
+                            id = teacher.id,
+                            code = $"Teacher-{sc.schoolId}",
+                            roles = new List<string> { "teacher" },
+                            permissions = new List<string>(),
+                            pk = "Teacher",
+                            name = teacher.name,
+                            picture = teacher.picture,
+                            status = "join",
+                            createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
+                            ttl = -1
+                        };
+                        await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").UpsertItemAsync(schoolTeacher);
+                    }
+
                 }
                 else {
                     teacher.schools.Add(new Teacher.TeacherSchool { schoolId = item.id, name = item.name, areaId = item.areaId, picture = item.picture, time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), status = "join" });