Переглянути джерело

Merge branch 'develop' into TPE/develop

jeff 1 рік тому
батько
коміт
b1ad7bb691
47 змінених файлів з 1688 додано та 521 видалено
  1. 26 19
      TEAMModelBI/ClientApp/src/view/index/index.vue
  2. 28 24
      TEAMModelBI/ClientApp/src/view/schoolServe/school.vue
  3. 1 1
      TEAMModelBI/ClientApp/src/view/schoolmanage/schoolAnalyse.vue
  4. 2 5
      TEAMModelBI/ClientApp/src/view/userInquire/details.vue
  5. 1 1
      TEAMModelBI/Controllers/BITmid/TmidController.cs
  6. 0 113
      TEAMModelBI/Properties/ServiceDependencies/teammodelbi-rc - Web Deploy/profile.arm.json
  7. 3 3
      TEAMModelBI/TEAMModelBI.csproj
  8. 27 8
      TEAMModelOS.FunctionV4/CosmosDB/TriggerExam.cs
  9. 0 174
      TEAMModelOS.FunctionV4/Properties/ServiceDependencies/TEAMModelFunction - Zip Deploy/profile.arm.json
  10. 0 3
      TEAMModelOS.FunctionV4/Properties/serviceDependencies.TEAMModelFunction - Zip Deploy.json
  11. 3 3
      TEAMModelOS.FunctionV4/TEAMModelOS.FunctionV4.csproj
  12. 29 74
      TEAMModelOS.SDK/DI/AzureCosmos/AzureCosmosExtensions.cs
  13. 5 0
      TEAMModelOS.SDK/Models/Cosmos/Common/IotTeachingData.cs
  14. 4 2
      TEAMModelOS.SDK/Models/Service/BI/BIProdAnalysis.cs
  15. 152 3
      TEAMModelOS.SDK/Models/Service/StudentService.cs
  16. 3 3
      TEAMModelOS.SDK/TEAMModelOS.SDK.csproj
  17. 13 10
      TEAMModelOS/ClientApp/public/lang/en-US.js
  18. 3 0
      TEAMModelOS/ClientApp/public/lang/zh-CN.js
  19. 3 0
      TEAMModelOS/ClientApp/public/lang/zh-TW.js
  20. 141 3
      TEAMModelOS/ClientApp/src/assets/iconfont/demo_index.html
  21. 43 3
      TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.css
  22. 1 1
      TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.js
  23. 70 0
      TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.json
  24. BIN
      TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.ttf
  25. BIN
      TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.woff
  26. BIN
      TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.woff2
  27. 3 2
      TEAMModelOS/ClientApp/src/common/BaseLayout.vue
  28. 0 1
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperViewBox/ArtView.vue
  29. 3 1
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperViewBox/PaperView.vue
  30. 7 5
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventList.vue
  31. 11 1
      TEAMModelOS/ClientApp/src/components/student-web/HomeView/HomeView.vue
  32. 9 0
      TEAMModelOS/ClientApp/src/router/routes.js
  33. 1 1
      TEAMModelOS/ClientApp/src/view/Home.vue
  34. 18 15
      TEAMModelOS/ClientApp/src/view/areaMgmt/AreaEcharts/gradePie.vue
  35. 24 19
      TEAMModelOS/ClientApp/src/view/areaMgmt/AreaIndex.vue
  36. 1 0
      TEAMModelOS/ClientApp/src/view/artexam/Create.vue
  37. 1 4
      TEAMModelOS/ClientApp/src/view/artexam/Mgt.vue
  38. 908 0
      TEAMModelOS/ClientApp/src/view/dashboard/school/SchoolDashboard.vue
  39. BIN
      TEAMModelOS/ClientApp/src/view/dashboard/school/bg-img.jpg
  40. 102 0
      TEAMModelOS/ClientApp/src/view/dashboard/school/echart/bar.vue
  41. 2 1
      TEAMModelOS/ClientApp/src/view/dashboardCenter/DashboardCenter.vue
  42. 12 6
      TEAMModelOS/ClientApp/src/view/student-web/AppNew.vue
  43. 3 2
      TEAMModelOS/Controllers/Both/GroupListController.cs
  44. 19 4
      TEAMModelOS/Controllers/Student/StudentCommonController.cs
  45. 4 4
      TEAMModelOS/TEAMModelOS.csproj
  46. 1 1
      TEAMModelOS/appsettings.Development.json
  47. 1 1
      TEAMModelOS/appsettings.json

+ 26 - 19
TEAMModelBI/ClientApp/src/view/index/index.vue

@@ -208,7 +208,7 @@
                 </div>
                 <div class="commonbox-versions" v-loading="loading.versions" element-loading-background="rgba(0, 0, 0, 0.2)">
                   <div class="commonbox-versions-title">
-                    <p class="versions-title-name">自訂版</p>
+                    <p class="versions-title-name">评测版</p>
                     <p class="versions-title-num">数量:
                       <span>{{ versionsData.custom.num }}</span>
                     </p>
@@ -3045,31 +3045,38 @@ export default {
       //    && item.service.includes('IPDYZYLC') && item.service.includes('YMPCVCIM') && item.service.includes('YPXSJ6NJ') 
       //    ? marjorArr.push(item) : '' }) : ''
       //  11.14日修正  关于学校版本问题   根据edition   current /1基础   /2标准   /3专业
-      schoolList ? schoolList.forEach((item) => {
-         item.edition  && !item.edition.scaleVersion && item.edition.current === 3 && item.code ==='BIRel' ? marjorArr.push(item):''
-        //  item.service.includes('IPDYZYLC') && item.service.includes('YMPCVCIM') &&  item.service.includes('YPXSJ6NJ') && item.code ==='BIRel'  ?  marjorArr.push(item):''
-       }) : ''
+      // schoolList ? schoolList.forEach((item) => {
+      //    item.edition   && item.edition.current === 3 && item.code ==='BIRel' ? marjorArr.push(item):''
+      //   //  item.service.includes('IPDYZYLC') && item.service.includes('YMPCVCIM') &&  item.service.includes('YPXSJ6NJ') && item.code ==='BIRel'  ?  marjorArr.push(item):''
+      //  }) : ''
        // 標準版
       //  schoolList ? schoolList.forEach((item) => { 
       //   (item.edition == null || item.edition.scaleVersion == null) && item.code ==='BIRel'
       //   && item.service.includes('IPDYZYLC') && item.service.includes('YMPCVCIM') && (!item.service.includes('YPXSJ6NJ')) ? standardArr.push(item) : '' }) : ''
-      schoolList ? schoolList.forEach((item) => { 
-        item.edition  && !item.edition.scaleVersion && item.edition.current === 2 && item.code ==='BIRel' ? standardArr.push(item):''
-        // item.service.includes('IPDYZYLC') && item.service.includes('YMPCVCIM') && item.code ==='BIRel' ? standardArr.push(item):''
-      }) : ''
+      // schoolList ? schoolList.forEach((item) => { 
+      //   item.edition  && item.edition.current === 2 && item.code ==='BIRel' ? standardArr.push(item):''
+      //   // item.service.includes('IPDYZYLC') && item.service.includes('YMPCVCIM') && item.code ==='BIRel' ? standardArr.push(item):''
+      // }) : ''
        // 基礎版
       //  schoolList ? schoolList.forEach((item) => { 
       //   (item.edition == null || item.edition.scaleVersion == null) && item.code ==='BIRel'
       //   && !item.service.includes('IPDYZYLC') && !item.service.includes('YMPCVCIM') ? basicsArr.push(item) : '' }) : ''
-      schoolList ? schoolList.forEach((item) => { 
-        item.edition  && !item.edition.scaleVersion && item.edition.current === 1 && item.code ==='BIRel' ? basicsArr.push(item):
-        item.edition ==null && item.code ==='BIRel' ? basicsArr.push(item):''
-        // !item.service.includes('IPDYZYLC') && !item.service.includes('YMPCVCIM') && item.code ==='BIRel' ? basicsArr.push(item):''
-      }) : ''
-       // 自訂版
-       schoolList ? schoolList.forEach((item) => { 
-        item.edition !== null && item.edition.scaleVersion && item.code ==='BIRel' ? customArr.push(item) : '' }) : ''    
-        
+      // schoolList ? schoolList.forEach((item) => { 
+      //   item.edition  &&  item.edition.current === 1 && item.code ==='BIRel' && !item.service.includes('B6V5J6NP') ? basicsArr.push(item):
+      //   item.edition ==null && item.code ==='BIRel' ? basicsArr.push(item):''
+      //   // !item.service.includes('IPDYZYLC') && !item.service.includes('YMPCVCIM') && item.code ==='BIRel' ? basicsArr.push(item):''
+      // }) : ''
+       // 评测版
+      //  schoolList ? schoolList.forEach((item) => { 
+      //   item.edition !== null && item.edition.current === 1 && item.code ==='BIRel' && item.service.includes('B6V5J6NP') ? 
+      //   customArr.push(item) : '' }) : ''    
+
+        schoolList ? schoolList.forEach((item) => {
+          item.service.includes('YPXSJ6NJ') && item.service.includes('B6V5J6NP') && item.service.includes('YMPCVCIM') && item.code ==='BIRel' ? marjorArr.push(item):
+          item.service.includes('IPDYZYLC') && item.service.includes('YMPCVCIM') && (!item.service.includes('YPXSJ6NJ')) && item.code ==='BIRel' ? standardArr.push(item):
+          !item.service.includes('IPDYZYLC') && !item.service.includes('YMPCVCIM') && item.service.includes('B6V5J6NP') && item.code ==='BIRel'   ? customArr.push(item):
+          !item.service.includes('IPDYZYLC') && !item.service.includes('YMPCVCIM') && item.code ==='BIRel'  ? basicsArr.push(item):''
+        }):''
         //计算版本占比
         console.log(basicsArr,standardArr,marjorArr,customArr,'数组')
         versionsData.value.basics.num = basicsArr.length >0 ?basicsArr.length :0
@@ -3335,7 +3342,7 @@ export default {
         }
         let dataCustom = {
               title: {
-                text: '{a|' + versionsData.value.custom.proportion + '}{c|%}' + '\n' + '自訂版占比',
+                text: '{a|' + versionsData.value.custom.proportion + '}{c|%}' + '\n' + '评测版占比',
                 x: 'center',
                 y: 'center',
                 textStyle: {

+ 28 - 24
TEAMModelBI/ClientApp/src/view/schoolServe/school.vue

@@ -565,10 +565,10 @@ export default {
         // sortable: true,
          cellRenderer: (data) => (
           <>
-            <div style="color:#000000;" v-show={data.rowData.versions !=='基础版' && data.rowData.versions !=='标准版' && data.rowData.versions !=='专业版'}>{data.rowData.versions}</div>
             <div style="color:#e6a23c;" v-show={data.rowData.versions ==='专业版' ? true:false}>专业版</div>
             <div style="color:#67C23A;" v-show={data.rowData.versions ==='标准版' ? true:false}>标准版</div>
             <div style="color:#409EFF;" v-show={data.rowData.versions ==='基础版' ? true:false}>基础版</div>
+            <div style="color:#fab6b6;" v-show={data.rowData.versions ==='评测版' ? true:false}>评测版</div>
           </>
         ),
       },
@@ -727,7 +727,7 @@ export default {
                       基础版
                     </ElCheckbox>
                     <ElCheckbox v-model={shouldFilter.value.custom} onChange={versionsEstimate}>
-                      自訂
+                      评测
                     </ElCheckbox>
                   </div>
                   {/* <div class="el-table-v2__demo-filter">
@@ -808,14 +808,18 @@ export default {
                 item.versions = item.service.includes('YPXSJ6NJ') && item.service.includes('B6V5J6NP') ? '专业版' : item.service.includes('YMPCVCIM') ? '标准版' : '基础版';
           } */
           //11.14日修正  关于学校版本问题   根据edition   current /1基础   /2标准   /3专业
-          if(item.edition !== null){
-            item.edition.scaleVersion ? item.versions='自訂版':
-            !item.edition.scaleVersion && item.edition.current === 3 ?  item.versions='专业版':
-            !item.edition.scaleVersion && item.edition.current === 2 ? item.versions='标准版':
-            !item.edition.scaleVersion && item.edition.current === 1 ? item.versions='基础版':''
+           /* if(item.edition !== null){
+            item.edition.current === 1 && item.service.includes('B6V5J6NP') ? item.versions='评测版':
+            item.edition.current === 3 ?  item.versions='专业版':
+            item.edition.current === 2 ? item.versions='标准版':
+            item.edition.current === 1 ? item.versions='基础版':''
           }else{
             item.versions='基础版'
-          }
+          } */
+          item.versions =item.service.includes('YPXSJ6NJ') && item.service.includes('B6V5J6NP') && item.service.includes('YMPCVCIM') ? '专业版':
+          item.service.includes('IPDYZYLC') && item.service.includes('YMPCVCIM') && (!item.service.includes('YPXSJ6NJ')) ? '标准版':
+          !item.service.includes('IPDYZYLC') && !item.service.includes('YMPCVCIM') && item.service.includes('B6V5J6NP')   ?'评测版':
+          !item.service.includes('IPDYZYLC') && !item.service.includes('YMPCVCIM')  ? '基础版':'基础版' 
         }),
         tableData.value.push(...res.scInfos),originalNum.value = res.scInfos.length,
         originalData.value = res.scInfos,tablesccnt.value = res.allCnt) 
@@ -1520,34 +1524,34 @@ export default {
       //debugger;
       // debugger;
        // 專業版
-       /* arrState.major ? originalData.value.forEach((item) => {
-         (item.edition == null || item.edition.scaleVersion == null || item.edition.scaleVersion == "") 
-         && item.service.includes('IPDYZYLC') && item.service.includes('YMPCVCIM') && item.service.includes('YPXSJ6NJ') 
-         ? marjorArr.push(item) : '' }) : '' */
+        arrState.major ? originalData.value.forEach((item) => {
+          item.service.includes('IPDYZYLC') && item.service.includes('YMPCVCIM') && item.service.includes('YPXSJ6NJ') ? 
+          marjorArr.push(item) : '' }) : '' 
 
-         arrState.major ? originalData.value.forEach((item) => {
+         {/* arrState.major ? originalData.value.forEach((item) => {
           item.edition  && !item.edition.scaleVersion && item.edition.current === 3 ? marjorArr.push(item):''
-         }) : ''
+         }) : '' */}
 
        // 標準版
-       /* arrState.standard ? originalData.value.forEach((item) => { 
-        (item.edition == null || item.edition.scaleVersion == null || item.edition.scaleVersion == "") 
-        && item.service.includes('IPDYZYLC') && item.service.includes('YMPCVCIM') && (!item.service.includes('YPXSJ6NJ')) ? standardArr.push(item) : '' }) : '' */
         arrState.standard ? originalData.value.forEach((item) => { 
+        item.service.includes('IPDYZYLC') && item.service.includes('YMPCVCIM') && (!item.service.includes('YPXSJ6NJ')) ? 
+        standardArr.push(item) : '' }) : '' 
+        /* arrState.standard ? originalData.value.forEach((item) => { 
           item.edition  && !item.edition.scaleVersion && item.edition.current === 2  ? standardArr.push(item):''
-        }) : ''
+        }) : '' */
        // 基礎版
-       /* arrState.basics ? originalData.value.forEach((item) => { 
-        (item.edition == null || item.edition.scaleVersion == null || item.edition.scaleVersion == "") 
-        && !item.service.includes('IPDYZYLC') && !item.service.includes('YMPCVCIM') ? basicsArr.push(item) : '' }) : '' */
+       arrState.basics ? originalData.value.forEach((item) => { 
+        !item.service.includes('IPDYZYLC') && !item.service.includes('YMPCVCIM') && !item.service.includes('B6V5J6NP') ? 
+        basicsArr.push(item) : '' }) : '' 
 
-        arrState.basics ? originalData.value.forEach((item) => { 
+        /* arrState.basics ? originalData.value.forEach((item) => { 
           item.edition  && !item.edition.scaleVersion && item.edition.current === 1 ? basicsArr.push(item):
           item.edition ==null ? basicsArr.push(item):''
-        }) : ''
+        }) : '' */
        // 自訂版
        arrState.custom ? originalData.value.forEach((item) => { 
-        item.edition !== null && item.edition.scaleVersion !== null && item.edition.scaleVersion !== "" ? customArr.push(item) : '' }) : ''           
+        !item.service.includes('IPDYZYLC') && !item.service.includes('YMPCVCIM') && item.service.includes('B6V5J6NP') ? customArr.push(item) : '' }) : ''   
+        console.log(marjorArr,standardArr,basicsArr,customArr,'重组')        
       let versionArr = [...marjorArr, ...standardArr, ...basicsArr, ...customArr]
       console.log(versionArr, '合并结果')
       tableData.value = versionArr

+ 1 - 1
TEAMModelBI/ClientApp/src/view/schoolmanage/schoolAnalyse.vue

@@ -2832,7 +2832,7 @@ export default {
 .class-info,
 .class-total {
   width: 100%;
-  padding: 0.5% 1%;
+  padding: 1%;
   display: flex;
   flex-wrap: nowrap;
   justify-content: space-between;

+ 2 - 5
TEAMModelBI/ClientApp/src/view/userInquire/details.vue

@@ -1081,13 +1081,13 @@ watch(()=>transferNum.value,(newnum)=>{
 }
 
 .HiTeach{
-    background: linear-gradient(to top right, #7d82fe, #6fa5fe);
+    background: linear-gradient(to top right, #0093E9, #80D0C7);
 }
 .HiTA{
     background: linear-gradient(to top right, #ff6e72, #ff7390);
 }
 .IES5{
-    background: linear-gradient(to top right, #ff8f64, #ffaa64); 
+    background: linear-gradient(to top right, #FBAB7E, #F7CE68); 
 }
 .Sokrates{
     background: linear-gradient(to top right, #a55bfb, #bc5dfe); 
@@ -1509,9 +1509,6 @@ watch(()=>transferNum.value,(newnum)=>{
 .nextbtn:hover .btn-ls-text {
   opacity: 0.8;
 }
-.btn-ls {
-  /* width: 100%; */
-}
 .btn-ls-text {
   margin-top: 3px;
   color: #303a5d;

+ 1 - 1
TEAMModelBI/Controllers/BITmid/TmidController.cs

@@ -494,7 +494,7 @@ namespace TEAMModelBI.Controllers.BITmid
         public async Task<TmidAnalysisCal> getTMIDIotData(CosmosClient cosmosClientIes5, string tmid, string toolType, string dateUnit, int year, int month, int day, long from, long to)
         {
             TmidAnalysisCal result = new TmidAnalysisCal();
-            List<string> calPropList = new List<string>() { "lessonRecord", "useIES", "useIES5Resource", "useWebIrs", "useDeviceIrs", "useHaboard", "useHita", "lessonLengMin", "lessonLeng0", "stuShow", "stuLessonLengMin", "tGreen", "lTypeCoop", "lTypeIact", "lTypeMis", "lTypeTst", "lTypeDif", "lTypeNone", "lessonCnt928", "lessonCntId", "lessonCntDevice", "lessonCntIdDevice", "mission", "missionFin", "item", "interact", "sendSok" }; //要計算的ProdAnalysis欄位列表
+            List<string> calPropList = new List<string>() { "lessonRecord", "useIES", "useIES5Resource", "useWebIrs", "useDeviceIrs", "useHaboard", "useHita", "lessonLengMin", "lessonLeng0", "stuShow", "stuLessonLengMin", "tGreen", "tLesson", "lTypeCoop", "lTypeIact", "lTypeMis", "lTypeTst", "lTypeDif", "lTypeNone", "lessonCnt928", "lessonCntId", "lessonCntDevice", "lessonCntIdDevice", "mission", "missionFin", "item", "interact", "sendSok" }; //要計算的ProdAnalysis欄位列表
             string strQuery = $"SELECT * FROM c WHERE c.tmid = '{tmid}' AND c.toolType = '{toolType}'";
             var qryOption = new QueryRequestOptions() { PartitionKey = new PartitionKey("TmidAnalysis") };
             if (!string.IsNullOrWhiteSpace(dateUnit)) strQuery += $" AND c.dateUnit = '{dateUnit}'";

+ 0 - 113
TEAMModelBI/Properties/ServiceDependencies/teammodelbi-rc - Web Deploy/profile.arm.json

@@ -1,113 +0,0 @@
-{
-  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
-  "contentVersion": "1.0.0.0",
-  "metadata": {
-    "_dependencyType": "compute.appService.windows"
-  },
-  "parameters": {
-    "resourceGroupName": {
-      "type": "string",
-      "defaultValue": "TEAMModelChengdu",
-      "metadata": {
-        "description": "Name of the resource group for the resource. It is recommended to put resources under same resource group for better tracking."
-      }
-    },
-    "resourceGroupLocation": {
-      "type": "string",
-      "defaultValue": "",
-      "metadata": {
-        "description": "Location of the resource group. Resource groups could have different location than resources, however by default we use API versions from latest hybrid profile which support all locations for resource types we support."
-      }
-    },
-    "resourceName": {
-      "type": "string",
-      "defaultValue": "rc",
-      "metadata": {
-        "description": "Name of the main resource to be created by this template."
-      }
-    },
-    "resourceLocation": {
-      "type": "string",
-      "defaultValue": "[parameters('resourceGroupLocation')]",
-      "metadata": {
-        "description": "Location of the resource. By default use resource group's location, unless the resource provider is not supported there."
-      }
-    }
-  },
-  "variables": {
-    "appServicePlan_name": "[concat('Plan', uniqueString(concat(parameters('resourceName'), subscription().subscriptionId)))]",
-    "appServicePlan_ResourceId": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', parameters('resourceGroupName'), '/providers/Microsoft.Web/serverFarms/', variables('appServicePlan_name'))]"
-  },
-  "resources": [
-    {
-      "type": "Microsoft.Resources/resourceGroups",
-      "name": "[parameters('resourceGroupName')]",
-      "location": "[parameters('resourceGroupLocation')]",
-      "apiVersion": "2019-10-01"
-    },
-    {
-      "type": "Microsoft.Resources/deployments",
-      "name": "[concat(parameters('resourceGroupName'), 'Deployment', uniqueString(concat(parameters('resourceName'), subscription().subscriptionId)))]",
-      "resourceGroup": "[parameters('resourceGroupName')]",
-      "apiVersion": "2019-10-01",
-      "dependsOn": [
-        "[parameters('resourceGroupName')]"
-      ],
-      "properties": {
-        "mode": "Incremental",
-        "template": {
-          "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
-          "contentVersion": "1.0.0.0",
-          "resources": [
-            {
-              "location": "[parameters('resourceLocation')]",
-              "name": "[parameters('resourceName')]",
-              "type": "Microsoft.Web/sites",
-              "apiVersion": "2015-08-01",
-              "tags": {
-                "[concat('hidden-related:', variables('appServicePlan_ResourceId'))]": "empty"
-              },
-              "dependsOn": [
-                "[variables('appServicePlan_ResourceId')]"
-              ],
-              "kind": "app",
-              "properties": {
-                "name": "[parameters('resourceName')]",
-                "kind": "app",
-                "httpsOnly": true,
-                "reserved": false,
-                "serverFarmId": "[variables('appServicePlan_ResourceId')]",
-                "siteConfig": {
-                  "metadata": [
-                    {
-                      "name": "CURRENT_STACK",
-                      "value": "dotnetcore"
-                    }
-                  ]
-                }
-              },
-              "identity": {
-                "type": "SystemAssigned"
-              }
-            },
-            {
-              "location": "[parameters('resourceLocation')]",
-              "name": "[variables('appServicePlan_name')]",
-              "type": "Microsoft.Web/serverFarms",
-              "apiVersion": "2015-08-01",
-              "sku": {
-                "name": "S1",
-                "tier": "Standard",
-                "family": "S",
-                "size": "S1"
-              },
-              "properties": {
-                "name": "[variables('appServicePlan_name')]"
-              }
-            }
-          ]
-        }
-      }
-    }
-  ]
-}

+ 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.2311.8</Version>
-		<AssemblyVersion>5.2311.8.1</AssemblyVersion>
-		<FileVersion>5.2311.8.1</FileVersion>
+		<Version>5.2311.15</Version>
+		<AssemblyVersion>5.2311.15.1</AssemblyVersion>
+		<FileVersion>5.2311.15.1</FileVersion>
 		<Description>TEAMModelBI(BI)</Description>
 		<PackageReleaseNotes>BI版本说明版本切换标记2022000908</PackageReleaseNotes>
 		<PackageId>TEAMModelBI</PackageId>

+ 27 - 8
TEAMModelOS.FunctionV4/CosmosDB/TriggerExam.cs

@@ -1587,22 +1587,25 @@ namespace TEAMModelOS.FunctionV4
                         index_json = await _azureStorage.GetBlobContainerClient($"{info.creatorId}").GetBlobClient($"{info.papers[no].blob}/index.json").DownloadContentAsync();
                     }
                     //BlobDownloadResult index_json = await _azureStorage.GetBlobContainerClient($"{info.school}").GetBlobClient($"{info.papers[no].blob}/index.json").DownloadContentAsync();
-                    JObject jo = JObject.Parse(index_json.Content.ToString());
-                    JArray array = jo.Value<JArray>("slides");
+                    //JObject jo = JObject.Parse(new MemoryStream(Encoding.UTF8.GetBytes(index_json.Content.ToString())).ToString());
+                    JsonElement RecordingJson = JsonDocument.Parse(new MemoryStream(Encoding.UTF8.GetBytes(index_json.Content.ToString()))).RootElement;
+                    RecordingJson.TryGetProperty("slides", out JsonElement slides);
+                    var sdes = slides.ToObject<List<Slides>>();
                     List<string> attachments = new List<string>();
                     if (info.qamode == 1) {
-                        attachments = jo.Value<JArray>("attachments")?.ToObject<List<string>>();
+                        attachments = RecordingJson.GetProperty("attachments").ToObject<List<string>>();
                         if (attachments.Count == 0)
                         {
                             return;
                         }
                     }
                     List<string> urls = new();
-                    foreach (var ne in array)
+                  
+                    foreach (var ne in sdes)
                     {
-                        if (!ne["type"].ToString().Equals("compose"))
+                        if (!ne.type.Equals("compose"))
                         {
-                            urls.Add(ne["url"].ToString());
+                            urls.Add(ne.url);
                         }
                     }
                     
@@ -1693,12 +1696,12 @@ namespace TEAMModelOS.FunctionV4
                         if(location.Equals("China")) //大陸正式站
                         {
                             urlAction = "https://malearn.teammodel.cn";
-                            accessKey = "QUzQqbqbnLsTDTeaJy4Br6wUuqPoAlKpzRK2S6PGImRHAzFuySGAeA==";
+                            accessKey = "2BcXFR_hvzG1pZjqIkaM7Dx74Hcu6m0PwwOacFpDpq44AzFuHJBRXA==";
                         }
                         else if(location.Equals("China-Dep") || location.Equals("China-Test")) //大陸測試站
                         {
                             urlAction = "https://malearn-rc.teammodel.cn";
-                            accessKey = "hESc0g7Q60FTEss4ZnVXPB61S1a8WlAXIq5ULl3T3oTxAzFunpLDwA==";
+                            accessKey = "lghWhJduNiAlo-e8isqEoROjdR7DAC-50XNtanIwHKYlAzFu1aog_A==";
                         }                        
                     }
                     else if (location.Contains("Global"))
@@ -1741,5 +1744,21 @@ namespace TEAMModelOS.FunctionV4
             public int total { get; set; }
             public double qrate { get; set; }
         }
+
+        public class Slides
+        {
+            public string url { get; set; }
+            public string type { get; set; }
+            public Scoring scoring { get; set; } = new Scoring();
+        }
+
+        public class Scoring
+        {
+            public double score { get; set; }
+            public List<string> knowledge { get; set; } = new List<string>();
+            public int field { get; set; } = new();
+            public List<string> ans { get; set; } = new List<string>();
+        }
+
     }
 }

+ 0 - 174
TEAMModelOS.FunctionV4/Properties/ServiceDependencies/TEAMModelFunction - Zip Deploy/profile.arm.json

@@ -1,174 +0,0 @@
-{
-  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
-  "contentVersion": "1.0.0.0",
-  "metadata": {
-    "_dependencyType": "compute.function.windows.appService"
-  },
-  "parameters": {
-    "resourceGroupName": {
-      "type": "string",
-      "defaultValue": "TEAMModelChengdu",
-      "metadata": {
-        "description": "Name of the resource group for the resource. It is recommended to put resources under same resource group for better tracking."
-      }
-    },
-    "resourceGroupLocation": {
-      "type": "string",
-      "defaultValue": "",
-      "metadata": {
-        "description": "Location of the resource group. Resource groups could have different location than resources, however by default we use API versions from latest hybrid profile which support all locations for resource types we support."
-      }
-    },
-    "resourceName": {
-      "type": "string",
-      "defaultValue": "TEAMModelFunction",
-      "metadata": {
-        "description": "Name of the main resource to be created by this template."
-      }
-    },
-    "resourceLocation": {
-      "type": "string",
-      "defaultValue": "[parameters('resourceGroupLocation')]",
-      "metadata": {
-        "description": "Location of the resource. By default use resource group's location, unless the resource provider is not supported there."
-      }
-    }
-  },
-  "resources": [
-    {
-      "type": "Microsoft.Resources/resourceGroups",
-      "name": "[parameters('resourceGroupName')]",
-      "location": "[parameters('resourceGroupLocation')]",
-      "apiVersion": "2019-10-01"
-    },
-    {
-      "type": "Microsoft.Resources/deployments",
-      "name": "[concat(parameters('resourceGroupName'), 'Deployment', uniqueString(concat(parameters('resourceName'), subscription().subscriptionId)))]",
-      "resourceGroup": "[parameters('resourceGroupName')]",
-      "apiVersion": "2019-10-01",
-      "dependsOn": [
-        "[parameters('resourceGroupName')]"
-      ],
-      "properties": {
-        "mode": "Incremental",
-        "expressionEvaluationOptions": {
-          "scope": "inner"
-        },
-        "parameters": {
-          "resourceGroupName": {
-            "value": "[parameters('resourceGroupName')]"
-          },
-          "resourceGroupLocation": {
-            "value": "[parameters('resourceGroupLocation')]"
-          },
-          "resourceName": {
-            "value": "[parameters('resourceName')]"
-          },
-          "resourceLocation": {
-            "value": "[parameters('resourceLocation')]"
-          }
-        },
-        "template": {
-          "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
-          "contentVersion": "1.0.0.0",
-          "parameters": {
-            "resourceGroupName": {
-              "type": "string"
-            },
-            "resourceGroupLocation": {
-              "type": "string"
-            },
-            "resourceName": {
-              "type": "string"
-            },
-            "resourceLocation": {
-              "type": "string"
-            }
-          },
-          "variables": {
-            "storage_name": "[toLower(concat('storage', uniqueString(concat(parameters('resourceName'), subscription().subscriptionId))))]",
-            "appServicePlan_name": "[concat('Plan', uniqueString(concat(parameters('resourceName'), subscription().subscriptionId)))]",
-            "storage_ResourceId": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', parameters('resourceGroupName'), '/providers/Microsoft.Storage/storageAccounts/', variables('storage_name'))]",
-            "appServicePlan_ResourceId": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', parameters('resourceGroupName'), '/providers/Microsoft.Web/serverFarms/', variables('appServicePlan_name'))]",
-            "function_ResourceId": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', parameters('resourceGroupName'), '/providers/Microsoft.Web/sites/', parameters('resourceName'))]"
-          },
-          "resources": [
-            {
-              "location": "[parameters('resourceLocation')]",
-              "name": "[parameters('resourceName')]",
-              "type": "Microsoft.Web/sites",
-              "apiVersion": "2015-08-01",
-              "tags": {
-                "[concat('hidden-related:', variables('appServicePlan_ResourceId'))]": "empty"
-              },
-              "dependsOn": [
-                "[variables('appServicePlan_ResourceId')]",
-                "[variables('storage_ResourceId')]"
-              ],
-              "kind": "functionapp",
-              "properties": {
-                "name": "[parameters('resourceName')]",
-                "kind": "functionapp",
-                "httpsOnly": true,
-                "reserved": false,
-                "serverFarmId": "[variables('appServicePlan_ResourceId')]",
-                "siteConfig": {
-                  "alwaysOn": true
-                }
-              },
-              "identity": {
-                "type": "SystemAssigned"
-              },
-              "resources": [
-                {
-                  "name": "appsettings",
-                  "type": "config",
-                  "apiVersion": "2015-08-01",
-                  "dependsOn": [
-                    "[variables('function_ResourceId')]"
-                  ],
-                  "properties": {
-                    "AzureWebJobsStorage": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storage_name'), ';AccountKey=', listKeys(variables('storage_ResourceId'), '2017-10-01').keys[0].value, ';EndpointSuffix=', 'core.windows.net')]",
-                    "FUNCTIONS_EXTENSION_VERSION": "~3",
-                    "FUNCTIONS_WORKER_RUNTIME": "dotnet"
-                  }
-                }
-              ]
-            },
-            {
-              "location": "[parameters('resourceGroupLocation')]",
-              "name": "[variables('storage_name')]",
-              "type": "Microsoft.Storage/storageAccounts",
-              "apiVersion": "2017-10-01",
-              "tags": {
-                "[concat('hidden-related:', concat('/providers/Microsoft.Web/sites/', parameters('resourceName')))]": "empty"
-              },
-              "properties": {
-                "supportsHttpsTrafficOnly": true
-              },
-              "sku": {
-                "name": "Standard_LRS"
-              },
-              "kind": "Storage"
-            },
-            {
-              "location": "[parameters('resourceGroupLocation')]",
-              "name": "[variables('appServicePlan_name')]",
-              "type": "Microsoft.Web/serverFarms",
-              "apiVersion": "2015-08-01",
-              "sku": {
-                "name": "S1",
-                "tier": "Standard",
-                "family": "S",
-                "size": "S1"
-              },
-              "properties": {
-                "name": "[variables('appServicePlan_name')]"
-              }
-            }
-          ]
-        }
-      }
-    }
-  ]
-}

+ 0 - 3
TEAMModelOS.FunctionV4/Properties/serviceDependencies.TEAMModelFunction - Zip Deploy.json

@@ -1,3 +0,0 @@
-{
-  "dependencies": {}
-}

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

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

+ 29 - 74
TEAMModelOS.SDK/DI/AzureCosmos/AzureCosmosExtensions.cs

@@ -65,7 +65,7 @@ namespace TEAMModelOS.SDK.DI
             int totalCount = 0;
             await foreach (var item in container.GetItemQueryStreamIterator(
                 queryText: $"SELECT VALUE COUNT(1) From c {queryWhere}",
-                requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey(partitionkey), MaxItemCount = -1 }))
+                requestOptions: new QueryRequestOptions() { PartitionKey =!string.IsNullOrWhiteSpace(partitionkey) ? new PartitionKey(partitionkey) : null , MaxItemCount = -1 }))
             {
                 using var json = await JsonDocument.ParseAsync(item.ContentStream);
                 if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
@@ -114,17 +114,12 @@ namespace TEAMModelOS.SDK.DI
             }
             return responses;
         }
-        public static async Task<CosmosDBResult<T>> GetList<T>(this CosmosContainer container, QueryDefinition  queryDefinition, string partitionkey, string? continuationToken = null, int? pageSize = null)
+        public static async Task<CosmosDBResult<T>> GetList<T>(this CosmosContainer container, QueryDefinition  queryDefinition, string partitionkey= null, string continuationToken = null, int? pageSize = null)
         {
             List<T> list = new List<T>();
             double RU = 0;
-            if (string.IsNullOrWhiteSpace(partitionkey))
-            {
-                return (new CosmosDBResult<T> { list = list, ru = RU, continuationToken = continuationToken });
-            }
-
             await foreach (var item in container.GetItemQueryStreamIterator(queryDefinition: queryDefinition, continuationToken: continuationToken,
-                requestOptions: new QueryRequestOptions { MaxItemCount = pageSize, PartitionKey = new PartitionKey(partitionkey) }))
+                requestOptions: new QueryRequestOptions { MaxItemCount = pageSize, PartitionKey =!string.IsNullOrWhiteSpace(partitionkey) ? new PartitionKey(partitionkey) : null }))
             {
                 using var json = await JsonDocument.ParseAsync(item.ContentStream);
                 if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
@@ -154,85 +149,45 @@ namespace TEAMModelOS.SDK.DI
             return (new CosmosDBResult<T> { list = list, ru = RU, continuationToken = continuationToken }); ;
         }
 
-        public static async Task<CosmosDBResult<T>> GetList<T>(this CosmosContainer container, string sql, string partitionkey, string? continuationToken = null, int? pageSize = null)
+        public static async Task<CosmosDBResult<T>> GetList<T>(this CosmosContainer container, string sql, string partitionkey= null, string continuationToken = null, int? pageSize = null)
         {
             List<T> list = new List<T>();
             double RU = 0;
-            if (string.IsNullOrWhiteSpace(partitionkey))
+            try
             {
-                try
+
+                await foreach (var item in container.GetItemQueryStreamIterator(queryText: sql, continuationToken: continuationToken,
+                 requestOptions: new QueryRequestOptions { MaxItemCount = pageSize, PartitionKey =!string.IsNullOrWhiteSpace(partitionkey)?new PartitionKey(partitionkey) : null}))
                 {
-                    await foreach (var item in container.GetItemQueryStreamIterator(queryText: sql, continuationToken: continuationToken,
-                     requestOptions: new QueryRequestOptions { MaxItemCount = pageSize }))
+                    using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
                     {
-                        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.Add(obj.ToObject<T>());
-                            }
-                        }
-                        if (sql.Contains(" distinct ", StringComparison.OrdinalIgnoreCase)
-                            || (sql.Contains("order ", StringComparison.OrdinalIgnoreCase)
-                            && !sql.Contains(".order ", StringComparison.OrdinalIgnoreCase)))
-                        {
-                            continuationToken = null;
-                        }
-                        else
-                        {
-                            continuationToken = item.GetContinuationToken();
-                        }
-                        RU += item.RU();
-                        if (pageSize.HasValue && pageSize.Value >= 0 && list.Count >= pageSize)
+                        foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
                         {
-                            break;
+                            list.Add(obj.ToObject<T>());
                         }
                     }
-                }
-                catch (Exception ex)
-                {
-                    Console.WriteLine(ex.ToString());
-                }
-            }
-            else {
-                try
-                {
-                    await foreach (var item in container.GetItemQueryStreamIterator(queryText: sql, continuationToken: continuationToken,
-                     requestOptions: new QueryRequestOptions { MaxItemCount = pageSize, PartitionKey = new PartitionKey(partitionkey) }))
+                    if (sql.Contains(" distinct ", StringComparison.OrdinalIgnoreCase)
+                        || (sql.Contains("order ", StringComparison.OrdinalIgnoreCase)
+                        && !sql.Contains(".order ", StringComparison.OrdinalIgnoreCase)))
                     {
-                        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.Add(obj.ToObject<T>());
-                            }
-                        }
-                        if (sql.Contains(" distinct ", StringComparison.OrdinalIgnoreCase)
-                            || (sql.Contains("order ", StringComparison.OrdinalIgnoreCase)
-                            && !sql.Contains(".order ", StringComparison.OrdinalIgnoreCase)))
-                        {
-                            continuationToken = null;
-                        }
-                        else
-                        {
-                            continuationToken = item.GetContinuationToken();
-                        }
-                        RU += item.RU();
-                        if (pageSize.HasValue && pageSize.Value >= 0 && list.Count >= pageSize)
-                        {
-                            break;
-                        }
+                        continuationToken = null;
+                    }
+                    else
+                    {
+                        continuationToken = item.GetContinuationToken();
+                    }
+                    RU += item.RU();
+                    if (pageSize.HasValue && pageSize.Value >= 0 && list.Count >= pageSize)
+                    {
+                        break;
                     }
-                }
-                catch (Exception ex)
-                {
-                    Console.WriteLine(ex.ToString());
                 }
             }
-
-            
+            catch (Exception ex)
+            {
+                Console.WriteLine(ex.ToString());
+            }
             //记录日志,RU开销大于400(开发测试),1000(正式)
             return (new CosmosDBResult<T> { list = list, ru = RU, continuationToken = continuationToken }); ;
         }

+ 5 - 0
TEAMModelOS.SDK/Models/Cosmos/Common/IotTeachingData.cs

@@ -137,6 +137,10 @@ namespace TEAMModelOS.SDK.Models.Cosmos.Common
         /// 課堂中有使用Excel測驗模式 0:false 1:true
         /// </summary>
         public string useExcelTest { get; set; }
+        /// <summary>
+        /// T課堂 0:false 1:true
+        /// </summary>
+        public string tlesson { get; set; }
     }
 
     /// <summary>
@@ -166,6 +170,7 @@ namespace TEAMModelOS.SDK.Models.Cosmos.Common
         public int stuShow { get; set; } //學生出席人次
         public long stuLessonLengMin { get; set; } //學生參與總時數 ※課堂時間x學生出席人次
         public int tGreen { get; set; } //T綠燈數(T>=70)
+        public int tLesson { get; set; } //T課堂(課堂時間>=10 && T指數>0)
         public int lTypeCoop { get; set; } //學習型態: 合作
         public int lTypeIact { get; set; } //學習型態: 互動
         public int lTypeMis { get; set; } //學習型態: 任務

Різницю між файлами не показано, бо вона завелика
+ 4 - 2
TEAMModelOS.SDK/Models/Service/BI/BIProdAnalysis.cs


+ 152 - 3
TEAMModelOS.SDK/Models/Service/StudentService.cs

@@ -22,7 +22,48 @@ namespace TEAMModelOS.SDK
 {
     public class StudentService
     {
+        public class StudentActivity
+        {
 
+            public string id { get; set; }
+            public string code { get; set; }
+
+            /// <summary>
+            /// 源数据的发布层级 类型 school  teacher
+            /// </summary>
+            public string owner { get; set; }
+          
+            public string pk {  get; set; }
+            //评测模式
+            public string source { get; set; }
+            public string name { get; set; }
+            public long startTime { get; set; }
+            public long endTime { get; set; }
+            public string scope { get; set; }
+            public string school { get; set; }
+            public string creatorId { get; set; }
+
+            public List<ExamSubject> subjects { get; set; } = new List<ExamSubject>();
+
+            public List<string> classes { get; set; } = new List<string>();
+            public List<string> stuLists { get; set; } = new List<string>();
+            public List<string> tchLists { get; set; }= new List<string>();
+            public long createTime { get; set; } = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+            //public Dictionary<string, JsonElement> ext { get; set; } = new Dictionary<string, JsonElement>();
+            /// 评分状态,0,未评分, 1已评分
+            public int sStatus { get; set; } = 0;
+            //评测 纸本1或者书面问答0
+            public int qamode { get; set; } = 0;
+            //标记作业活动是否比交
+            public bool mustSubmit { get; set; } = false;
+            //标记问卷是否重复提交 0 否 1 是
+            public int isSub { get; set; } = 0;
+            /// <summary>
+            /// 任务完成状态,-1 未参与,0,未完成, 1已完成
+            /// </summary>
+            public int taskStatus { get; set; } = -1;
+            public string recordUrl { get; set; }
+        }
 
         /// <summary>
         ///
@@ -35,8 +76,9 @@ namespace TEAMModelOS.SDK
         /// <param name="types">Exam ,Vote,Homework,Survey</param>
         /// <param name="_azureCosmos"></param>
         /// <param name="azureRedis"></param>
-        public static async void FindActivity(JsonElement request,string userId ,string userType, List<string>groupListIds, string school,List<string> types, AzureCosmosFactory _azureCosmos, AzureRedisFactory azureRedis)
+        public static async Task<List<StudentActivity>> FindActivity(JsonElement request,string userId ,string userScope, List<string>groupListIds,List<string> subjects, string school,List<string> types, AzureCosmosFactory _azureCosmos)
         {
+            string filed = "c.id ,c.code,c.owner,c.pk,c.qamode,c.name,c.school,c.startTime,c.endTime,c.classes,c.stuLists,c.tchLists,c.createTime,c.creatorId,c.isSub,c.mustSubmit,c.sStatus,c.scope,c.source,c.subjects";
             if (string.IsNullOrWhiteSpace(school))
             {
                 if (request.TryGetProperty("school", out JsonElement schooljson))
@@ -47,7 +89,7 @@ namespace TEAMModelOS.SDK
                     }
                 }
             }
-            long stime = 0, etime = 0; 
+            long stime = DateTimeOffset.UtcNow.AddDays(-30).ToUnixTimeMilliseconds(), etime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); 
             if (request.TryGetProperty("stime", out JsonElement _stime))
             {
                 if (!_stime.ValueKind.Equals(JsonValueKind.Undefined) && !_stime.ValueKind.Equals(JsonValueKind.Null) && _stime.TryGetInt64(out long data))
@@ -62,10 +104,117 @@ namespace TEAMModelOS.SDK
                     etime= data;
                 }
             }
+            string  groupListSQL =string .Empty ;
+            if (groupListIds.IsNotEmpty())
+            {
+                List<string >  arrayStr= new List<string>();
+                groupListIds.ForEach(z => {
+                    arrayStr.Add($"array_contains(c.classes,'{z}') ");
+                    arrayStr.Add($"array_contains(c.stuLists,'{z}') ");
+                    if (userScope.Equals(Constant.ScopeTeacher))
+                    {
+                        arrayStr.Add($"array_contains(c.tchLists,'{z}') ");
+                    }
+                });
+                groupListSQL= $"and ({string.Join(" or ", arrayStr)})";
+            }
+            else
+            {
+                throw new Exception("名单为空");
+            }
+            
+            List<StudentActivity> activities = new List<StudentActivity>();
+            if (types.IsEmpty()|| types.Contains("Exam")) {
+                string subjectSQL = "";
+                string subjectJoin = "";
+                if (subjects.IsNotEmpty()) {
+                    subjectJoin = "join s in c.subjects";
+                    subjectSQL = $" and  c.id in ({string.Join(",",subjects.Select(z=>$"'{z}'"))}) ";
+                }
+                StringBuilder SQL = new StringBuilder( $"select { filed} from c {subjectJoin} where c.pk='Exam' {subjectSQL} {groupListSQL} and c.startTime>={stime} and c.startTime <= {etime} ");
+                //获取学校发布的活动
+                if (userScope.Equals(Constant.ScopeStudent)  && ! string.IsNullOrWhiteSpace(school)) {
+                   var resultSchool =   await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<StudentActivity>($"{SQL.ToString()}  and c.owner='school' ", $"Exam-{school}");
+                    activities.AddRange(resultSchool.list);
+                }
+                //获取教师发布的活动(个人名单,学校名单)
+                {
+                    var resultTeacher = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<StudentActivity>($"{SQL.ToString()}  and c.owner='teacher' ");
+                    activities.AddRange(resultTeacher.list);
+                }
+            }
 
-        }
+            if (types.IsEmpty()|| types.Contains("Vote"))
+            {
+               
+                StringBuilder SQL = new StringBuilder($"select {filed} from c  where c.pk='Vote' {groupListSQL} and c.startTime>={stime} and c.startTime <= {etime} ");
+                //获取学校发布的活动
+                if (userScope.Equals(Constant.ScopeStudent)  && !string.IsNullOrWhiteSpace(school))
+                {
+                    var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<StudentActivity>($"{SQL.ToString()}  and c.owner='school' ", $"Vote-{school}");
+                    activities.AddRange(resultSchool.list);
+                }
+                //获取教师发布的活动(个人名单,学校名单)
+                {
+                    var resultTeacher = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<StudentActivity>($"{SQL.ToString()}  and c.owner='teacher' ");
+                    activities.AddRange(resultTeacher.list);
+                }
+            }
+            if (types.IsEmpty()|| types.Contains("Survey"))
+            {
 
+                StringBuilder SQL = new StringBuilder($"select {filed} from c  where c.pk='Survey' {groupListSQL} and c.startTime>={stime} and c.startTime <= {etime} ");
+                //获取学校发布的活动
+                if (userScope.Equals(Constant.ScopeStudent)  && !string.IsNullOrWhiteSpace(school))
+                {
+                    var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<StudentActivity>($"{SQL.ToString()}  and c.owner='school' ", $"Survey-{school}");
+                    activities.AddRange(resultSchool.list);
+                }
+                //获取教师发布的活动(个人名单,学校名单)
+                {
+                    var resultTeacher = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<StudentActivity>($"{SQL.ToString()}  and c.owner='teacher' ");
+                    activities.AddRange(resultTeacher.list);
+                }
+            }
+            if (types.IsEmpty()|| types.Contains("Homework"))
+            {
+
+                StringBuilder SQL = new StringBuilder($"select {filed} from c  where c.pk='Homework' {groupListSQL} and c.startTime>={stime} and c.startTime <= {etime} ");
+                //获取学校发布的活动
+                if (userScope.Equals(Constant.ScopeStudent)  && !string.IsNullOrWhiteSpace(school))
+                {
+                    var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<StudentActivity>($"{SQL.ToString()}  and c.owner='school' ", $"Homework-{school}");
+                    activities.AddRange(resultSchool.list);
+                }
+                //获取教师发布的活动(个人名单,学校名单)
+                {
+                    var resultTeacher = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<StudentActivity>($"{SQL.ToString()}  and c.owner='teacher' ");
+                    activities.AddRange(resultTeacher.list);
+                }
+            }
+            if (types.IsEmpty()|| types.Contains("Art"))
+            {
+                string subjectSQL = "";
+                string subjectJoin = "";
+                if (subjects.IsNotEmpty())
+                {
+                    subjectJoin = "join s in c.subjects";
+                    subjectSQL = $" and  c.id in ({string.Join(",", subjects.Select(z => $"'{z}'"))}) ";
+                }
+
+                StringBuilder SQL = new StringBuilder($"select {filed} from c  {subjectJoin} where c.pk='Art' {subjectSQL} {groupListSQL} and c.startTime>={stime} and c.startTime <= {etime} ");
+                //获取学校发布的活动
+                if (userScope.Equals(Constant.ScopeStudent)  && !string.IsNullOrWhiteSpace(school))
+                {
+                    var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<StudentActivity>($"{SQL.ToString()}  and c.school='school' ", $"Art-{school}");
+                    activities.AddRange(resultSchool.list);
+                }
+            }
+            //作答 记录recordUrl  taskStatus
+            return activities;
+        }
 
+       
 
 
 

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

@@ -2,9 +2,9 @@
 
   <PropertyGroup>
     <TargetFramework>net6.0</TargetFramework>
-    <Version>5.2311.8</Version>
-    <AssemblyVersion>5.2311.8.1</AssemblyVersion>
-    <FileVersion>5.2311.8.1</FileVersion>
+    <Version>5.2311.15</Version>
+    <AssemblyVersion>5.2311.15.1</AssemblyVersion>
+    <FileVersion>5.2311.15.1</FileVersion>
     <PackageReleaseNotes>发版</PackageReleaseNotes>
   </PropertyGroup>
 

+ 13 - 10
TEAMModelOS/ClientApp/public/lang/en-US.js

@@ -1192,7 +1192,7 @@ const LANG_EN_US = {
         addCourseMeg5: 'Failed to invite',
         enterNotification: 'Please input notification',
         filterClass: 'My lessons',
-        filterAct: 'Filter my activities',
+        filterAct: 'My activities',
         classTea: 'Taught by',
 
         //ManageClass.vue
@@ -5306,7 +5306,7 @@ const LANG_EN_US = {
             summary1: "Added Today",
             summary2: "Practiced",
             summary3: "Mastered",
-            summary4: "Total of smart wrong questions",
+            summary4: "Total Questions No.",
             summary5: "Last Review",
             summary6: "Recommended Review Time",
             summary7: "Last Practice",
@@ -5317,7 +5317,7 @@ const LANG_EN_US = {
             chartText1: "Incorrectly Answered Question Difficulty Distribution",
             chartText2: "Learning Difficulty Distribution",
             button1: "Start Practice",
-            button2: "Search for wrong questions in collection",
+            button2: "Search all incorrectly answered questions",
             button3: "Start Reviewing",
             button4: "Start",
             sundry1: "Quantity",
@@ -5357,13 +5357,16 @@ const LANG_EN_US = {
             headerTitle1: 'SMART Incorrectly Answered Question Practice',
             headerTitle2: 'Current Question',
             question1: 'Question Stem',
-            modalTitle1: 'Review Recently Incorrectly Answered Questions',
+            modalTitle1: 'Revisit Mistakes',
             modalTitle2: 'Exit Practice',
             modal1: 'All current exercises have been completed and submitted. The practice results are as follows:',
             modal2: 'Time Used',
             modal3: 'There are a total of ',
             modal4: 'questions that were answered incorrectly or not understood. Would you like to review these questions again? (Review only; no record will be kept)',
-            modal5: 'Congratulations! There were no incorrectly answered or misunderstood questions in this practice session. You can exit the practice now.'
+            modal5: 'Congratulations! There were no incorrectly answered or misunderstood questions in this practice session. You can exit the practice now.',
+            stats1: 'Correct Answers',
+            stats2: 'Incorrect Answers',
+            showOptionType: 'Show Objective Options',
         },
         informviewTitle: 'Notification Overview',
         view: 'Go to view',
@@ -7621,11 +7624,11 @@ const LANG_EN_US = {
             totals:'Total'
         },
         classrooming: {
-            title: 'Statistics in Class',
-            taskNums: 'Learning tasks',
-            productionNums: 'Learning works',
-            topicNums: 'Questions',
-            interactionNums: 'Student interactions',
+            title: 'Lesson Statistics',
+            taskNums: 'Learning Tasks',
+            productionNums: 'Learning Works',
+            topicNums: 'Assessment Questions',
+            interactionNums: 'Student Interactions',
         },
         device: {
             title: 'Device Statistics',

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

@@ -5362,6 +5362,9 @@ const LANG_ZH_CN = {
             modal3: '本次复习答错和不会的题目共',
             modal4: '题,请问想要重新复习一遍这些题目吗?(仅做练习,不会进行记录)',
             modal5: '本次复习没有答错和不会的题目,非常棒,可以退出练习了',
+            statistics1: '答对题目数',
+            statistics2: '答错题目数',
+            showOptionType: '显示客观题选项',
         },
         informviewTitle: '通知总览',
         view: '前往检视',

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

@@ -5365,6 +5365,9 @@ const LANG_ZH_TW = {
             modal3: '本次練習中答錯和不會的題目共',
             modal4: '題,請問想要重新復習一遍這些題目嗎? (僅做練習,不會進行記錄)',
             modal5: '本次練習中沒有答錯和不會的題目,非常棒,可以結束練習了',
+            statistics1: '答對題目數',
+            statistics2: '答錯題目數',
+            showOptionType: '顯示選擇是非題選項',
         },
         informviewTitle: '通知總覽',
         view: '前往檢視',

+ 141 - 3
TEAMModelOS/ClientApp/src/assets/iconfont/demo_index.html

@@ -54,6 +54,42 @@
       <div class="content unicode" style="display: block;">
           <ul class="icon_lists dib-box">
           
+            <li class="dib">
+              <span class="icon iconfont">&#xe6a9;</span>
+                <div class="name">提交失败</div>
+                <div class="code-name">&amp;#xe6a9;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6a7;</span>
+                <div class="name">呆</div>
+                <div class="code-name">&amp;#xe6a7;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6a8;</span>
+                <div class="name">Expression-2</div>
+                <div class="code-name">&amp;#xe6a8;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6dc;</span>
+                <div class="name">表情_悲伤</div>
+                <div class="code-name">&amp;#xe6dc;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe7b9;</span>
+                <div class="name">通用_表情_填充_16</div>
+                <div class="code-name">&amp;#xe7b9;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe712;</span>
+                <div class="name">成功</div>
+                <div class="code-name">&amp;#xe712;</div>
+              </li>
+          
             <li class="dib">
               <span class="icon iconfont">&#xe6a4;</span>
                 <div class="name">标准管理</div>
@@ -1482,9 +1518,9 @@
 <pre><code class="language-css"
 >@font-face {
   font-family: 'iconfont';
-  src: url('iconfont.woff2?t=1694069397328') format('woff2'),
-       url('iconfont.woff?t=1694069397328') format('woff'),
-       url('iconfont.ttf?t=1694069397328') format('truetype');
+  src: url('iconfont.woff2?t=1700017106516') format('woff2'),
+       url('iconfont.woff?t=1700017106516') format('woff'),
+       url('iconfont.ttf?t=1700017106516') format('truetype');
 }
 </code></pre>
           <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
@@ -1510,6 +1546,60 @@
       <div class="content font-class">
         <ul class="icon_lists dib-box">
           
+          <li class="dib">
+            <span class="icon iconfont icon-tijiaoshibai"></span>
+            <div class="name">
+              提交失败
+            </div>
+            <div class="code-name">.icon-tijiaoshibai
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-dai"></span>
+            <div class="name">
+              呆
+            </div>
+            <div class="code-name">.icon-dai
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-biaoqing-2"></span>
+            <div class="name">
+              Expression-2
+            </div>
+            <div class="code-name">.icon-biaoqing-2
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-biaoqing_beishang"></span>
+            <div class="name">
+              表情_悲伤
+            </div>
+            <div class="code-name">.icon-biaoqing_beishang
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-tongyong_biaoqing_tianchong_16"></span>
+            <div class="name">
+              通用_表情_填充_16
+            </div>
+            <div class="code-name">.icon-tongyong_biaoqing_tianchong_16
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-chenggong"></span>
+            <div class="name">
+              成功
+            </div>
+            <div class="code-name">.icon-chenggong
+            </div>
+          </li>
+          
           <li class="dib">
             <span class="icon iconfont icon-biaozhunguanli"></span>
             <div class="name">
@@ -3652,6 +3742,54 @@
       <div class="content symbol">
           <ul class="icon_lists dib-box">
           
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-tijiaoshibai"></use>
+                </svg>
+                <div class="name">提交失败</div>
+                <div class="code-name">#icon-tijiaoshibai</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-dai"></use>
+                </svg>
+                <div class="name">呆</div>
+                <div class="code-name">#icon-dai</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-biaoqing-2"></use>
+                </svg>
+                <div class="name">Expression-2</div>
+                <div class="code-name">#icon-biaoqing-2</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-biaoqing_beishang"></use>
+                </svg>
+                <div class="name">表情_悲伤</div>
+                <div class="code-name">#icon-biaoqing_beishang</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-tongyong_biaoqing_tianchong_16"></use>
+                </svg>
+                <div class="name">通用_表情_填充_16</div>
+                <div class="code-name">#icon-tongyong_biaoqing_tianchong_16</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-chenggong"></use>
+                </svg>
+                <div class="name">成功</div>
+                <div class="code-name">#icon-chenggong</div>
+            </li>
+          
             <li class="dib">
                 <svg class="icon svg-icon" aria-hidden="true">
                   <use xlink:href="#icon-biaozhunguanli"></use>

+ 43 - 3
TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.css

@@ -1,8 +1,8 @@
 @font-face {
   font-family: "iconfont"; /* Project id 2000444 */
-  src: url('iconfont.woff2?t=1694069397328') format('woff2'),
-       url('iconfont.woff?t=1694069397328') format('woff'),
-       url('iconfont.ttf?t=1694069397328') format('truetype');
+  src: url('iconfont.woff2?t=1700123569341') format('woff2'),
+       url('iconfont.woff?t=1700123569341') format('woff'),
+       url('iconfont.ttf?t=1700123569341') format('truetype');
 }
 
 .iconfont {
@@ -13,6 +13,46 @@
   -moz-osx-font-smoothing: grayscale;
 }
 
+.icon-suoyouzhijieguidangjilu:before {
+  content: "\e6b1";
+}
+
+.icon-hudong2:before {
+  content: "\e6cf";
+}
+
+.icon-activity-line:before {
+  content: "\e6ad";
+}
+
+.icon-zhihuiketang:before {
+  content: "\e6b0";
+}
+
+.icon-tijiaoshibai:before {
+  content: "\e6a9";
+}
+
+.icon-dai:before {
+  content: "\e6a7";
+}
+
+.icon-biaoqing-2:before {
+  content: "\e6a8";
+}
+
+.icon-biaoqing_beishang:before {
+  content: "\e6dc";
+}
+
+.icon-tongyong_biaoqing_tianchong_16:before {
+  content: "\e7b9";
+}
+
+.icon-chenggong:before {
+  content: "\e712";
+}
+
 .icon-biaozhunguanli:before {
   content: "\e6a4";
 }

Різницю між файлами не показано, бо вона завелика
+ 1 - 1
TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.js


+ 70 - 0
TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.json

@@ -5,6 +5,76 @@
   "css_prefix_text": "icon-",
   "description": "",
   "glyphs": [
+    {
+      "icon_id": "11661880",
+      "name": "所有直接归档记录",
+      "font_class": "suoyouzhijieguidangjilu",
+      "unicode": "e6b1",
+      "unicode_decimal": 59057
+    },
+    {
+      "icon_id": "16392816",
+      "name": "互动",
+      "font_class": "hudong2",
+      "unicode": "e6cf",
+      "unicode_decimal": 59087
+    },
+    {
+      "icon_id": "6265032",
+      "name": "活动",
+      "font_class": "activity-line",
+      "unicode": "e6ad",
+      "unicode_decimal": 59053
+    },
+    {
+      "icon_id": "8497509",
+      "name": "智慧课堂",
+      "font_class": "zhihuiketang",
+      "unicode": "e6b0",
+      "unicode_decimal": 59056
+    },
+    {
+      "icon_id": "28410666",
+      "name": "提交失败",
+      "font_class": "tijiaoshibai",
+      "unicode": "e6a9",
+      "unicode_decimal": 59049
+    },
+    {
+      "icon_id": "1214",
+      "name": "呆",
+      "font_class": "dai",
+      "unicode": "e6a7",
+      "unicode_decimal": 59047
+    },
+    {
+      "icon_id": "1299915",
+      "name": "Expression-2",
+      "font_class": "biaoqing-2",
+      "unicode": "e6a8",
+      "unicode_decimal": 59048
+    },
+    {
+      "icon_id": "15685377",
+      "name": "表情_悲伤",
+      "font_class": "biaoqing_beishang",
+      "unicode": "e6dc",
+      "unicode_decimal": 59100
+    },
+    {
+      "icon_id": "36924364",
+      "name": "通用_表情_填充_16",
+      "font_class": "tongyong_biaoqing_tianchong_16",
+      "unicode": "e7b9",
+      "unicode_decimal": 59321
+    },
+    {
+      "icon_id": "27334033",
+      "name": "成功",
+      "font_class": "chenggong",
+      "unicode": "e712",
+      "unicode_decimal": 59154
+    },
     {
       "icon_id": "35146586",
       "name": "标准管理",

BIN
TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.ttf


BIN
TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.woff


BIN
TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.woff2


+ 3 - 2
TEAMModelOS/ClientApp/src/common/BaseLayout.vue

@@ -322,7 +322,7 @@
 					let hasStuDash = schoolVersions.productSum.service.find((i) => i.prodCode === "YPXSJ6NJ"); // 五育看板模块
 					let hasAnalysis = schoolVersions.productSum.service.find((i) => i.prodCode === "YMPCVCIM"); // 学情分析模块 代表至少是标准版
 					let isPro = hasStuDash && hasArtProd; // 同时购买了五育看板和艺术评测 代表是专业版本
-					let isArtTest = this.$store.state.user.schoolProfile.school_base.modules?.includes('art') // modules里面有art代表 必定为评测版本
+					// let isArtTest = this.$store.state.user.schoolProfile.school_base.modules?.includes('art') // modules里面有art代表 必定为评测版本
 					this.hasArtProd = hasArtProd;
 					if (isPro) {
 						this.isPro = true;
@@ -331,7 +331,7 @@
 					} else if (hasAnalysis) {
 						this.edition = "standard";
 						this.systemLevel = this.$t("system.advanced");
-					} else if (isArtTest) {
+					} else if (hasArtProd) {
 						this.edition = "artTest";
 						this.systemLevel = this.$t("system.artTest");
 					} else {
@@ -346,6 +346,7 @@
 					localStorage.setItem("edition", this.edition);
 					this.hasAnalysisAuth = this.getAnalysisAuth();
 				}
+
 				let bodyElement = document.body;
 				console.log(bodyElement.style, "body");
 				bodyElement.style.fontFamily = localStorage.local === "zh-tw" ? "微软雅黑" : "Hm";

+ 0 - 1
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperViewBox/ArtView.vue

@@ -112,7 +112,6 @@
             </div>
 
           </div>
-
         </div>
       </template>
       <!-- </div> -->

+ 3 - 1
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperViewBox/PaperView.vue

@@ -578,7 +578,9 @@
                     this.activeIndex = index
                     if(isArt) {
                         this.examLists = item.exam
-                        this.hwLists = item.homework
+                        // this.hwLists = item.homework
+                        // 2023.11.15 #2985 C527 艺术评测只显示基本技能,其他材料通过小程序端上传
+                        this.hwLists = item.homework.filter(hws => hws.quotaId === "quota_22")
                         if(this.examLists.length) {
                             this.showPaper = 0
                             localStorage.setItem("quotaId", item.exam[0].quotaId)

+ 7 - 5
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventList.vue

@@ -469,7 +469,7 @@ import QuesNaire from "./EventContentTypeTemplate/QuesNaire";
                 isListNoItem: false, //清單為空
                 eventList: [], //活动数据
                 eventShow: [], //展示的活动数据
-                eventPageType: ["Learn", "Exam", "Homework", "Vote", "Survey"], //本頁出現的類型
+                eventPageType: ["Learn", "Exam", "Homework", "Vote", "Survey", "Art"], //本頁出現的類型
                 selectedEventStatusNow: {
                     type: "all",
                     status: this.$t('studentWeb.event.allStatus')
@@ -558,7 +558,7 @@ import QuesNaire from "./EventContentTypeTemplate/QuesNaire";
                 "getNowCourse",
             ]),
             courseNow() {
-                return this.getNowCourse || JSON.parse(decodeURIComponent(localStorage.course, "utf-8"))
+                return this.getNowCourse || localStorage.course ? JSON.parse(decodeURIComponent(localStorage.course, "utf-8")) :undefined
             },
         },
         methods: {
@@ -685,7 +685,7 @@ import QuesNaire from "./EventContentTypeTemplate/QuesNaire";
                                 })
                                 if(info) {
                                     this.nowSub = this.courseNow.subjectList.findIndex(item => {
-                                        return info.subjects.includes(item.id)
+                                        return info.subjects.includes(item.id) || info.subjects.includes(item.bindId)
                                     })
                                 }
                             }
@@ -869,8 +869,10 @@ import QuesNaire from "./EventContentTypeTemplate/QuesNaire";
                 if (currentfilterArray.length !== 0) {
                     if(this.nowTea) {
                         this.eventShow = currentfilterArray.filter(item => item.creatorId === this.teachers[this.nowTea - 1].id)
-                    } else if(this.courseNow.subjectList) {
-                        this.eventShow = currentfilterArray.filter(item => item.subjects.includes(this.courseNow.subjectList[this.nowSub].id))
+                    } else if(this.courseNow && this.courseNow.subjectList && !this.showType.includes("Vote")) {
+                        this.eventShow = currentfilterArray.filter(item => {
+                            return item.subjects.includes(this.courseNow.subjectList[this.nowSub].id) || item.subjects.includes(this.courseNow.subjectList[this.nowSub].bindId)
+                        })
                     } else {
                         this.eventShow = [...currentfilterArray]
                     }

+ 11 - 1
TEAMModelOS/ClientApp/src/components/student-web/HomeView/HomeView.vue

@@ -724,7 +724,7 @@ export default {
         },
         sentSelectedEventTitle(item) {
             if(item.type === "Exam" || item.type === "Homework" || item.type === "Art") {
-                let index =  this.getCourseIndex(item.owner === 'school' ? item.creatorId : item.subjects, item.classIds, item.owner === 'school')
+                let index =  this.getCourseIndex(item.scope === 'school' ? item.subjects : item.creatorId, item.classIds, item.scope === 'school')
                 if(index === -1) {
                     this.$Message.error(this.$t('studentWeb.homework.tips3'))
                 } else {
@@ -808,6 +808,16 @@ export default {
             }
         },
         getCourseIndex(ids, classIds, isSchool) {
+            // 同时匹配科目 && 班级id
+            return this.getAllCourse.findIndex(course => {
+                if(isSchool && course.subjectList) {
+                    return classIds.includes(course.groupId) && course.subjectList.find(subList => {
+                        return ids.includes(subList.id) || ids.includes(subList.bindId)
+                    })
+                } else {
+                    return classIds.includes(course.groupId) && (ids.includes(course.subject.id) || ids.includes(course.id))
+                }
+            })
             return this.getAllCourse.findIndex(course => {
                 // 要同时匹配课程和班级id
                 // 学校发布的只匹配老师和名单

+ 9 - 0
TEAMModelOS/ClientApp/src/router/routes.js

@@ -1150,6 +1150,15 @@ export const routes = [{
                 middleware: ['login', 'ability:admin,dashboard-read'],
             }
         },
+        {
+            name: 'schoolDash',
+            path: '/schoolDash',
+            component: () => import('@/view/dashboard/school/SchoolDashboard.vue'),
+            meta: {
+                activeName: 'dashCenter',
+                middleware: ['login', 'ability:admin,dashboard-read'],
+            }
+        },
         {
         name: 'artDashboard',
         path: '/artDashboard',

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

@@ -576,7 +576,7 @@ export default {
 #content {
   height: 100%;
   /* background: #242328; */
-  overflow: hidden;
+  /* overflow: hidden; */
 }
 
 /*重绘滚动条样式*/

+ 18 - 15
TEAMModelOS/ClientApp/src/view/areaMgmt/AreaEcharts/gradePie.vue

@@ -96,10 +96,10 @@ class InitChart {
         name: data[i].name,
         itemStyle: {
           normal: {
-            borderWidth: 30,
-            shadowBlur: 20,
+            borderWidth: 20,
+            shadowBlur: 10,
             borderColor: color[i],
-            borderRadius: 10,
+            borderRadius: 5,
           },
         },
       })
@@ -136,13 +136,14 @@ class InitChart {
       },
       series: [
         {
-          zlevel: 1,
+          // zlevel: 1,
           name: '',
           type: 'pie',
-          selectedMode: 'single',
-          radius: [50, 100],
+          // selectedMode: 'single',
+          // radius: [50, 100],
+          radius: ['40%', '70%'],
           center: ['35%', '50%'],
-          startAngle: 20,
+          //startAngle: 20,
           // hoverAnimation: false,
           label: {
             normal: {
@@ -152,19 +153,21 @@ class InitChart {
               formatter: function (params) {
                 return params.percent.toFixed() + '%'
               },
-              rich: {
-                b: {
-                  fontSize: 16,
-                  lineHeight: 10,
-                  color: '#fff',
-                },
-              },
+              // rich: {
+              //   b: {
+              //     fontSize: 18,
+              //     lineHeight: 10,
+              //     color: '#fff',
+              //   },
+              // },
             },
           },
           itemStyle: {
             normal: {
               shadowColor: 'rgba(0, 0, 0, 0.2)',
-              shadowBlur: 10,
+              shadowBlur: 20,
+              borderColor: '#ffffff',
+              borderWidth: 40,
             },
           },
           data: baseData,

+ 24 - 19
TEAMModelOS/ClientApp/src/view/areaMgmt/AreaIndex.vue

@@ -1023,7 +1023,7 @@ export default {
   display: flex;
   justify-content: space-between;
   margin-top: 10px;
-  padding-right: 10px;
+  /* padding-right: 10px; */
   flex-wrap: wrap;
   justify-content: space-between;
 }
@@ -1153,7 +1153,7 @@ export default {
   display: flex;
   flex-wrap: wrap;
   background-color: #fff;
-  margin-top: 2%;
+  margin-top: 30px;
   padding: 15px;
   position: relative;
   justify-content: space-between;
@@ -1166,7 +1166,7 @@ export default {
   display: flex;
   flex-wrap: wrap;
   background-color: #fff;
-  margin-top: 2%;
+  margin-top: 30px;
   padding: 23px;
   position: relative;
   border-radius: 5px;
@@ -1231,7 +1231,7 @@ export default {
 
 .tags {
   width: 100px;
-  height: 22px;
+  height: 20px;
   background: rgb(256 169 100) no-repeat center;
   background-size: contain;
   font-size: 12px;
@@ -1258,28 +1258,29 @@ export default {
 .center-resource {
   display: flex;
   width: 100%;
-  margin-top: 2%;
+  margin-top: 30px;
   position: relative;
+  justify-content: space-between;
 }
 
 .center-resource-left {
-  width: 35%;
+  width: 48%;
   height: 300px;
   position: relative;
   background: #fff;
-  padding: 20px 10px;
+  padding: 15px;
   display: flex;
   justify-content: space-between;
   border-radius: 5px;
 }
 
 .center-resource-right {
-  width: 62.5%;
-  margin-left: 2%;
+  width: 50%;
+  /* margin-left: 2%; */
   height: 300px;
   position: relative;
   background: #fff;
-  padding: 25px 10px;
+  padding: 23px;
   overflow: hidden;
   border-radius: 5px;
 }
@@ -1291,15 +1292,16 @@ export default {
 .bottom-resource {
   width: 100%;
   margin-top: 0px;
-  padding: 30px 0px 15px 0px;
+  /* padding: 30px 0px 0px 0px; */
   display: flex;
   flex-direction: row;
   justify-content: flex-start;
   position: relative;
+  margin-top:30px;
 }
 
 .bottom-leftbox {
-  width: 40%;
+  width: 48%;
   padding: 1%;
   height: 200px;
   background: #fff;
@@ -1308,7 +1310,7 @@ export default {
 }
 
 .bottom-rightbox {
-  width: 57.5%;
+  width: 50%;
   height: 200px;
   background-color: #fff;
   display: flex;
@@ -1325,7 +1327,7 @@ export default {
 }
 
 .bottom-rightbox-right {
-  width: 60%;
+  width: 55%;
   height: 100%;
 }
 
@@ -1521,8 +1523,8 @@ export default {
 
 .echarts-title {
   position: absolute;
-  left: 0.5%;
-  top: 1.5%;
+  left: 0%;
+  top: 8%;
   font-size: 16px;
   color: #00a8ff;
 }
@@ -1638,13 +1640,14 @@ export default {
 }
 
 .school-Listinfo {
-  width: 99.6%;
+  width: 100%;
   margin-top: 0px;
-  padding: 35px 15px 15px 15px;
+  padding: 30px 15px 15px 15px;
   position: relative;
   background-color: #fff;
-  margin-bottom: 20px;
+  margin-bottom: 30px;
   border-radius: 5px;
+  margin-top:30px;
 }
 
 .right-all {
@@ -1667,6 +1670,8 @@ export default {
 
 .sizeclass {
   width: 100% !important;
+  text-align: center;
+  margin-bottom: 3px;
 }
 
 .notimage {

+ 1 - 0
TEAMModelOS/ClientApp/src/view/artexam/Create.vue

@@ -460,6 +460,7 @@ export default {
                     setting.paper.forEach(paper => {
                       paper.infoId = infoId
                       paper.scope = 'school'
+                      paper.time = setting.time
                     })
                     this.examInfoList.push(...setting.paper)
                   })

+ 1 - 4
TEAMModelOS/ClientApp/src/view/artexam/Mgt.vue

@@ -201,7 +201,6 @@
 						if (task.type === 1 && task.infoId) {
 							try {
 								let simplePapers = this.examInfoList.filter((item) => item.infoId === task.infoId);
-								console.log(simplePapers);
 								let paperPromiseArr = [];
 								simplePapers.forEach((paper) => {
 									paperPromiseArr.push(this.getPaperInfo(paper));
@@ -323,8 +322,6 @@
 						simplePaper.scope = "school";
 						simplePaper.code = "hbcn";
 						let fullPaper = await this.$evTools.getStuPaper(simplePaper);
-						console.log(simplePaper);
-						console.log(fullPaper);
 						if (fullPaper) {
 							let apiPaper = {};
 							apiPaper.id = fullPaper.id;
@@ -339,7 +336,7 @@
 							apiPaper.point = [];
 							apiPaper.knowledge = [];
 							apiPaper.field = [];
-							apiPaper.time = fullPaper.time;
+							apiPaper.time = simplePaper.time;
 							apiPaper.type = []; //后面新增字段, 保存每个题目类型
 							for (let k = 0; k < fullPaper.slides.length; k++) {
 								if (fullPaper.slides[k].type !== "compose") {

+ 908 - 0
TEAMModelOS/ClientApp/src/view/dashboard/school/SchoolDashboard.vue

@@ -0,0 +1,908 @@
+<template>
+    <div class="school-dash-container">
+        <div class="schoolanalysebox" >
+            <div class="school-analyse-header bgimg">
+            <div class="school-analyse-headersbox">
+                <div class="school-analyse-headersbox-name">
+                <span>123456</span>
+                </div>
+                <div class="school-analyse-headersbox-basics">
+                <div class="items-basics">
+                    <p class="items-basics-title">教师数:</p>
+                    <p class="items-basics-num">{{anSchool.teachNum}}</p>
+                </div>
+                <div class="items-basics">
+                    <p class="items-basics-title">学生数:</p>
+                    <p class="items-basics-num">{{anSchool.studentNum}}</p>
+                </div>
+                <div class="items-basics">
+                    <p class="items-basics-title">智慧教室:</p>
+                    <p class="items-basics-num">{{anSchool.classNum}}</p>
+                </div>
+                <div class="items-basics">
+                    <p class="items-basics-title">资源数:</p>
+                    <p class="items-basics-num">{{anSchool.classInfoNum}}</p>
+                </div>
+                </div>
+            </div>
+            <div class="backbtn">
+                <Button size="small" @click="detailsback">
+                    <Icon type="ios-arrow-back" />
+                返回
+                </Button>
+            </div>
+            </div>
+            <!--课堂信息-->
+            <div class="class-datas">
+            <div class="class-info">
+                <div class="class-box box1" v-for="item in classroomsData.attend" :key="item.id">
+                <div class="classbox-num">{{item.value}}</div>
+                <div class="classbox-title">{{item.name}}</div>
+                </div>
+            </div>
+            <div class="class-total">
+                <div class="class-box total-box total1" v-for="itemD in classroomsData.details" :key="itemD.id">
+                <div class="classbox-num total-num">{{itemD.value}}</div>
+                <div class="classbox-title total-title">{{itemD.name}}</div>
+                </div>
+            </div>
+            </div>
+            <!--课堂信息end-->
+            <div class="school-analyse-top">
+            <div class="school-analyse-top-left" >
+                <Bar :barData="detailsEchart.bar1"></Bar>
+            </div>
+            <div class="school-analyse-top-center">
+                <Bar :barData="detailsEchart.bar2"></Bar>
+            </div>
+            <div class="school-analyse-top-right">
+                <Bar :barData="detailsEchart.bar3"></Bar>
+            </div>
+            </div>
+            <div class="school-analyse-center">
+            <div class="school-analyse-center-bottom">
+                <div :class="[item.classname,'bottom-item']" v-for="item in detailsbasics" :key="item.id" >
+                <div class="bottom-item-header">
+                    <!-- <svg class="icon" aria-hidden="true">
+                    <use :xlink:href="item.icon"></use>
+                    </svg> -->
+                    <Icon :custom="item.icon" class="model-icon" />
+                    <span>{{item.title}}</span>
+                </div>
+                <div class="comparebox">
+                    <p class="comparebox-num">{{item.num}}</p>
+                    <p class="comparebox-subhead">
+                    <span class="comparebox-subhead-title">{{item.today}}:</span>
+                    <span class="comparebox-subhead-value">{{item.todayNum}}</span>
+                    </p>
+                    <p class="comparebox-subhead">
+                    <span class="comparebox-subhead-title">{{item.subheading}}:</span>
+                    <span class="comparebox-subhead-value">{{item.subheadingNum}}</span>
+                    <span class="comparebox-subhead-state">
+                        <!-- <el-image style="width: 12px; height: 12px" :src="imgdata[0].url" :fit="fit" v-if="item.subheadingState==='down'" />
+                        <el-image style="width: 12px; height: 12px" :src="imgdata[1].url" :fit="fit" v-if="item.subheadingState==='up'" /> -->
+                    </span>
+                    </p>
+                    <p class="comparebox-subhead">
+                    <span class="comparebox-subhead-title">{{item.subhead}}:</span>
+                    <span class="comparebox-subhead-value">{{item.subheadNum}}</span>
+                    <span class="comparebox-subhead-state">
+                        <!-- <el-image style="width: 12px; height: 12px" :src="imgdata[0].url" :fit="fit" v-if="item.subheadState==='down'" />
+                        <el-image style="width: 12px; height: 12px" :src="imgdata[1].url" :fit="fit" v-if="item.subheadState==='up'" /> -->
+                    </span>
+                    </p>
+                </div>
+                </div>
+            </div>
+            <div class="school-analyse-center-line" >
+                <CommonLine :lineData="detailsEchart.line"></CommonLine>
+                <!-- <TestLine></TestLine> -->
+            </div>
+            </div>
+            <div class="school-analyse-bottom">
+            <div class="school-analyse-bottom-left">
+                <div class="flag-as-box">年级占比</div>
+                <Gradepie :mapData="detailsGrade" v-show="detailsGrade.length > 0"></Gradepie>
+                <div class="notdatas" v-show="detailsGrade.length == 0">暂无数据</div>
+            </div>
+            <div class="school-analyse-bottom-right">
+                <div class="flag-as-box">科目占比</div>
+                <ConventionPie :pieData="detailsEchart.subject" v-show="detailsEchart.subject.series[0].data.length >0"></ConventionPie>
+                <div class="notdatas" v-show="detailsEchart.subject.series[0].data.length ==0">暂无数据</div>
+            </div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+import Bar from './echart/bar.vue'
+import CommonLine from '../../areaMgmt/AreaEcharts/commonLine.vue'
+import Gradepie from '../../areaMgmt/AreaEcharts/gradePie.vue'
+import ConventionPie from '../../areaMgmt/AreaEcharts/conventionPie.vue'
+import * as echarts from 'echarts'
+export default {
+    components:{
+        Bar,
+        CommonLine,
+        Gradepie,
+        ConventionPie
+    },
+    data(){
+        return{
+            schoolDeatils:{
+                name:'123456'
+            },
+            anSchool:{
+                teachNum: 0,
+                studentNum: 0,
+                classNum: 0,
+                classInfoNum: 0,
+                //下面的图表
+                class: 0,
+                activity: 0,
+                interact: 0,
+                classed: [],
+                activitys: [],
+                interacts: [],
+                times: ['11','22'],
+            },
+            classroomsData:{
+                attend: [
+                    { id: 1, name: '课堂总数', value: 0 },
+                    { id: 2, name: '今日课堂', value: 0 },
+                    { id: 3, name: '本周课堂', value: 0 },
+                    { id: 4, name: '本月课堂', value: 0 },
+                    { id: 5, name: '本年课堂', value: 0 },
+                ],
+                details: [
+                    { id: 1, name: '课堂总时数', value: 0 },
+                    { id: 2, name: '课堂总参与人次', value: 0 },
+                    { id: 3, name: '课堂总互动次数', value: 0 },
+                    { id: 4, name: '课堂任务总人次', value: 0 },
+                    { id: 5, name: '课堂提问总题数', value: 0 },
+                ]
+            },
+            detailsEchart:{
+                bar1: {
+                    timeline: {
+                    axisType: 'category',
+                    show: false,
+                    autoPlay: false,
+                    playInterval: 1000,
+                    data: [11,15,13,14,15],
+                    },
+                    grid: {
+                    top: '25%',
+                    bottom: '1.5%',
+                    left: '5%',
+                    right: '5%',
+                    containLabel: true,
+                    },
+                    xAxis: [
+                    {
+                        type: 'category',
+                        axisLabel: {
+                        show: true,
+                        interval: 0,
+                        rotate: 0,
+                        textStyle: {
+                            color: '#A6D3FD',
+                            fontSize: 10,
+                        },
+                        },
+                        axisPointer: {
+                        show: true,
+                        type: 'shadow',
+                        },
+                        data: ['1月','2月','3月','4月','5月',],
+                    },
+                    ],
+                    yAxis: [
+                    {
+                        type: 'value',
+                        axisLabel: {
+                        formatter: '{value}',
+                        },
+                        axisLine: {
+                        show: false,
+                        },
+                        axisTick: {
+                        show: false,
+                        },
+
+                        splitLine: {
+                        show: false,
+                        },
+                    },
+                    ],
+                    tooltip: {
+                    trigger: 'axis',
+                    axisPointer: {
+                        // 坐标轴指示器,坐标轴触发有效
+                        type: 'shadow', // 默认为直线,可选为:'line' | 'shadow'
+                    },
+                    },
+                    series: [
+                        {
+                            name: '课例',
+                            type: 'bar',
+                            barWidth: '20',
+                            data: [11,15,16,18,17],
+                            itemStyle: {
+                            //lenged文本
+                            opacity: 1,
+                            color: function () {
+                                return new echarts.graphic.LinearGradient(
+                                0,
+                                0,
+                                1,
+                                0,
+                                [
+                                    {
+                                    offset: 0,
+                                    color: 'rgba(162, 155, 254,0.2)', // 0% 处的颜色
+                                    },
+                                    {
+                                    offset: 1,
+                                    color: 'rgba(112, 103, 245, 0.5)', // 100% 处的颜色
+                                    },
+                                ],
+                                false
+                                )
+                            },
+                            },
+                        },
+                    ],
+                },
+                bar2: {
+                    timeline: {
+                    axisType: 'category',
+                    show: false,
+                    autoPlay: false,
+                    playInterval: 1000,
+                    data: [],
+                    },
+                    grid: {
+                    top: '25%',
+                    bottom: '1.5%',
+                    left: '2%',
+                    right: '5%',
+                    containLabel: true,
+                    },
+                    xAxis: [
+                    {
+                        type: 'category',
+                        axisLabel: {
+                        show: true,
+                        interval: 0,
+                        rotate: 0,
+                        textStyle: {
+                            color: '#A6D3FD',
+                            fontSize: 10,
+                        },
+                        },
+                        axisPointer: {
+                        show: true,
+                        type: 'shadow',
+                        },
+                        data: ['1月','2月','3月','4月','5月',],
+                    },
+                    ],
+                    yAxis: [
+                    {
+                        type: 'value',
+                        axisLabel: {
+                        formatter: '{value}',
+                        },
+                        axisLine: {
+                        show: false,
+                        },
+                        axisTick: {
+                        show: false,
+                        },
+
+                        splitLine: {
+                        show: false,
+                        },
+                    },
+                    ],
+                    tooltip: {
+                    trigger: 'axis',
+                    axisPointer: {
+                        // 坐标轴指示器,坐标轴触发有效
+                        type: 'shadow', // 默认为直线,可选为:'line' | 'shadow'
+                    },
+                    },
+                    //变量则写在options中
+                    series: [
+                    {
+                        name: '活动',
+                        type: 'bar',
+                        barWidth: '20',
+                        data: [11,15,16,14,18],
+                        itemStyle: {
+                        //lenged文本
+                        opacity: 1,
+                        color: function () {
+                            return new echarts.graphic.LinearGradient(
+                            0,
+                            0,
+                            1,
+                            0,
+                            [
+                                {
+                                offset: 0,
+                                color: 'rgba(250, 177, 160,0.5)', // 0% 处的颜色
+                                },
+                                {
+                                offset: 1,
+                                color: 'rgba(255, 117, 26, 0.7)', // 100% 处的颜色
+                                },
+                            ],
+                            false
+                            )
+                        },
+                        },
+                    },
+                    ],
+                },
+                bar3: {
+                    timeline: {
+                    axisType: 'category',
+                    show: false,
+                    autoPlay: false,
+                    playInterval: 1000,
+                    data: [],
+                    },
+                    grid: {
+                    top: '25%',
+                    bottom: '1.5%',
+                    left: '5%',
+                    right: '5%',
+                    containLabel: true,
+                    },
+                    xAxis: [
+                    {
+                        type: 'category',
+                        axisLabel: {
+                        show: true,
+                        interval: 0,
+                        rotate: 0,
+                        textStyle: {
+                            color: '#A6D3FD',
+                            fontSize: 10,
+                        },
+                        },
+                        axisPointer: {
+                        show: true,
+                        type: 'shadow',
+                        },
+                        data: ['1月','2月','3月','4月','5月',],
+                    },
+                    ],
+                    yAxis: [
+                    {
+                        type: 'value',
+                        axisLabel: {
+                        formatter: '{value}',
+                        },
+                        axisLine: {
+                        show: false,
+                        },
+                        axisTick: {
+                        show: false,
+                        },
+
+                        splitLine: {
+                        show: false,
+                        },
+                    },
+                    ],
+                    tooltip: {
+                    trigger: 'axis',
+                    axisPointer: {
+                        // 坐标轴指示器,坐标轴触发有效
+                        type: 'shadow', // 默认为直线,可选为:'line' | 'shadow'
+                    },
+                    },
+                    //变量则写在options中
+                    series: [
+                    {
+                        name: '互动',
+                        type: 'bar',
+                        barWidth: '20',
+                        data: [10,5,9,78,12],
+                        itemStyle: {
+                        //lenged文本
+                        opacity: 1,
+                        color: function () {
+                            return new echarts.graphic.LinearGradient(
+                            0,
+                            0,
+                            1,
+                            0,
+                            [
+                                {
+                                offset: 0,
+                                color: 'rgba(29, 227, 255,.3)', // 0% 处的颜色
+                                },
+                                {
+                                offset: 1,
+                                color: 'rgba(29, 227, 255,.9)', // 100% 处的颜色
+                                },
+                            ],
+                            false
+                            )
+                        },
+                        },
+                    },
+                    ],
+                },
+                line: {
+                    tooltip: {
+                    trigger: 'axis',
+                    axisPointer: {
+                        type: 'cross',
+                        crossStyle: {
+                        color: '#999',
+                        },
+                        lineStyle: {
+                        type: 'dashed',
+                        },
+                    },
+                    },
+                    grid: {
+                    top: '25%',
+                    left: '2%',
+                    bottom: '5%',
+                    right: '2%',
+                    textStyle: {
+                        color: '#fff',
+                    },
+                    containLabel: true,
+                    },
+                    legend: {
+                    show: true,
+                    // data: this.anSchool.times,
+                    data:['1月','2月','3月','4月','5月'],
+                    textStyle: {
+                        color: '#000',
+                    },
+                    right: '20%',
+                    top: '15%',
+                    },
+                    xAxis: {
+                    type: 'category',
+                    data:['1月','2月','3月','4月','5月'],
+                    boundaryGap: false,
+                    },
+                    yAxis: {
+                    type: 'value',
+                    },
+                    series: [
+                    {
+                        name: '全年各月总数据',
+                        type: 'line',
+                        symbolSize: 8,
+                        markPoint: {
+                        data: [
+                            { type: 'max', name: 'Max' },
+                            { type: 'min', name: 'Min' },
+                        ],
+                        label: {
+                            color: '#FFF', // 文字颜色
+                            padding: [0, 0, 5, 0], // 可用padding调整图片内文字距离
+                            show: true,
+                        },
+                        },
+                        data: [11,68,30,482,30],
+                        areaStyle: {
+                        normal: {
+                            color: new echarts.graphic.LinearGradient(
+                            0,
+                            0,
+                            0,
+                            1,
+                            [
+                                {
+                                offset: 0,
+                                color: 'rgba(3,118,255,.5)',
+                                },
+                                {
+                                offset: 1,
+                                color: '#fff',
+                                },
+                            ],
+                            false
+                            ),
+                        },
+                        },
+                        itemStyle: {
+                        normal: {
+                            color: 'rgba(3,118,255,.5)',
+                            color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+                                    offset: 0,
+                                    color: 'rgba(3,118,255,.3)'
+                                },
+                                {
+                                    offset: 1,
+                                    color: 'rgba(3,118,255,.9)'
+                                }
+                            ], false),
+                        },
+                        },
+                    },
+                    ],
+                },
+                subject: {
+                    // color: ['#ef5777', '#0fbcf9', '#0be881', '#575fcf', '#ffd32a', '#55E6C1', '#3742fa', '#B33771', '#F8EFBA'],
+                    color: ['#3fb1e3', '#6be6c1', '#626c91', '#a0a7e6', '#c4ebad', '#96dee8'],
+                    // title: {
+                    // text: '科目占比',
+                    // textStyle: {
+                    //     fontSize: '12',
+                    //     color: '#b2bec3',
+                    // },
+                    // },
+
+                    legend: {
+                    right: '10%',
+                    orient: 'vertical',
+                    itemWidth: 10,
+                    itemHeight: 10, // 修改icon图形大小
+                    textStyle: {
+                        fontSize: 14,
+                        color: '#333',
+                    },
+                    },
+                    series: [
+                    {
+                        name: '科目占比',
+                        type: 'pie',
+                        radius: '80%',
+                        center: ['45%', '50%'],
+                        itemStyle: {
+                        borderRadius: 2,
+                        },
+                        label: {
+                        normal: {
+                            position: 'inner',
+                            show: false,
+                        },
+                        },
+                        data: [],
+                    },
+                    ],
+                },
+            },
+            detailsGrade:[ {
+                value: 0,
+                name: '123',
+              },
+              {
+                value: 0,
+                name: '456',
+              },
+              {
+                value: 0,
+                name: '789',
+              },],
+            detailsbasics:[
+            {
+                id: 1,
+                title: '课例',
+                num: 0,
+                icon: 'iconfont icon-zhihuiketang',
+                subheading: '昨日对比',
+                subheadingNum: '0%',
+                subheadingState: '',
+                subhead: '上月对比',
+                subheadNum: '0%',
+                subheadState: '',
+                classname: 'purples',
+                today: '今日数据',
+                todayNum: 0,
+            },
+            {
+                id: 2,
+                title: '活动',
+                num: 0,
+                icon: 'iconfont icon-activity-line',
+                subheading: '昨日对比',
+                subheadingNum: '0%',
+                subheadingState: '',
+                subhead: '上月对比',
+                subheadNum: '0%',
+                subheadState: '',
+                classname: 'oranges',
+                today: '今日数据',
+                todayNum: 0,
+            },
+            {
+                id: 3,
+                title: '互动',
+                num: 0,
+                icon: 'iconfont icon-hudong2',
+                subheading: '昨日对比',
+                subheadingNum: '0%',
+                subheadingState: '',
+                subhead: '上月对比',
+                subheadNum: '0%',
+                subheadState: '',
+                classname: 'blues',
+                today: '今日数据',
+                todayNum: 0,
+            },
+            {
+                id: 3,
+                title: '总数据',
+                num: 0,
+                icon: 'iconfont icon-suoyouzhijieguidangjilu',
+                subheading: '上月对比',
+                subheadingNum: '0%',
+                subheadingState: '',
+                subhead: '去年对比',
+                subheadNum: '0%',
+                subheadState: '',
+                classname: 'total',
+                today: '今日数据',
+                todayNum: 0,
+            },
+            ],
+        }
+    },
+    methods:{
+        detailsback(){
+            this.$router.push('/dashCenter')
+        }
+    }
+}
+</script>
+
+<style scoped>
+.school-dash-container{
+    padding: 1%;
+    background-image: url('./bg-img.jpg');
+    background-size: contain;
+    overflow: hidden;
+    overflow-y: auto;
+}
+.schoolanalysebox {
+  width: 100%;
+  position: relative;
+  /* overflow: hidden;
+  overflow-y: auto; */
+  background-color: rgba(240,240,245,.6);
+  border-radius: 5px;
+}
+.school-analyse-header {
+  width: 100%;
+  border-radius: 5px 5px 0px 0px;
+}
+.bgimg {
+  background-color: rgb(81, 86, 184);
+  background-repeat: no-repeat;
+  background-size: cover;
+  background-position: center center;
+  /* background: linear-gradient(90deg, #36d1dc, #5b86e5); */
+  /* background: linear-gradient(90deg, rgba(54, 209, 220, 0.7), rgba(91, 134, 229, 0.7)); */
+  background-image: linear-gradient(160deg, #0093E9 0%, #80D0C7 100%);
+}
+.school-analyse-headersbox {
+  background-repeat: no-repeat;
+  background-size: cover;
+  background-position: center center;
+  display: flex;
+  justify-content: space-between;
+  flex-wrap: wrap;
+}
+.school-analyse-headersbox-name {
+  width: 100%;
+  font-size: 28px;
+  line-height: 28px;
+  color: hsla(0, 0%, 100%, 0.9);
+  font-weight: 700;
+  text-align: center;
+  margin-bottom: 2px;
+  margin-top: 2%;
+}
+.school-analyse-headersbox-basics {
+  width: 100%;
+  display: flex;
+  justify-content: space-around;
+}
+.items-basics {
+  width: 23%;
+  padding: 1%;
+  text-align: center;
+}
+.items-basics-title {
+  font-size: 16px;
+  color: hsla(0, 0%, 100%, 0.9);
+  padding-left: 10px;
+}
+.items-basics-num {
+  font-size: 22px;
+  color: hsla(0, 0%, 100%, 0.9);
+  font-weight: 700;
+}
+.backbtn {
+  position: absolute;
+  left: 1%;
+  top: 2%;
+}
+.backbtnicon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.1em;
+  fill: currentColor;
+  overflow: hidden;
+  margin-right: 2px;
+}
+.class-datas {
+  width: 100%;
+  /* background: #fff; */
+  margin-top: 1%;
+  border-radius: 5px;
+}
+.class-info,
+.class-total {
+  width: 100%;
+  padding: 1%;
+  display: flex;
+  flex-wrap: nowrap;
+  justify-content: space-between;
+}
+.class-box {
+  width: 15%;
+  text-align: center;
+  line-height: 40px;
+  /* background-color: #eef4fb; */
+  background-color: #fff;
+  border-radius: 5px;
+  box-shadow: 0px 0px 5px hsl(0deg 0% 0% /0.05);
+}
+.classbox-num {
+  font-size: 24px;
+  font-weight: 700;
+  color: #043d75;
+}
+.classbox-title {
+  font-size: 16px;
+  color: #AAA8AD;
+  /* font-weight: 600; */
+}
+.school-analyse-top {
+  /* width: 100%; */
+  display: flex;
+  justify-content: space-between;
+  background: #fff;
+  /* margin-top: 1%; */
+  flex-wrap: wrap;
+  border-radius: 5px;
+  margin: 0% 1% 1% 1%;
+}
+.school-analyse-top-left,
+.school-analyse-top-center,
+.school-analyse-top-right {
+  width: 30%;
+  height: 240px;
+  border-right: 1px dashed rgba(200, 214, 229, 0.7);
+  margin: 1%;
+  padding-right: 1%;
+}
+.school-analyse-top-right {
+  border-right: 0px;
+}
+.school-analyse-center {
+  /* width: 100%; */
+  height: 40vh;
+  /* margin-top: 1%; */
+  background: #fff;
+  padding: 1%;
+  margin:1%;
+  border-radius: 5px;
+}
+.school-analyse-center-bottom {
+  width: 100%;
+  display: flex;
+  justify-content: space-between;
+}
+.bottom-item {
+  width: 24%;
+  height: 160px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  flex-wrap: wrap;
+  background-color: rgba(112, 103, 245, 0.3);
+  border-radius: 10px;
+  position:relative;
+}
+.bottom-item-header {
+  width: 100%;
+  line-height: 20px;
+  margin-top: 10px;
+  font-size: 16px;
+  text-align: center;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+.school-analyse-center-line {
+  width: 100%;
+  height: 21vh;
+}
+.comparebox-subhead {
+  font-size: 14px;
+  margin-bottom: 2px;
+  text-align: left;
+}
+.comparebox-num {
+  font-size: 24px;
+  font-weight: 700;
+  text-align: center;
+}
+.comparebox-subhead-value,
+.comparebox-subhead-state {
+  margin-left: 5px;
+}
+.school-analyse-bottom {
+  width: 100%;
+  display: flex;
+  justify-content: space-between;
+  margin-top: 1%;
+  margin-bottom: 1%;
+}
+.school-analyse-bottom-left,
+.school-analyse-bottom-right {
+  width: 48%;
+  height: 32vh;
+  background-color: #fff;
+  border-radius: 5px;
+  margin:0% 1% 1% 1%;
+  position:relative;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+.school-analyse-bottom-left{
+  position:relative;
+}
+.flag-as-box{
+    position:absolute;
+    top:2px;
+    left:5px;
+    font-size:14px;
+    color:#B8C3C7;
+}
+.notdatas{
+    font-size:16px;
+    font-weight: 700;
+    color:#909399;
+}
+.model-icon{
+    fill: currentColor;
+    overflow: hidden;
+    font-size: 26px;
+    color: #fff;
+    margin-right:5px;
+}
+.purples {
+  /* background: rgba(112, 103, 245, 0.3); */
+  background-image: linear-gradient(62deg, #8EC5FC 0%, #E0C3FC 100%);
+}
+.oranges {
+  /* background: rgba(255, 117, 26, 0.3); */
+  background-image: linear-gradient(62deg, #FBAB7E 0%, #F7CE68 100%);
+}
+.blues {
+  /* background: rgba(29, 227, 255, 0.3); */
+  background-image: linear-gradient(62deg, #74EBD5 0%, #9FACE6 100%);
+}
+.total {
+  /* background: rgba(26, 125, 255, 0.3); */
+  background-image: linear-gradient(135deg, #8BC6EC 0%, #9599E2 100%);
+}
+</style>

BIN
TEAMModelOS/ClientApp/src/view/dashboard/school/bg-img.jpg


+ 102 - 0
TEAMModelOS/ClientApp/src/view/dashboard/school/echart/bar.vue

@@ -0,0 +1,102 @@
+<!--基础折线图-->
+<template>
+    <div ref="myEcharts" :style="{ height, width }" class="boxs"></div>
+  </template>
+  <script>
+  import * as echarts from 'echarts'
+  export default {
+    name: 'baseBar',
+    props: {
+      width: {
+        type: String,
+        default: '100%',
+      },
+      height: {
+        type: String,
+        default: '100%',
+      },
+      barData: {
+        type: Object,
+        default: () => { },
+      },
+      title: {
+        type: String,
+        default: '',
+      },
+    },
+          data() {
+              return {
+                  myEcharts: this.$refs.myEcharts,
+                  chart: '',
+              }
+          },
+          created() {
+  
+          },
+          mounted() {
+              let datas = {
+                  width: '100%', height: '100%',
+                  barData: {
+                      timeline:this.barData.timeline,
+                      color: this.barData.color,
+                      data: this.barData.data,
+                      legend: this.barData.legend,
+                      series: this.barData.series,
+                      tooltip: this.barData.tooltip
+                  },
+                  title: ''
+              }
+              this.chart = new InitChart(datas, this.$refs.myEcharts)
+              this.chart.init(this.barData)
+          },
+          watch: {
+              $props: {
+                  handler(newProps) {
+                      this.$nextTick(() => {
+                          newProps ? this.chart.init(newProps.barData) : ''
+                      })
+                  },
+                  deep: true,
+                  immediate: true
+              }
+          },
+  }
+  class InitChart {
+    constructor(props, myEcharts) {
+      this.props = props
+      this.myEcharts = myEcharts
+      this.state = {
+        chart: null,
+      }
+    }
+    init (datas, proxy) {
+      this.state.chart && this.destory()
+      this.state.chart = echarts.init(this.myEcharts)
+      this.state.chart.setOption({
+        color: datas.color ? datas.color : '',
+        title: datas.title ? datas.title : '',
+        tooltip: datas.tooltip ? datas.tooltip : '',
+        legend: datas.legend ? datas.legend : '',
+        grid: datas.grid ? datas.grid : '',
+        xAxis: datas.xAxis ? datas.xAxis : '',
+        yAxis: datas.yAxis ? datas.yAxis : '',
+        dataZoom: datas.dataZoom ? datas.dataZoom : '',
+        series: datas.series ? datas.series : '',
+      })
+      window.addEventListener('resize', () => {
+        this.state.chart.resize()
+      })
+    }
+  
+    destory () {
+      this.state.chart.dispose()
+      window.removeEventListener('resize', () => {
+        console.log('事件移除')
+      })
+    }
+  }
+  </script>
+  <style lang="less">
+  </style>
+  
+  

+ 2 - 1
TEAMModelOS/ClientApp/src/view/dashboardCenter/DashboardCenter.vue

@@ -47,7 +47,8 @@
 			goDash(val) {
 				switch (val) {
 					case "school":
-						this.$Message.warning('即将开放~')
+						// this.$Message.warning('即将开放~')
+						this.$router.push("schoolDash");
 						break;
 					case "teacher":
 						this.$router.push("researchDashboard");

+ 12 - 6
TEAMModelOS/ClientApp/src/view/student-web/AppNew.vue

@@ -75,7 +75,8 @@
                     </Tooltip>
                     <!-- 作业 -->
                     <Tooltip :content="$t('studentWeb.type.homework')">
-                        <MenuItem name="6" to="/studentWeb/homeworkView" v-show="selectClass && !isScale">
+                        <MenuItem name="6" to="/studentWeb/homeworkView"
+                                v-show="getNowCourse && getNowCourse.id && !onlySystem && getNowCourse.subject && selectClass && !isScale">
                             <svg-icon icon-class="doc" class="tabIcon3" />
                             <span class="no-show" v-show="MyNo != 6">{{ $t('studentWeb.type.homework') }}</span>
                         </MenuItem>
@@ -116,7 +117,8 @@
                     </MenuItem> -->
                     <!-- 成绩 -->
                     <Tooltip :content="$t('studentWeb.type.achievement')">
-                        <MenuItem name="7" to="/studentWeb/achievement" v-show="getNowCourse && getNowCourse.id && !onlySystem && getNowCourse.subject && selectClass && !isScale">
+                        <MenuItem name="7" to="/studentWeb/achievement"
+                                v-show="getNowCourse && getNowCourse.id && !onlySystem && getNowCourse.subject && selectClass && !isScale">
                             <Icon custom="iconfont icon-chengjitongji" size="18" style="font-weight: bold" />
                             <span class="no-show" v-show="MyNo != 7">{{ $t('studentWeb.type.achievement') }}</span>
                         </MenuItem>
@@ -655,10 +657,14 @@ export default {
                             return item.groupId === this.user.studentProfile.classinfo.id
                         })
                         let noCourseSubj = [...this.subjectList]
-                        res.schoolCourses.forEach(item => {
-                            noCourseSubj = noCourseSubj.filter(noCouSub => noCouSub.id != item.courseBase.subject.id)
+                        // 2023.11.16 基本课程只筛选行政班的未分配科目,不匹配教学班的科目
+                        list.forEach(item => {
+                            if(item.groupId === this.user.studentProfile.classinfo.id) {
+                                noCourseSubj = noCourseSubj.filter(noCouSub => {
+                                    return noCouSub.id != item.subject.id
+                                })
+                            }
                         })
-                        console.log(noCourseSubj);
                         // 没有学校课程,需要添加'基本课程'
                         // 2023.11.10 有未分配的科目也需创建基本课程,里面包含所有未分配的科目
                         if(!adminClass || noCourseSubj.length) {
@@ -793,7 +799,7 @@ export default {
         classChange(value) {
             if(value) {
                 // 没有课程 && 行政班未加入课程
-                if((this.onlySystem || this.courseList[this.selectClass - 1].isSystem) && this.noJumpRouter.includes(this.$route.path)) {
+                if((this.onlySystem || this.courseList[this.selectClass - 1].subjectList) && this.noJumpRouter.includes(this.$route.path)) {
                     this.$router.push({
                         path: '/studentWeb/examView'
                     })

+ 3 - 2
TEAMModelOS/Controllers/Both/GroupListController.cs

@@ -205,12 +205,13 @@ namespace TEAMModelOS.Controllers
             }
             if (!json.TryGetProperty("stuListNo", out JsonElement _stuListNo)) return BadRequest();
             var (userid, _name, _picture, school) = HttpContext.GetAuthTokenInfo();
-            object scope = null;
+          
             int type = 0;
             string no = null;
             var client = _azureCosmos.GetCosmosClient();
-            HttpContext?.Items.TryGetValue("Scope", out scope);
             int year = DateTimeOffset.UtcNow.Year;
+            object scope = null;
+            HttpContext?.Items.TryGetValue("Scope", out scope);
             if ($"{scope}".Equals(Constant.ScopeStudent))
             {
                 type = 2;

+ 19 - 4
TEAMModelOS/Controllers/Student/StudentCommonController.cs

@@ -18,6 +18,7 @@ using TEAMModelOS.SDK.Models;
 using TEAMModelOS.SDK.Models.Cosmos;
 using TEAMModelOS.SDK.Models.Cosmos.Common;
 using TEAMModelOS.SDK.Services;
+using static TEAMModelOS.SDK.StudentService;
 
 namespace TEAMModelOS.Controllers
 {
@@ -68,10 +69,24 @@ namespace TEAMModelOS.Controllers
         public async Task<IActionResult> StudentActivity(JsonElement request)
         {
             var (id, name, pic, school) = HttpContext.GetAuthTokenInfo();
-
-            //(List<StuActivity> datas, string continuationToken) = await ActivityStudentService.FindActivity(request, id, school, _azureCosmos, _azureRedis);
-            //return Ok(new { datas, continuationToken });
-            return Ok();
+            object _scope = null;
+            List<string> groupListIds = new List<string>();
+            List<string> subjects = new List<string>();
+            if (request.TryGetProperty("groupListIds", out JsonElement _groupListIds)) {
+                groupListIds= _groupListIds.ToObject<List<string>>();
+            }
+            if (request.TryGetProperty("subjects", out JsonElement _subjects))
+            {
+                subjects= _subjects.ToObject<List<string>>();
+            }
+            List<string> types = new List<string>();
+            if (request.TryGetProperty("types", out JsonElement _types))
+            {
+                types= _types.ToObject<List<string>>();
+            }
+            HttpContext?.Items.TryGetValue("Scope", out  _scope);
+            List<StudentActivity> activities =  await  StudentService.FindActivity(request, id, $"{_scope}", groupListIds, subjects, school, types, _azureCosmos);
+            return Ok(new { code =200, activities ,serverTime=DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()});
         }
 
         /// <summary>

+ 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.2311.8</Version>
-    <AssemblyVersion>5.2311.8.1</AssemblyVersion>
-    <FileVersion>5.2311.8.1</FileVersion>
+    <Version>5.2311.15</Version>
+    <AssemblyVersion>5.2311.15.1</AssemblyVersion>
+    <FileVersion>5.2311.15.1</FileVersion>
     <Description>TEAMModelOS(IES5)</Description>
-    <PackageReleaseNotes>IES版本说明版本切换标记5.2311.8.1</PackageReleaseNotes>
+    <PackageReleaseNotes>IES版本说明版本切换标记5.2311.15.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.2311.8.1"
+    "Version": "5.2311.15.1"
   },
   "Azure": {
     // 测试站数据库

+ 1 - 1
TEAMModelOS/appsettings.json

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