Browse Source

Merge branch 'develop' of http://52.130.252.100:10000/TEAMMODEL/TEAMModelOS into develop

zhouj1203@hotmail.com 1 năm trước cách đây
mục cha
commit
6cc8548dc9
33 tập tin đã thay đổi với 995 bổ sung282 xóa
  1. 20 20
      TEAMModelBI/ClientApp/src/view/created/created.vue
  2. 61 25
      TEAMModelBI/ClientApp/src/view/userInquire/details.vue
  3. 13 0
      TEAMModelBI/ClientApp/src/view/userInquire/ies.vue
  4. 12 4
      TEAMModelBI/ClientApp/src/view/userInquire/index.vue
  5. 12 0
      TEAMModelBI/ClientApp/src/view/userInquire/score.vue
  6. 32 14
      TEAMModelBI/ClientApp/src/view/userInquire/socrates.vue
  7. 14 13
      TEAMModelBI/Controllers/BISchool/BatchSchoolController.cs
  8. 3 3
      TEAMModelBI/TEAMModelBI.csproj
  9. 3 3
      TEAMModelOS.FunctionV4/TEAMModelOS.FunctionV4.csproj
  10. 2 2
      TEAMModelOS.SDK/Models/Cosmos/Common/IotTeachingData.cs
  11. 14 6
      TEAMModelOS.SDK/Models/Cosmos/Common/StudentScoreRecord.cs
  12. 1 0
      TEAMModelOS.SDK/Models/Cosmos/School/CourseBase.cs
  13. 1 1
      TEAMModelOS.SDK/Models/Cosmos/School/School.cs
  14. 6 13
      TEAMModelOS.SDK/Models/Dtos/LessonRecordActivityInfo.cs
  15. 3 0
      TEAMModelOS.SDK/Models/Service/OpenApiService.cs
  16. 3 5
      TEAMModelOS.SDK/TEAMModelOS.SDK.csproj
  17. 68 0
      TEAMModelOS.TEST/Program.cs
  18. 6 1
      TEAMModelOS/ClientApp/public/lang/en-US.js
  19. 2 0
      TEAMModelOS/ClientApp/public/lang/zh-CN.js
  20. 6 1
      TEAMModelOS/ClientApp/public/lang/zh-TW.js
  21. 1 1
      TEAMModelOS/ClientApp/src/common/BaseSelectSchool.vue
  22. 25 4
      TEAMModelOS/ClientApp/src/view/coursemgt/NewCusMgt.vue
  23. 1 1
      TEAMModelOS/ClientApp/src/view/mycourse/score/ScoreBody.vue
  24. 13 0
      TEAMModelOS/Controllers/Both/CourseBaseController.cs
  25. 507 67
      TEAMModelOS/Controllers/Both/GroupListController.cs
  26. 3 3
      TEAMModelOS/Controllers/Both/ScoreCalcController.cs
  27. 1 1
      TEAMModelOS/Controllers/Client/HabbController.cs
  28. 79 31
      TEAMModelOS/Controllers/Common/ExamController.cs
  29. 11 0
      TEAMModelOS/Controllers/School/SchoolController.cs
  30. 66 57
      TEAMModelOS/Controllers/Student/OverallEducationController.cs
  31. 4 4
      TEAMModelOS/TEAMModelOS.csproj
  32. 1 1
      TEAMModelOS/appsettings.Development.json
  33. 1 1
      TEAMModelOS/appsettings.json

+ 20 - 20
TEAMModelBI/ClientApp/src/view/created/created.vue

@@ -1338,7 +1338,6 @@ export default {
       console.log(data, '提交的数据')
       proxy.$api.verifyContent(data).then((res) => {
         console.log(res, '数据验证的结果')
-        res.state === 200 ? (batchDatas.forEach((item) => { item.dataState = true }), batchVerify(presentData, loadingverify), codeShow.value = true) : ''
         if (res.state === 200) {
           //处理简码
           res.createScInfo.forEach((items) => {
@@ -1349,6 +1348,7 @@ export default {
             }
           })
         }
+        res.state === 200 ? (batchDatas.forEach((item) => { item.dataState = true }), batchVerify(presentData, loadingverify), codeShow.value = true) : ''
         if (res.state === 201) {
           codeShow.value = false
           batchTablesArr.value = true; verifyState.value = false
@@ -1552,7 +1552,7 @@ export default {
       console.log(schoolForm.value)
       let schooldata = schoolForm.value
       let provinceName = (siteValue === 'cn') ? schooldata[0].schoolLocation.province : schooldata[0].schoolLocation.region ////國際站以region為省名獲取學校簡碼
-      let param = [{ id: '', name: schooldata[0].name, province: provinceName, aname: schooldata[0].name, city: schooldata[0].schoolLocation.area, createCount: 0 }]
+      let param = [{ id: '', name: schooldata[0].name, province: provinceName, aname: schooldata[0].name, city: schooldata[0].schoolLocation.city, createCount: 0 }]
       let data = { schools: param }
       console.log(data, '提交数据')
       proxy.$api.getSchoolcode(data).then((res) => {
@@ -1732,10 +1732,10 @@ export default {
         })
       }
 
-      let datas = { regionId: regionCodeNow, name: verifyData[0].name, nameFuzzy: false, shortCode: verifyData[0].code, shortCodeFuzzy: false }
+      let datas = { regionId: '', name: '', nameFuzzy: false, shortCode: '', shortCodeFuzzy: false, codeOrShortCode: verifyData[0].code }
       proxy.$api.verifyDatainbb(datas).then((res) => {
         console.log(res.length, '核验数据')
-        res.length == 0 ? (verifyForstate.value.state = true, verifyForstate.value.pass = true, ElMessage.success('数据已通过核验,可执行创校')) : (verifyForstate.value.state = false, verifyForstate.value.pass = false, ElMessage.error('数据未通过核验,请检查表单内容'))
+        res.length == 0 ? (verifyForstate.value.state = true, verifyForstate.value.pass = true, ElMessage.success('数据已通过核验,可执行创校')) : (verifyForstate.value.state = false, verifyForstate.value.pass = false, ElMessage.error('数据未通过核验,BB学校资料库已存在此学校代码或简码。'))
       }).catch((error) => {
         ElMessage.error('API异常,数据核验失败')
       })
@@ -1747,25 +1747,25 @@ export default {
       let scArr = value
       let snameList = []; let scodeList = []; let shortArr = []; let regionList = []; let regionInfoRowNow = [];
       let regionCodeTmp = ''
-      scArr.forEach((item) => {
-        snameList.push(item.name);
-        scodeList.push(item.id);
+        scArr.forEach((item) => {
+        // snameList.push(item.name);
+        // scodeList.push(item.id);
         shortArr.push(item.id);
-        regionInfoRowNow = regionInfoList.filter(function (rgitem) { return rgitem.name.includes(item.region) })
-        regionCodeTmp = (regionInfoRowNow.length > 0 && regionInfoRowNow[0].hasOwnProperty('code')) ? regionInfoRowNow[0]['code'] : ''
-        if (regionCodeTmp != '' && !regionList.includes(regionCodeTmp)) {
-          regionList.push(regionCodeTmp)
-        }
+        // regionInfoRowNow = regionInfoList.filter(function (rgitem) { return rgitem.name.includes(item.region) })
+        // regionCodeTmp = (regionInfoRowNow.length > 0 && regionInfoRowNow[0].hasOwnProperty('code')) ? regionInfoRowNow[0]['code'] : ''
+        // if (regionCodeTmp != '' && !regionList.includes(regionCodeTmp)) {
+        //   regionList.push(regionCodeTmp)
+        // }
       })
-      let data = { nameList: snameList, codeList: scodeList, shortCodeList: shortArr }
-      if (siteValue === 'cn') {
-        data['regionId'] = 'CN'
-      } else {
-        data['regionId'] = (regionList.length == 1) ? regionList[0] : ''
-        data['regionIdList'] = (regionList.length > 1) ? regionList : []
-      }
+      let data = { nameList: snameList, codeList: scodeList, codeOrShortCodeList: shortArr }
+      // if (siteValue === 'cn') {
+      //   data['regionId'] = 'CN'
+      // } else {
+      //   data['regionId'] = (regionList.length == 1) ? regionList[0] : ''
+      //   data['regionIdList'] = (regionList.length > 1) ? regionList : []
+      // }
       proxy.$api.verifyDatainbb(data).then((res) => {
-        res.length == 0 ? (ElMessage.success('数据已通过核验,可执行创校'), batchTablesArr.value = true) : (ElMessage.error('数据未通过核验,请检查表单内容'), batchTablesArr.value = true, verifyState.value = false)
+        res.length == 0 ? (ElMessage.success('数据已通过核验,可执行创校'), batchTablesArr.value = true) : (ElMessage.error('数据未通过核验,BB学校资料库已存在此学校代码或简码,请检查表单内容'), batchTablesArr.value = true, verifyState.value = false)
       }).catch((error) => {
         ElMessage.error('API异常,批量数据核验失败')
       })

+ 61 - 25
TEAMModelBI/ClientApp/src/view/userInquire/details.vue

@@ -101,7 +101,7 @@
                     <!-- <div class="expire">到期日:2023-11-22</div> -->
                 </div>
                 <el-divider />
-                <IES></IES>
+                <IES :iesdata="ies5datas"></IES>
             </div>
             <div class="socratesdiv">
                 <div  class="common-header-title">
@@ -109,14 +109,14 @@
                     <!-- <div class="expire">到期日:2023-11-22</div> -->
                 </div>
                 <el-divider />
-                <Socrates></Socrates>
+                <Socrates :sokratesdatas="sokratesData"></Socrates>
             </div>
             <div class="scorebox">
                 <div  class="common-header-title">
                     <div>积分统计</div>
                 </div>
                 <el-divider />
-                <Score></Score>
+                <Score :pointsdatas="pointsData"></Score>
             </div>
             <div class="ticketdiv">
                 <div  class="common-header-title">
@@ -144,23 +144,24 @@ import Userdetail from './userdetail.vue'
 let props = defineProps({
     searchdata: Object,
 })
+let { proxy } = getCurrentInstance()
 let activeName = ref('basics')
 let userdetailState=ref(false)
 let tabPosition = ref('left')
 let usernames=ref('')
 let userdata = ref([
-    { id: 1, icon: '#icon-ic_idcard', value: '1598326144', title: '',key:'integral',check:false ,hint:'用户ID'},
-    { id: 2, icon: '#icon-shouji', value: '1234567890', title: '',key:'phone',check:true,hint:'手机号码'},
-    { id: 3, icon: '#icon-dibudaohanglan-', value: '四川省成都市锦江区外国语小学', title: '',key:'school',correlation:false,check:true,hint:'学校'},
-    { id: 4, icon: '#icon-youxiang', value: '123456789@qq.com', title: '', key: 'email', check: true, hint: '邮箱' },
+    { id: 1, icon: '#icon-ic_idcard', value: '0', title: '',key:'integral',check:false ,hint:'用户ID'},
+    { id: 2, icon: '#icon-shouji', value: '0', title: '',key:'phone',check:true,hint:'手机号码'},
+    { id: 3, icon: '#icon-dibudaohanglan-', value: '', title: '',key:'school',correlation:false,check:true,hint:'学校'},
+    { id: 4, icon: '#icon-youxiang', value: '', title: '', key: 'email', check: true, hint: '邮箱' },
     { id: 5, icon: '#icon-yuyan-shi', value: '中文(简体)', title: '',key:'local',check:false ,hint:'语系'},
     { id: 6, icon: '#icon-shijian2', value: '2023-04-23', title: '', key: 'time', check: false ,hint:'上次登录时间' },
 ])
 let productdata = ref([
-    { id: 1, title: 'HiTeach', subhead1: '课堂总时长', subhead1Value: '13H', subhead2: '课堂数量', subhead2Value: 25,key:'HiTeach',state: true },
+    { id: 1, title: 'HiTeach', subhead1: '课堂总时长', subhead1Value: '13H', subhead2: '课堂数量', subhead2Value: 25,key:'HiTeach',state: false },
     { id: 2, title: 'HiTA', subhead1: '使用时长', subhead1Value: '13H', subhead2: '协助课堂', subhead2Value: 199, key:'HiTA',state: false },
-    { id: 3, title: 'IES', subhead1: '使用资源课程', subhead1Value: '159', subhead2: '贡献资源数量', subhead2Value: 13, key:'IES', state: true },
-    { id: 4, title: '苏格拉底', subhead1: '上传影片', subhead1Value: '9', subhead2: '议课数量', subhead2Value: 15,key:'Socrates', state: true },
+    { id: 3, title: 'IES', subhead1: '使用资源课程', subhead1Value: '159', subhead2: '贡献资源数量', subhead2Value: 13, key:'IES', state: false },
+    { id: 4, title: '苏格拉底', subhead1: '上传影片', subhead1Value: '9', subhead2: '议课数量', subhead2Value: 15,key:'Socrates', state: false },
 ])
 let tableData = ref([
     { time: '2023-07-05 15:33', ip: '222.209.14.199', location: '四川省成都市',platform:'HiTeach' },
@@ -311,6 +312,16 @@ let maplabels = ref([
     {id:4,value:'300-100',color:'#58d4b0'},
 ])
 let gaugedata = ref({
+    title:[{
+        text: '0',
+        x: 'center',
+        bottom:'33%',
+        textStyle: {
+            fontSize: '14',
+            color: '#313a5e',
+            foontWeight: '600',
+        },
+    }],
     series: [
         {
         type: 'gauge',
@@ -369,7 +380,7 @@ let gaugedata = ref({
             return params+'%'
             },
         },
-         title: {
+        title: {
             show: true,
             offsetCenter: [0, '0%'], // x, y,单位px
             textStyle: {
@@ -378,7 +389,7 @@ let gaugedata = ref({
             }
         },
         detail: {
-           show: true,
+           show: false,
             offsetCenter: [0, '-15%'],
             color: '#313a5e',
             formatter: function(params) {
@@ -390,17 +401,17 @@ let gaugedata = ref({
         },
         data: [{
             name: "已使用总量",
-            value: 40
+            value: 0
         }]
     }]
 })
 let gaugelabels = ref([
-    { id: 1, value: 15, title: '文档', color: '#58D9F9' },
-    {id:2,value:10,title:'学校分配空间',color:'#58D9F9'},
-    { id: 3, value: 10, title: '视频', color:'#58D9F9' },
-    { id: 4, value: 8, title: '试卷', color:'#58D9F9' },
-    { id: 5, value: 5, title: 'Hiteach上传', color: '#58D9F9' },
-    {id:6,value:2,title:'其他',color:'#58D9F9'},
+    { id: 1, value: 0, title: '文档', color: '#58D9F9' },
+    {id:2,value:0,title:'学校分配空间',color:'#58D9F9'},
+    { id: 3, value: 0, title: '视频', color:'#58D9F9' },
+    { id: 4, value: 0, title: '试卷', color:'#58D9F9' },
+    { id: 5, value: 0, title: 'Hiteach上传', color: '#58D9F9' },
+    {id:6,value:0,title:'其他',color:'#58D9F9'},
 ])
 let rightsdata=ref([
     { name: 'AI苏格拉底小数据', time: '2024/08/29', code: 'ais' },
@@ -411,6 +422,9 @@ let rightsdata=ref([
 ])
 let detailsData = ref()
 detailsData.value = props.searchdata?.length > 0 ? props.searchdata : ''
+let ies5datas=detailsData.value[0].ies5
+let sokratesData=detailsData.value[0].sokrates
+let pointsData=detailsData.value[0].points
 console.log(props.searchdata, '传输的值')
 console.log(detailsData.value, '最终数据')
 const handleChildEvent = (payload) => {
@@ -418,17 +432,39 @@ const handleChildEvent = (payload) => {
 };
 function initdata() {
     let transmitData = detailsData.value[0]
+    console.log(transmitData,'数据')
     //header 基础信息 
-    let { name, mobile, mail, schoolCode, schoolCodeW, points } = transmitData
+    let { name,id,mobile, mail, schoolCode, schoolCodeW, points } = transmitData
     usernames.value=name
-    userdata.value[0].value = mobile
-    userdata.value[1].value = schoolCodeW
-    userdata.value[2].value = mail
-    userdata.value[5].value = points.balance
+    userdata.value[0].value = id
+    userdata.value[1].value = mobile
+    userdata.value[2].value = 'XXXX'
+    userdata.value[3].value = mail
+    userdata.value[4].value = 'XXXX'
+    userdata.value[5].value = 'XXXX-XX-XX'
+    //产品使用及安装情况
+    let {hiteach,hita,ies5,sokrates}=transmitData
+    transmitData.hasOwnProperty('hiteach') && Object.keys(hiteach).length !== 0 ? (productdata.value[0].state=true,productdata.value[0].subhead1Value=hiteach.subhead1Value,productdata.value[0].subhead2Value=hiteach.subhead2Value):productdata.value[0].state=false
+    transmitData.hasOwnProperty('hita') && Object.keys(hita).length !== 0 ? (productdata.value[1].state=true,productdata.value[1].subhead1Value=hita.subhead1Value,productdata.value[1].subhead2Value=hita.subhead2Value):productdata.value[1].state=false
+    transmitData.hasOwnProperty('ies5') && Object.keys(ies5).length !== 0 ? (productdata.value[2].state=true,productdata.value[2].subhead1Value='XXX',productdata.value[2].subhead2Value='XXX'):productdata.value[2].state=false
+    transmitData.hasOwnProperty('sokrates') && Object.keys(sokrates).length !== 0 ? (productdata.value[3].state=true,productdata.value[3].subhead1Value='XXX',productdata.value[3].subhead2Value='XXX'):productdata.value[3].state=false
+    //空间与权益
+    let {usedSize,teachSize,totalSize,surplusSize}=transmitData.ies5
+    let usePercentum=parseInt(((Number(bytesToGB(usedSize))+Number(bytesToGB(teachSize)))/Number(bytesToGB(totalSize)))*100);let useGsize=proxy.$common.convertSize(usedSize)
+    //空间图表
+    gaugedata.value.series[0].data[0].value=usePercentum
+    gaugedata.value.title[0].text=useGsize+'G'
+    console.log(usePercentum,useGsize,'结果')
+    //IES
+
+}
+function bytesToGB(bytes) {
+  const gb = bytes / (1024 * 1024 * 1024);
+  return gb.toFixed(2); // 将结果保留两位小数
 }
 
 onMounted(() => {
-    // initdata()
+    initdata()
 })
 
 </script>

+ 13 - 0
TEAMModelBI/ClientApp/src/view/userInquire/ies.vue

@@ -30,6 +30,9 @@
  import { ref, getCurrentInstance, watch, h, nextTick, onMounted } from 'vue'
  import * as echarts from 'echarts'
  import bars from '@/components/echarts/commonBar.vue'
+ let props = defineProps({
+    iesdata: Object,
+})
  let relevancedata = ref([
       { title: '我的教材', icon: '#icon-anli', value: 38, key: 'material' },
       { title: '我的题库', icon: '#icon-tiku', value: 58, key: 'question' },
@@ -146,6 +149,16 @@
         }
     }]
  })
+ function initdatas(){
+    console.log(props.iesdata,'IESde zhi')
+    relevancedata.value[0].value='XXX'
+    relevancedata.value[1].value='XXX'
+    relevancedata.value[2].value=props.iesdata.paperCount
+    relevancedata.value[3].value='XXX'
+ }
+ onMounted(() => {
+    initdatas()
+})
  </script>
  <style scoped>
  .ies-content{

+ 12 - 4
TEAMModelBI/ClientApp/src/view/userInquire/index.vue

@@ -3,7 +3,7 @@
         <div class="inquire-title">
             <p>TEAM Model 智慧教育</p>
         </div>
-        <div class="searchbox">
+        <div class="searchbox" v-loading="searchLoading" element-loading-text="数据搜索中...">
             <div class="searchbox-title">
                 <p>用户查询</p>
             </div>
@@ -13,7 +13,7 @@
                 <template #prepend>
                     <el-select v-model="selecttypes" placeholder="Select" style="width: 120px">
                     <el-option label="精准查询" value="precise" />
-                    <el-option label="批量查询/操作" value="batch" />
+                    <!-- <el-option label="批量查询/操作" value="batch" /> -->
                     </el-select>
                 </template>
                 <template #append>
@@ -55,12 +55,20 @@ let pageShow = ref('default')
 let searchvalue=ref('')
 let selecttypes = ref('precise')
 let searchResult=ref()
+let searchLoading=ref(false)
 function seachSole(datavalue) {
-    let data = {'tmids':['1595321354']}
+    if(!searchvalue.value){
+        ElMessage.info('请输入手机号码/ 醍魔豆账号 进行搜索!')
+        return
+    }
+    let data = {'tmids':[searchvalue.value]}
+    console.log(data)
+    searchLoading.value=true
     proxy.$api.getUserdatas(data).then((res) => { 
         console.log(res, 'user back')
-        res.length >0 ? (searchResult.value=res,pageShow.value='details'):''
+        res.length >0 ? (searchResult.value=res,searchLoading.value=false,pageShow.value='details'):(ElMessage.error('暂无搜索到相关人员,请检查信息搜索'),searchLoading.value=false)
     }).catch((err) => {
+        searchLoading.value=false
         ElMessage.error('API异常,查询失败')
     })
     // pageShow.value='details'

+ 12 - 0
TEAMModelBI/ClientApp/src/view/userInquire/score.vue

@@ -87,6 +87,9 @@
 </template>
 <script setup>
 import { ref, getCurrentInstance, watch, h, nextTick, onMounted } from 'vue'
+let props = defineProps({
+    pointsdatas: Object,
+})
 let tabPosition=ref('left')
 let scoredata = ref([
     { title: '已使用', value: 23, key: 'used' },
@@ -118,6 +121,15 @@ let scoredetail = ref({
         {type:'add',typename:'系统添加',value:'+2000',time:'2023/05/23 15:23'},
     ]
 })
+function initdatas(){
+    console.log(props,'SGLD')
+    scoredata.value[0].value=Number(props.pointsdatas.points)-Number(props.pointsdatas.balance)   
+    scoredata.value[1].value=props.pointsdatas.balance
+    scoredata.value[2].value=props.pointsdatas.points
+}
+onMounted(() => {
+    initdatas()
+})
 </script>
 <style scoped>
 .score-content{

+ 32 - 14
TEAMModelBI/ClientApp/src/view/userInquire/socrates.vue

@@ -1,13 +1,13 @@
 <template>
     <div class="socrates-content">
         <div class="socrates-header">
-            <div class="socrates-item" v-for="item in basicsdata.primary" :key="item.title">
+            <div class="socrates-item" v-for="item in primary" :key="item.title">
                 <div class="socrates-item-title">{{item.title}}</div>
                 <div class="socrates-item-value">{{item.value}}</div>
             </div>
         </div>
         <div class="socrates-auxiliary">
-            <div class="auxiliary-item" v-for="item in basicsdata.auxiliary" :key="item.title">
+            <div class="auxiliary-item" v-for="item in auxiliary" :key="item.title">
                 <div class="socrates-item-title">{{item.title}}</div>
                 <div class="socrates-item-value">{{item.value}}</div>
             </div>
@@ -22,20 +22,23 @@
  import { ref, getCurrentInstance, watch, h, nextTick, onMounted } from 'vue'
  import * as echarts from 'echarts'
  import bars from '@/components/echarts/commonBar.vue'
+ let props = defineProps({
+    sokratesdatas: Object,
+})
  let basicsdata = ref({
-    primary: [
-        { title: 'T(数据)', value: 64 },
-        { title: 'T(绿灯)', value: 3 },
-        {title:'双绿灯',value:61},
-        { title: '录课数', value: 86 },
-      ],
-      auxiliary: [
-           { title: '公开课', value: 0, },
-           { title: '议课数', value: 15, },
-           { title: '观课数', value: 25, },
-           {title:'课件数',value:110,},
-    ]
  })
+ let primary=ref([
+        { title: 'T(数据)', value: 0 },
+        { title: 'T(绿灯)', value: 0 },
+        {title:'双绿灯',value:0},
+        { title: '录课数', value: 0},
+])
+let auxiliary=ref([
+           { title: '公开课', value: 0, },
+           { title: '议课数', value: 0, },
+           { title: '观课数', value: 0, },
+           {title:'课件数',value:0,},
+])
  let ecahrtsdata = ref({
         tooltip: {
           trigger: 'axis',
@@ -183,6 +186,21 @@
           data: [40, 60, 70, 70, 100, 40, 40, 60, 70]
         }]
  })
+ function initdatas(){
+    console.log(props,'苏格拉底')
+    primary.value[0].value='XXX'
+    primary.value[1].value=props.sokratesdatas.t_green
+    primary.value[2].value='XXX'
+    primary.value[3].value=props.sokratesdatas.t_data
+
+    auxiliary.value[0].value='XXX'
+    auxiliary.value[1].value='XXX'
+    auxiliary.value[2].value='XXX'
+    auxiliary.value[3].value='XXX'
+ }
+ onMounted(() => {
+    initdatas()
+})
  </script>
  <style scoped>
  .socrates-header,.socrates-auxiliary{

+ 14 - 13
TEAMModelBI/Controllers/BISchool/BatchSchoolController.cs

@@ -216,7 +216,7 @@ namespace TEAMModelBI.Controllers.BISchool
                                 period = PresetSchoolPeriod(bischool.period, foundSchools.lang, campusId),
                                 scale = bischool.size >= 300 ? 500 : 0,
                                 isinit = true,
-                                modules=bischool.modules,
+                                //modules=bischool.modules,
                                 openLessonRecord = (_option.Location.Contains("Global")) ? false : true,
                                 createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
 
@@ -1046,14 +1046,15 @@ namespace TEAMModelBI.Controllers.BISchool
                 jsonElement.TryGetProperty("address", out JsonElement address);
                 string code = (jsonElement.TryGetProperty("code", out JsonElement _code))? _code.GetString() : string.Empty;
                 jsonElement.TryGetProperty("assist", out JsonElement assist);
-                List<string> modules = null ;
-                if (!jsonElement.TryGetProperty("modules ", out JsonElement _modules))
-                {
-                    return BadRequest();
-                }
-                else {
-                    modules= _modules.ToObject<List<string>>();
-                }
+                //手動追加商業模組的部分先封印,商業模組需要經過訂單系統下單控管。
+                //List<string> modules = null ;
+                //if (!jsonElement.TryGetProperty("modules ", out JsonElement _modules))
+                //{
+                //    return BadRequest();
+                //}
+                //else {
+                //    modules= _modules.ToObject<List<string>>();
+                //}
               
                 List<IdInfo> idInfos = assist.ToObject<List<IdInfo>>();
                 //jsonElement.TryGetProperty("site", out JsonElement site);//分开部署,就不需要,一站多用时,取消注释
@@ -1085,9 +1086,9 @@ namespace TEAMModelBI.Controllers.BISchool
                         //});
 
                         //tempShool.period = periods;
-                        if (modules!=null) {
-                            tempShool.modules=modules;
-                        }
+                        //if (modules!=null) {
+                        //    tempShool.modules=modules;
+                        //}
                         tempShool.size = !string.IsNullOrEmpty($"{size}") ? int.Parse($"{size}") : tempShool.size;
                         tempShool.scale = !string.IsNullOrEmpty($"{scale}") ? int.Parse($"{scale}") : tempShool.scale;
                         tempShool.picture = $"{picture}";
@@ -1973,7 +1974,7 @@ namespace TEAMModelBI.Controllers.BISchool
             /// <summary>
             /// 手动增加的模块 ["art"]
             /// </summary>
-            public List<string> modules { get; set; } = new List<string>();
+            //public List<string> modules { get; set; } = new List<string>();
         }
 
         /// <summary>

+ 3 - 3
TEAMModelBI/TEAMModelBI.csproj

@@ -65,9 +65,9 @@
 		<SpaRoot>ClientApp\</SpaRoot>
 		<DefaultItemExcludes>$(DefaultItemExcludes);$(SpaRoot)node_modules\**</DefaultItemExcludes>
 		<UserSecretsId>078b5d89-7d90-4f6a-88fc-7d96025990a8</UserSecretsId>
-		<Version>5.2309.20</Version>
-		<AssemblyVersion>5.2309.20.1</AssemblyVersion>
-		<FileVersion>5.2309.20.1</FileVersion>
+		<Version>5.2309.27</Version>
+		<AssemblyVersion>5.2309.27.1</AssemblyVersion>
+		<FileVersion>5.2309.27.1</FileVersion>
 		<Description>TEAMModelBI(BI)</Description>
 		<PackageReleaseNotes>BI版本说明版本切换标记2022000908</PackageReleaseNotes>
 		<PackageId>TEAMModelBI</PackageId>

+ 3 - 3
TEAMModelOS.FunctionV4/TEAMModelOS.FunctionV4.csproj

@@ -5,9 +5,9 @@
 		<OutputType>Exe</OutputType>
 		<_FunctionsSkipCleanOutput>true</_FunctionsSkipCleanOutput>
 		<SignAssembly>true</SignAssembly>
-		<Version>5.2309.20</Version>
-		<AssemblyVersion>5.2309.20.1</AssemblyVersion>
-		<FileVersion>5.2309.20.1</FileVersion>
+		<Version>5.2309.27</Version>
+		<AssemblyVersion>5.2309.27.1</AssemblyVersion>
+		<FileVersion>5.2309.27.1</FileVersion>
 		<PackageId>TEAMModelOS.FunctionV4</PackageId>
 		<Authors>teammodel</Authors>
 		<Company>醍摩豆(成都)信息技术有限公司</Company>

+ 2 - 2
TEAMModelOS.SDK/Models/Cosmos/Common/IotTeachingData.cs

@@ -43,7 +43,7 @@ namespace TEAMModelOS.SDK.Models.Cosmos.Common
         /// <summary>
         /// 課堂時間(分鐘整數)
         /// </summary>
-        public int lessonLengMin { get; set; }
+        public long lessonLengMin { get; set; }
         /// <summary>
         /// 學生出席數(整數)
         /// </summary>
@@ -128,7 +128,7 @@ namespace TEAMModelOS.SDK.Models.Cosmos.Common
         public int useDeviceIrs { get; set; } //課堂中有使用硬體IRS
         public int useHaboard { get; set; } //課堂中有使用Haboard
         public int useHita { get; set; } //課堂中有使用HiTA
-        public int lessonLengMin { get; set; } //課堂時間(分鐘整數)
+        public long lessonLengMin { get; set; } //課堂時間(分鐘整數)
         public int lessonLeng0 { get; set; } //課堂時間為0的課堂數
         public int stuShow { get; set; } //學生出席人次
         public long stuLessonLengMin { get; set; } //學生參與總時數 ※課堂時間x學生出席人次

+ 14 - 6
TEAMModelOS.SDK/Models/Cosmos/Common/StudentScoreRecord.cs

@@ -13,13 +13,21 @@ namespace TEAMModelOS.SDK.Models.Cosmos.Common
 
     /// <summary>
     /// 
+    //    Quiz : IRS問題(不論任何題型)
+    //Quiz_Buzz: 搶權  抢权 ,按了反馈器的学生。 buzzHistory  , 抢权成功的学生 buzzMember
+    //Collate_End/Collate_Start: 任務(不論任何內容, 如果結束課堂時還開著, 會出現 Collate_Start)
+    //Meteor_End: 星光評分/投票
+    //MutuallyScore_End: 互評
+    //SelfPace_End: 課中測驗
+
+
     /// 互动:
-//    答题:按反馈器。
-//isBuzz 抢权
-//互动 => TimeLine.json => PickupOption=>   挑人
-//差异化:推送给学生。???
-//绿灯数: 拉取所有的分数,然后 计算中位数,
-//教师喜欢的功能 :Event 事件,同页过滤。
+    //    答题:按反馈器。
+    //isBuzz 抢权
+    //互动 => TimeLine.json => PickupOption=>   挑人
+    //差异化:推送给学生。???
+    //绿灯数: 拉取所有的分数,然后 计算中位数,
+    //教师喜欢的功能 :Event 事件,同页过滤。
     /// 学生计分记录
     /// </summary>
     public class StudentSemesterRecord : CosmosEntity

+ 1 - 0
TEAMModelOS.SDK/Models/Cosmos/School/CourseBase.cs

@@ -97,6 +97,7 @@ namespace TEAMModelOS.SDK.Models
         /// </summary>
 
         public int status { get; set; } = 1;
+        public int count { get; set; }
     }
     /*
      //课程排课任务

+ 1 - 1
TEAMModelOS.SDK/Models/Cosmos/School/School.cs

@@ -109,7 +109,7 @@ namespace TEAMModelOS.SDK.Models
         /// <summary>
         /// 单独增加的模块
         /// </summary>
-        public List<string> modules { get; set; } = new List<string>();
+        //public List<string> modules { get; set; } = new List<string>();
     }
     /// <summary>
     /// 课表计划

+ 6 - 13
TEAMModelOS.SDK/Models/Dtos/LessonRecordActivityInfo.cs

@@ -895,17 +895,10 @@ namespace TEAMModelOS.SDK.Models.Dtos
         public MappingDictionary mappingDictionary { get; set; } = new MappingDictionary();
     }
 
-    public class MemberEliminatedDictionary
-    {
-    }
 
-    public class CompetitionAnsweredDic
-    {
-    }
+ 
 
-    public class MemberPushes
-    {
-    }
+   
 
     public class PqA_ListItem
     {
@@ -1050,13 +1043,13 @@ namespace TEAMModelOS.SDK.Models.Dtos
         /// </summary>
         public SelfPaceAnswers selfPaceAnswers { get; set; }= new SelfPaceAnswers();
         /// <summary>
-        /// 
+        /// 学生被淘汰出局的 字典
         /// </summary>
-        public MemberEliminatedDictionary memberEliminatedDictionary { get; set; } = new MemberEliminatedDictionary();
+        public Dictionary<string, SelectedItemsItem>  memberEliminatedDictionary { get; set; } = new Dictionary<string, SelectedItemsItem>();
         /// <summary>
         /// 
         /// </summary>
-        public CompetitionAnsweredDic competitionAnsweredDic { get; set; } = new CompetitionAnsweredDic();
+        public Dictionary<string, SelectedItemsItem> competitionAnsweredDic { get; set; } = new Dictionary<string, SelectedItemsItem>();
         /// <summary>
         /// 
         /// </summary>
@@ -1064,7 +1057,7 @@ namespace TEAMModelOS.SDK.Models.Dtos
         /// <summary>
         /// 
         /// </summary>
-        public MemberPushes memberPushes { get; set; } = new MemberPushes();
+        public Dictionary<string, SelectedItemsItem> memberPushes { get; set; } = new Dictionary<string, SelectedItemsItem>();
         /// <summary>
         /// 
         /// </summary>

+ 3 - 0
TEAMModelOS.SDK/Models/Service/OpenApiService.cs

@@ -1717,6 +1717,9 @@ namespace TEAMModelOS.SDK
                 }
                 School schoolBase = await client.GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>($"{schoolCode}", new PartitionKey("Base"));
                 List<PortraitStudent> students = _students.ToObject<List<PortraitStudent>>();
+                if (students.IsEmpty()) { 
+                    return responseData = new() { code = RespondCode.ParamsError, msg = "没有学生数据" };
+                }
                 List<(Student studentBase, PortraitStudent portrait)> studentsBases = new List<(Student, PortraitStudent)>();
                 //学生信息不匹配的
                 List<PortraitStudent> unmatchStuInfo = new List<PortraitStudent>();

+ 3 - 5
TEAMModelOS.SDK/TEAMModelOS.SDK.csproj

@@ -2,14 +2,12 @@
 
   <PropertyGroup>
     <TargetFramework>net6.0</TargetFramework>
-    <Version>3.0.1223</Version>
-    <AssemblyVersion>3.0.1223.0</AssemblyVersion>
-    <FileVersion>3.0.1223.0</FileVersion>
+    <Version>5.2309.27</Version>
+    <AssemblyVersion>5.2309.27.1</AssemblyVersion>
+    <FileVersion>5.2309.27.1</FileVersion>
     <PackageReleaseNotes>发版</PackageReleaseNotes>
   </PropertyGroup>
 
-
-
   <ItemGroup>
     <PackageReference Include="CHTCHSConv" Version="1.0.0" />
     <PackageReference Include="AspectCore.Extensions.Reflection" Version="2.2.0" />

+ 68 - 0
TEAMModelOS.TEST/Program.cs

@@ -16,6 +16,74 @@ namespace TEAMModelOS.TEST
             groupNames =groupNames.OrderBy(x => x).ToList();
             var jsonAuth = System.IO.File.ReadAllText("C:\\Users\\CrazyIter\\Downloads\\492266088181141504\\ActivityInfo.json", Encoding.UTF8);
             var jsonData = jsonAuth.ToObject<LessonRecordActivityInfo>();
+
         }
     }
+
+    public class LessonBase {
+        public string? id { get; set; }
+        public string? duration { get; set; }
+
+        public string? schoolId { get; set; }
+        public string? schoolName { get; set; }
+
+        public string? scope { get; set; }
+        public string? subjectId { get; set; }
+        public string? subjectName { get; set; }
+        public string? courseId { get; set; }
+        public string? courseName { get; set; }
+        public string? classId { get; set; }
+        public string? className { get; set; }
+        public string? gradeId { get; set; }
+        public string? gradeName { get; set; }
+        public string? teacherId { get; set; }
+        public string? teacherName { get; set; }
+        public long time { get; set; }
+        public int memberCount { get; set; }
+    }
+
+    public class LessonStudent { 
+        public string? studentID { get; set; }
+        public string? groupName { get; set; }
+        public string? groupId { get; set; }
+        /// <summary>
+        /// 1开始,groupIndex=0  表示未分组
+        /// </summary>
+        public int groupIndex { get; set; }
+
+        public int seatID { get; set; }
+        public int studentIndex { get; set; }
+        public string? studentName { get; set; }
+        /// <summary>
+        /// 学生类型 1 醍摩豆id, 2校内账号  ==对应字段 ies_Type   //ID類型 1 tmdid,2 student  本地或動態班級的話會是0
+        /// </summary>
+        public int type  { get; set; }
+        /// <summary>
+        /// 名单id
+        /// </summary>
+        public string? classId { get; set; }
+        /// <summary>
+        ///Uncall,//未點名
+        ///Attended,//已出席
+        ///Absent,//缺席
+        ///DayOff,//請假
+        ///Absent_Sick,//病假
+        ///Absent_Personal,//事假
+        ///Absent_Official,//公假
+        /// </summary>
+        public string? AttendState { get; set; }
+        /// <summary>
+        /// 个人积分
+        /// </summary>
+        public double score { get; set; }
+        /// <summary>
+        /// 小组积分
+        /// </summary>
+        public double groupScore { get; set; }
+        /// <summary>
+        /// 互动积分
+        /// </summary>
+        public double interactScore { get; set; }
+    }
+
 }

+ 6 - 1
TEAMModelOS/ClientApp/public/lang/en-US.js

@@ -866,6 +866,7 @@ const LANG_EN_US = {
         tips1: 'Modify Information'
     },
     newCusMgt: {
+        configCourse: 'Assigned courses this semester',
         recommendFiles: 'Lesson Backup data',
         sort: 'Sort by',
         sortType0: 'Sort by grade',
@@ -3420,7 +3421,8 @@ const LANG_EN_US = {
             dingding: 'DingTalk',
         },
         apiError: {
-            text1: ' User name or password incorrect'
+            text1: ' User name or password incorrect',
+            text2: 'You have graduated and cannot log in at this time!',
         },
         sse: {
             error: {
@@ -3605,6 +3607,7 @@ const LANG_EN_US = {
         delete: 'Delete',
         view: 'View',
         edit: 'Edit',
+        tableIsNaN:'No score sheet yet',
         noNotify: 'No Announcement Yet',
         notifyDetail: 'Announcement Detail',
         delNotifyTitle: 'Delete Announcement',
@@ -6114,6 +6117,7 @@ const LANG_EN_US = {
         props7: 'Not enough storage space!',
         uploadText: 'Tap or drag to upload',
         resTips: 'Format generated by HiTeach: HTEX Files',
+        space: 'Remaining Space:',
         calcing: 'Calculating...',
         blobFull: '(Full)',
         otherType: 'Other types',
@@ -7187,6 +7191,7 @@ const LANG_EN_US = {
         diffTip4: ' hour(s) ago',
         diffTip5: ' minute(s) ago',
         diffTip6: 'Now',
+        backSemester: 'Switch back to current semester'
     },
     // 上传组件
     updModal: {

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

@@ -866,6 +866,7 @@ const LANG_ZH_CN = {
         tips1: '修改信息'
     },
     newCusMgt: {
+        configCourse: '本学期已配置课程',
         recommendFiles: '课程备用资料',
         sort: '排序方式',
         sortType0: '按年级排序',
@@ -7188,6 +7189,7 @@ const LANG_ZH_CN = {
         diffTip4: '小时前',
         diffTip5: '分钟前',
         diffTip6: '刚刚',
+        backSemester: '回到当前学期'
     },
     // 上传组件
     updModal: {

+ 6 - 1
TEAMModelOS/ClientApp/public/lang/zh-TW.js

@@ -866,6 +866,7 @@ const LANG_ZH_TW = {
         tips1: '修改資訊'
     },
     newCusMgt: {
+        configCourse: '本學期已配置課程',
         recommendFiles: '課程備用數據',
         sort: '排序方式',
         sortType0: '依年級排序',
@@ -3422,7 +3423,8 @@ const LANG_ZH_TW = {
             dingding: '釘釘',
         },
         apiError: {
-            text1: '您的 帳號 或 密碼 不正確'
+            text1: '您的 帳號 或 密碼 不正確',
+            text2: '你已畢業,暫不能登入!',
         },
         sse: {
             error: {
@@ -3607,6 +3609,7 @@ const LANG_ZH_TW = {
         delete: '刪除',
         view: '查看',
         edit: '編輯',
+        tableIsNaN:'尚無成績表',
         noNotify: '暫無公告',
         notifyDetail: '公告詳情',
         delNotifyTitle: '刪除公告',
@@ -6115,6 +6118,7 @@ const LANG_ZH_TW = {
         props7: '儲存空間不足!',
         uploadText: '點按或者拖移上傳',
         resTips: 'HiTeach生成的教材,只支援HTEX格式',
+        space: '剩餘空間:',
         calcing: '計算中…',
         blobFull: '(已滿)',
         otherType: '其他',
@@ -7188,6 +7192,7 @@ const LANG_ZH_TW = {
         diffTip4: '小時前',
         diffTip5: '分鐘前',
         diffTip6: '剛剛',
+        backSemester: '切回到當前學期'
     },
     // 上传组件
     updModal: {

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

@@ -54,7 +54,7 @@
 					</div>
 				</DropdownMenu>
 			</Dropdown>
-			<span style="margin-left: 10px; cursor: pointer" @click="goNowSemester()" v-if="!isNowSemester && showSemesterSelect" title="回到当前学期">
+			<span style="margin-left: 10px; cursor: pointer" @click="goNowSemester()" v-if="!isNowSemester && showSemesterSelect" :title="$t('unit.backSemester')">
 				<Icon type="md-sync" color="#16b1f3" />
 			</span>
 		</div>

+ 25 - 4
TEAMModelOS/ClientApp/src/view/coursemgt/NewCusMgt.vue

@@ -35,7 +35,8 @@
 						<Poptip trigger="hover" :title="$t('totalAnalysis.echarts_text10')" placement="bottom" @on-popper-show="canEmitSelectChange = true" @on-popper-hide="canEmitSelectChange = false" v-if="originCourseList.length">
 							<Icon type="ios-funnel" :title="$t('syllabus.search')" @click="doAction('search')" />
 							<div slot="content">
-								<p>{{ $t("courseManage.syllabus.grade") }}</p>
+								<Checkbox v-model="onlyShowConfigCourse" @on-change="onFilterConfig">{{ $t('newCusMgt.configCourse') }}</Checkbox>
+								<p style="margin-top: 10px;">{{ $t("courseManage.syllabus.grade") }}</p>
 								<Select v-model="filterGrade" clearable @on-change="onFilterGrade" :placeholder="$t('courseManage.syllabus.placeHolder3')" style="margin: 10px 0">
 									<Option v-for="(item, index) in curPeriod.grades" :value="index" :key="index">{{ item }}</Option>
 								</Select>
@@ -207,6 +208,7 @@
 		},
 		data() {
 			return {
+				onlyShowConfigCourse:false,
 				guideModal:false,
 				sortValue:'grade',
 				taskGroups:[],
@@ -304,7 +306,9 @@
 					.then((res) => {
 						this.originCourseList = res.courseBases
 						this.courseList = res.courseBases
+						this.canEmitSelectChange = true
 						this.onFilterSort('grade')
+						this.canEmitSelectChange = false
 						if (res.courseBases.length) {
 							this.onCourseClick(res.courseBases[0], 0);
 						} else {
@@ -360,7 +364,7 @@
 				};
 				this.$api.common.getGroupListByIds(req).then(
 					(res) => {
-						this.members = res.members;
+						this.members = res.members.sort((a,b) => a.irs - b.irs);
 						// console.log(this.members);
 						this.isLoading = false;
 						this.$refs.memberTable.tableLoading = false;
@@ -494,8 +498,6 @@
 				// 找到当前课程下该老师已经被安排的班级名单
 				let tchMatchGroupIds = [...new Set(this.taskJson.schedules.filter((i) => i.teacherId === tch.id).map((k) => k.groupId))];
 				this.rightClasses = tchMatchGroupIds.map((i) => this.taskGroups.find((j) => j.id === i));
-				console.log(this.rightClasses);
-				console.log(tchMatchGroupIds);
 				this.activeClassIndex = -1;
 				// 默认呈现第一个班级的名单数据
 				this.onClassClick(this.rightClasses[0], 0);
@@ -595,8 +597,23 @@
 				this.sortValue = 'grade'
 				this.canEmitSelectChange = false
 			},	
+			onFilterConfig(val){
+				console.error(val)
+				if(!this.canEmitSelectChange) return
+				let gradeCond = this.filterGrade > -1
+				let subjectCond = this.filterSubjectIndex > -1
+				let nowList = this.originCourseList.filter((i) => (gradeCond ? i.grade === this.filterGrade : true) && (subjectCond ? i.subject.id === this.curPeriod.subjects[this.filterSubjectIndex].id : true));
+				console.error(nowList)
+				this.courseList = !val ? this._.cloneDeep(nowList) : nowList.filter(i => i.count > 0)
+				console.error(this.courseList)
+				if(this.courseList.length){
+					this.onFilterSort(this.sortValue)
+					this.onCourseClick(this.courseList[0], 0);
+				}
+			},
 			/* 排序方式 */
 			onFilterSort(val){
+				console.log(this.canEmitSelectChange)
 				if(!this.courseList.length || !this.canEmitSelectChange) return
 				if(val === 'grade'){
 					this.courseList = this.courseList.sort((a,b) => a.grade - b.grade)
@@ -869,6 +886,10 @@
 				color: #8a8a8a;
 
 				.tools {
+
+					.ivu-checkbox-wrapper{
+						white-space: break-spaces;
+					}
 					.ivu-icon {
 						font-size: 16px;
 						margin-left: 10px;

+ 1 - 1
TEAMModelOS/ClientApp/src/view/mycourse/score/ScoreBody.vue

@@ -658,7 +658,7 @@ import Column from 'primevue/column'
 import ColumnGroup from 'primevue/columngroup'
 import 'primevue/resources/themes/saga-blue/theme.css'; // 根據你喜好的主題選擇
 import 'primevue/resources/primevue.min.css';
-// import 'primeicons/primeicons.css';//篩選圖示需要用到這個CSS
+import 'primeicons/primeicons.css';//篩選圖示需要用到這個CSS
 
 
 export default {

+ 13 - 0
TEAMModelOS/Controllers/Both/CourseBaseController.cs

@@ -125,6 +125,19 @@ namespace TEAMModelOS.Controllers.Both
                                     studyYear = _year.GetInt32();
                                     semesterId=_semesterId.GetString();
                                 }
+                                var ids = courseBases.Select(z=>$"'{studyYear}-{semesterId}-{z.id}'");
+                                if (ids!=null  && ids.Count()>0) {
+                                    string taskCode = $"CourseTask-{school}";
+                                    string sql = $"select value c from c where c.id in ({string.Join(",", ids)})";
+                                    var result =  await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, tbname).GetList<CourseTask>(sql, taskCode);
+                                    foreach (var rs in result.list) {
+                                        var courseBase=  courseBases.Find(z => z.id.Equals(rs.courseId));
+                                        if (courseBase!=null) {
+                                            courseBase.count= rs.schedules.Count();
+                                        }
+                                    }
+                                 
+                                }
                             }
                             foreach (var z in courseBases) {
                                 var teacher = teachers.Find(x => x.id.Equals(z.creatorId));

+ 507 - 67
TEAMModelOS/Controllers/Both/GroupListController.cs

@@ -31,6 +31,11 @@ using static TEAMModelOS.SDK.GroupListService;
 using TEAMModelOS.Controllers.Both;
 using CourseDto = TEAMModelOS.Controllers.Both.CourseDto;
 using DocumentFormat.OpenXml.Drawing.Charts;
+using Grpc.Core;
+using Org.BouncyCastle.Asn1.Ocsp;
+using DocumentFormat.OpenXml.Office2010.Excel;
+using System.Security.Claims;
+using TEAMModelOS.Controllers.Analysis;
 
 namespace TEAMModelOS.Controllers
 {
@@ -1747,92 +1752,527 @@ namespace TEAMModelOS.Controllers
         /// <returns></returns>
         [ProducesDefaultResponseType]
         
-        [HttpPost("backups")]
+        [HttpPost("process-grouplist-backups")]
 #if !DEBUG
 [AuthToken(Roles = "teacher,admin")]
         [Authorize(Roles = "IES")]
 #endif
         public async Task<IActionResult> Backups(JsonElement json) {
-            if (!json.TryGetProperty("targetStudyYear", out JsonElement _targetStudyYear)) { return BadRequest(); }
-            if (!json.TryGetProperty("sourceStudyYear", out JsonElement _sourceStudyYear)) { return BadRequest(); }
-            if (!json.TryGetProperty("schoolId", out JsonElement _schoolId)) { return BadRequest(); }
-            string schoolId = _schoolId.GetString();
-            int targetStudyYear = _targetStudyYear.GetInt32();
-            int sourceStudyYear = _sourceStudyYear.GetInt32();
-           // var (userid, _, _, schoolId) = HttpContext.GetAuthTokenInfo();
-            School school =  await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(schoolId, new PartitionKey("Base"));
-            List<Class> expireClass = new List<Class>();
-            List<Class> okClass = new List<Class>();
-            foreach (var period in school.period) {
-
-                int syear = 0;
-                int eyear = 0;
-                DateTimeOffset expireData = default;
-                //sourceStudyYear:2023  targetStudyYear:2022
-                if (sourceStudyYear>targetStudyYear  && sourceStudyYear-targetStudyYear==1)
-                {
-                    eyear=targetStudyYear;
-                    syear= targetStudyYear-period.grades.Count()+1;
-                    var semesters = period.semesters.Where(x => x.start==1);
-                    if (semesters!=null  && semesters.Count()>0)
+            if (!json.TryGetProperty("grant_type", out JsonElement _grant_type)) return BadRequest();
+            switch (true) {
+                case bool when $"{_grant_type}".Equals("ignore", StringComparison.OrdinalIgnoreCase):
                     {
-                        string date = $"{eyear}-{semesters.First().month}-{semesters.First().day}";
-                        DateTimeOffset.TryParse(date, out expireData);
+                        json.TryGetProperty("keys", out JsonElement _keys);
+                        List<string> keys = _keys.ToObject<List<string>>();
+                        foreach (var key in keys) {
+                            var data = await _azureRedis.GetRedisClient(8).StringGetAsync(key);
+                            if (data.HasValue)
+                            {
+                                SemesterStudyYearNotify notify = data.ToString().ToObject<SemesterStudyYearNotify>();
+                                notify.ignore=1;
+                                await _azureRedis.GetRedisClient(8).StringSetAsync(key, notify.ToJsonString());
+                                //3天 * 24 =72小时
+#if DEBUG
+                                await _azureRedis.GetRedisClient(8).KeyExpireAsync(key, new TimeSpan(0, 0, 60));
+#else
+                                await _azureRedis.GetRedisClient(8).KeyExpireAsync(key, new TimeSpan(72, 0, 0));
+#endif
+                            }
+                        }
+                        return Ok(new { code = 200 });
                     }
-                }
-                else if (sourceStudyYear<targetStudyYear && targetStudyYear-sourceStudyYear==1)
-                {
-                    //sourceStudyYear:2023  targetStudyYear:2024
-
-                    eyear=sourceStudyYear;
-                    syear= sourceStudyYear-period.grades.Count()+1;
-                    var semesters = SchoolService.SortSemester(period.semesters);
-                    if (semesters!=null  && semesters.Count()>0)
+                case bool when $"{_grant_type}".Equals("sync_edited", StringComparison.OrdinalIgnoreCase):
                     {
-                        string date = $"{eyear}-{semesters.Last().month}-{semesters.Last().day}";
-                        var semesterInfo = SchoolService.GetSemester(period, time: date);
-                        expireData= semesterInfo.nextSemester;
+                        try {
+                            json.TryGetProperty("editedStus", out JsonElement _editedStus);
+                            List<GroupListSemester> groupListSemesters = _editedStus.ToObject<List<GroupListSemester>>();
+                            List<RMember> syncedMembers = new List<RMember>();
+                            foreach (var z in groupListSemesters)
+                            {
+                                z.code=$"GroupListSemester-{z.school}";
+                                Azure.Response response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemStreamAsync(z.id, new PartitionKey(z.code));
+                                if (response.Status==200)
+                                {
+                                    GroupListSemester groupListSemester = JsonDocument.Parse(response.Content).ToObject<GroupListSemester>();
+                                    var notIn = z.members.ExceptBy(groupListSemester.members.Select(z => z.id), x => x.id);
+                                    if (notIn!=null && notIn.Count()>0)
+                                    {
+                                        syncedMembers.AddRange(notIn);
+                                        groupListSemester.members.AddRange(notIn);
+                                        await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).UpsertItemAsync(groupListSemester, new PartitionKey(z.code));
+                                    }
+                                }
+                                else
+                                {
+                                    z.scope="school";
+                                    z.type="class";
+                                    z.pk= "GroupListSemester";
+                                    syncedMembers.AddRange(z.members);
+                                    await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).UpsertItemAsync(z, new PartitionKey(z.code));
+                                }
+                            }
+                            return Ok(new { code = 200 , syncedMembers });
+                        }
+                        catch (Exception ex ){
+                            await _dingDing.SendBotMsg($"{_option.Location},{ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
+                            return Ok(new { code = 500 });
+                        }
                     }
-                }
-                if (sourceStudyYear==targetStudyYear)
-                {
-                    //sourceStudyYear:2023  targetStudyYear:2024
+            }
+            return Ok(new {  code=400 });
+        }
 
-                    eyear=sourceStudyYear;
-                    syear= sourceStudyYear-period.grades.Count()+1;
-                    var semesters = SchoolService.SortSemester(period.semesters);
-                    if (semesters!=null  && semesters.Count()>0)
-                    {
-                        string date = $"{eyear}-{semesters.Last().month}-{semesters.Last().day}";
-                        var semesterInfo = SchoolService.GetSemester(period, time: date);
-                        expireData= semesterInfo.nextSemester;
-                    }
-                }
-                if (syear>0 && eyear>0)
+        //新学年8.1号开学 ,第二学期开学2.17,设置提示区间60天
+        //2023-8-7   type = "studyYearStarted";新学年已经开始
+        //2023-10-7  type = "";不提示
+        //2024-1-20  type = "semesterEnding";本学期即将结束
+        //2024-3-20  type = "semesterStarted";新学期已经开始
+        //2024-4-20  type = "";不提示
+        //2024-7-20  type = "studyYearEnding";本学年即将结束
+        /// <
+        /// summary>
+        /// 检查当前学期的开学时间和学期结束时间 
+        /// </summary>
+        /// <param name="json"></param>
+        /// <returns></returns>
+        [ProducesDefaultResponseType]
+
+        [HttpPost("check-class-sync")]
+#if !DEBUG
+[AuthToken(Roles = "teacher,admin")]
+        [Authorize(Roles = "IES")]
+#endif
+        public async Task<IActionResult> CheckSemesters(JsonElement json)
+        {
+            if (!json.TryGetProperty("schoolId", out JsonElement _schoolId)) { return BadRequest(); }
+            School school = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(_schoolId.GetString(), new PartitionKey("Base"));
+
+            List<dynamic> periodNotify = new List<dynamic>();
+            foreach (var period in school.period) {
+                if (period!=null)
                 {
-                    long expireTime = expireData.ToUnixTimeSeconds();
-                    string sqlClass = $"select value c from c where c.year>={syear} and c.year<={eyear} and c.periodId='{period.id}'";
-                    var resultClasses = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<Class>(sqlClass, $"Class-{schoolId}");
-                    if (resultClasses.list.IsNotEmpty())
+                    //var semesterInfo = SchoolService.GetSemester(period, DateTimeOffset.Now.ToUnixTimeMilliseconds());
+                    var semesterInfo = SchoolService.GetSemester(period, time:$"{json.GetProperty("time")}");
+                    var start = period.semesters.Where(z => z.start==1).FirstOrDefault();
+                    if (start!=null)
                     {
-                      
-                        string sqlStudent = $"select distinct value c.classId from c where c.classId in ({string.Join(",", resultClasses.list.Select(z => $"'{z.id}'"))})  and c.periodId='{period.id}' and c._ts>={expireTime}";
-                        var resultExpireClass = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Student).GetList<string>(sqlStudent, $"Base-{schoolId}");
-                        if (resultExpireClass.list.IsNotEmpty())
+
+                        var alreadySemester = semesterInfo.date.Subtract(semesterInfo.currSemesterDate);
+                        var soonSemester = semesterInfo.nextSemester.Subtract(semesterInfo.date);
+                        var semesterStarted = Math.Abs((int)alreadySemester.TotalDays);
+                        var semesterEnding = Math.Abs((int)soonSemester.TotalDays);
+
+                        string currStudyYear = $"{semesterInfo.studyYear}-{start.month}-{start.day}";
+                        string nextStudyYear = $"{(semesterInfo.studyYear+1)}-{start.month}-{start.day}";
+                        DateTimeOffset.TryParse(currStudyYear, out DateTimeOffset currYear);
+                        DateTimeOffset.TryParse(nextStudyYear, out DateTimeOffset nextYear);
+                        var alreadyYear = semesterInfo.date.Subtract(currYear);
+                        var soonYear = nextYear.Subtract(semesterInfo.date);
+                        var studyYearStarted = Math.Abs((int)alreadyYear.TotalDays);
+                        var studyYearEnding = Math.Abs((int)soonYear.TotalDays);
+                        string type = string.Empty;
+                        //开始天数小于60天
+                        if (semesterStarted<=60)
+                        {
+                            type = "semesterStarted";
+                        }
+                        //结束天数小于60天
+                        if (semesterEnding<=60)
                         {
-                            var warnData  = resultClasses.list.Where(z => resultExpireClass.list.Contains(z.id));
-                            if (warnData!=null  && warnData.Count()>0) {
-                                expireClass.AddRange(warnData);
+                            type = "semesterEnding";
+
+                        }
+                        //开始天数小于60天
+                        if (studyYearStarted<=60)
+                        {
+                            type = "studyYearStarted";
+                        }
+                        //结束天数小于60天
+                        if (studyYearEnding<=60)
+                        {
+                            type = "studyYearEnding";
+                        }
+
+                        string sqlClass = string.Empty;
+                        string idPrefix = string.Empty;
+                        string key =string.Empty;
+                        var lastSemesterDate = semesterInfo.currSemesterDate.AddDays(-1);
+                        var lastSemesterInfo = SchoolService.GetSemester(period, lastSemesterDate.ToUnixTimeMilliseconds());
+                        if (type.Contains("Started"))
+                        {   //semesterStarted   studyYearStarted
+                            //获取上学期的任意时间,以获取学年,学期信息。
+                            sqlClass = $"select value c from c where c.year >={lastSemesterInfo.studyYear-period.grades.Count+1} and c.year <={lastSemesterInfo.studyYear} and c.periodId='{period.id}' ";
+                            idPrefix=$"{lastSemesterInfo.studyYear}-{lastSemesterInfo.currSemester.id}-";
+                            key = $"SemesterStudyYearNotify:{_schoolId}:{lastSemesterInfo.studyYear}:{lastSemesterInfo.currSemester.id}:{type}";
+                        }
+                        //Ending  //semesterEnding   studyYearEnding
+                        else
+                        {
+                            sqlClass = $"select value c from c where c.year >={semesterInfo.studyYear-period.grades.Count+1} and c.year <={semesterInfo.studyYear} and c.periodId='{period.id}' ";
+                            idPrefix=$"{semesterInfo.studyYear}-{semesterInfo.currSemester.id}-";
+                            key = $"SemesterStudyYearNotify:{_schoolId}:{semesterInfo.studyYear}:{semesterInfo.currSemester.id}:{type}";
+                        }
+                        var keyExists = await _azureRedis.GetRedisClient(8).KeyExistsAsync(key);
+                        if (keyExists)
+                        {
+                            var data = await _azureRedis.GetRedisClient(8).StringGetAsync(key);
+                            if (data.HasValue)
+                            {
+                                SemesterStudyYearNotify notify = data.ToString().ToObject<SemesterStudyYearNotify>();
+                                if (notify.ignore==1)
+                                {
+                                    //忽略提示
+                                    type="";
+                                }
+                                else
+                                {
+                                    //已经处理过的不再处理
+                                    if (notify.process==1)
+                                    {
+                                        type="";
+                                    }
+                                }
                             }
-                            var okData= resultClasses.list.Where(z => !resultExpireClass.list.Contains(z.id));
-                            if (okData!=null  && okData.Count()>0) {
-                                okClass.AddRange(okData);
+                        }
+                        else
+                        {
+                            await _azureRedis.GetRedisClient(8).StringSetAsync(key, new SemesterStudyYearNotify { studyYear=semesterInfo.studyYear, semester=semesterInfo.currSemester.id, ignore=0, type=type }.ToJsonString());
+                            //60天 * 24 =1440小时
+                            await _azureRedis.GetRedisClient(8).KeyExpireAsync(key, new TimeSpan(1440, 0, 0));
+                        }
+
+
+                        /*
+                        //2022-11-01
+                        var dataSemester = SchoolService.GetSemester(period, 1667232000000);
+                        string id = $"{dataSemester.studyYear}-{dataSemester.currSemester.id}-{group.id}";
+                        string code = $"GroupListSemester-{school.id}";
+                        GroupListSemester groupListSemester = group.ToJsonString().ToObject<GroupListSemester>();
+                        groupListSemester.id = id;
+                        groupListSemester.code = code;
+                        groupListSemester.pk="GroupListSemester";
+                        groupListSemester.semesterId=dataSemester.currSemester.id;
+                        groupListSemester.groupListId=group.id;
+                        groupListSemester.studyYear=dataSemester.studyYear;
+                        await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).UpsertItemAsync<GroupListSemester>(groupListSemester, new PartitionKey(groupListSemester.code));
+                        listSemesters.Add(groupListSemester);
+                         */
+
+                        //已同步的学生。
+                        List<Student> syncedStus = new List<Student>();
+                        //未同步的学生
+                        //List<dynamic> unsyncStus = new List<dynamic>();
+                        //有调整的学生
+                        List<dynamic> editedStus = new List<dynamic>();
+                        if (!string.IsNullOrWhiteSpace(type))
+                        {
+                            var resultClasses = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<Class>(sqlClass, $"Class-{school.id}");
+                            if (resultClasses.list.IsNotEmpty()) {
+                                string sqlStudents = $"select value c from c where c.classId in ({string.Join(",", resultClasses.list.Select(z => $"'{z.id}'"))})";
+                                var resultStudents = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Student).GetList<Student>(sqlStudents, $"Base-{school.id}");
+                                if (resultStudents.list.IsNotEmpty()) {
+                                    foreach (var clazz in resultClasses.list) {
+                                        string id = $"{idPrefix}{clazz.id}";
+                                        string code = $"GroupListSemester-{school.id}"; 
+                                        var studentList = resultStudents.list.FindAll(z => z.classId.Equals(clazz.id));
+                                        Azure.Response response =  await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemStreamAsync(id, new PartitionKey(code));
+                                        if (response.Status==200)
+                                        {
+                                            bool changeGroupListSemester = false;
+                                            GroupListSemester  groupListSemester = JsonDocument.Parse(response.Content).ToObject<GroupListSemester>();
+                                            var stuslist = studentList.ExceptBy(groupListSemester.members.Select(z=>z.id), x => x.id);
+                                            //学年学期结束 不用处理有更新编辑的学生,直接批量处理。
+                                            if (type.Contains("Ending", StringComparison.OrdinalIgnoreCase)) {
+                                                if (stuslist.Any() && stuslist.Count()>0)
+                                                {
+                                                    //var stus = new
+                                                    //{
+                                                    //    id=id ,
+                                                    //    status=200,
+                                                    //    type,
+                                                    //    periodId = period.id,
+                                                    //    periodName = period.name,
+                                                    //    classId = clazz.id,
+                                                    //    className = clazz.name,
+                                                    //    students = stuslist.Select(z => new { z.id, z.name, z.picture, z._ts })
+                                                    //};
+                                                    groupListSemester.members.AddRange(stuslist.Select(z => new RMember {
+                                                        id=  z.id,
+                                                        code=z.schoolId,
+                                                        name =z.name,
+                                                        type=2,
+                                                        picture=z.picture,
+                                                        gender=z.gender,
+                                                        no=z.no,
+                                                        irs=z.irs,
+                                                        classId=z.classId,
+                                                        groupId=z.groupId,
+                                                        groupName=z.groupName,
+                                                        graduate=z.graduate,
+                                                        year=z.year,
+                                                        periodId=z.periodId,
+                                                    }));
+                                                    changeGroupListSemester = true;
+                                                }
+                                            }
+                                            if (type.Contains("Started", StringComparison.OrdinalIgnoreCase))
+                                            {
+                                                if (stuslist.Any() && stuslist.Count()>0) {
+                                                    //获取开学时间  
+                                                    var kxdata = $"{semesterInfo.currSemesterDate.Year}-{semesterInfo.currSemester.month}-{semesterInfo.currSemester.day}";
+                                                    DateTimeOffset.TryParse(kxdata, out DateTimeOffset kxData);
+                                                    long time = kxData.ToUnixTimeSeconds();
+                                                    var editStu = stuslist.Where(z => z._ts>=time);
+                                                    if (editStu!=null && editStu.Count()>0) {
+                                                        var stus = new
+                                                        {
+                                                            id = id,
+                                                            status = 404,
+                                                            type,
+                                                            periodId = period.id,
+                                                            periodName = period.name,
+                                                            groupListId = clazz.id,
+                                                            name = clazz.name,
+                                                            className = clazz.name,
+                                                            school = school.id,
+                                                            no = clazz.no,
+                                                            year = clazz.year,
+                                                            studyYear = lastSemesterInfo.studyYear,
+                                                            semesterId = lastSemesterInfo.currSemester.id,
+                                                            leader = clazz.teacher?.id,
+                                                            grades = new List<int> { clazz.year },
+                                                            members = editStu.Select(z => new {
+                                                                z.id,
+                                                                code = z.schoolId,
+                                                                gender = z.gender,
+                                                                no = z.no,
+                                                                irs = z.irs,
+                                                                classId = z.classId,
+                                                                groupId = z.groupId,
+                                                                groupName = z.groupName,
+                                                                graduate = z.graduate,
+                                                                periodId = z.periodId,
+                                                                z.name,
+                                                                z.picture,
+                                                                z._ts,
+                                                                z.year
+                                                            })
+                                                        };
+                                                        editedStus.Add(stus);
+                                                    }
+                                                    var uneditStu = studentList.Where(z => z._ts<time);
+                                                    if (uneditStu!=null  &&uneditStu.Count()>0)
+                                                    {
+                                                        //var stus = new
+                                                        //{
+                                                        //    id = id,
+                                                        //    status = 200,
+                                                        //    type,
+                                                        //    periodId = period.id,
+                                                        //    periodName = period.name,
+                                                        //    classId = clazz.id,
+                                                        //    className = clazz.name,
+                                                        //    students = uneditStu.Select(z => new { z.id, z.name, z.picture, z._ts })
+                                                        //};
+                                                        groupListSemester.members.AddRange(uneditStu.Select(z => new RMember
+                                                        {
+                                                            id=  z.id,
+                                                            code=z.schoolId,
+                                                            name =z.name,
+                                                            type=2,
+                                                            picture=z.picture,
+                                                            gender=z.gender,
+                                                            no=z.no,
+                                                            irs=z.irs,
+                                                            classId=z.classId,
+                                                            groupId=z.groupId,
+                                                            groupName=z.groupName,
+                                                            graduate=z.graduate,
+                                                            year=z.year,
+                                                            periodId=z.periodId,
+                                                        }));
+                                                        changeGroupListSemester = true;
+                                                    }
+                                                }
+                                            }
+                                            if (changeGroupListSemester) {
+                                                await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).UpsertItemAsync(groupListSemester, new PartitionKey(code));
+                                            }
+                                        }
+                                        else
+                                        {   
+                                            //学年学期结束 不用处理有更新编辑的学生,直接批量处理。
+                                            if (type.Contains("Ending", StringComparison.OrdinalIgnoreCase))
+                                            {
+                                                //var stus = new
+                                                //{
+                                                //    id = id,
+                                                //    status = 404,
+                                                //    type,
+                                                //    periodId = period.id,
+                                                //    periodName = period.name,
+                                                //    classId = clazz.id,
+                                                //    className = clazz.name,
+                                                //    students = studentList.Select(z => new { z.id, z.name, z.picture, z._ts })
+                                                //};
+
+                                                GroupListSemester groupListSemester = new GroupListSemester();
+                                                groupListSemester.id = id;
+                                                groupListSemester.name=clazz.name;
+                                                groupListSemester.no=clazz.no;
+                                                groupListSemester.periodId=period.id;
+                                                groupListSemester.scope="school";
+                                                groupListSemester.school=school.id;
+                                                groupListSemester.type="class";
+                                                groupListSemester.year=clazz.year;
+                                                groupListSemester.studyYear=semesterInfo.studyYear;
+                                                groupListSemester.code = code;
+                                                groupListSemester.pk="GroupListSemester";
+                                                groupListSemester.semesterId=semesterInfo.currSemester.id;
+                                                groupListSemester.groupListId=clazz.id;
+                                                groupListSemester.members.AddRange(studentList.Select(z => new RMember
+                                                {
+                                                    id=  z.id,
+                                                    code=z.schoolId,
+                                                    name =z.name,
+                                                    type=2,
+                                                    picture=z.picture,
+                                                    gender=z.gender,
+                                                    no=z.no,
+                                                    irs=z.irs,
+                                                    classId=z.classId,
+                                                    groupId=z.groupId,
+                                                    groupName=z.groupName,
+                                                    graduate=z.graduate,
+                                                    year=z.year,
+                                                    periodId=z.periodId,
+                                                }));
+                                                groupListSemester.scount = groupListSemester.members.Count();
+                                                groupListSemester.leader=clazz.teacher?.id;
+                                                groupListSemester.grades.Add(clazz.year);
+                                               await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).UpsertItemAsync<GroupListSemester>(groupListSemester, new PartitionKey(groupListSemester.code));
+                                            }
+                                            //开始则需要处理当前学期有变更的学生数据
+                                            if (type.Contains("Started", StringComparison.OrdinalIgnoreCase))
+                                            {
+                                                //获取开学时间  
+                                                var kxdata = $"{semesterInfo.currSemesterDate.Year}-{semesterInfo.currSemester.month}-{semesterInfo.currSemester.day}";
+                                                DateTimeOffset.TryParse(kxdata, out DateTimeOffset kxData);
+                                                long time =  kxData.ToUnixTimeSeconds();
+                                                //在开学日期之后编辑的学生
+                                                var editStu = studentList.FindAll(z => z._ts>=time);
+                                                if (editStu.IsNotEmpty()) {
+                                                    var stus = new
+                                                    {
+                                                        id = id,
+                                                        status = 404,
+                                                        type,
+                                                        periodId = period.id,
+                                                        periodName = period.name,
+                                                        groupListId = clazz.id,
+                                                        name = clazz.name,
+                                                        className = clazz.name,
+                                                        school = school.id,
+                                                        no = clazz.no,
+                                                        year = clazz.year,
+                                                        studyYear = lastSemesterInfo.studyYear,
+                                                        semesterId = lastSemesterInfo.currSemester.id,
+                                                        leader = clazz.teacher?.id,
+                                                        grades = new List<int> { clazz.year },
+                                                        members = editStu.Select(z => new { z.id,
+                                                            code = z.schoolId,
+                                                            gender = z.gender,
+                                                            no = z.no,
+                                                            irs = z.irs,
+                                                            classId = z.classId,
+                                                            groupId = z.groupId,
+                                                            groupName = z.groupName,
+                                                            graduate = z.graduate,
+                                                            periodId = z.periodId,
+                                                            z.name, z.picture, z._ts,z.year })
+                                                    };
+                                                    editedStus.Add(stus);
+                                                }
+                                                //在开学日期之前编辑的学生
+                                                var uneditStu = studentList.FindAll(z => z._ts<time);
+                                                if (uneditStu.IsNotEmpty()) {
+                                                    //var stus = new
+                                                    //{
+                                                    //    id = id,
+                                                    //    status = 404,
+                                                    //    type,
+                                                    //    periodId = period.id,
+                                                    //    periodName = period.name,
+                                                    //    classId = clazz.id,
+                                                    //    className = clazz.name,
+                                                    //    students = uneditStu.Select(z => new { z.id, z.name, z.picture, z._ts })
+                                                    //};
+                                                    GroupListSemester groupListSemester = new GroupListSemester();
+                                                    groupListSemester.id = id;
+                                                    groupListSemester.name=clazz.name;
+                                                    groupListSemester.no=clazz.no;
+                                                    groupListSemester.periodId=period.id;
+                                                    groupListSemester.scope="school";
+                                                    groupListSemester.school=school.id;
+                                                    groupListSemester.type="class";
+                                                    groupListSemester.year=clazz.year;
+                                                    groupListSemester.studyYear=lastSemesterInfo.studyYear;
+                                                    groupListSemester.code = code;
+                                                    groupListSemester.pk="GroupListSemester";
+                                                    groupListSemester.semesterId=lastSemesterInfo.currSemester.id;
+                                                    groupListSemester.groupListId=clazz.id;
+                                                    groupListSemester.members.AddRange(studentList.Select(z => new RMember
+                                                    {
+                                                        id=  z.id,
+                                                        code=z.schoolId,
+                                                        name =z.name,
+                                                        type=2,
+                                                        picture=z.picture,
+                                                        gender=z.gender,
+                                                        no=z.no,
+                                                        irs=z.irs,
+                                                        classId=z.classId,
+                                                        groupId=z.groupId,
+                                                        groupName=z.groupName,
+                                                        graduate=z.graduate,
+                                                        year=z.year,
+                                                        periodId=z.periodId,
+                                                    }));
+                                                    groupListSemester.scount = groupListSemester.members.Count();
+                                                    groupListSemester.leader=clazz.teacher?.id;
+                                                    groupListSemester.grades.Add(clazz.year);
+                                                    await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).UpsertItemAsync<GroupListSemester>(groupListSemester, new PartitionKey(groupListSemester.code));
+
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
                             }
                         }
+                        //已经处理过的数据则不需要在进行处理
+                        if (editedStus.IsEmpty() &&  !string.IsNullOrWhiteSpace(type))
+                        {
+                            keyExists = await _azureRedis.GetRedisClient(8).KeyExistsAsync(key);
+                            if (keyExists)
+                            {
+                                var data = await _azureRedis.GetRedisClient(8).StringGetAsync(key);
+                                if (data.HasValue)
+                                {
+                                    SemesterStudyYearNotify notify = data.ToString().ToObject<SemesterStudyYearNotify>();
+                                    notify.process = 1;
+                                    await _azureRedis.GetRedisClient(8).StringSetAsync(key, notify.ToJsonString());
+                                }
+                            }
+                            type="";
+                        }
+                        else {
+                            periodNotify.Add(new { studyYearStarted, studyYearEnding, semesterStarted, semesterEnding, type, key, editedStus, periodId = period.id, periodName = period.name });
+                        }
                     }
                 }
             }
-            return Ok(new { expireClass, okClass });
+            return Ok(new { code = 200, periodNotify });
         }
     }
 }

+ 3 - 3
TEAMModelOS/Controllers/Both/ScoreCalcController.cs

@@ -1940,7 +1940,7 @@ namespace TEAMModelOS.Controllers
             string sql_members = "";
             if (ishaveClassId)
             {// 如果有classId 直接到student 取資料
-                sql_members = $"SELECT c.id, c.no, c.name FROM c WHERE c.classId= '{classId}'";
+                sql_members = $"SELECT c.id, c.no, c.name FROM c WHERE c.classId= '{classId}' and c.code = 'Base-{schoolId}'";
                 await foreach (var item in clientStudent.GetItemQueryIterator<ScoreCalcMember>(queryText: sql_members))
                 {
                     members.Add(item);
@@ -1948,7 +1948,7 @@ namespace TEAMModelOS.Controllers
             }
             else if (scope.ToString() == "school")
             {// 選課班 撈School 取id 撈student 取name no
-                sql_members = $"SELECT b.id  FROM c join b in c.members WHERE c.id= '{grouplistId}'";
+                sql_members = $"SELECT b.id  FROM c join b in c.members WHERE c.id= '{grouplistId}' and c.code = 'GroupList-{schoolId}'";
                 StringBuilder sb = new StringBuilder();
                 await foreach (var item in clientSchool.GetItemQueryIterator<ScoreCalcMember>(queryText: sql_members))
                 {
@@ -1965,7 +1965,7 @@ namespace TEAMModelOS.Controllers
             }
             else if (scope.ToString() == "private")
             {// 私人班 撈Teacher 取c.id, c.no  撈student 取name
-                sql_members = $"SELECT b.id  FROM c join b in c.members WHERE c.id= '{grouplistId}'";
+                sql_members = $"SELECT b.id  FROM c join b in c.members WHERE c.id= '{grouplistId}' and c.code = 'GroupList'";
                 StringBuilder sb = new StringBuilder();
                 await foreach (var item in clientTeacher.GetItemQueryIterator<ScoreCalcMember>(queryText: sql_members))
                 {

+ 1 - 1
TEAMModelOS/Controllers/Client/HabbController.cs

@@ -219,7 +219,7 @@ namespace TEAMModelOS.Controllers.Client
                 return BadRequest();
             }
         }
-        //變更學校基本資料(目前先只變更名稱)
+        //生成學校ID
         [ProducesDefaultResponseType]
         [Authorize(Roles = "BB")]
         [HttpPost("gen-school-id")]

+ 79 - 31
TEAMModelOS/Controllers/Common/ExamController.cs

@@ -286,15 +286,15 @@ namespace TEAMModelOS.Controllers
             }
 
         }
-       /* [ProducesDefaultResponseType]
-        //[AuthToken(Roles = "teacher,admin")]
-        [HttpPost("read-score")]
-       // [Authorize(Roles = "IES")]
-        public async Task<IActionResult> getAverage(JsonElement request) {
-            var client = _azureCosmos.GetCosmosClient();
-            var grades =  ExamService.getGradeScore(_coreAPIHttpService,_dingDing,client,2021,"二年级", "463db08d-cbe7-48a0-a81a-fc39b3c1fep1","hbcn", 1688349974000, 1693706774000);
-            return Ok(grades);
-        }*/
+        /* [ProducesDefaultResponseType]
+         //[AuthToken(Roles = "teacher,admin")]
+         [HttpPost("read-score")]
+        // [Authorize(Roles = "IES")]
+         public async Task<IActionResult> getAverage(JsonElement request) {
+             var client = _azureCosmos.GetCosmosClient();
+             var grades =  ExamService.getGradeScore(_coreAPIHttpService,_dingDing,client,2021,"二年级", "463db08d-cbe7-48a0-a81a-fc39b3c1fep1","hbcn", 1688349974000, 1693706774000);
+             return Ok(grades);
+         }*/
 
         /// <summary>
         /// 保存考试信息
@@ -848,7 +848,8 @@ namespace TEAMModelOS.Controllers
                     using var cJson = await JsonDocument.ParseAsync(response.ContentStream);
                     info = cJson.ToObject<ExamInfo>();
                 }
-                else {
+                else
+                {
                     return Ok(new { code = 404, msg = "该活动未被找到" });
                 }
                 //ExamInfo info = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Common").ReadItemAsync<ExamInfo>(id.GetString(), new PartitionKey($"{scode}"));
@@ -1210,7 +1211,7 @@ namespace TEAMModelOS.Controllers
                             activity.taskStatus = 1;
                             await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<StuActivity>(activity, id.ToString(), new PartitionKey($"Activity-{userId}"));
                         }
-                    }                    
+                    }
                 }
                 await Task.WhenAll(tasks);
 
@@ -1264,8 +1265,10 @@ namespace TEAMModelOS.Controllers
                         classIds = cIds,
                     };
 
-                    art.settings.ForEach(qIds => {
-                        qIds.task.ForEach(task => {
+                    art.settings.ForEach(qIds =>
+                    {
+                        qIds.task.ForEach(task =>
+                        {
                             ArtQuotaResult quotaResult = new()
                             {
                                 quotaId = qIds.id,
@@ -1844,7 +1847,7 @@ namespace TEAMModelOS.Controllers
                         }
                     }
                 }
-                
+
                 //查询结果
                 List<ExamResult> results = new();
                 await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<ExamResult>(queryText: $"select value(c) from c ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"ExamResult-{id}") }))
@@ -1883,13 +1886,14 @@ namespace TEAMModelOS.Controllers
                 List<(List<int> fs, List<double> fps, List<double> cfps, List<double> afps)> fp = new();
                 List<List<double>> wno = new();
                 List<KeyValuePair<string, List<KeyValuePair<string, Dictionary<string, string>>>>> subjectScatter = new();
-                if (!string.IsNullOrEmpty(info.progress) && info.progress.Equals("finish")) {
+                if (!string.IsNullOrEmpty(info.progress) && info.progress.Equals("finish"))
+                {
                     (List<RMember> members, List<RGroupList> classLists) = await GroupListService.GetMemberByListids(_coreAPIHttpService, client, _dingDing, infoIds, school.GetString(), null);
                     await foreach (var s in stuTask(subId, info.papers, answers, studentId.GetString()))
                     {
                         know = s.know;
                         fp = s.filed;
-                    }               
+                    }
                     foreach (ExamResult exam in results)
                     {
                         subjectScatter.Add(DoSubjectScatter(exam, members));
@@ -1905,10 +1909,10 @@ namespace TEAMModelOS.Controllers
                         var knowledge = know.Select(k => new { k.kn, k.kps, k.ckps, k.akps });
                         var filed = fp.Select(k => new { k.fs, k.fps, k.cfps, k.afps });
                         //papers = papers
-                        return Ok(new { info.cloudas,info.papers, subjects, stuScore, stuAns, mark, total, claId = infoIds, knowledge, filed, average, wno, subjectScatter, status = 200 });
+                        return Ok(new { info.cloudas, info.papers, subjects, stuScore, stuAns, mark, total, claId = infoIds, knowledge, filed, average, wno, subjectScatter, status = 200 });
                     }
                 }
-                return Ok(new { info.cloudas,info.papers, subjects, stuScore, stuAns, mark, total, claId = infoIds, knowledge = new List<object>(), filed = new List<object>(), average, wno, subjectScatter, status = 200 });
+                return Ok(new { info.cloudas, info.papers, subjects, stuScore, stuAns, mark, total, claId = infoIds, knowledge = new List<object>(), filed = new List<object>(), average, wno, subjectScatter, status = 200 });
             }
             catch (Exception ex)
             {
@@ -1940,10 +1944,10 @@ namespace TEAMModelOS.Controllers
                 List<string> knowledges = new();
                 if (kones.Count > 0)
                 {
-                    knowles=new HashSet<string>(kones.SelectMany(z => z));
+                    knowles = new HashSet<string>(kones.SelectMany(z => z));
                 }
-                knowledges.AddRange(knowles.Where(z=>!string.IsNullOrWhiteSpace(z)));
-                answers= answers.Where(result => !string.IsNullOrWhiteSpace(result ?.subjectId) && result.subjectId.Equals(sub)).ToList();
+                knowledges.AddRange(knowles.Where(z => !string.IsNullOrWhiteSpace(z)));
+                answers = answers.Where(result => !string.IsNullOrWhiteSpace(result?.subjectId) && result.subjectId.Equals(sub)).ToList();
                 foreach (ExamClassResult result in answers)
                 {
                     int index = result.studentIds.IndexOf(stuId.ToString());
@@ -2001,7 +2005,7 @@ namespace TEAMModelOS.Controllers
                     }
                     ckp = result.krate;
                     cfp = result.frate;
-                    
+
                 }
                 foreach (string k in knowledges)
                 {
@@ -2011,7 +2015,7 @@ namespace TEAMModelOS.Controllers
                     int count = 0;
                     foreach (ExamClassResult result in answers)
                     {
-                         
+
                         int n = 0;
                         foreach (List<string> str in kones)
                         {
@@ -3704,7 +3708,7 @@ namespace TEAMModelOS.Controllers
             string hval = await redisClient.HashGetAsync(hkey, $"{stuId}");
             List<stuErrorItemCnt> stuErrCntList = (hval != null) ? JsonSerializer.Deserialize<List<stuErrorItemCnt>>(hval) : new List<stuErrorItemCnt>();
             stuErrorItemCnt stuErrCnt = stuErrCntList.Where(s => s.subjectId.Equals($"{subjectId}")).FirstOrDefault();
-            if(stuErrCnt != null)
+            if (stuErrCnt != null)
             {
                 record = stuErrCnt.number;
             }
@@ -3715,27 +3719,71 @@ namespace TEAMModelOS.Controllers
             string qryAdd = (!string.IsNullOrWhiteSpace(code)) ? $" AND c.school = '{code}' " : string.Empty;
             //string qry = $"SELECT SUM(ARRAY_LENGTH(c.its)) AS number, c.stuId, c.school, c.subjectId FROM c WHERE CONTAINS(c.code, 'ErrorItems') AND c.stuId = '{stuId}' AND c.subjectId = '{subjectId}'{qryAdd} GROUP BY c.stuId, c.school, c.subjectId";
             string pk = "ErrorItems";
-            string qry = "SELECT ARRAY(SELECT VALUE t.id FROM t IN c.its ) AS itemIds, c.stuId, c.school AS schoolId, c.subjectId, c.code FROM c WHERE " +
-                    $"c.stuId = '{stuId}' AND c.subjectId = '{subjectId}'{qryAdd} ";
+            //string qry = "SELECT ARRAY(SELECT VALUE t.id FROM t IN c.its ) AS itemIds, c.stuId, c.school AS schoolId, c.subjectId, c.code FROM c WHERE " +
+            //        $"c.stuId = '{stuId}' AND c.subjectId = '{subjectId}'{qryAdd} ";
+            string qry = $"SELECT  i.blob, i.id, i.pId, c.stuId, c.school AS schoolId, c.subjectId, c.code FROM c JOIN i IN c.its WHERE " +
+                      $" c.stuId = '{stuId}' AND c.subjectId = '{subjectId}' {qryAdd} ";
             if (!string.IsNullOrWhiteSpace(code))
             {
-                qry += $"AND c.school = '{code}' ";
+                //qry += $"AND c.school = '{code}' ";
                 pk = $"ErrorItems-{code}";
             };
 
-            await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryStreamIterator(queryText: qry, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"{pk}") } ))
+            //await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryStreamIterator(queryText: qry, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"{pk}") }))
+            //{
+            //    using var json = await JsonDocument.ParseAsync(item.ContentStream);
+            //    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+            //    {
+            //        foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
+            //        {
+            //            List<string> itemIdListRow = obj.GetProperty("itemIds").ToObject<List<string>>();
+            //            itemIdList = itemIdList.Union(itemIdListRow).ToList();
+            //        }
+            //    }
+            //}
+
+            //avaliable = itemIdList.Count;
+
+            //return Ok(new { record, avaliable });
+
+            Dictionary<string, string> dict = new();
+
+
+            await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryStreamIterator(queryText: qry, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"{pk}") }))
             {
                 using var json = await JsonDocument.ParseAsync(item.ContentStream);
                 if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
                 {
                     foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
                     {
-                        List<string> itemIdListRow = obj.GetProperty("itemIds").ToObject<List<string>>();
-                        itemIdList = itemIdList.Union(itemIdListRow).ToList();
+                        if (!dict.ContainsKey(obj.GetProperty("id").ToString()))
+                        {
+                            dict.Add(obj.GetProperty("id").ToString(), obj.GetProperty("blob").ToString());
+                            //if (!String.IsNullOrWhiteSpace(obj.GetProperty("pId") + ""))
+                            //{
+                            //    if (!dict.ContainsKey(obj.GetProperty("pId").ToString()))
+                            //    {
+
+
+                            //        dict.Add(obj.GetProperty("pId").ToString(), obj.GetProperty("blob").ToString());
+                            //    }
+                            //}
+                            //else
+                            //{
+                            //    dict.Add(obj.GetProperty("id").ToString(), obj.GetProperty("blob").ToString());
+                            //}
+                        }
                     }
                 }
             }
-            avaliable = itemIdList.Count;
+
+            foreach (var obj in dict)
+            {
+                if (_azureStorage.GetBlobContainerClient(schCode).GetBlobClient($"{obj.Value}/{obj.Key}.json").Exists())
+                {
+                    avaliable++;
+                }
+            }
 
             return Ok(new { record, avaliable });
         }

+ 11 - 0
TEAMModelOS/Controllers/School/SchoolController.cs

@@ -2516,6 +2516,17 @@ namespace TEAMModelOS.Controllers
                         //60天 * 24 =1440小时
                         await _azureRedis.GetRedisClient(8).KeyExpireAsync(key, new TimeSpan(1440,0,0));
                     }
+                    if (!string.IsNullOrWhiteSpace(type)) {
+                        if (type.Contains("Ending", StringComparison.OrdinalIgnoreCase))
+                        {
+                            string sql = $"";
+                            
+                        }
+                        if (type.Contains("Started", StringComparison.OrdinalIgnoreCase))
+                        {
+
+                        }
+                    }
                     return Ok(new { code = 1, studyYearStarted, studyYearEnding,semesterStarted, semesterEnding, type ,key});
                 }
             }

+ 66 - 57
TEAMModelOS/Controllers/Student/OverallEducationController.cs

@@ -294,19 +294,23 @@ namespace TEAMModelOS.Controllers
                     if (item.intelligence.IsNotEmpty())
                     {
                         //智育
-                        if (schoolSetting.overallEducationSetting.intelligence.Equals("avg"))
-                        {
-                            double sumScore = item.intelligence.Average(x => x.sumScore);
-                            double totalScore = item.intelligence.Average(x => x.totalScore);
-                            if (totalScore > 0)
-                            {
-                                intelligence = Math.Round(sumScore * 1.0 / totalScore * 100,2);
+                        //if (schoolSetting.overallEducationSetting.intelligence.Equals("avg"))
+                        //{
+                           
+                        //}
+                        //else { 
+                        //}
 
-                            }
-                            else
-                            {
-                                intelligence = Math.Round(sumScore * 1.0 / item.intelligence.Count,2);
-                            }
+
+                        double sumScore = item.intelligence.Average(x => x.sumScore);
+                        double totalScore = item.intelligence.Average(x => x.totalScore);
+                        if (totalScore > 0)
+                        {
+                            intelligence = Math.Round(sumScore * 1.0 / totalScore * 100, 2);
+                        }
+                        else
+                        {
+                            intelligence = Math.Round(sumScore * 1.0 / item.intelligence.Count, 2);
                         }
                     }
                     dimensionScore.exam = intelligence;
@@ -329,20 +333,22 @@ namespace TEAMModelOS.Controllers
                     dimensionScore.intelligence = Math.Round(intelligence * standard + pdata_score * ability + tdata_score * attitude + gdata_score * cooperate, 2);
                     if (item.sports.IsNotEmpty())
                     {  //体育
-                        if (schoolSetting.overallEducationSetting.sports.Equals("newest"))
+                        //if (schoolSetting.overallEducationSetting.sports.Equals("newest"))
+                        //{
+                           
+                        //}
+                        //else { dimensionScore.sports = basic_Score; }
+
+                        double sumScore = item.sports.OrderByDescending(x => x.examDate).First().sumScore;
+                        double totalScore = item.sports.OrderByDescending(x => x.examDate).First().totalScore;
+                        if (totalScore > 0)
                         {
-                            double sumScore = item.sports.OrderByDescending(x => x.examDate).First().sumScore;
-                            double totalScore = item.sports.OrderByDescending(x => x.examDate).First().totalScore;
-                            if (totalScore > 0)
-                            {
-                                dimensionScore.sports = Math.Round(sumScore * 1.0 / totalScore * 100,2);
-                            }
-                            else
-                            {
-                                dimensionScore.sports = Math.Round(sumScore * 1.0 / item.sports.Count,2);
-                            }
+                            dimensionScore.sports = Math.Round(sumScore * 1.0 / totalScore * 100, 2);
+                        }
+                        else
+                        {
+                            dimensionScore.sports = Math.Round(sumScore * 1.0 / item.sports.Count, 2);
                         }
-                        else { dimensionScore.sports = basic_Score; }
                     }
                     else
                     {
@@ -352,43 +358,46 @@ namespace TEAMModelOS.Controllers
                     if (item.art.IsNotEmpty())
                     {
                         //艺术
-                        if (schoolSetting.overallEducationSetting.art.Equals("newest"))
-                        {
-                            var art = item.art.OrderByDescending(x => x.examDate).First();
-                            double sumScore = art.sumScore;
-                            double totalScore = art.totalScore;
-                            if (totalScore > 0)
-                            {
-                                dimensionScore.art = Math.Round(sumScore * 1.0 / totalScore * 100,2);
-                            }
-                            else
-                            {
-                                dimensionScore.art = Math.Round(sumScore * 1.0 / item.art.Count,2);
-                            }
+                        //if (schoolSetting.overallEducationSetting.art.Equals("newest"))
+                        //{
                             
-                            var subject_music = art.itemScore.Find(x => !string.IsNullOrWhiteSpace(x.id)?x.id.Equals("subject_music"): x.type.Equals("subject_music"));
-                            var subject_painting = art.itemScore.Find(x => !string.IsNullOrWhiteSpace(x.id) ? x.id.Equals("subject_painting") : x.type.Equals("subject_painting"));
-                            if (subject_music != null)
-                            {
-                                dimensionScore.subject_music = Math.Round(subject_music.score * 1.0 / subject_music.totalScore *100,2);
-                            }
-                            else
-                            {
-                                dimensionScore.subject_music = 0;
-                            }
-                            if (subject_painting != null)
-                            {
-                                dimensionScore.subject_painting = Math.Round(subject_painting.score * 1.0 / subject_painting.totalScore *100,2);
-                            }
-                            else
-                            {
-                                dimensionScore.subject_painting = 0;
-                            }
+                        //}
+                        //else
+                        //{
+                        //    dimensionScore.art = basic_Score;
+                        //}
+
+                        var art = item.art.OrderByDescending(x => x.examDate).First();
+                        double sumScore = art.sumScore;
+                        double totalScore = art.totalScore;
+                        if (totalScore > 0)
+                        {
+                            dimensionScore.art = Math.Round(sumScore * 1.0 / totalScore * 100, 2);
                         }
                         else
                         {
-                            dimensionScore.art = basic_Score;
+                            dimensionScore.art = Math.Round(sumScore * 1.0 / item.art.Count, 2);
                         }
+
+                        var subject_music = art.itemScore.Find(x => !string.IsNullOrWhiteSpace(x.id) ? x.id.Equals("subject_music") : x.type.Equals("subject_music"));
+                        var subject_painting = art.itemScore.Find(x => !string.IsNullOrWhiteSpace(x.id) ? x.id.Equals("subject_painting") : x.type.Equals("subject_painting"));
+                        if (subject_music != null)
+                        {
+                            dimensionScore.subject_music = Math.Round(subject_music.score * 1.0 / subject_music.totalScore *100, 2);
+                        }
+                        else
+                        {
+                            dimensionScore.subject_music = 0;
+                        }
+                        if (subject_painting != null)
+                        {
+                            dimensionScore.subject_painting = Math.Round(subject_painting.score * 1.0 / subject_painting.totalScore *100, 2);
+                        }
+                        else
+                        {
+                            dimensionScore.subject_painting = 0;
+                        }
+
                     }
                     else
                     {
@@ -511,7 +520,7 @@ namespace TEAMModelOS.Controllers
                 else
                 {
                     if (grade_dimensions != null && grade_dimensions.Any())
-                    { //能力年级平均分
+                    {   //能力年级平均分
                         pscore_avg = Math.Round(grade_dimensions.Average(x => x.pscore), 2);
                         //态度年级平均分
                         tscore_avg = Math.Round(grade_dimensions.Average(x => x.tscore), 2);

+ 4 - 4
TEAMModelOS/TEAMModelOS.csproj

@@ -74,11 +74,11 @@
     <SpaRoot>ClientApp\</SpaRoot>
     <DefaultItemExcludes>$(DefaultItemExcludes);$(SpaRoot)node_modules\**</DefaultItemExcludes>
     <UserSecretsId>078b5d89-7d90-4f6a-88fc-7d96025990a8</UserSecretsId>
-    <Version>5.2309.20</Version>
-    <AssemblyVersion>5.2309.20.1</AssemblyVersion>
-    <FileVersion>5.2309.20.1</FileVersion>
+    <Version>5.2309.27</Version>
+    <AssemblyVersion>5.2309.27.1</AssemblyVersion>
+    <FileVersion>5.2309.27.1</FileVersion>
     <Description>TEAMModelOS(IES5)</Description>
-    <PackageReleaseNotes>IES版本说明版本切换标记5.2309.20.1</PackageReleaseNotes>
+    <PackageReleaseNotes>IES版本说明版本切换标记5.2309.27.1</PackageReleaseNotes>
     <PackageId>TEAMModelOS</PackageId>
     <Authors>teammodel</Authors>
     <Company>醍摩豆(成都)信息技术有限公司</Company>

+ 1 - 1
TEAMModelOS/appsettings.Development.json

@@ -18,7 +18,7 @@
     "IdTokenSalt": "8263692E2213497BB55E74792B7900B4",
     "HttpTrigger": "https://teammodelosfunction-test.chinacloudsites.cn/api/",
     //"HttpTrigger": "http://localhost:7071/api/"
-    "Version": "5.2309.20.1"
+    "Version": "5.2309.27.1"
   },
   "Azure": {
     // 测试站数据库

+ 1 - 1
TEAMModelOS/appsettings.json

@@ -18,7 +18,7 @@
     "Exp": 86400,
     "IdTokenSalt": "8263692E2213497BB55E74792B7900B4",
     "HttpTrigger": "https://teammodelosfunction.chinacloudsites.cn/api/",
-    "Version": "5.2309.20.1"
+    "Version": "5.2309.27.1"
   },
   "Azure": {
     "Storage": {