Selaa lähdekoodia

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

jeff 1 vuosi sitten
vanhempi
commit
20d7f5ce3c
27 muutettua tiedostoa jossa 817 lisäystä ja 219 poistoa
  1. 1 1
      TEAMModelBI/ClientApp/src/api/index.js
  2. 162 19
      TEAMModelBI/ClientApp/src/view/areaServe/areamanage.vue
  3. 32 27
      TEAMModelBI/ClientApp/src/view/created/created.vue
  4. 37 28
      TEAMModelBI/ClientApp/src/view/participation/index.vue
  5. 64 46
      TEAMModelBI/ClientApp/src/view/participation/setPhase.vue
  6. 3 3
      TEAMModelBI/ClientApp/src/view/schoolServe/school.vue
  7. 4 4
      TEAMModelBI/ClientApp/src/view/systemConfig/pushmsg/createdpush.vue
  8. 1 1
      TEAMModelBI/Controllers/BISchool/BatchSchoolController.cs
  9. 89 28
      TEAMModelOS.FunctionV4/CosmosDB/TriggerArt.cs
  10. 1 1
      TEAMModelOS.FunctionV4/CosmosDB/TriggerExam.cs
  11. 17 1
      TEAMModelOS.SDK/Models/Cosmos/Common/ArtEvaluation.cs
  12. 1 1
      TEAMModelOS.SDK/Models/Cosmos/School/School.cs
  13. 6 0
      TEAMModelOS.SDK/Models/Cosmos/Student/StudentArtResult.cs
  14. 1 1
      TEAMModelOS/ClientApp/public/lang/en-US.js
  15. 1 1
      TEAMModelOS/ClientApp/public/lang/zh-CN.js
  16. 1 1
      TEAMModelOS/ClientApp/public/lang/zh-TW.js
  17. 1 1
      TEAMModelOS/ClientApp/src/common/BaseLayout.vue
  18. 7 0
      TEAMModelOS/ClientApp/src/view/artexam/Create.vue
  19. 12 8
      TEAMModelOS/ClientApp/src/view/coursemgt/NewCusMgt.vue
  20. 2 2
      TEAMModelOS/ClientApp/src/view/coursemgt/components/AddTask.vue
  21. 1 1
      TEAMModelOS/ClientApp/src/view/mycourse/score/ScoreBody.vue
  22. 3 1
      TEAMModelOS/ClientApp/src/view/settings/SchoolMgmt.vue
  23. 1 1
      TEAMModelOS/ClientApp/src/view/student-web/AppNew.vue
  24. 2 1
      TEAMModelOS/ClientApp/src/view/teachcontent/index.vue
  25. 130 38
      TEAMModelOS/Controllers/Analysis/ArtAnalysisController.cs
  26. 221 0
      TEAMModelOS/Controllers/Client/AClassONEController.cs
  27. 16 3
      TEAMModelOS/Controllers/Common/ArtController.cs

+ 1 - 1
TEAMModelBI/ClientApp/src/api/index.js

@@ -472,7 +472,7 @@ export default {
     },
     //端外通知 v2
     sendPushnotify(data) {
-        return post('https://api2.teammodel.net/service/PushNotify',data)
+        return post('https://api2.teammodel.net/service/PushNotify',data) 
      },
     //第三方相关API(BI)
     //创建or保存 第三方信息

+ 162 - 19
TEAMModelBI/ClientApp/src/view/areaServe/areamanage.vue

@@ -75,7 +75,6 @@
     </div>
     <div class="traitfrom">
       <el-table :data="optionData" style="width: 100%" :highlight-current-row="true" height="74vh" v-loading="loading" :empty-text="$t(`commonMsg.nodataTable`)" element-loading-text="数据加载中...">
-        <!-- <el-table-column prop="index" :label="$t(`areaManages.areaTable.serialnum`)" type="index" sortable align="center" /> -->
         <el-table-column prop="name" :label="$t(`areaManages.areaTable.name`)" align="center" />
         <el-table-column prop="id" label="学区ID" align="center">
           <template #default="scope">
@@ -89,21 +88,34 @@
             </div>
           </template>
         </el-table-column>
-        <el-table-column prop="code" label="学区简码" align="center">
+        <el-table-column prop="code" label="频道简码" align="center">
           <template #default="scope">
-            <div class="code-idboxs">
-             <div>XXXX</div>
+            <!-- <div class="code-idboxs">
+             <div>暂无简码</div>
               <div class="code-copyicon" title="复制学区简码">
                 <el-icon @click="copyAreaID(scope.row)">
                   <CopyDocument />
                 </el-icon>
               </div>
+            </div> -->
+
+            <div>
+              <p v-show="scope.$index !==curTarget.index ">
+               暂无简码
+              <el-icon  class="el-icon-edit-outline" @click="curTarget.index=scope.$index"><Edit /></el-icon>
+            </p>
+            <el-input
+              type="textarea"
+              :autosize="{minRows:2,maxRows:4}"
+              v-show="scope.$index ===curTarget.index "
+              v-model="scope.row.id"
+              @blur="curTarget.index=-1"
+            />
             </div>
           </template>
         </el-table-column>
         <el-table-column prop="schoolCount" label="区内学校数量" align="center" sortable :sort-method="areaSort" />
         <el-table-column prop="location" label="位置" align="center" />
-        <!-- <el-table-column prop="cityName" :label="$t(`areaManages.areaTable.city`)" align="center" /> -->
         <el-table-column prop="institution" :label="$t(`areaManages.areaTable.affiliation`)" align="center" />
         <el-table-column prop="standardName" :label="$t(`areaManages.areaTable.project`)" align="center" />
         <el-table-column :label="$t(`areaManages.areaTable.operate`)" align="center" v-if="PowerShow">
@@ -118,6 +130,41 @@
           </template>
         </el-table-column>
       </el-table>
+      <!--可编辑table-->
+      <!-- <el-table
+        :data="testDatas"
+        :row-class-name="tableRowClassName"
+        v-loading="loading" :empty-text="$t(`commonMsg.nodataTable`)" element-loading-text="数据加载中..."
+      >
+        <el-table-column v-for="(col, idx) in columnList" :key="col.prop" :index="idx">
+            <template #header>
+              <p v-show="col.show" class="customtable-header">
+                {{col.label}}
+
+              </p>
+        </template>
+          <template #default="{ row }">
+            <div v-if="col.prop !=='operate'">
+              <p v-show="row[col.prop].show" >
+              {{row[col.prop].content}} 
+              <el-icon v-show="col.prop ==='code' " class="el-icon-edit-outline" @click="$event => handleEdit(row[col.prop], $event.target)"><Edit /></el-icon>
+            </p>
+            <el-input
+              type="textarea"
+              :autosize="{minRows:2,maxRows:4}"
+              v-show="!row[col.prop].show"
+              v-model="row[col.prop].content"
+              @blur="row[col.prop].show=true"
+            />
+            </div>
+            <div v-else class="customtable-header">
+              <el-button   size="mini" @click="operation(scope.$index, scope.row, true)" type="primary">查看</el-button>
+            </div>
+          </template>
+        </el-table-column>
+        <el-button size="mini"  type="primary">查看</el-button>
+      </el-table>   -->
+      <!--可编辑table end-->
     </div>
     <div class="adjustmentDialog">
       <el-dialog v-model="adjustmentbox" title="" width="80%" @close="closeInfo" center class="interfacebbox">
@@ -145,14 +192,17 @@
                     </el-dropdown>
                   </div>
                   <div class="search-school">
-                    <el-input v-model="schoolSeach" placeholder="输入学校名称搜索" clearable v-if="!multiplecheck">
-                    </el-input>
-                    <el-button type="primary" v-else-if="multiplecheck" @click="multipleAdd">
+                    <div class="search-school-search">
+                      <el-input v-model="schoolSeach" placeholder="输入学校名称搜索" clearable ></el-input>
+                    </div>
+                    <div class="search-school-btn" v-show="multiplecheck">
+                      <el-button type="primary"  @click="multipleAdd" size="small">
                       <svg class="multipleicon" aria-hidden="true">
                         <use xlink:href="#icon-piliangtianjia1"></use>
                       </svg>
                       批量添加
                     </el-button>  
+                    </div>
                   </div>
                   <div class="synchronization-title" v-show="currentlySelect.cutArea"><span>已同步省平台</span></div>
                 </div>
@@ -643,7 +693,7 @@ import { useRouter } from 'vue-router'
 import Ability from '@/components/Ability.vue'
 import option from '@/static/region.json'
 import loadingsz from '@/components/loading/partial.vue'
-import { CopyDocument, ArrowRight, ArrowLeft, Search, Back, ArrowDown } from '@element-plus/icons-vue'
+import { CopyDocument, ArrowRight, ArrowLeft, Search, Back, ArrowDown,Edit } from '@element-plus/icons-vue'
 import useClipboard from 'vue-clipboard3'
 import jwt_decode from 'jwt-decode'
 const optionsData = option
@@ -656,9 +706,40 @@ export default {
     ArrowLeft,
     Search,
     Back,
-    ArrowDown
+    ArrowDown,
+    Edit
   },
   setup () {
+    let columnList=ref( [
+        { prop: "name", label: '名称', show: true },
+        { prop: "id", label: '学区ID', show: true },
+        { prop: "code", label: '频道简码', show: true },
+        { prop: "schoolCount", label: '区内学校数量', show: true },
+        { prop: "location", label: '位置', show: true },
+        { prop: "institution", label: '所属机构', show: true },
+        { prop: "standardName", label: '微能力点方案', show: true },
+        { prop: "operate", label: '操作', show: true },
+    ])
+    let testDatas=ref([
+    //   {
+    //       name: { content: '张三', show: true},
+    //       age: { content: 24, show: true },
+    //       city: { content: '广州', show: true },
+    //       tel: { content: '13312345678', show: true },
+    //       operate:{content:'',state:true}
+    //     },{
+    //       name: { content: '李四', show: true },
+    //       age: { content: 25, show: true },
+    //       city: { content: '九江', show: true },
+    //       tel: { content: '18899998888', show: true },
+    //       operate:{content:'',state:true}
+    // }
+    ])
+    let count_col=ref(0)
+    let showMenu=ref(false)
+    let curTarget=ref({
+       index:-1,
+    })
     let { proxy } = getCurrentInstance()
     let PowerShow = proxy.$access.identifyPosition(JSON.parse(localStorage.getItem('id_token')))
     const { toClipboard } = useClipboard()
@@ -776,16 +857,35 @@ export default {
           res.areas[i].location = res.areas[i].provName + res.areas[i].cityName
         }
         optionData.value.push(...res.areas)
-        loading.value = false
         store.commit('getPoint', res.areas)
         originalDatas.value.push(...res.areas)
         optionData.value.forEach((item, index) => { item.name.includes('完整') ? optionData.value.splice(index, 1) : '' })
+        disposeTabledata(optionData.value)
+      })
+    }
+    //处理API返回的学区json 符合table的呈现
+    function disposeTabledata(data){
+      let initData=data
+      initData.forEach((item)=>{
+         let pushData={
+          name:{content:item.name,show:true},
+          id:{content:item.id,show:true},
+          code:{content:'暂无简码',show:true},
+          schoolCount:{content:item.schoolCount,show:true},
+          location:{content:item.provName+item.cityName,show:true},
+          institution:{content:item.institution,show:true},
+          standardName:{content:item.standardName,show:true},
+          standardName:{content:item.standardName,show:true},
+          operate:{content:'',state:true}
+        }
+        testDatas.value.push(pushData)
       })
+      loading.value = false
     }
     //table按钮
     async function operation (index, row, state) {
       tableData.value = []
-      console.log(row)
+      console.log(index,row,state,'打开学区传输内容')
       loadingSchoolList.value = true
       currentlySelect.value = row
       let dialogData = JSON.parse(JSON.stringify(originalDatas.value))
@@ -1256,6 +1356,7 @@ export default {
         return item.name.includes(areaValues.value)
       })
       optionData.value = newArr
+      disposeTabledata(optionData.value)
       loading.value = false
     }
     function addSelectSchool (value) {
@@ -1361,6 +1462,16 @@ export default {
       })
       position.value = ''
     }
+    //编辑table
+    function handleEdit(cell,pEl){
+      console.log(pEl.nextSibling,'编辑按钮btn')
+      // const editIputEl = Array.from(pEl.nextSibling.childNodes).find(n => ['INPUT','TEXTAREA'].includes(n.tagName))
+      //console.log(editIputEl,'结果')
+      cell.show = false
+      // editIputEl && this.$nextTick(() => {
+      //   editIputEl.focus()
+      // })
+    }
     watch(abilityModel, (newdata) => {
       console.log(newdata)
       newdata
@@ -1490,7 +1601,14 @@ export default {
       dropdownValue,
       multiplecheck,
       multipleChange,
-      multipleAdd
+      multipleAdd,
+      columnList,
+      testDatas,
+      handleEdit,
+      count_col,
+      showMenu,
+      curTarget,
+      disposeTabledata
     }
   },
 }
@@ -1874,19 +1992,24 @@ export default {
   flex-wrap: nowrap;
 }
 .select-text {
-  width: 13%;
-  padding-left: 2%;
+  width: 11%;
+  padding-left: 0%;
 }
 .select-click {
-  width: 25%;
+  width: 20%;
   line-height: 40px;
 }
 .search-school {
-  width: 45%;
+  width: 60%;
   text-align: center;
+  display: flex;
+  flex-wrap: nowrap;
 }
-.search-school div {
-  width: 100%;
+.search-school .search-school-search {
+  width: 70%;
+}
+.search-school .search-school-btn{
+  width:30%;
 }
 .synchronization-title {
   float: right;
@@ -2370,6 +2493,10 @@ export default {
   color: #636e72;
   font-weight: none;
 }
+.customtable-header{
+  margin-bottom: 5px;
+  text-align: center;
+}
 </style>
 <style>
 .stagebox-table-not .el-image {
@@ -2387,6 +2514,9 @@ export default {
   width: 98%;
   margin: 0 auto;
   /* padding: 1%; */
+  overflow: hidden;
+  height:80vh;
+  overflow-y: auto;
 }
 
 .traitfrom .el-form-item {
@@ -2568,6 +2698,19 @@ export default {
   border: 0px;
   box-shadow: 0px 0px 0px 0px transparent;
 }
+.select-school .el-input{
+  width:100% !important;
+}
+.traitfrom .el-scrollbar{
+  line-height: 80px;
+}
+.traitfrom .el-table .el-table__cell{
+  padding: 15px 0px;
+}
+.traitfrom .el-scrollbar .cell p{
+  margin-bottom: 0px;
+  text-align: center;
+}
 @media screen and (max-width: 2600px) {
   .select-box-items {
     width: 25%;

+ 32 - 27
TEAMModelBI/ClientApp/src/view/created/created.vue

@@ -108,6 +108,9 @@
             <el-form-item :label="$t(`areaManages.createdArea.areaSelect`)" class="region">
               <el-cascader v-model="provinceOptions.provinceValue" :options="provinceOptions.optionInfo" :props="regionParams" placeholder="选择学区所在地" @change="cascaderArea" />
             </el-form-item>
+            <el-form-item label="频道简码" class="special">
+              <el-input v-model="formArea.code" placeholder="填写学区频道简码" />
+            </el-form-item>
           </el-form>
           <div class="submitbtn">
             <el-button type="primary" @click="createdArea()" :loading="createdLoading">
@@ -192,10 +195,10 @@
               <el-checkbox label="大学"></el-checkbox> -->
               </el-radio-group>
             </el-form-item>
-            <el-form-item label="创校流程" class="school-form-grading">
+            <!-- <el-form-item label="创校流程" class="school-form-grading">
               <el-radio v-model="item.modules" label="default" size="large">普通创校</el-radio>
               <el-radio v-model="item.modules" label="art" size="large">评测创校</el-radio>
-            </el-form-item>
+            </el-form-item> -->
             <el-form-item label="预设管理员" class="scholl-admin" prop="presupposeAdmin">
               <el-input v-model="item.presupposeAdmin" placeholder="输入醍摩豆账号或手机号,预设学校管理员" />
               <p class="repetition-hint" v-if="repetition.admin">该管理员用户不存在,请检查</p>
@@ -571,7 +574,7 @@ import * as excel from '../../until/excel.js'
 import option from '@/static/region.json'
 import router from '@/router/index.js'
 import { useRoute } from 'vue-router'
- import { useI18n } from 'vue-i18n'
+import { useI18n } from 'vue-i18n'
 import option_cn from '@/static/regions/region_cn.json'
 import option_gl from '@/static/regions/region_gl.json'
 const chinaData = new EluiChinaAreaDht.ChinaArea().chinaAreaflat
@@ -592,6 +595,7 @@ const areaData = {
   capacityvalue: '',
   options: [],
   areaAdmin: '',
+  code:'',
 }
 const siteValue = window.location.host === 'localhost:5001' ? 'cn' : window.location.host === 'bi.teammodel.cn' ? 'cn' : window.location.host === 'bitest.teammodel.cn' ? 'cn' : 'international'
 const optionsData = siteValue === 'cn' ? option_cn : option_gl
@@ -620,7 +624,7 @@ const schoolAssets = {
   address: '',
   areaId: '',
   lang: "1",
-  modules:'default',
+  // modules:'default',
   schoolLocation: {
     region: '',
     regionvalue: '',
@@ -647,7 +651,7 @@ export default {
   components: { EluiChinaAreaDht, Search, StarFilled },
   setup () {
     const siteValue = window.location.host === 'localhost:5001' ? 'cn' : window.location.host === 'bi.teammodel.cn' ? 'cn' : window.location.host === 'bitest.teammodel.cn' ? 'cn' : 'international'
-     const { t } = useI18n()
+    const { t } = useI18n()
     const labelPosition = 'right'
     let { proxy } = getCurrentInstance()
     const store = useStore()
@@ -1009,6 +1013,7 @@ export default {
         areaAdmin: formArea.value.areaAdmin,
         tmdId: users.tmdId,
         tmdName: users.tmdName,
+        code:formArea.value.code
       }
       console.log(createdParame, '创区数据')
       if (createdParame.institution === '' || createdParame.institution === undefined) {
@@ -1126,7 +1131,7 @@ export default {
           lang: schoolForm.value[0].lang === '1' ? 'zh-CN' : schoolForm.value[0].lang === '2' ? 'zh-TW' : schoolForm.value[0].lang === '3' ? 'en-US' : 'zh-CN',
           areaId: schoolForm.value[i].areaIdcreated,
           code: schoolForm.value[i].code,
-          modules:schoolForm.value[i].modules === 'default' ? []:['art']
+          // modules:schoolForm.value[i].modules === 'default' ? []:['art']
         })
       }
       let parameter = { biSchools: datas, lang: schoolForm.value[0].lang === '1' ? 'zh-CN' : schoolForm.value[0].lang === '2' ? 'zh-TW' : schoolForm.value[0].lang === '3' ? 'en-US' : 'zh-CN' }
@@ -1164,7 +1169,7 @@ export default {
       schoolForm.value[0].lang = "1"
       schoolForm.value[0].areaIdcreated = ''
       schoolForm.value[0].code = ''
-      schoolForm.value[0].modules  = 'default'
+      // schoolForm.value[0].modules  = 'default'
       provinceOptions.value.provinceValue = ''
     }
     //处理取消和确认并返回
@@ -1338,6 +1343,7 @@ export default {
       console.log(data, '提交的数据')
       proxy.$api.verifyContent(data).then((res) => {
         console.log(res, '数据验证的结果')
+        res.state === 200 ? (batchDatas.forEach((item) => { item.dataState = true }), batchVerify(presentData, loadingverify), codeShow.value = true) : ''
         if (res.state === 200) {
           //处理简码
           res.createScInfo.forEach((items) => {
@@ -1348,7 +1354,6 @@ export default {
             }
           })
         }
-        res.state === 200 ? (batchDatas.forEach((item) => { item.dataState = true }), batchVerify(presentData, loadingverify), codeShow.value = true) : ''
         if (res.state === 201) {
           codeShow.value = false
           batchTablesArr.value = true; verifyState.value = false
@@ -1552,7 +1557,7 @@ export default {
       console.log(schoolForm.value)
       let schooldata = schoolForm.value
       let provinceName = (siteValue === 'cn') ? schooldata[0].schoolLocation.province : schooldata[0].schoolLocation.region ////國際站以region為省名獲取學校簡碼
-      let param = [{ id: '', name: schooldata[0].name, province: provinceName, aname: schooldata[0].name, city: schooldata[0].schoolLocation.city, createCount: 0 }]
+      let param = [{ id: '', name: schooldata[0].name, province: provinceName, aname: schooldata[0].name, city: schooldata[0].schoolLocation.area, createCount: 0 }]
       let data = { schools: param }
       console.log(data, '提交数据')
       proxy.$api.getSchoolcode(data).then((res) => {
@@ -1732,10 +1737,10 @@ export default {
         })
       }
 
-      let datas = { regionId: '', name: '', nameFuzzy: false, shortCode: '', shortCodeFuzzy: false, codeOrShortCode: verifyData[0].code }
+      let datas = { regionId: regionCodeNow, name: verifyData[0].name, nameFuzzy: false, shortCode: verifyData[0].code, shortCodeFuzzy: false }
       proxy.$api.verifyDatainbb(datas).then((res) => {
         console.log(res.length, '核验数据')
-        res.length == 0 ? (verifyForstate.value.state = true, verifyForstate.value.pass = true, ElMessage.success('数据已通过核验,可执行创校')) : (verifyForstate.value.state = false, verifyForstate.value.pass = false, ElMessage.error('数据未通过核验,BB学校资料库已存在此学校代码或简码。'))
+        res.length == 0 ? (verifyForstate.value.state = true, verifyForstate.value.pass = true, ElMessage.success('数据已通过核验,可执行创校')) : (verifyForstate.value.state = false, verifyForstate.value.pass = false, ElMessage.error('数据未通过核验,请检查表单内容'))
       }).catch((error) => {
         ElMessage.error('API异常,数据核验失败')
       })
@@ -1747,25 +1752,25 @@ export default {
       let scArr = value
       let snameList = []; let scodeList = []; let shortArr = []; let regionList = []; let regionInfoRowNow = [];
       let regionCodeTmp = ''
-        scArr.forEach((item) => {
-        // snameList.push(item.name);
-        // scodeList.push(item.id);
+      scArr.forEach((item) => {
+        snameList.push(item.name);
+        scodeList.push(item.id);
         shortArr.push(item.id);
-        // regionInfoRowNow = regionInfoList.filter(function (rgitem) { return rgitem.name.includes(item.region) })
-        // regionCodeTmp = (regionInfoRowNow.length > 0 && regionInfoRowNow[0].hasOwnProperty('code')) ? regionInfoRowNow[0]['code'] : ''
-        // if (regionCodeTmp != '' && !regionList.includes(regionCodeTmp)) {
-        //   regionList.push(regionCodeTmp)
-        // }
+        regionInfoRowNow = regionInfoList.filter(function (rgitem) { return rgitem.name.includes(item.region) })
+        regionCodeTmp = (regionInfoRowNow.length > 0 && regionInfoRowNow[0].hasOwnProperty('code')) ? regionInfoRowNow[0]['code'] : ''
+        if (regionCodeTmp != '' && !regionList.includes(regionCodeTmp)) {
+          regionList.push(regionCodeTmp)
+        }
       })
-      let data = { nameList: snameList, codeList: scodeList, codeOrShortCodeList: shortArr }
-      // if (siteValue === 'cn') {
-      //   data['regionId'] = 'CN'
-      // } else {
-      //   data['regionId'] = (regionList.length == 1) ? regionList[0] : ''
-      //   data['regionIdList'] = (regionList.length > 1) ? regionList : []
-      // }
+      let data = { nameList: snameList, codeList: scodeList, shortCodeList: shortArr }
+      if (siteValue === 'cn') {
+        data['regionId'] = 'CN'
+      } else {
+        data['regionId'] = (regionList.length == 1) ? regionList[0] : ''
+        data['regionIdList'] = (regionList.length > 1) ? regionList : []
+      }
       proxy.$api.verifyDatainbb(data).then((res) => {
-        res.length == 0 ? (ElMessage.success('数据已通过核验,可执行创校'), batchTablesArr.value = true) : (ElMessage.error('数据未通过核验,BB学校资料库已存在此学校代码或简码,请检查表单内容'), batchTablesArr.value = true, verifyState.value = false)
+        res.length == 0 ? (ElMessage.success('数据已通过核验,可执行创校'), batchTablesArr.value = true) : (ElMessage.error('数据未通过核验,请检查表单内容'), batchTablesArr.value = true, verifyState.value = false)
       }).catch((error) => {
         ElMessage.error('API异常,批量数据核验失败')
       })

+ 37 - 28
TEAMModelBI/ClientApp/src/view/participation/index.vue

@@ -118,8 +118,8 @@
   <!--学校列表end-->
   <!--编辑学校页面-->
   <div class="schoolDeatils">
-    <div class="backbtn" v-if="models === 'details' && PowerShow">
-      <el-button class="changebtn" v-if="store.state.changbtnShow && changebtns" @click="getSetschool()" size="small">
+    <div class="backbtn" v-if="models === 'details'">
+      <el-button class="changebtn" v-if="store.state.changbtnShow && changebtns" @click="getSetschool()" >
         <svg class="changebtn-areaicon" aria-hidden="true">
           <use xlink:href="#icon-wenjian"></use>
         </svg>
@@ -132,10 +132,10 @@
         返回
       </el-button>
     </div>
-    <el-tabs v-if="models === 'details' && PowerShow" @tab-click="changeTabs">
+    <el-tabs v-if="models === 'details'" @tab-click="changeTabs">
       <!--基础设置-->
       <el-tab-pane :label="$t(`schoolManages.redactSet`)">
-        <div class="redactbox" v-show="models === 'details' && PowerShow">
+        <div class="redactbox" v-show="models === 'details'">
           <div class="school-formbox">
             <el-form ref="form" :model="nowPitchdata" label-width="120px">
               <el-form-item :label="$t(`schoolManages.basicSet.name`) + ':'" class="school-form-name">
@@ -436,9 +436,9 @@ export default {
         // sortable: true,
         cellRenderer: (data) => (
           <>
-            <div style="color:#409EFF" v-show={data.rowData.scale === 0 && (data.rowData.size < 100 || data.rowData.size == 100) ? true : false}>基础版</div>
-            <div style="color:#67C23A" v-show={(data.rowData.scale === 300 && data.rowData.size === 500) || (data.rowData.size > 100 && (!data.rowData.service.includes('YMPCVCIM') && !data.rowData.service.includes('VLY6J6N6') && !data.rowData.service.includes('VABAJ6NV'))) ? true : false}>标准版</div>
-            <div style="color: #e6a23c;" v-show={data.rowData.service.includes('YMPCVCIM') || data.rowData.service.includes('VLY6J6N6') || data.rowData.service.includes('VABAJ6NV') ? true : false}>专业版</div>
+            <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>
           </>
         ),
       },
@@ -483,23 +483,26 @@ export default {
         headerClass: 'testclass',
         cellRenderer: (data) => (
           <>
-            <div title="学情分析" v-show={data.rowData.service.includes('YMPCVCIM') ? true : false}>
-              <svg style=" width: 1.8em;height: 1.8em;vertical-align: -0.5em;fill: currentColor;overflow: hidden;cursor: pointer;" aria-hidden="true" ><use xlink:href="#icon-tongjifenxi"></use></svg>
+            <div title="基础服务模组">
+              <svg style=" width: 1.6em;height: 1.6em;vertical-align: -0.5em;fill: currentColor;overflow: hidden;cursor: pointer;" aria-hidden="true" ><use xlink:href="#icon-jianyanbiaozhun"></use></svg>
             </div>
-            <div title="智慧学校管理服务" v-show={data.rowData.service.includes('IPDYZYLC') ? true : false}>
-              <svg style=" width: 1.8em;height: 1.8em;vertical-align: -0.5em;fill: currentColor;overflow: hidden;cursor: pointer;" aria-hidden="true" ><use xlink:href="#icon-zhihuixiaoyuan"></use></svg>
+            <div title="学情分析服务模组(未开启)" v-show={!data.rowData.service.includes('YMPCVCIM') ? true : false}>
+              <svg style=" width: 1.5em;height: 1.5em;vertical-align: -0.5em;fill: currentColor;overflow: hidden;cursor: pointer;" aria-hidden="true" ><use xlink:href="#icon-xueqinggailan"></use></svg>
             </div>
-            <div title="A Class ONE 智慧学伴" v-show={data.rowData.service.includes('3CLYJ6NP') ? true : false}>
-              <svg style=" width: 1.8em;height: 1.8em;vertical-align: -0.5em;fill: currentColor;overflow: hidden;cursor: pointer;" aria-hidden="true" ><use xlink:href="#icon-jxuexiao2"></use></svg>
+            <div title="学情分析服务模组" v-show={data.rowData.service.includes('YMPCVCIM') ? true : false}>
+              <svg style=" width: 1.5em;height: 1.5em;vertical-align: -0.5em;fill: currentColor;overflow: hidden;cursor: pointer;" aria-hidden="true" ><use xlink:href="#icon-xueqinggailan-copy"></use></svg>
             </div>
-            <div title="数据存储服务空间" v-show={data.rowData.service.includes('IPALJ6NY') ? true : false}>
-              <svg style=" width: 1.8em;height: 1.8em;vertical-align: -0.5em;fill: currentColor;overflow: hidden;cursor: pointer;" aria-hidden="true" ><use xlink:href="#icon-yuncunchu"></use></svg>
+            <div title="艺术评测服务(未开启)" v-show={!data.rowData.service.includes('B6V5J6NP') ? true : false}>
+              <svg style=" width: 1.5em;height: 1.5em;vertical-align: -0.5em;fill: currentColor;overflow: hidden;cursor: pointer;" aria-hidden="true" ><use xlink:href="#icon-yishuzhuanye"></use></svg>
             </div>
-            <div title="卷卡合一阅卷系统" v-show={data.rowData.service.includes('VABAJ6NV') ? true : false}>
-              <svg style=" width: 1.8em;height: 1.8em;vertical-align: -0.5em;fill: currentColor;overflow: hidden;cursor: pointer;" aria-hidden="true" ><use xlink:href="#icon-pingtai_kaoshi"></use></svg>
+            <div title="艺术评测服务" v-show={data.rowData.service.includes('B6V5J6NP') ? true : false}>
+              <svg style=" width: 1.5em;height: 1.5em;vertical-align: -0.5em;fill: currentColor;overflow: hidden;cursor: pointer;" aria-hidden="true" ><use xlink:href="#icon-yishuzhuanye-copy"></use></svg>
             </div>
-            <div title="教研中心模组" v-show={data.rowData.service.includes('VLY6J6N6') ? true : false}>
-              <svg style=" width: 1.8em;height: 1.8em;vertical-align: -0.5em;fill: currentColor;overflow: hidden;cursor: pointer;" aria-hidden="true" ><use xlink:href="#icon-jiaoyan"></use></svg>
+            <div title="五育看板服(未开启)" v-show={!data.rowData.service.includes('YPXSJ6NJ') ? true : false}>
+              <svg style=" width: 1.5em;height: 1.5em;vertical-align: -0.5em;fill: currentColor;overflow: hidden;cursor: pointer;" aria-hidden="true" ><use xlink:href="#icon-shuzikanban-copy"></use></svg>
+            </div>
+            <div title="五育看板服" v-show={data.rowData.service.includes('YPXSJ6NJ') ? true : false}>
+              <svg style=" width: 1.5em;height: 1.5em;vertical-align: -0.5em;fill: currentColor;overflow: hidden;cursor: pointer;" aria-hidden="true" ><use xlink:href="#icon-shuzikanban"></use></svg>
             </div>
           </>
         ),
@@ -596,7 +599,11 @@ export default {
           }
         }
         console.log(res)
-        res.state == 200 ? (tableData.value = [], originalData.value = [], tableData.value.push(...res.scInfos), (originalData.value = res.scInfos), tablesccnt.value = res.allCnt, originalNum.value = res.allCnt) : ''
+        res.state == 200 ? 
+        (tableData.value = [], originalData.value = [],
+        res.scInfos.forEach((item)=>{item.versions= item.service.includes('YPXSJ6NJ') && item.service.includes('B6V5J6NP') ? '专业版':item.service.includes('YMPCVCIM') ? '标准版':'基础版'}),
+         tableData.value.push(...res.scInfos), (originalData.value = res.scInfos), tablesccnt.value = res.allCnt, originalNum.value = res.allCnt) 
+        : ''
         loading.value = false
       })
     }
@@ -623,9 +630,11 @@ export default {
       uploadHeader.value['x-auth-authtoken'] = token
       data.areaId !== null ? (areaSelect.value.Selectvalue = data.areaId) : ''
       console.log(store.state.point, '目前现有的所有区')
-      store.state.point.length ? areaSelect.value.data.push(...store.state.point) : getoption()
+      //store.state.point.length ? areaSelect.value.data.push(...store.state.point) : getoption()
       proxy.$api.getNowscholl({ schoolId: school.id }).then((res) => {
-        res.state === 200 ? (detailsSchool.value = res.schoolAssists, nowPitchdata.value.type = res.schoolAssists.type.toString(), models.value = 'details') : ElMessage.error('详情API异常,访问失败')
+        res.state === 200 ? 
+        (detailsSchool.value = res.schoolAssists, nowPitchdata.value.type = res.schoolAssists.type.toString(), models.value = 'details') 
+        : ElMessage.error('详情API异常,访问失败')
       }).catch((error) => {
         ElMessage.error('详情API异常,访问失败')
         return
@@ -873,10 +882,10 @@ export default {
     }
     //获取所有区域,学校编辑内呈现
     function getoption () {
-      proxy.$api.getCapacity({}).then((res) => {
-        areaSelect.value.data.push(...res.areas)
-        store.commit('getPoint', res.areas)
-      })
+      // proxy.$api.getCapacity({}).then((res) => {
+      //   areaSelect.value.data.push(...res.areas)
+      //   store.commit('getPoint', res.areas)
+      // })
     }
     //修改成功后执行
     function updateSuccess () {
@@ -898,7 +907,7 @@ export default {
     }
     //关于储存变更按钮
     function changeTabs (value) {
-      console.log(value.props.label)
+      console.log(value.props.label,'目前的值')
       value.props.label == '学段管理' || value.props.label == '學段管理' ? (changebtns.value = true) : (changebtns.value = false)
     }
     //获取子页面的数据
@@ -928,7 +937,7 @@ export default {
       proxy.$api
         .updateSchoolphase(newData)
         .then((res) => {
-          res.state === 200 ? (ElMessage.success('保存成功'), (studyPhase.value = res.schoolInfo.id), (changebtns.value = false)) : ElMessage.error('保存失败')
+          res.state === 200 ? (ElMessage.success('保存成功'), (studyPhase.value = res.schoolInfo.id), (changebtns.value = true)) : ElMessage.error('保存失败')
           loadinginfo.close()
         })
         .catch((res) => {

+ 64 - 46
TEAMModelBI/ClientApp/src/view/participation/setPhase.vue

@@ -27,10 +27,7 @@
       <div class="phaseList" v-if="nowschoolData.period">
         <div class="phaseitem" v-for="(item, index) in nowschoolData.period" :key="index" :class="{ 'checkedis': pathNowphase === index }" @click="cutPhase(index)">
           <div class="phasei-item-name">
-            <div class="namebox" v-if="item.changed === false">{{ item.name }}</div>
-            <div class="namebox" v-show="item.changed === true">
-              <el-input ref="editbox" v-model="item.name" @blur="nameChanges(index)" />
-            </div>
+            <div class="namebox">{{ item.name }}</div>
             <span class="campus">{{ item.area }}</span>
           </div>
           <p class="phasei-item-common">
@@ -418,7 +415,10 @@
           </el-form-item>
           <el-form-item label="所属阶段" class="stage-checkbox">
             <div class="checkbox-stage">
-              <el-checkbox v-for="(item,index) in stageData.checkeds" :key="index" v-model="item.state" :label="item.name" size="small" />
+              <!-- <el-checkbox v-for="(item,index) in stageData.checkeds" :key="index" v-model="item.state" :label="item.name" size="small" /> -->
+              <el-radio-group v-model="stageData.ptichValue">
+                <el-radio v-for="(item,index) in stageData.checkeds" :key="index" :label="item.name" size="small" />
+              </el-radio-group>
             </div>
           </el-form-item>
         </el-form>
@@ -758,24 +758,38 @@ export default {
       ],
     })
     //获取当前学校的信息(API)
+    // function getnowSchool (data) {
+    //   console.log(data, '进入调用API方法')
+    //   let schoolData = {}
+    //   conductData(data)
+    //   //处理学段管理api
+    //   // proxy.$api
+    //   //   .getNowscholl({ schoolId: data })
+    //   //   .then((res) => {
+    //   //     console.log(res, '返回的res内容CCCCC')
+    //   //     res.state === 200 ? ((schoolData = res.schoolAssists), conductData(res.schoolAssists), context.emit('schoolDetailInfo', res.schoolAssists)) : ''
+    //   //   })
+    //   //   .catch((res) => {
+    //   //     ElMessage.error('获取学校数据异常')
+    //   //   })
+    // }
     function getnowSchool (data) {
       console.log(data, '进入调用API方法')
       let schoolData = {}
-      conductData(data)
       //处理学段管理api
-      // proxy.$api
-      //   .getNowscholl({ schoolId: data })
-      //   .then((res) => {
-      //     console.log(res, '返回的res内容CCCCC')
-      //     res.state === 200 ? ((schoolData = res.schoolAssists), conductData(res.schoolAssists), context.emit('schoolDetailInfo', res.schoolAssists)) : ''
-      //   })
-      //   .catch((res) => {
-      //     ElMessage.error('获取学校数据异常')
-      //   })
+      proxy.$api
+        .getNowscholl({ schoolId: data.id })
+        .then((res) => {
+          console.log(res, '返回的res内容CCCCC')
+          res.state === 200 ? ((schoolData = res.schoolAssists), conductData(res.schoolAssists), context.emit('schoolDetails', res.schoolAssists)) : ''
+        })
+        .catch((res) => {
+          ElMessage.error('获取学校数据异常')
+        })
     }
     //接收到学校信息处理数据
     function conductData (data) {
-      console.log(data, '进来的数据')
+      console.log(data,pathNowphase.value, '进来的数据')
       if (!data) {
         return
       }
@@ -787,14 +801,10 @@ export default {
           datas.campuses[y].id === ids ? (datas.period[i].area = datas.campuses[y].name) : ''
         }
       }
-      //显示学段名称和校区
-      for (let i in datas.period) {
-        let ids = datas.period[i].campusId
-        datas.period[i].changed = false
-        for (let y in datas.campuses) {
-          datas.campuses[y].id === ids ? (datas.period[i].area = datas.campuses[y].name) : ''
-        }
-      }
+      // if (data.period[pathNowphase.value].semesters.length === 0 || data.period[pathNowphase.value].subjects.length === 0) {
+      //   ElMessage.error('学段管理内数据异常')
+      //   // return
+      // }
       //处理学期设置
       let phasetime = data.period[pathNowphase.value].semesters
       console.log(phasetime, '当前的学期')
@@ -810,8 +820,8 @@ export default {
           }
         }
         timesteps.value.nowitem = data.period[pathNowphase.value].semesters[0]
+        console.log(timesteps.value)
       }
-      console.log(timesteps.value, '查看这里是否执行')
       // for (let i in phasetime) {
       //     phasetime[i].start === 0 ? (phasetime[i].totaldays = proxy.$common.totalDay(topStart, downStart)) : (phasetime[i].totaldays = proxy.$common.totalDay(downStart, topStart))
       // }
@@ -946,11 +956,12 @@ export default {
             (dialogModels.value = 'semester')))
         : ''
       state === 'updateSubjects'
-        ? ((subjectsData.value.name = value.name),
-          (subjectsData.value.type = value.type.toString()),
-          (subjectsData.value.id = value.id),
-          (dialogModels.value = 'subjects'),
-          (editDialogName.value = proxy.$t(`schoolManages.gradSet.popup.updatesubject`)),
+        ? (subjectsData.value.name = value.name,
+          subjectsData.value.type = value.type.toString(),
+          subjectsData.value.id = value.id,
+          dialogModels.value = 'subjects',
+          editDialogName.value = proxy.$t(`schoolManages.gradSet.popup.compile`),
+          // editDialogName.value='编辑学科',
           (subjectsData.value.models = 'subjectsUpdate'))
         : ''
       state === 'addSubjects'
@@ -960,7 +971,18 @@ export default {
           (subjectsData.value.models = 'subjectsAdd'),
           (editDialogName.value = proxy.$t(`schoolManages.gradSet.popup.addSubject`)),
           (dialogModels.value = 'subjects'))
-        : ''
+        :
+        state === 'stage'
+          ? (
+            (editDialogName.value = '编辑学段属性'),
+            console.log(stageData, value, '属性属性'),
+            (stageData.value.checkeds.forEach((a) => { a.state = false })),
+            (stageData.value.name = value.name),
+            stageData.value.checkeds.forEach((items) => {
+              items.value == value.periodType ? stageData.value.ptichValue = items.name : ''
+            }),
+            dialogModels.value = 'stage')
+          : ''
       if (state === 'updateTimebucket') {
         let timetables = nowschoolData.value.period[pathNowphase.value].timetable
         let timeindex = timetables[index].time.indexOf('-')
@@ -991,18 +1013,6 @@ export default {
           (editDialogName.value = proxy.$t(`schoolManages.gradSet.popup.addTime`)),
           (dialogModels.value = 'timebucket'))
         : ''
-      state === 'stage'
-        ? (
-          (editDialogName.value = '编辑学段属性'),
-          (stageData.value.checkeds.forEach((a) => { a.state = false })),
-          (stageData.value.name = value.name),
-          (value.type.forEach((item) => {
-            stageData.value.checkeds.forEach((items) => {
-              item == items.value ? items.state = true : ''
-            })
-          })),
-          dialogModels.value = 'stage')
-        : ''
       console.log(form.value)
       editDialog.value = true
     }
@@ -1056,6 +1066,14 @@ export default {
           (nowschoolData.value.period[pathNowphase.value].timetable = settimeArr),
           timeSort(nowschoolData.value.period[pathNowphase.value].timetable))
         : ''
+       //编辑学段名称和阶段
+       if (dialogModels.value === 'stage') {
+        console.log(nowschoolData.value.period, '当前学段')
+        nowschoolData.value.period[pathNowphase.value].name = stageData.value.name
+        let stageTrue = ''
+        stageData.value.checkeds.forEach((item) => { item.name === stageData.value.ptichValue ? stageTrue = item.value : '' })
+        nowschoolData.value.period[pathNowphase.value].periodType = stageTrue
+      }  
       console.log(nowschoolData.value, '修改后的数据')
       store.commit('changeShowbtn', true)
       editDialog.value = false
@@ -1333,9 +1351,9 @@ export default {
     }
     watch(
       props,
-      (newdata, olddata) => {
+      (newdata) => {
         console.log(newdata, '数据')
-        newdata.detailsSchool !== undefined && newdata !== olddata ? getnowSchool(newdata.detailsSchool) : ''
+        newdata.detailsSchool !== undefined ? getnowSchool(newdata.detailsSchool) : ''
       },
       { immediate: true, deep: true }
     )
@@ -2242,7 +2260,7 @@ export default {
 
 .form-semester-name {
   width: 55%;
-  padding-left: 2.5%;
+  /* padding-left: 2.5%; */
 }
 
 .form-semester-entrance .form-radio {

+ 3 - 3
TEAMModelBI/ClientApp/src/view/schoolServe/school.vue

@@ -209,7 +209,7 @@
                     {{ $t(`schoolManages.basicSet.higherEducation`) }}</el-radio>
                 </div>
               </el-form-item>
-              <el-form-item :label="创校流程" class="school-form-grading">
+              <!-- <el-form-item :label="创校流程" class="school-form-grading">
                 <div v-if="PowerShow">
                   <el-radio v-model="nowPitchdata.modules " label="default" size="large">
                     普通创校
@@ -224,7 +224,7 @@
                   <el-radio v-model="nowPitchdata.modules " label="art" size="large" disabled>
                     评测创校</el-radio>
                 </div>
-              </el-form-item>
+              </el-form-item> -->
               <el-form-item :label="$t(`schoolManages.basicSet.nowAssistant`)" class="school-form-admin">
                 <div v-if="PowerShow" class="admin-boxs-width">
                   <el-select v-model="adminvalue" multiple @change="assistChange" :placeholder="$t(`schoolManages.basicSet.nowAssistanthint`)">
@@ -1251,7 +1251,7 @@ export default {
       proxy.$api
         .updateSchoolphase(newData)
         .then((res) => {
-          res.state === 200 ? (ElMessage.success('保存成功'), (studyPhase.value = res.schoolInfo.id), (changebtns.value = false)) : ElMessage.error('保存失败')
+          res.state === 200 ? (ElMessage.success('保存成功'), (studyPhase.value = res.schoolInfo.id), (changebtns.value = true),store.commit('changeShowbtn', false)) : ElMessage.error('保存失败')
           loadinginfo.close()
         })
         .catch((res) => {

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

@@ -466,7 +466,7 @@
     <el-drawer v-model="drawer" title="历史消息" size="45%">
       <div class="center-table">
         <el-table :data="tableData" style="width: 100%" height="85vh" v-loading="loading" element-loading-text="数据加载中..." empty-text="暂无消息数据">
-          <el-table-column label="类型" align="center">
+          <!-- <el-table-column label="类型" align="center">
             <template #header>
               <el-select v-model="tableSelect.value" class="m-2" placeholder="类型选择" size="small" @change="changeTag">
                 <el-option v-for="item in tableSelect.options" :key="item.value" :label="item.label" :value="item.value" />
@@ -478,7 +478,7 @@
               <el-tag type="" effect="dark" v-if="scope.row.type ===3">提示</el-tag>
               <el-tag type="success" effect="dark" v-if="scope.row.type ===4">特殊</el-tag>
             </template>
-          </el-table-column>
+          </el-table-column> -->
           <el-table-column prop="theme" label="消息主题" align="center" />
           <el-table-column prop="content" label="消息内容" align="center" />
           <el-table-column prop="address" label="接收产品" align="center">
@@ -824,9 +824,9 @@ function pitchonly (val) {
 function sourceMsg(){
   let values=constructorData.value.source
   if(values ==='system'){
-    this.pushSystem()
+    pushSystem()
   }else{
-    this.publish()
+    publish()
   }
 }
 //发布消息

+ 1 - 1
TEAMModelBI/Controllers/BISchool/BatchSchoolController.cs

@@ -216,7 +216,7 @@ namespace TEAMModelBI.Controllers.BISchool
                                 period = PresetSchoolPeriod(bischool.period, foundSchools.lang, campusId),
                                 scale = bischool.size >= 300 ? 500 : 0,
                                 isinit = true,
-                                //modules=bischool.modules,
+                                //modules=bischool?.modules,
                                 openLessonRecord = (_option.Location.Contains("Global")) ? false : true,
                                 createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
 

+ 89 - 28
TEAMModelOS.FunctionV4/CosmosDB/TriggerArt.cs

@@ -417,7 +417,7 @@ namespace TEAMModelOS.FunctionV4.CosmosDB
                                     knoledge.Add(await getKnowledge(art.periodType, exams.Where(c => c.subjects[0].id.Equals(ss.id))?.FirstOrDefault().papers[0].code, client, ss.id, exams.Where(c => c.subjects[0].id.Equals(ss.id))?.FirstOrDefault().papers[0].periodId));
                                 }
 
-                                List<(string name, double score, double aver,string subject)> blockScore = new();
+                                List<(string name, double score, double aver, string subject)> blockScore = new();
                                 List<(List<(string name, double score, double point, string subject)> studentScore, string stuId)> studentScores = new();
                                 foreach (var exam in exams)
                                 {
@@ -456,9 +456,10 @@ namespace TEAMModelOS.FunctionV4.CosmosDB
                                     //List<(string name, double score, string subject)> pointScore = new();
                                     List<string> stus = examClassResults.Where(c => c.examId.Equals(exam.id)).SelectMany(z => z.studentIds).ToList();
                                     List<List<double>> stuScores = examClassResults.Where(c => c.examId.Equals(exam.id)).SelectMany(z => z.studentScores).ToList();
-                                    foreach (string id in stus) {
+                                    foreach (string id in stus)
+                                    {
                                         //double scores = 0;
-                                        List<(string name, double score, double point,string subject)> studentScore = new();
+                                        List<(string name, double score, double point, string subject)> studentScore = new();
                                         for (int k = 0; k < knowledgeName.Count; k++)
                                         {
                                             int n = 0;
@@ -474,13 +475,13 @@ namespace TEAMModelOS.FunctionV4.CosmosDB
                                                     if (stuScores[index][n] > 0)
                                                     {
                                                         scores += stuScores[index][n] * itemPersent;
-                                                   }
+                                                    }
                                                 }
                                                 n++;
                                             });
-                                            studentScore.Add((knowledgeName[k], Math.Round(scores,2), OnePoint, exam.subjects[0].id));                                           
+                                            studentScore.Add((knowledgeName[k], Math.Round(scores, 2), OnePoint, exam.subjects[0].id));
                                         }
-                                        studentScores.Add((studentScore,id));
+                                        studentScores.Add((studentScore, id));
                                     }
                                     for (int k = 0; k < knowledgeName.Count; k++)
                                     {
@@ -505,7 +506,7 @@ namespace TEAMModelOS.FunctionV4.CosmosDB
                                             n++;
                                         });
                                         double sc = stus.Count > 0 ? Math.Round(scores * 1.0 / stus.Count, 2) : 0;
-                                        blockScore.Add((knowledgeName[k], OnePoint,sc, exam.subjects[0].id));
+                                        blockScore.Add((knowledgeName[k], OnePoint, sc, exam.subjects[0].id));
                                         //blockScore.AddRange(pointScore);
                                     }
                                 }
@@ -520,12 +521,19 @@ namespace TEAMModelOS.FunctionV4.CosmosDB
                                     })
                                 });
                                 var subjectKnow = knoledge.Where(c => c.ptype.Equals(art.periodType)).Select(x => new { x.subId, x.knos }).ToList();
-                                List<(string subjectId, List<(string name, double score,double persent,double aver, List<string> dim)> bks)> bs = new();
+                                List<(string subjectId, List<(string name, double score, double persent, double aver, List<string> dim)> bks)> bs = new();
+                                List<(string subjectId, List<(string stuId, List<(string name, double score, double point, List<string> dim)> values)> stuBks)> sbs = new();
+                                List<(string name, double score, double av, string sId)> stuBlockScore = new();
                                 foreach (var bb in subjectKnow)
                                 {
                                     var kno1 = bls.Where(c => c.subjectId.Equals(bb.subId)).SelectMany(x => x.knoScore).ToList();
+                                    var stuInfo = studentScores.Select(c => new
+                                    {
+                                        c.stuId,
+                                        subInfo = c.studentScore.Where(x => x.subject.Equals(bb.subId)).ToList()
+                                    }).Where(z => z.subInfo.Count > 0).ToList();
                                     //var kno2 = dimensions.Where(c => c.subjectBind.Equals(bb.subId)).Select(x => new { x.dimension,x.blocks}).ToList();
-                                    List<(string name, double score,double aver)> blockScores = new();
+                                    List<(string name, double score, double aver)> blockScores = new();
                                     foreach (var k2 in bb.knos)
                                     {
                                         double bsc = 0;
@@ -538,22 +546,58 @@ namespace TEAMModelOS.FunctionV4.CosmosDB
                                                 avs += k3.aver;
                                             }
                                         }
-                                        blockScores.Add((k2.name, bsc,avs));
+                                        foreach (var stu in stuInfo)
+                                        {
+                                            double realScore = 0;
+                                            double realPoint = 0;
+                                            foreach (var subScore in stu.subInfo)
+                                            {
+                                                if (null != k2.kno && k2.kno.Contains(subScore.name))
+                                                {
+                                                    realScore = subScore.score;
+                                                    realPoint = subScore.point;
+                                                }                                             
+                                            }
+                                            stuBlockScore.Add((k2.name, realScore, realPoint, stu.stuId));
+                                        }
+                                        blockScores.Add((k2.name, bsc, avs));
                                     }
+
+
+                                    var stuBlock = stuBlockScore.GroupBy(x => (x.sId)).Select(c => new
+                                    {
+                                        stuId = c.Key,
+                                        block = c.ToList().GroupBy(b => b.name).Select(q => new
+                                        {
+                                            name = q.Key,
+                                            score = q.ToList().Sum(q => q.score),
+                                            point = q.ToList().Sum(q => q.av),
+                                            dimension = setting.dimensions.Where(s => s.blocks.Contains(q.Key)).Select(x => x.dimension).ToList()
+                                        })
+                                    }).ToList() ;
                                     var blk = blockScores.Select(x => new
                                     {
                                         x.name,
                                         x.score,
-                                        persent = Math.Round( x.aver > 0 ? x.aver / x.score : 0,2),
+                                        persent = Math.Round(x.aver > 0 ? x.aver / x.score : 0, 2),
                                         x.aver,
                                         dimension = setting.dimensions.Where(s => s.blocks.Contains(x.name)).Select(x => x.dimension)
                                     });
-                                    List<(string name, double score, double persent,double aver,List<string> dim)> bks = new();
+                                    List<(string name, double score, double persent, double aver, List<string> dim)> bks = new();
+                                    List<(string stuId, List<(string name, double score, double point, List<string> dim)> values)> stuBks = new();
                                     foreach (var bk in blk)
                                     {
-                                        bks.Add((bk.name, bk.score,bk.persent, bk.aver,bk.dimension.ToList()));
+                                        bks.Add((bk.name, bk.score, bk.persent, bk.aver, bk.dimension.ToList()));
+                                    }
+                                    foreach (var stuBlk in stuBlock) {
+                                        List<(string name, double score, double point, List<string> dim)> values = new();
+                                        foreach (var lk in stuBlk.block) {
+                                            values.Add((lk.name,lk.score,lk.point,lk.dimension));
+                                        }
+                                        stuBks.Add((stuBlk.stuId, values));
                                     }
                                     bs.Add((bb.subId, bks));
+                                    sbs.Add((bb.subId, stuBks));
                                 }
 
                                 var blocks = bs.Select(x => new
@@ -568,16 +612,31 @@ namespace TEAMModelOS.FunctionV4.CosmosDB
                                         z.dim
                                     })
                                 });
+                                var stuBlocks = sbs.Select(x => new { 
+                                    x.subjectId,
+                                    dim = x.stuBks.Select(z => new { 
+                                        z.stuId,
+                                        blk = z.values.Select(c => new { 
+                                            c.name,
+                                            c.score,
+                                            c.point,
+                                            c.dim
+                                        })
+                                    })
+                                });
                                 //获取维度得分率
-                                var dim = setting.dimensions.GroupBy(a => a.subjectBind).Select(x => new {
+                                var dim = setting.dimensions.GroupBy(a => a.subjectBind).Select(x => new
+                                {
                                     x.Key,
-                                    dim =  x.ToList().Select(c => new { 
+                                    dim = x.ToList().Select(c => new
+                                    {
                                         c.dimension,
-                                        persent = Math.Round( c.blocks.Select(z => new {
-                                            persent = Math.Round( bs.Where(z => z.subjectId.Equals(x.Key)).SelectMany(k => k.bks).Where(q => q.name.Equals(z)).Sum(h => h.score) > 0 ?
-                                            bs.Where(z => z.subjectId.Equals(x.Key)).SelectMany(k => k.bks).Where(q => q.name.Equals(z)).Sum(h => h.aver )  /
-                                            bs.Where(z => z.subjectId.Equals(x.Key)).SelectMany(k => k.bks).Where(q => q.name.Equals(z)).Sum(h => h.score) : 0 ,2)
-                                        }).Sum(o => o.persent) / c.blocks.Count,2)
+                                        persent = Math.Round(c.blocks.Select(z => new
+                                        {
+                                            persent = Math.Round(bs.Where(z => z.subjectId.Equals(x.Key)).SelectMany(k => k.bks).Where(q => q.name.Equals(z)).Sum(h => h.score) > 0 ?
+                                            bs.Where(z => z.subjectId.Equals(x.Key)).SelectMany(k => k.bks).Where(q => q.name.Equals(z)).Sum(h => h.aver) /
+                                            bs.Where(z => z.subjectId.Equals(x.Key)).SelectMany(k => k.bks).Where(q => q.name.Equals(z)).Sum(h => h.score) : 0, 2)
+                                        }).Sum(o => o.persent) / c.blocks.Count, 2)
                                     })
                                 });
 
@@ -662,15 +721,17 @@ namespace TEAMModelOS.FunctionV4.CosmosDB
                                             score = rs.subjectScores.Where(x => x.subjectId.Equals(sj.id)).FirstOrDefault().score,
                                             time = art.startTime,
                                             totalScore = 100,
-                                            id = sj.id,
-                                            block = blocks.Where(c => c.subjectId.Equals(sj.id))?.FirstOrDefault().dim,
+                                            id = sj.id,  
+                                            type = sj.id,
+                                            block = stuBlocks.Where(c => c.subjectId.Equals(sj.id)).SelectMany(x => x.dim).Where(z => z.stuId.Equals(rs.studentId)).FirstOrDefault().blk,
                                             kno = studentScores.Where(c => c.stuId.Equals(rs.studentId)).SelectMany(c => c.studentScore).Where(
-                                                p => p.subject.Equals(sj.id)).Select(z => new { 
-                                                z.name,
-                                                z.score,
-                                                z.point,
-                                                block = subjectKnow.Where(v => v.subId.Equals(sj.id)).SelectMany(k => k.knos).Where(c => null != c.kno && c.kno.Contains(z.name)).Select(x => x.name)
-                                            }),
+                                                p => p.subject.Equals(sj.id)).Select(z => new
+                                                {
+                                                    z.name,
+                                                    z.score,
+                                                    z.point,
+                                                    block = subjectKnow.Where(v => v.subId.Equals(sj.id)).SelectMany(k => k.knos).Where(c => null != c.kno && c.kno.Contains(z.name)).Select(x => x.name)
+                                                }),
                                             dim = dim.Where(c => c.Key.Equals(sj.id))?.FirstOrDefault().dim
                                         };
                                         index++;

+ 1 - 1
TEAMModelOS.FunctionV4/CosmosDB/TriggerExam.cs

@@ -507,7 +507,7 @@ namespace TEAMModelOS.FunctionV4
                                                     score = subScore.Where(c => c.subjectId.Equals(sj.id)).FirstOrDefault().score,
                                                     time = info.startTime,
                                                     totalScore = info.papers[index].point.Sum(),
-                                                    //type = sj.id
+                                                    type = sj.id
                                                 };
                                                 index++;
                                                 semesterData.itemScore.Add(item);

+ 17 - 1
TEAMModelOS.SDK/Models/Cosmos/Common/ArtEvaluation.cs

@@ -88,6 +88,22 @@ namespace TEAMModelOS.SDK.Models.Cosmos.Common
     public class Tasks {
         public string id { get; set; }
         public string quotaname { get; set; }
+        public long start { get; set; }
+        public long end { get; set; }
+        public string progress { get => progress; set {
+                long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                if (start > now)
+                {
+                    progress = "pending";
+                }
+                else if (now > start && now < end)
+                {
+                    progress = "going";
+                }
+                else {
+                    progress = "finish";
+                }    
+            }}
         public List<string> path { get; set; } = new List<string>();
         public List<Acs> task { get; set; } = new List<Acs>();
     }
@@ -104,7 +120,7 @@ namespace TEAMModelOS.SDK.Models.Cosmos.Common
         public int? isOrder { get; set; } = 0;
         public int? type { get; set; } = 0;
         public string workDesc { get; set; }
-        public long workEnd { get; set; }
+        public long workEnd { get; set; } 
       
     }
 }

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

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

+ 6 - 0
TEAMModelOS.SDK/Models/Cosmos/Student/StudentArtResult.cs

@@ -73,6 +73,12 @@ namespace TEAMModelOS.SDK.Models
         /// 分数
         /// </summary>
         public double score { get; set; } = -1;
+        public string name { get; set; }
+        public string des { get; set; }
+        //0 艺术作品 1 等级证书
+        public int artType { get; set; }
+        // 0 校级 1 区级 2 市级 3 省级 4 国家级
+        public int level { get; set; }
         /// <summary>
         /// 上传的文件
         /// </summary>

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

@@ -892,7 +892,7 @@ const LANG_EN_US = {
         assistants: 'Co-teachers (multiple)',
         tip1: 'Removing the lead teacher will clear the corresponding co-teacher',
         tip2: 'Please set the lead teacher first! ',
-        tip3: 'A maximum of 3 co-teachers can be designated!',
+        tip3: 'A maximum of 10 co-teachers can be designated!',
         normal: 'Normal and can be imported',
         tip4: 'The red mark indicates abnormal parsing of course data; please adjust the template data and reimport it. ',
         tip5: 'Data not marked in red can be imported properly.',

+ 1 - 1
TEAMModelOS/ClientApp/public/lang/zh-CN.js

@@ -892,7 +892,7 @@ const LANG_ZH_CN = {
         assistants: '协同教师(多选)',
         tip1: '移除执教老师将会清空对应的协同教师',
         tip2: '请先设置执教老师!',
-        tip3: '协同教师最多设置3人!',
+        tip3: '协同教师最多设置10人!',
         normal: '正常可导入',
         tip4: '标红的信息代表该条课程数据解析异常,可修改模板内数据后重新导入。',
         tip5: '未标红的数据代表可正常导入。',

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

@@ -892,7 +892,7 @@ const LANG_ZH_TW = {
         assistants: '協同教師(多位)',
         tip1: '移除主授課教師將會清空對應的協同教師',
         tip2: '請先設定主授課教師! ',
-        tip3: '協同教師最多指定3位! ',
+        tip3: '協同教師最多指定10位! ',
         normal: '正常可匯入',
         tip4: '標示紅色代表該筆課程資料解析異常,可修改範本內的資料後重新匯入。 ',
         tip5: '未標示紅色的資料代表可正常匯入。 ',

+ 1 - 1
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;

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

@@ -2,6 +2,10 @@
   <div class="create-art-container">
     <vuescroll>
       <div class="create-form-wrap">
+        <span style="margin-bottom: 20px;display: block;cursor: pointer;color: #2D8CF0;" @click="goBack">
+          <Icon type="md-arrow-back" />
+          <span>{{ $t('evaluation.index.backList') }}</span>
+        </span>
         <!-- 上一步 -->
         <div v-show="step > 0" class="step-handler last-step" @click="lastStep()">
           <span class="step-icon-wrap">
@@ -299,6 +303,9 @@ export default {
     }
   },
   methods: {
+    goBack(){
+      this.$router.go(-1)
+    },
     test() {
       console.log(this.settingDetail, this.getZYData())
     },

+ 12 - 8
TEAMModelOS/ClientApp/src/view/coursemgt/NewCusMgt.vue

@@ -301,7 +301,9 @@
 						scope: "school",
 						grant_type: "list",
 						periodId: this.$store.state.user.curPeriod.id,
-						code: this.$store.state.userInfo.schoolCode
+						code: this.$store.state.userInfo.schoolCode,
+						year: this.filterYear,
+						semesterId: this.curPeriod.semesters[this.filterSemetsterIndex].id
 					})
 					.then((res) => {
 						this.originCourseList = res.courseBases
@@ -596,16 +598,14 @@
 				this.filterGrade = -1
 				this.sortValue = 'grade'
 				this.canEmitSelectChange = false
+				this.onlyShowConfigCourse = false
 			},	
 			onFilterConfig(val){
-				console.error(val)
 				if(!this.canEmitSelectChange) return
 				let gradeCond = this.filterGrade > -1
 				let subjectCond = this.filterSubjectIndex > -1
 				let nowList = this.originCourseList.filter((i) => (gradeCond ? i.grade === this.filterGrade : true) && (subjectCond ? i.subject.id === this.curPeriod.subjects[this.filterSubjectIndex].id : true));
-				console.error(nowList)
 				this.courseList = !val ? this._.cloneDeep(nowList) : nowList.filter(i => i.count > 0)
-				console.error(this.courseList)
 				if(this.courseList.length){
 					this.onFilterSort(this.sortValue)
 					this.onCourseClick(this.courseList[0], 0);
@@ -627,7 +627,7 @@
 				if(!this.canEmitSelectChange) return
 				if (val || val === 0) {
 					let subjectCond = this.filterSubjectIndex > -1
-					this.courseList = this.originCourseList.filter((i) => i.grade === val && (subjectCond ? i.subject.id === this.curPeriod.subjects[this.filterSubjectIndex].id : true));
+					this.courseList = this.originCourseList.filter((i) => i.grade === val && (subjectCond ? i.subject.id === this.curPeriod.subjects[this.filterSubjectIndex].id : true) && (this.onlyShowConfigCourse ? i.count > 0 : true));
 					if (this.courseList.length) {
 						this.onCourseClick(this.courseList[0], 0);
 					} else {
@@ -641,7 +641,7 @@
 				if(!this.canEmitSelectChange) return
 				if (val || val === 0) {
 					let gradeCond = this.filterGrade > -1
-					this.courseList = this.originCourseList.filter((i) => i.subject.id === this.curPeriod.subjects[val].id && (gradeCond ? i.grade === this.filterGrade : true));
+					this.courseList = this.originCourseList.filter((i) => i.subject.id === this.curPeriod.subjects[val].id && (gradeCond ? i.grade === this.filterGrade : true) && (this.onlyShowConfigCourse ? i.count > 0 : true));
 					if (this.courseList.length) {
 						this.onCourseClick(this.courseList[0], 0);
 					} else {
@@ -662,8 +662,12 @@
 					return
 				}
 				this.isLoading = false;
-				this.courseList = this._.cloneDeep(this.originCourseList);
-				this.onCourseClick(this.courseList[0], 0);
+				if(this.onlyShowConfigCourse){
+					this.onFilterConfig(true)
+				}else{
+					this.courseList =  this._.cloneDeep(this.originCourseList);
+					this.onCourseClick(this.courseList[0], 0);
+				}
 			},
 			/* 课程操作 */
 			doAction(action) {

+ 2 - 2
TEAMModelOS/ClientApp/src/view/coursemgt/components/AddTask.vue

@@ -119,9 +119,9 @@
                     val.assistants = []
                     return
                 }
-                if(val.assistants.length > 3){
+                if(val.assistants.length > 10){
                     this.$Message.warning(this.$t('newCusMgt.tip3'))
-                    val.assistants = val.assistants.slice(0,3)
+                    val.assistants = val.assistants.slice(0,10)
                 }else{
                     this.$set(this.allGroups,index,val)
                 }

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

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

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

@@ -462,7 +462,9 @@ export default {
     },
 
     applyJoin() {
-      this.applyModal = true
+      // this.applyModal = true C481 学校管理--调整“申请建立学校”及“申请成为管理员”为跳转官网地址
+      let url = localStorage.local === 'zh-cn' ? 'https://www.habook.com.cn/event.php?act=view&id=46' : localStorage.local === 'zh-tw' ? 'https://www.habook.com/zh-tw/event.php?act=view&id=158' : 'https://www.habook.com/en/event.php?act=view&id=158'
+      window.open(url)
     },
 
     onSelectSchool(val, item) {

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

@@ -119,7 +119,7 @@
                     <div id="profile-pop">
                         <div class="profile-name">
                             <p>{{ userInfo.name }}</p>
-                            <p>ID:{{ userInfo.studentId }}</p>
+                            <p>ID:{{ userInfo.sub }}</p>
                             <template v-if="userInfo.scope != 'tmduser' && user.studentProfile.classinfo">
                                 <p>{{ $t("ae.ae6") }}:{{ user.studentProfile.classinfo.name }}</p>
                             </template>

+ 2 - 1
TEAMModelOS/ClientApp/src/view/teachcontent/index.vue

@@ -857,7 +857,7 @@ export default {
     delFileBatch() {
       if (this.selections.length == 0) {
         if (this.showType) {
-          this.$Message.warning(this.$t('teachContent.delBatchTips1'))
+          this.$Message.warning(this.$t('teachContent.delBatchTips2'))
         } else {
           this.$Message.warning(this.$t('teachContent.delBatchTips2'))
         }
@@ -897,6 +897,7 @@ export default {
               }
               this.fileListShow = this._.cloneDeep(this.fileList[this.activeType])
               this.$Message.success(this.$t('teachContent.props2'))
+              this.selections = []
               //如果是从最近删除,需要更新其他类型列表
               if (this.activeType == 'recent') {
                 this.selections.forEach(item => {

+ 130 - 38
TEAMModelOS/Controllers/Analysis/ArtAnalysisController.cs

@@ -179,10 +179,16 @@ namespace TEAMModelOS.Controllers.Analysis
                     examResults.Add(item);
                 }
                 List<KeyValuePair<string, List<(string name, double score, double aver)>>> pointPersent = new();
-                (KeyValuePair<string, List<string>> key1, KeyValuePair<string, List<string>> key2, KeyValuePair<string, List<(string name, double score, double average)>> key3, KeyValuePair<string, List<(string name, double score)>> key4) = DoKnowledgePoint(examResults[0], info);
+                List<KeyValuePair<string, List<(string name, double score, double point, string sId)>>> stuPersent = new();
+                (KeyValuePair<string, List<string>> key1, KeyValuePair<string, List<string>> key2, KeyValuePair<string, List<(string name, double score, double average)>> key3,
+                    KeyValuePair<string, List<(string name, double score)>> key4, KeyValuePair<string, List<(string name, double score, double point, string cId)>> key5,
+                    KeyValuePair<string, List<(string name, double score, double point, string sId)>> key6) = DoKnowledgePoint(examResults[0], info);
                 KeyValuePair<string, List<(string id, double sta, double pass, string stu)>> key = DoSubjectScatter(examResults[0]);
                 pointPersent.Add(key3);
+                stuPersent.Add(key6);
                 List<(string name, double score, double av)> blockScore = new();
+                List<(string name, double score, double av, string sId)> stuBlockScore = new();
+                List<(string name, double score, double av, string cId)> claBlockScore = new();
                 foreach (var block in knos)
                 {
                     double sc = 0;
@@ -198,8 +204,50 @@ namespace TEAMModelOS.Controllers.Analysis
                             }
                         }
                     }
+                    foreach (var (name, score, point, sId) in key6.Value)
+                    {
+                        double realScore = 0;
+                        double realPoint = 0;
+                        if (null != block.kno && block.kno.Contains(name))
+                        {
+                            realScore = score;
+                            realPoint = point;
+                        }
+                        stuBlockScore.Add((block.name, realScore, realPoint, sId));
+                    }
+                    foreach (var (name, score, point, cId) in key5.Value)
+                    {
+                        double realScore = 0;
+                        double realPoint = 0;
+                        if (null != block.kno && block.kno.Contains(name))
+                        {
+                            realScore = score;
+                            realPoint = point;
+                        }
+                        claBlockScore.Add((block.name, realScore, realPoint, cId));
+                    }
                     blockScore.Add((block.name, sc, av));
                 }
+                var stuBlock = stuBlockScore.GroupBy(x => x.sId).Select(z => new
+                {
+                    z.Key,
+                    block = z.ToList().GroupBy(c => c.name).Select(k => new
+                    {
+                        k.Key,
+                        score = k.ToList().Sum(p => p.score),
+                        point = k.ToList().Sum(p => p.av)
+                    })
+                });
+                var claBlock = claBlockScore.GroupBy(x => x.cId).Select(z => new
+                {
+                    z.Key,
+                    block = z.ToList().GroupBy(c => c.name).Select(k => new
+                    {
+                        k.Key,
+                        score = k.ToList().Sum(p => p.score),
+                        point = k.ToList().Sum(p => p.av)
+                    })
+                });
                 var blk = blockScore.Select(x => new
                 {
                     x.name,
@@ -208,6 +256,39 @@ namespace TEAMModelOS.Controllers.Analysis
                     dimension = setting.dimensions.Where(s => s.blocks.Contains(x.name)).Select(x => x.dimension)
                 });
                 //获取维度得分率
+                List<(string stuId, double score, double point, string dim)> stuDims = new();
+                List<(string claId, double score, double point, string dim)> claDims = new();
+                foreach (var dimm in setting.dimensions)
+                {
+                    double dimScore = 0;
+                    double dimPoint = 0;
+                    if (dimm.subjectBind.Equals(subjectId.GetString()))
+                    {
+                        foreach (var stuDim in stuBlock)
+                        {
+                            foreach (var dd in stuDim.block)
+                            {
+                                if (dimm.blocks.Contains(dd.Key))
+                                {
+                                    dimScore += dd.score;
+                                    dimPoint += dd.point;
+                                }
+                            }
+                            stuDims.Add((stuDim.Key, dimScore, dimPoint, dimm.dimension));
+                        }
+                        foreach (var claDim in claBlock) {
+                            foreach (var dd in claDim.block)
+                            {
+                                if (dimm.blocks.Contains(dd.Key))
+                                {
+                                    dimScore += dd.score;
+                                    dimPoint += dd.point;
+                                }
+                            }
+                            claDims.Add((claDim.Key, dimScore, dimPoint, dimm.dimension));
+                        }
+                    }
+                }
                 var dim = setting.dimensions.Where(q => q.subjectBind.Equals(subjectId.GetString())).Select(x => new
                 {
                     x.dimension,
@@ -219,6 +300,7 @@ namespace TEAMModelOS.Controllers.Analysis
                     }).Sum(o => o.persent) / x.blocks.Count, 2)
                 });
 
+
                 var kno = key4.Value.Select(x => new
                 {
                     x.name,
@@ -237,8 +319,25 @@ namespace TEAMModelOS.Controllers.Analysis
                     key.Value.Where(c => c.id.Equals(s.sIds)).FirstOrDefault().sta,
                     key.Value.Where(c => c.id.Equals(s.sIds)).FirstOrDefault().pass,
                     key.Value.Where(c => c.id.Equals(s.sIds)).FirstOrDefault().stu,
+                    kno = key6.Value.Where(c => c.sId.Equals(s.sIds)).Select(z => new
+                    {
+                        z.name,
+                        persent = Math.Round(z.point > 0 ? z.score / z.point : 0, 2),
+                        block = knos.Where(v => null != v.kno && v.kno.Contains(z.name)).Select(x => x.name)
+                    }),
+                    block = stuBlock.Where(c => c.Key.Equals(s.sIds)).FirstOrDefault().block.Select(x => new
+                    {
+                        name = x.Key,
+                        persent = Math.Round(x.point > 0 ? x.score / x.point : 0, 2)
+                    }),
+                    dim = stuDims.Where(c => c.stuId.Equals(s.sIds)).Select(z => new
+                    {
+                        name = z.dim,
+                        persent = Math.Round(z.point > 0 ? z.score / z.point : 0, 2)
+                    })
+
                 });
-                List<(string cId, double sc, double max, double min, double excellent, double pass)> clsInfo = new();
+                List<(string cId, double sc, double max, double min, double excellent, double pass,double count)> clsInfo = new();
                 foreach (var cls in classLists)
                 {
                     double classTotal = 0;
@@ -256,7 +355,7 @@ namespace TEAMModelOS.Controllers.Analysis
                     double ex = Math.Round(excellentc / scores.Count, 2);
                     double passc = scores.Where(s => s >= 60).Count();
                     double pa = Math.Round(passc / scores.Count, 2);
-                    clsInfo.Add((cls.id, classTotal / scores.Count, maxc, minc, ex, pa));
+                    clsInfo.Add((cls.id, classTotal / scores.Count, maxc, minc, ex, pa, scores.Count));
                 }
                 //班级信息
                 var cInfo = clsInfo.Select(x => new
@@ -268,6 +367,22 @@ namespace TEAMModelOS.Controllers.Analysis
                     x.min,
                     x.excellent,
                     x.pass,
+                    kno = key5.Value.Where(c => c.cId.Equals(x.cId)).Select(z => new
+                    {
+                        z.name,
+                        persent = Math.Round(z.point > 0 ? z.score / x.count / z.point : 0, 2),
+                        block = knos.Where(v => null != v.kno && v.kno.Contains(z.name)).Select(x => x.name)
+                    }),
+                    block = claBlock.Where(c => c.Key.Equals(x.cId)).FirstOrDefault().block.Select(z => new
+                    {
+                        name = z.Key,
+                        persent = Math.Round(z.point > 0 ? z.score / x.count/ z.point : 0, 2)
+                    }),
+                    dim = claDims.Where(c => c.claId.Equals(x.cId)).Select(z => new
+                    {
+                        name = z.dim,
+                        persent = Math.Round(z.point > 0 ? z.score / x.count / z.point : 0, 2)
+                    }),
                     examResults[0].classes.Where(c => c.id.Equals(x.cId)).FirstOrDefault().gradeId
                 });
                 //年级信息
@@ -372,7 +487,8 @@ namespace TEAMModelOS.Controllers.Analysis
             }
         }
         //获取知识点得分率
-        private static (KeyValuePair<string, List<string>>, KeyValuePair<string, List<string>>, KeyValuePair<string, List<(string name, double score, double average)>>, KeyValuePair<string, List<(string name, double score)>>) DoKnowledgePoint(ExamResult exam, ExamInfo info)
+        private static (KeyValuePair<string, List<string>>, KeyValuePair<string, List<string>>, KeyValuePair<string, List<(string name, double score, double average)>>,
+            KeyValuePair<string, List<(string name, double score)>>, KeyValuePair<string, List<(string name, double score, double point, string cId)>>, KeyValuePair<string, List<(string name, double score, double point, string sId)>>) DoKnowledgePoint(ExamResult exam, ExamInfo info)
         {
 
             HashSet<string> knowledge = new HashSet<string>();
@@ -407,7 +523,7 @@ namespace TEAMModelOS.Controllers.Analysis
             }
             else
             {
-                return (default, default, default, default);
+                return (default, default, default, default, default, default);
             }
             point = info.papers[index].point;
             result = exam.studentScores;
@@ -438,8 +554,8 @@ namespace TEAMModelOS.Controllers.Analysis
             //学生得分情况
             List<double> Score = new List<double>();
             List<(string name, double score, double average)> pointScore = new();
-            List<(string name, double score,string cId)> classInfo = new();
-            List<(string name, double score, string sId)> stuInfo = new();
+            List<(string name, double score, double point, string cId)> classInfo = new();
+            List<(string name, double score, double point, string sId)> stuInfo = new();
             List<(string name, double score)> pointTScore = new();
             for (int k = 0; k < knowledgeName.Count; k++)
             {
@@ -463,15 +579,16 @@ namespace TEAMModelOS.Controllers.Analysis
                                 scores += exam.studentScores[index][n] * itemPersent;
                                 stuScore = exam.studentScores[index][n] * itemPersent;
                             }
-                            stuInfo.Add((knowledgeName[k], stuScore, id));
+                            stuInfo.Add((knowledgeName[k], stuScore, OnePoint, id));
                         }
-                        foreach (var cla in exam.classes) {
+                        foreach (var cla in exam.classes)
+                        {
                             double classScores = 0;
                             for (int i = cla.range[0]; i <= cla.range[1]; i++)
                             {
                                 classScores += exam.studentScores[i][n] * itemPersent;
                             }
-                            classInfo.Add((knowledgeName[k],classScores,cla.id));
+                            classInfo.Add((knowledgeName[k], classScores, OnePoint, cla.id));
                         }
                     }
                     n++;
@@ -495,39 +612,14 @@ namespace TEAMModelOS.Controllers.Analysis
 
             }
 
-            // 获取班级学生知识点得分
-           /* foreach (var cla in exam.classes)
-            {
-                List<(string cId, string kno, double score)> classInfo = new();
-                double classScores = 0;
-                for (int k = 0; k < knowledgeName.Count; k++)
-                {
-                    double OnePoint = 0;
-                    int n = 0;
-                    info.papers[index].knowledge.ForEach(kno =>
-                    {
-                        if (kno.Contains(knowledgeName[k]))
-                        {
-                            var itemPersent = kno.Count > 0 ? 1 / Convert.ToDouble(kno.Count) : 0;
-                            OnePoint += point[n] * itemPersent;
-                            for (int i = cla.range[0]; i < cla.range[1]; i++)
-                            {
-                                classScores += exam.studentIds[i][n] * itemPersent;
-                            }
-                        }
-                        n++;
-                    });
-                    classInfo.Add((cla.id, knowledgeName[k], classScores));
-                }
-
-            }*/
-
             KeyValuePair<string, List<string>> key1 = new(exam.subjectId, knowledgeName);
             KeyValuePair<string, List<string>> key2 = new(exam.subjectId, per);
             KeyValuePair<string, List<(string name, double score, double average)>> key3 = new(exam.subjectId, pointScore);
             KeyValuePair<string, List<(string name, double score)>> key4 = new(exam.subjectId, pointTScore);
+            KeyValuePair<string, List<(string name, double score, double point, string cId)>> key5 = new(exam.subjectId, classInfo);
+            KeyValuePair<string, List<(string name, double score, double point, string sId)>> key6 = new(exam.subjectId, stuInfo);
             //KeyValuePair<string, List<double>> key3 = new KeyValuePair<string, List<double>>(exam.subjectId, allPer);          
-            return (key1, key2, key3, key4);
+            return (key1, key2, key3, key4, key5, key6);
         }
         private KeyValuePair<string, List<(string id, double sta, double pass, string stu)>> DoSubjectScatter(ExamResult e)
         {

+ 221 - 0
TEAMModelOS/Controllers/Client/AClassONEController.cs

@@ -1,5 +1,6 @@
 using Azure.Cosmos;
 using Azure.Storage.Blobs.Models;
+using DocumentFormat.OpenXml.Drawing.Charts;
 using HTEXLib.COMM.Helpers;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Http;
@@ -21,9 +22,11 @@ using System.Text;
 using System.Text.Json;
 using System.Threading.Tasks;
 using TEAMModelOS.Models;
+using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.Extension;
 using TEAMModelOS.SDK.Models;
+using TEAMModelOS.SDK.Models.Cosmos.Common;
 using TEAMModelOS.SDK.Services;
 using static TEAMModelOS.SDK.Services.BlobService;
 namespace TEAMModelOS.Controllers
@@ -299,6 +302,212 @@ namespace TEAMModelOS.Controllers
         }
 
 
+
+        /// <summary>
+        /// 获取当前学生参与的活动列表
+        /// </summary>
+        /// <param name="json"></param>
+        /// <returns></returns>
+        [ProducesDefaultResponseType]
+        [HttpPost("find-children-activity")]
+#if !DEBUG
+        [Authorize(Roles = "AClassONE")]
+#endif
+        public async Task<IActionResult> getActivity(JsonElement request) {
+            try {
+                //if (!request.TryGetProperty("studentId", out JsonElement stuId)) return BadRequest();
+                if (!request.TryGetProperty("classId", out JsonElement classId)) return BadRequest();
+                if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();//学校编码
+
+                var client = _azureCosmos.GetCosmosClient();
+                StringBuilder stringBuilder = new($"select value(c) from c where (c.status<>404 or IS_DEFINED(c.status) = false )");
+                string continuationToken = string.Empty;
+                string token = default;
+                if (!string.IsNullOrWhiteSpace($"{classId}"))
+                {
+                    stringBuilder.Append($" and array_contains(c.classIds,'{classId}')");
+                }             
+                stringBuilder.Append("order by c.createTime desc");
+                //是否需要进行分页查询,默认不分页
+                bool iscontinuation = false;
+                if (request.TryGetProperty("token", out JsonElement token_1))
+                {
+                    token = token_1.GetString();
+                    iscontinuation = true;
+                };
+                //默认不指定返回大小
+                int? topcout = null;
+                if (request.TryGetProperty("count", out JsonElement jcount))
+                {
+                    if (!jcount.ValueKind.Equals(JsonValueKind.Undefined) && !jcount.ValueKind.Equals(JsonValueKind.Null) && jcount.TryGetInt32(out int data))
+                    {
+                        topcout = data;
+                    }
+                }
+
+                List<ArtEvaluation> arts = new();
+                await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(queryText: stringBuilder.ToString(), continuationToken: token, requestOptions: new QueryRequestOptions() { MaxItemCount = topcout, PartitionKey = new PartitionKey($"Art-{code}") }))
+                {
+
+                    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())
+                        {
+                            arts.Add(obj.ToObject<ArtEvaluation>());
+                        }
+                    }
+                    if (iscontinuation)
+                    {
+                        continuationToken = item.GetContinuationToken();
+                        break;
+                    }
+                }
+                arts = arts.Where((x, i) => arts.FindIndex(z => z.id == x.id) == i).ToList();
+                return Ok(new { arts });
+            } catch (Exception e) {
+                await _dingDing.SendBotMsg($"OS,{_option.Location},art/find-children-activity()\n{e.Message}\n{e.StackTrace}\n", GroupNames.醍摩豆服務運維群組);
+                return BadRequest("500错误");
+            }
+        }
+
+        [ProducesDefaultResponseType]
+        [HttpPost("upload-all")]
+#if !DEBUG
+        [Authorize(Roles = "AClassONE")]
+#endif
+        public async Task<IActionResult> UploadAll(JsonElement element)
+        {
+            try
+            {
+                var client = _azureCosmos.GetCosmosClient();
+                if (!element.TryGetProperty("artId", out JsonElement artId)) return BadRequest();
+                if (!element.TryGetProperty("classId", out JsonElement classId)) return BadRequest();
+                if (!element.TryGetProperty("acId", out JsonElement acId)) return BadRequest();
+                if (!element.TryGetProperty("subject", out JsonElement subject)) return BadRequest();
+                if (!element.TryGetProperty("code", out JsonElement school)) return BadRequest();
+                if (!element.TryGetProperty("attachments", out JsonElement stus)) return BadRequest();
+                List<stuFiles> stuFiles = stus.ToObject<List<stuFiles>>();
+                List<string> value = new List<string>();
+                await foreach (var s in stuTask(stuFiles, client, school.GetString(), artId.GetString(), classId.GetString(), acId.GetString(), subject.GetString()))
+                {
+                    if (s.code == 1)
+                    {
+                        value.Add(s.value);
+                    }
+                }
+                if (value.Count > 0)
+                {
+                    return Ok(new { code = 1, msg = "学生ID上传异常", value = value });
+                }
+                else
+                {
+                    return Ok(new { code = 0 });
+                }
+            }
+            catch (Exception ex)
+            {
+                await _dingDing.SendBotMsg($"OS,{_option.Location},art/uploadAll()\n{ex.Message}\n{ex.StackTrace}\n", GroupNames.醍摩豆服務運維群組);
+                return Ok(new { code = 500, msg = ex.Message });
+            }
+
+        }
+        private async IAsyncEnumerable<(int code, string value)> stuTask(List<stuFiles> stuFiles, CosmosClient client, string school, string artId, string classId, string acId, string subject)
+        {
+
+            List<string> classIds = new List<string> { classId };
+            foreach (var request in stuFiles)
+            {
+                string value = "";
+                int code = 0;
+                try
+                {
+                    long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                    StudentArtResult artResult;
+                    ArtEvaluation art;                                      
+                    string rId = string.Format("{0}{1}{2}", school, "-", request.stuId);
+                    //首先根据大ID获取整个活动得内容
+                    var aresponse = await client.GetContainer("TEAMModelOS", "Common").ReadItemStreamAsync(artId, new PartitionKey($"Art-{school}"));
+                    if (aresponse.Status == 200)
+                    {
+                        using var json = await JsonDocument.ParseAsync(aresponse.ContentStream);
+                        art = json.ToObject<ArtEvaluation>();
+                        var response = await client.GetContainer("TEAMModelOS", "Student").ReadItemStreamAsync(rId, new PartitionKey($"ArtResult-{artId}"));
+                        if (response.Status == 200)
+                        {
+                            using var json_1 = await JsonDocument.ParseAsync(response.ContentStream);
+                            artResult = json_1.ToObject<StudentArtResult>();
+                            List<Attachment> files = new();
+                            files = request.attachments;
+                            //bool flage = artResult.results.Exists(a => a.taskId == request.acId);
+                            artResult.results.ForEach(a =>
+                            {
+                                if (a.taskId == acId)
+                                {
+                                    a.name = request.name;
+                                    a.des = request.des;
+                                    a.artType = request.artType;
+                                    a.level = request.level;
+                                    a.files = files;
+                                }
+                            });
+                            await client.GetContainer("TEAMModelOS", "Student").ReplaceItemAsync(artResult, artResult.id, new PartitionKey($"{artResult.code}"));
+                        }
+                        else
+                        {
+                            artResult = new StudentArtResult
+                            {
+                                id = rId,
+                                pk = "ArtResult",
+                                code = $"ArtResult-{artId}",
+                                studentId = request.stuId,
+                                //picture = picture,
+                                studentName = request.name,
+                                school = school,
+                                userType = request.userType,
+                                artId = artId,
+                                classIds = classIds,
+                            };
+                            foreach (var qIds in art.settings)
+                            {
+                                foreach (var task in qIds.task)
+                                {
+                                    ArtQuotaResult quotaResult = new()
+                                    {
+                                        quotaId = qIds.id,
+                                        quotaName = qIds.quotaname,
+                                        quotaType = (int)task.type,
+                                        subjectId = task.subject,
+                                        taskId = task.acId
+                                    };
+                                    if (!string.IsNullOrEmpty(quotaResult.taskId))
+                                    {
+                                        if (quotaResult.taskId.Equals(acId))
+                                        {
+                                            quotaResult.name = request.name;
+                                            quotaResult.des = request.des;
+                                            quotaResult.artType = request.artType;
+                                            quotaResult.level = request.level;
+                                            quotaResult.files = request.attachments;
+                                        }
+                                    }
+                                    artResult.results.Add(quotaResult);
+                                }
+                            }
+
+                            await client.GetContainer("TEAMModelOS", "Student").CreateItemAsync(artResult, new PartitionKey($"{artResult.code}"));
+                        }
+                    }
+                }
+                catch (Exception e)
+                {
+                    value = request.stuId;
+                    code = 1;
+                }
+                yield return (code, value);
+            }
+        }
+
         private async Task<(int code, WeChatPhone phone)> GetWeChatPhoneNumber(string phoneCode) 
         {
             var wxappid = _configuration.GetValue<string>("HaBookAuth:WXMiniAPP:appid");
@@ -377,6 +586,18 @@ namespace TEAMModelOS.Controllers
             public string? errmsg { get; set; }
             public WeChatPhone? phone_info { get; set; }
         }
+        private class stuFiles
+        {
+            public string stuId { get; set; }
+            public int userType { get; set; }
+            public string name { get; set; }
+            public string des { get; set; }
+            //0 艺术作品 1 等级证书
+            public int artType { get; set; }
+            // 0 校级 1 区级 2 市级 3 省级 4 国家级
+            public int level { get; set; } = -1;
+            public List<Attachment> attachments { get; set; } = new List<Attachment>();
+        }
 
     }
 }

+ 16 - 3
TEAMModelOS/Controllers/Common/ArtController.cs

@@ -363,7 +363,7 @@ namespace TEAMModelOS.Controllers.Common
                 try
                 {
                     long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-                    ArtRecord record = new()
+                    /*ArtRecord record = new()
                     {
                         school = school,
                         stuId = request.stuId,
@@ -375,7 +375,7 @@ namespace TEAMModelOS.Controllers.Common
                         createTime = now,
                         code = "ArtRecord",
                         attachments = request.attachments
-                    };
+                    };*/
                     StudentArtResult artResult;
                     ArtEvaluation art;
                     List<string> classIds = new();
@@ -393,7 +393,7 @@ namespace TEAMModelOS.Controllers.Common
                     {
                         record = await client.GetContainer("TEAMModelOS", "Student").ReplaceItemAsync(record, record.id, new PartitionKey($"{record.code}"));
                     }*/
-                    string rId = string.Format("{0}{1}{2}", record.school, "-", record.stuId);
+                    string rId = string.Format("{0}{1}{2}", school, "-", request.stuId);
                     //首先根据大ID获取整个活动得内容
                     var aresponse = await client.GetContainer("TEAMModelOS", "Common").ReadItemStreamAsync(artId, new PartitionKey($"Art-{school}"));
                     if (aresponse.Status == 200)
@@ -412,6 +412,10 @@ namespace TEAMModelOS.Controllers.Common
                             {
                                 if (a.taskId == acId)
                                 {
+                                    a.name = request.name;
+                                    a.des = request.des;
+                                    a.artType = request.artType;
+                                    a.level = request.level;
                                     a.files = files;
                                 }
                             });
@@ -448,6 +452,10 @@ namespace TEAMModelOS.Controllers.Common
                                     {
                                         if (quotaResult.taskId.Equals(acId))
                                         {
+                                            quotaResult.name = request.name;
+                                            quotaResult.des = request.des;
+                                            quotaResult.artType = request.artType;
+                                            quotaResult.level = request.level;
                                             quotaResult.files = request.attachments;
                                         }
                                     }
@@ -1171,6 +1179,11 @@ namespace TEAMModelOS.Controllers.Common
             public string stuId { get; set; }
             public int userType { get; set; }
             public string name { get; set; }
+            public string des { get; set; }
+            //0 艺术作品 1 等级证书
+            public int  artType { get; set; }
+            // 0 校级 1 区级 2 市级 3 省级 4 国家级
+            public int level { get; set; } = -1;
             public List<Attachment> attachments { get; set; } = new List<Attachment>();
         }
     }