Browse Source

Merge branch 'develop' into jj/addfix

JAELYS 3 years ago
parent
commit
daf447d206
60 changed files with 4061 additions and 595 deletions
  1. 2 1
      TEAMModelBI/ClientApp/public/index.html
  2. 10 1
      TEAMModelBI/ClientApp/src/api/index.js
  3. BIN
      TEAMModelBI/ClientApp/src/assets/img/thirdparty-index.png
  4. 14 0
      TEAMModelBI/ClientApp/src/router/index.js
  5. 8 8
      TEAMModelBI/ClientApp/src/view/areaServe/setthird.vue
  6. 555 0
      TEAMModelBI/ClientApp/src/view/thirdparty/details.vue
  7. 400 0
      TEAMModelBI/ClientApp/src/view/thirdparty/index.vue
  8. 12 12
      TEAMModelOS.FunctionV4/HttpTrigger/ScsYxptApis.cs
  9. 3 3
      TEAMModelOS.FunctionV4/TEAMModelOS.FunctionV4.csproj
  10. 2 1
      TEAMModelOS.SDK/Models/Cosmos/Teacher/Research/TeacherTrain.cs
  11. 4 1
      TEAMModelOS.SDK/Models/Service/Third/Sc/ScYxptModel.cs
  12. 5 3
      TEAMModelOS.SDK/Models/Service/Third/ThirdApisService.cs
  13. 198 90
      TEAMModelOS.SDK/Models/Service/Third/ThirdService.cs
  14. 1 1
      TEAMModelOS.SDK/TEAMModelOS.SDK.csproj
  15. 1 4
      TEAMModelOS/ClientApp/public/index.html
  16. 3 1
      TEAMModelOS/ClientApp/public/lang/en-US.js
  17. 3 1
      TEAMModelOS/ClientApp/public/lang/zh-CN.js
  18. 3 1
      TEAMModelOS/ClientApp/public/lang/zh-TW.js
  19. BIN
      TEAMModelOS/ClientApp/src/assets/dashboard/student/award1.png
  20. BIN
      TEAMModelOS/ClientApp/src/assets/dashboard/student/award2.png
  21. BIN
      TEAMModelOS/ClientApp/src/assets/dashboard/student/award3.png
  22. BIN
      TEAMModelOS/ClientApp/src/assets/dashboard/student/sport1.png
  23. BIN
      TEAMModelOS/ClientApp/src/assets/dashboard/student/sport2.png
  24. BIN
      TEAMModelOS/ClientApp/src/assets/dashboard/student/sport3.png
  25. BIN
      TEAMModelOS/ClientApp/src/assets/dashboard/student/sport4.png
  26. BIN
      TEAMModelOS/ClientApp/src/assets/dashboard/student/sport5.png
  27. BIN
      TEAMModelOS/ClientApp/src/assets/iconfont/NUMBER.ttf
  28. 2 0
      TEAMModelOS/ClientApp/src/boot-app.js
  29. 120 0
      TEAMModelOS/ClientApp/src/components/dashboard/student/BaseArtCircle.vue
  30. 258 0
      TEAMModelOS/ClientApp/src/components/dashboard/student/BaseLine.vue
  31. 120 0
      TEAMModelOS/ClientApp/src/components/dashboard/student/BaseMusicCircle.vue
  32. 170 0
      TEAMModelOS/ClientApp/src/components/dashboard/student/BaseProgressBar.vue
  33. 227 0
      TEAMModelOS/ClientApp/src/components/dashboard/student/BaseRadar.vue
  34. 170 0
      TEAMModelOS/ClientApp/src/components/dashboard/student/BaseSportRadar.vue
  35. 109 0
      TEAMModelOS/ClientApp/src/components/dashboard/student/BaseStuProfile.vue
  36. 194 0
      TEAMModelOS/ClientApp/src/components/dashboard/student/BaseWordCloud.vue
  37. 2 2
      TEAMModelOS/ClientApp/src/components/student-web/ClassRecord/ClassRecord.vue
  38. 2 2
      TEAMModelOS/ClientApp/src/components/student-web/ClassRecord/newClassRecord.vue
  39. 5 0
      TEAMModelOS/ClientApp/src/css/site.css
  40. 2 6
      TEAMModelOS/ClientApp/src/locale/index.js
  41. 5 0
      TEAMModelOS/ClientApp/src/router/routes.js
  42. 2 2
      TEAMModelOS/ClientApp/src/static/Global.js
  43. 20 0
      TEAMModelOS/ClientApp/src/utils/blobTool.js
  44. 12 1
      TEAMModelOS/ClientApp/src/utils/js-fn.js
  45. 6 0
      TEAMModelOS/ClientApp/src/view/ability/Review.vue
  46. 1 1
      TEAMModelOS/ClientApp/src/view/classrecord/ClassRecord.vue
  47. 27 4
      TEAMModelOS/ClientApp/src/view/classrecord/ClassRecordNew.vue
  48. 14 12
      TEAMModelOS/ClientApp/src/view/classrecord/eventchart/Receive.vue
  49. 255 0
      TEAMModelOS/ClientApp/src/view/classrecord/eventchart/WrkCmp.vue
  50. 3 1
      TEAMModelOS/ClientApp/src/view/dashboard/Index.vue
  51. 405 0
      TEAMModelOS/ClientApp/src/view/dashboard/Student.less
  52. 169 65
      TEAMModelOS/ClientApp/src/view/dashboard/Student.vue
  53. BIN
      TEAMModelOS/ClientApp/src/view/dashboard/circle.png
  54. 24 5
      TEAMModelOS/ClientApp/src/view/mycourse/MyCourse.vue
  55. 1 2
      TEAMModelOS/ClientApp/src/view/mycourse/student/Student.vue
  56. 25 25
      TEAMModelOS/Controllers/Third/Sc/ScApiController.cs
  57. 1 1
      TEAMModelOS/Controllers/Third/Sc/ScDataInitController.cs
  58. 435 303
      TEAMModelOS/Controllers/Third/Sc/ScDataPushController.cs
  59. 46 30
      TEAMModelOS/Controllers/XTest/FixDataController.cs
  60. 5 5
      TEAMModelOS/TEAMModelOS.csproj

+ 2 - 1
TEAMModelBI/ClientApp/public/index.html

@@ -16,7 +16,8 @@
 
 <body>
     <noscript>
-      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
+      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled.
+          Please enable it to continue.</strong>
     </noscript>
     <div id="app"></div>
     <!-- built files will be auto injected   -->

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

@@ -1,4 +1,4 @@
-import { post } from '@/until/http.js'
+import { post, fetch } from '@/until/http.js'
 export default {
     //钉钉登录获取状态
     Dinglogin(data) {
@@ -344,5 +344,14 @@ export default {
     //企业移除关联学校
     enterpriseRemoveSchool(data) {
         return post('/business/del-companysc', data)
+    },
+
+    //获取地址location
+    getlocation(key, location) {
+        return fetch('https://restapi.amap.com/v3/ip?key=' + key + '&ip=' + location)
+    },
+    //获取天气的API
+    getWeather(key, location) {
+        return fetch('https://devapi.qweather.com/v7/weather/now?location=' + location + '&key=' + key)
     }
 }

BIN
TEAMModelBI/ClientApp/src/assets/img/thirdparty-index.png


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

@@ -176,6 +176,20 @@ const routes = [{
         name: "login-thirdparty",
         component: () => require.ensure([], (require) => require(`@/view/thirdparty/login.vue`))
     },
+    //第三方首页
+    {
+        path: "/thirdpartys",
+        name: "thirdpartys",
+        component: () => require.ensure([], (require) => require(`@/view/thirdparty/index.vue`)),
+        // children: [{
+        //     name: "index",
+        //     path: "index",
+        //     permission: "",
+        //     roles: [],
+        //     isShow: true,
+        //     component: () => require.ensure([], (require) => require(`@/view/thirdparty/index.vue`))
+        // }]
+    },
 ];
 const router = createRouter({
     history: createWebHashHistory(),

+ 8 - 8
TEAMModelBI/ClientApp/src/view/areaServe/setthird.vue

@@ -19,13 +19,13 @@
                   <el-input v-model="setform.name" @input="saveState=true" v-if="PowerShow" />
                   <el-input v-model="setform.name" disabled v-else />
                 </el-form-item>
-                <el-form-item label="信用代码" prop="code">
-                  <el-input v-model="setform.credit" @input="saveState=true" v-if="PowerShow" />
-                  <el-input v-model="setform.credit" disabled v-else />
+                <el-form-item label="信用代码" prop="credit">
+                  <!-- <el-input v-model="setform.credit" @input="saveState=true"/> -->
+                  <el-input v-model="setform.credit" disabled />
                 </el-form-item>
                 <el-form-item label="联系方式" prop="mobile">
-                  <el-input v-model="setform.mobile" @input="saveState=true" v-if="PowerShow" />
-                  <el-input v-model="setform.mobile" disabled v-else />
+                  <!-- <el-input v-model="setform.mobile" @input="saveState=true" v-if="PowerShow" /> -->
+                  <el-input v-model="setform.mobile" disabled />
                 </el-form-item>
                 <el-form-item label="企业logo">
                   <div class="upload-logo">
@@ -58,8 +58,8 @@
                 </el-form-item> -->
                 <el-form-item label="企业秘钥" class="token-box">
                   <div class="tokenbox">
-                    <el-input v-model="setform.token" :rows="2" type="textarea" @input="saveState=true" v-if="PowerShow" />
-                    <el-input v-model="setform.token" :rows="2" type="textarea" disabled v-else />
+                    <!-- <el-input v-model="setform.token" :rows="2" type="textarea" @input="saveState=true" v-if="PowerShow" /> -->
+                    <el-input v-model="setform.token" :rows="2" type="textarea" disabled />
                   </div>
                   <div class="generatebox" v-if="PowerShow">
                     <el-button type="primary" size="small" @click="againGenerate('token')">重新生成秘钥</el-button>
@@ -180,7 +180,7 @@ export default {
         { required: true, message: '企业名称不能为空', trigger: 'blur' },
         { min: 3, max: 50, message: '企业名称不能少于3个字符或大于50字符', trigger: 'blur' },
       ],
-      code: [
+      credit: [
         { required: true, message: '信用代码不能为空', trigger: 'blur' },
       ],
       mobile: [

+ 555 - 0
TEAMModelBI/ClientApp/src/view/thirdparty/details.vue

@@ -0,0 +1,555 @@
+<template>
+  <div class="details-thirdparty">
+    <div class="setboxs">
+      <div class="backs">
+        <el-button type="primary" size="small" @click="backs">返回</el-button>
+      </div>
+      <div class="setbox-content">
+        <el-tabs v-model="activeName" class="demo-tabs">
+          <el-tab-pane label="基础信息" name="first">
+            <div class="set-basics">
+              <p class="set-basics-title">
+              <div class="set-basics-title-name">基础信息</div>
+              <div class="set-basics-save" v-show="saveState === true" @click="saveSet">
+                <el-button type="primary" size="small">保存</el-button>
+              </div>
+              </p>
+              <div class="set-basics-form">
+                <el-form :model="setform" label-width="80px" :rules="formVerify">
+                  <el-form-item label="企业名称" prop="name">
+                    <el-input v-model="setform.name" @input="saveState=true" v-if="PowerShow" />
+                    <el-input v-model="setform.name" disabled v-else />
+                  </el-form-item>
+                  <el-form-item label="信用代码" prop="credit">
+                    <!-- <el-input v-model="setform.credit" @input="saveState=true"/> -->
+                    <el-input v-model="setform.credit" disabled />
+                  </el-form-item>
+                  <el-form-item label="联系方式" prop="mobile">
+                    <!-- <el-input v-model="setform.mobile" @input="saveState=true" v-if="PowerShow" /> -->
+                    <el-input v-model="setform.mobile" disabled />
+                  </el-form-item>
+                  <el-form-item label="企业logo">
+                    <div class="upload-logo">
+                      <el-upload class="avatar-uploader" :headers="uploadHeader" accept=".png,.jpeg,.jpg" action="/blob/upload-public" :disabled='uploadState' :show-file-list="false" :before-upload="changeBadge" :on-success="success" :on-error="handleUpdErr" v-if="PowerShow">
+                        <el-image v-if="setform.imageUrl" :src="setform.imageUrl" class="avatar" fit="contain" />
+                        <i v-else class="el-icon-plus avatar-uploader-icon"></i>
+                        <div class="changebadge" v-show="setform.imageUrl">
+                          <svg class="delete-logo" aria-hidden="true" @click="deltelogos">
+                            <use xlink:href="#icon-shanchu3"></use>
+                          </svg>
+                        </div>
+                      </el-upload>
+                      <div class="avatar-uploader" v-else>
+                        <el-image v-if="setform.imageUrl" :src="setform.imageUrl" class="avatar" fit="contain" />
+                      </div>
+                      <div class="upload-type">格式必须为:png/jpeg/jpg</div>
+                    </div>
+                  </el-form-item>
+                  <el-form-item label="企业邮箱">
+                    <el-input v-model="setform.email" @input="saveState=true" v-if="PowerShow" />
+                    <el-input v-model="setform.email" disabled v-else />
+                  </el-form-item>
+                  <!-- <el-form-item label="企业密码" class="token-box">
+                  <div class="tokenbox">
+                    <el-input v-model="setform.pwd" :rows="2" type="textarea" @input="saveState=true" />
+                  </div>
+                  <div class="generatebox">
+                    <el-button type="primary" size="small" @click="againGenerate('pwd')">重新生成密码</el-button>
+                  </div>
+                </el-form-item> -->
+                  <el-form-item label="企业秘钥" class="token-box">
+                    <div class="tokenbox">
+                      <!-- <el-input v-model="setform.token" :rows="2" type="textarea" @input="saveState=true" v-if="PowerShow" /> -->
+                      <el-input v-model="setform.token" :rows="2" type="textarea" disabled />
+                    </div>
+                    <div class="generatebox" v-if="PowerShow">
+                      <el-button type="primary" size="small" @click="againGenerate('token')">重新生成秘钥</el-button>
+                    </div>
+                  </el-form-item>
+                  <el-form-item label="官网地址">
+                    <el-input v-model="setform.domain" @input="saveState=true" v-if="PowerShow" />
+                    <el-input v-model="setform.domain" disabled v-else />
+                  </el-form-item>
+                  <el-form-item label="通知地址">
+                    <el-input v-model="setform.webhook" class="notification-input" @input="saveState=true" v-if="PowerShow" />
+                    <el-input v-model="setform.webhook" class="notification-input" disabled v-else />
+                    <!-- <el-button class="mt-2" @click.prevent="addDomain()">添加通知地址</el-button> -->
+                  </el-form-item>
+                </el-form>
+              </div>
+            </div>
+          </el-tab-pane>
+          <el-tab-pane label="关联学校" name="second">
+            <div class="set-basics">
+              <p class="set-basics-title">
+              <div class="set-basics-title-name">关联学校</div>
+              <!-- <div class="set-basics-save">
+              <el-button type="primary" size="small" @click="addschoolRelevancy=true" v-if="PowerShow">
+                <svg class="addrelevancy-icon" aria-hidden="true">
+                  <use xlink:href="#icon-addLink-fill"></use>
+                </svg>
+                添加关联学校
+              </el-button>
+            </div> -->
+              <div class="set-basics-save remove" v-if="removeArr.length !==0">
+                <el-button type="danger" size="small" @click="removeSchools('','batch')">
+                  <svg class="addrelevancy-icon" aria-hidden="true">
+                    <use xlink:href="#icon-addLink-fill"></use>
+                  </svg>
+                  移除选中学校
+                </el-button>
+              </div>
+              </p>
+              <div class="relevancyschool-list">
+                <el-table :data="tableData" height="83vh" style="width: 100%" empty-text="暂无关联学校" v-if="tableData.length !==0" @selection-change="removeSchoolList">
+                  <!-- <el-table-column label="状态" type="selection" /> -->
+                  <el-table-column prop="index" label="编号" type="index" sortable align="center" />
+                  <el-table-column label="校徽" align="center">
+                    <template #default="scope">
+                      <el-image style="width: 60px; height: 60px" :src="scope.row.picture" fit="fill"></el-image>
+                    </template>
+                  </el-table-column>
+                  <el-table-column prop="name" label="名称" align="center" />
+                  <el-table-column prop="school" label="简码" align="center" />
+                  <el-table-column label="操作" align="center" v-if="PowerShow">
+                    <template #default="scope">
+                      <el-button class="deletebtns" type="danger" size="small" @click="removeSchools(scope.row,'alone')">移除学校
+                      </el-button>
+                    </template>
+                  </el-table-column>
+                </el-table>
+                <div v-else class="notdatas"><span>暂无关联学校</span></div>
+              </div>
+            </div>
+          </el-tab-pane>
+        </el-tabs>
+      </div>
+      <!--添加关联学校弹窗-->
+      <div class="addschool-relevancy">
+        <el-dialog v-model="addschoolRelevancy" title="学校列表" width="25%">
+          <div>
+            <el-input v-model="serachValues" placeholder="搜索 学校名称/学校ID" class="input-with-select" size="small" clearable>
+              <template #prepend>
+                <svg class="addrelevancy-icon" aria-hidden="true">
+                  <use xlink:href="#icon-sousuo3-copy"></use>
+                </svg>
+              </template>
+            </el-input>
+          </div>
+          <el-table ref="multipleTableRef" :data="schoolLists" style="width: 100%" height="42vh" @selection-change="handleSelectionChange" empty-text="暂无相关搜索学校">
+            <el-table-column label="校徽">
+              <template #default="scope">
+                <el-image style="width: 40px; height: 40px" :src="scope.row.picture" fit="fill"></el-image>
+              </template>
+            </el-table-column>
+            <el-table-column property="name" label="名称" />
+            <el-table-column property="id" label="简码" />
+            <el-table-column label="状态" type="selection" />
+          </el-table>
+          <template #footer>
+            <span class="dialog-footer">
+              <el-button @click="addschoolRelevancy = false">取消</el-button>
+              <el-button type="primary" @click="correlationSchool">关联选中学校</el-button>
+            </span>
+          </template>
+        </el-dialog>
+      </div>
+      <!--添加关联学校弹窗end-->
+    </div>
+  </div>
+</template>
+<script>
+import { ref, reactive, getCurrentInstance, watch } from 'vue'
+import { ElMessage, ElMessageBox } from 'element-plus'
+import { Search } from '@element-plus/icons-vue'
+export default {
+  props: {
+    clickDetails: {
+      default: () => { },
+    }
+  },
+  components: {
+    Search
+  },
+  setup (props, context) {
+    console.log(props, context, '父传值')
+    let { proxy } = getCurrentInstance()
+    // let PowerShow = proxy.$access.identifyPosition(JSON.parse(localStorage.getItem('id_token')))
+    let PowerShow = true
+    let activeName = ref('first')
+    let setform = ref({
+      name: '',
+      credit: '',
+      mobile: '',
+      imageUrl: '',
+      email: '',
+      token: '',
+      domain: '',
+      webhook: '',
+    })
+    let formVerify = ref({
+      name: [
+        { required: true, message: '企业名称不能为空', trigger: 'blur' },
+        { min: 3, max: 50, message: '企业名称不能少于3个字符或大于50字符', trigger: 'blur' },
+      ],
+      credit: [
+        { required: true, message: '信用代码不能为空', trigger: 'blur' },
+      ],
+      mobile: [
+        { required: true, message: '联系方式不能为空', trigger: 'blur' },
+        { min: 6, max: 11, message: '联系方式需6至11位电话号码', trigger: 'blur' },
+      ]
+    })
+    let saveState = ref(false)
+    let tableData = ref([])
+    let schoolLists = ref([])
+    let original = ref([])
+    let timer = ref('')
+    let addschoolRelevancy = ref(false)
+    let checkedSchool = ref([])
+    let removeArr = ref([])
+    let serachValues = ref('')
+    let uploadState = ref(false)
+    let uploadHeader = ref({})
+    function backs () {
+      context.emit('backState', 'default')
+    }
+    function uploadInt () {
+      let token = JSON.parse(localStorage.getItem('id_token'))
+      uploadHeader.value['x-auth-authtoken'] = token
+    }
+    function changeBadge (file) {
+      console.log(file)
+      if (file.type == 'image/png' || file.type == 'image/jpeg' || file.type == 'image/jpg') {
+        return true
+      } else {
+        ElMessage.error('文件类型错误,请重新上传')
+        return false
+      }
+    }
+    function success (response, file, fileList) {
+      // this.schoolSetting.picture = response.url
+      console.log(response, file, fileList, '上传成功的返回')
+      setform.value.imageUrl = response.url
+      uploadState.value = true
+    }
+    function handleUpdErr () {
+      ElMessage.error('企业头像修改失败')
+    }
+    function deltelogos () {
+      setform.value.imageUrl = ''
+      setTimeout(function () {
+        uploadState.value = false
+      }, 500);
+    }
+    //获取企业相关联的学校列表
+    function relevanceSchools () {
+      // let companyID = setform.value.rowKey
+      let companyID = '94e4e8de-57cf-4ef9-b2ac-8e48fcb8028a'
+      let data = { id: companyID }
+      proxy.$api.relevanceSchool(data).then((res) => {
+        console.log(res, '关联学校的列表')
+        res.state === 200 ? tableData.value = res.busSchools : ''
+        getschoolList()
+      }).catch((err) => {
+        ElMessage.error('关联学校列表获取失败')
+      })
+    }
+    //获取学校列表进行关联
+    function getschoolList () {
+      proxy.$api.getschoolCorrelation({}).then((res) => {
+        console.log(res, '学校的列表')
+        res.state === 200 ? (schoolLists.value = res.applySchools, original.value = res.applySchools) : ''
+      }).catch((err) => {
+        ElMessage.error('学校列表获取失败')
+      })
+    }
+    //勾选的关联学校
+    function handleSelectionChange (val) {
+      console.log(val, '选中')
+      checkedSchool.value = val
+    }
+    //企业关联学校
+    function correlationSchool () {
+      let schoolList = checkedSchool.value
+      let companyID = setform.value.rowKey
+      let datas = { id: companyID, schools: schoolList }
+      proxy.$api.correlationSchool(datas).then((res) => {
+        console.log(res, '结果')
+        res.state === 200 ? (ElMessage.success('关联成功'), relevanceSchools(), addschoolRelevancy = false) : ''
+      }).catch((error) => {
+        ElMessage.error('关联失败')
+      })
+    }
+    //重新生成秘匙或密码
+    function againGenerate (type) {
+      let data = { id: setform.value.rowKey, resetType: type }
+      proxy.$api.produceCipher(data).then((res) => {
+        if (res.state === 200) {
+          type === 'pwd' ? (setform.value.pwd = res.busConfigs[0].pwd, ElMessage.success('密码生成成功')) : type === 'token' ? (setform.value.token = res.busConfigs[0].token, ElMessage.success('秘钥生成成功')) : ''
+        }
+      }).catch((error) => {
+        ElMessage.error('重新生成失败,API异常')
+      })
+    }
+    //移除学校选中
+    function removeSchoolList (val) {
+      removeArr.value = val
+    }
+    //企业内移除关联学校
+    function removeSchools (data, type) {
+      let removeList = []
+      data && type === 'alone' ? removeList.push(data.school) : ''
+      type === 'batch' ? removeArr.value.forEach((item) => { removeList.push(item.school) }) : ''
+      let text = ''
+      if (removeArr.value.length > 0 && !data) {
+        for (let i in removeArr.value) {
+          if (i < 6) {
+            text === '' ? text = removeArr.value[i].name : text = text + ',' + removeArr.value[i].name
+          } else {
+            text.indexOf('... 等') !== -1 ? '' : text = text + '... 等'
+          }
+        }
+      } else if (data) {
+        text = data.name
+      }
+      console.log(text, '名字')
+      let datainfo = { id: setform.value.rowKey, schools: removeList }
+      ElMessageBox.confirm(`您确定要移除 ${text} 学校与 当前企业的关联 吗? 请慎重操作!`, '移除关联学校', {
+        confirmButtonText: proxy.$t(`commonMsg.confirm`),
+        cancelButtonText: proxy.$t(`commonMsg.closes`),
+        type: 'warning',
+        center: true,
+      }).then(() => {
+        proxy.$api.enterpriseRemoveSchool(datainfo).then((res) => {
+          if (res.state === 200) {
+            ElMessage.success('移除成功')
+            relevanceSchools()
+          }
+        })
+      })
+    }
+    function debounce (fn, wait) {
+      if (timer.value !== null) {
+        clearTimeout(timer.value)
+      }
+      timer.value = setTimeout(fn, wait)
+    }
+    function personnelSearch () {
+      let arr = schoolLists.value
+      let newArr = arr.filter((item) => {
+        // return (item.name && item.name.includes(filterText.value)) || (item.mobile && item.mobile.includes(filterText.value)) || (item.mobile && item.mobile.tmdId.includes(filterText.value))
+        return item.name.includes(serachValues.value)
+      })
+      schoolLists.value = newArr
+    }
+    //保存基础设置
+    function saveSet () {
+      console.log(setform.value, '保存相关')
+      let datas = setform.value
+      let saveData = { PartitionKey: datas.partitionKey, RowKey: datas.rowKey, name: datas.name, credit: datas.credit, picture: datas.imageUrl, mobile: datas.mobile, email: datas.email, domain: datas.domain, webhook: datas.webhook }
+      proxy.$api.setThirdparty(saveData).then((res) => {
+        res.state === 200 ? (ElMessage.success('保存成功'), context.emit('backState', 'list')) : ElMessage.error('保存失败')
+      }).catch((error) => {
+        ElMessage.error('API异常,保存失败')
+      })
+    }
+    watch(
+      props,
+      (newsProps) => {
+        console.log(newsProps, '传来的值')
+        newsProps.clickDetails ? (setform.value = newsProps.clickDetails, setform.value.imageUrl = newsProps.clickDetails.picture) : ''
+      },
+      { immediate: true, deep: true }
+    )
+    watch(serachValues, (newdata) => {
+      if (newdata.trim().length !== 0) {
+        debounce(personnelSearch, 500)
+      } else {
+        schoolLists.value = original.value
+      }
+    })
+    relevanceSchools()
+    uploadInt()
+    return {
+      activeName,
+      setform,
+      formVerify,
+      backs,
+      saveState,
+      tableData,
+      addschoolRelevancy,
+      getschoolList,
+      schoolLists,
+      checkedSchool,
+      handleSelectionChange,
+      correlationSchool,
+      againGenerate,
+      removeSchoolList,
+      removeSchools,
+      removeArr,
+      serachValues,
+      timer,
+      original,
+      saveSet,
+      changeBadge,
+      uploadState,
+      success,
+      handleUpdErr,
+      uploadHeader,
+      deltelogos,
+      PowerShow
+    }
+  },
+}
+</script>
+<style scoped>
+.details-thirdparty {
+  width: 100%;
+  padding: 0%;
+  position: relative;
+}
+.setboxs {
+  width: 100%;
+  padding: 0%;
+  position: relative;
+}
+.backs {
+  position: absolute;
+  top: 0.5%;
+  right: 0.5%;
+  z-index: 99999;
+}
+.setbox-content {
+  width: 100%;
+}
+.set-basics {
+  width: 100%;
+  height: 93vh;
+  border: 1px solid #ccc;
+  padding: 0.5%;
+  margin: 0 auto;
+  overflow: auto;
+}
+.set-basics-title {
+  text-align: left;
+  margin-bottom: 25px;
+  padding-left: 1%;
+  margin-top: 1%;
+  font-size: 16px;
+  font-weight: bold;
+}
+.set-basics-form {
+  width: 45%;
+  padding: 0% 0.5%;
+}
+.upload-logo {
+  width: 100%;
+}
+.avatar-uploader {
+  width: 128px;
+  height: 128px;
+  line-height: 128px;
+  display: block;
+  text-align: center;
+}
+.upload-type {
+  text-align: left;
+  font-size: 12px;
+  color: #bdc3c7;
+  line-height: 20px;
+}
+.set-basics-save,
+.set-basics-title-name {
+  display: inline-block;
+  vertical-align: top;
+}
+.set-basics-save {
+  float: right;
+}
+.relevancyschool-list {
+  width: 100%;
+  height: 67vh;
+  padding: 0% 2%;
+}
+.notdatas {
+  margin: 30vh auto 0 auto;
+  font-size: 22px;
+  font-weight: bold;
+  color: #bdc3c7;
+}
+.addrelevancy-icon {
+  width: 1.2em;
+  height: 1.2em;
+  vertical-align: -0.2em;
+  fill: currentColor;
+  overflow: hidden;
+  margin-right: 5px;
+}
+.generatebox,
+.tokenbox {
+  display: inline-block;
+  vertical-align: top;
+}
+.token-box {
+  position: relative;
+}
+.tokenbox {
+  width: 100%;
+}
+.generatebox {
+  position: absolute;
+  top: 5px;
+  margin-left: 2%;
+}
+.remove {
+  margin-right: 2%;
+}
+.changebadge:hover {
+  opacity: 1;
+  background-color: rgba(200, 214, 229, 0.9);
+}
+.changebadge {
+  width: 100%;
+  height: 100%;
+  position: absolute;
+  top: 0px;
+  left: 0px;
+  opacity: 0;
+}
+.delete-logo {
+  width: 25px;
+  height: 25px;
+  overflow: hidden;
+  position: absolute;
+  top: 45%;
+  left: 41%;
+}
+.details-thirdparty .avatar-uploader {
+  border: 1px dashed #ccc;
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  overflow: hidden;
+}
+</style>
+<style>
+.set-basics-form .el-upload {
+  width: 128px;
+  height: 128px;
+}
+.set-basics-form .el-form-item__content {
+  text-align: left;
+}
+.addschool-relevancy .el-dialog__body {
+  height: 50vh;
+  padding: 15px;
+}
+.details-thirdparty .el-form-item {
+  margin-bottom: 23px;
+}
+.upload-logo .avatar {
+  width: 100%;
+  height: 100%;
+}
+</style>

+ 400 - 0
TEAMModelBI/ClientApp/src/view/thirdparty/index.vue

@@ -0,0 +1,400 @@
+<template>
+  <div class="loggedbox" v-if="showModel ==='default'">
+    <div class="header-basics">
+      <div class="basics-content">
+        <div class="basics-left">
+          <div class="basics-left-title">早上好,XXX,欢迎来到第三方合作平台</div>
+          <div class="basics-left-weather">{{place.province}}{{place.city}} 天气:{{place.weather}}
+            温度:{{place.temp}}摄氏度 风向:{{place.windDir}} 风力:{{place.windScale}} 空气湿度:{{place.humidity}} 能见度:{{place.vis}}公里</div>
+          <div class="basics-left-content">
+            <div class="basics-content-row">
+              <div class="basics-text">
+                <div class="basics-text-content">
+                  <el-icon>
+                    <Sort />
+                  </el-icon>
+                  今日数据数(123456)
+                </div>
+              </div>
+              <div class="basics-text">
+                <div class="basics-text-content">
+                  <el-icon>
+                    <OfficeBuilding />
+                  </el-icon>
+                  目前管理企业(3)
+                </div>
+              </div>
+              <div class="basics-text">
+                <div class="basics-text-content">
+                  <el-icon>
+                    <School />
+                  </el-icon>
+                  企业关联学校(59)
+                </div>
+              </div>
+            </div>
+          </div>
+          <div class="account">
+            <div class="account-box"><span>醍摩豆账户:</span><span>1456325879</span></div>
+          </div>
+        </div>
+        <img :src="bgUrl" class="bg-img" />
+      </div>
+    </div>
+    <div class="center-entrance">
+      <div class="center-entrance-box">
+        <div class="center-header">
+          <div class="center-header-text"><span>快捷入口</span></div>
+        </div>
+        <div class="center-content">
+          <div class="center-content-row">
+            <div class="entrancebox">
+              <div class="entrancebox-item">
+                <div class="entrancebox-item-icons">
+                  <el-icon :size="26">
+                    <OfficeBuilding />
+                  </el-icon>
+                </div>
+                <p>企业管理</p>
+              </div>
+            </div>
+            <div class="entrancebox">
+              <div class="entrancebox-item">
+                <div class="entrancebox-item-icons schools">
+                  <el-icon :size="26">
+                    <School />
+                  </el-icon>
+                </div>
+                <p>关联学校</p>
+              </div>
+            </div>
+            <div class="entrancebox">
+              <div class="entrancebox-item">
+                <div class="entrancebox-item-icons test">
+                  <el-icon :size="26">
+                    <School />
+                  </el-icon>
+                </div>
+                <p>XXXX</p>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="bottombox">
+      <div class="bottombox-content">
+        <div class="bottombox-content-header">
+          <div class="header-title"><span>关联企业列表</span></div>
+        </div>
+        <div class="school-List">
+          <div class="school-List-item" @click="showModel='details'">
+            <div class="school-List-item-img">
+              <el-image style="" :src="qiyebg" fit="fill" />
+            </div>
+            <div class="enterprise-item-content">
+              <p class="enterprise-item-content-name">醍摩豆(成都)信息技术有限公司</p>
+              <p class="enterprise-item-content-code"><span>信用代码:</span><span>91510104MA62L1YP8J</span></p>
+            </div>
+          </div>
+          <div class="school-List-item" @click="showModel='details'">
+            <div class="school-List-item-img">
+              <el-image style="" :src="qiyebg" fit="fill" />
+            </div>
+            <div class="enterprise-item-content">
+              <p class="enterprise-item-content-name">醍摩豆(成都)信息技术有限公司</p>
+              <p class="enterprise-item-content-code"><span>信用代码:</span><span>91510104MA62L1YP8J</span></p>
+            </div>
+          </div>
+          <div class="school-List-item" @click="showModel='details'">
+            <div class="school-List-item-img">
+              <el-image style="" :src="qiyebg" fit="fill" />
+            </div>
+            <div class="enterprise-item-content">
+              <p class="enterprise-item-content-name">醍摩豆(成都)信息技术有限公司</p>
+              <p class="enterprise-item-content-code"><span>信用代码:</span><span>91510104MA62L1YP8J</span></p>
+            </div>
+          </div>
+          <div class="school-List-item" @click="showModel='details'">
+            <div class="school-List-item-img">
+              <el-image style="" :src="qiyebg" fit="fill" />
+            </div>
+            <div class="enterprise-item-content">
+              <p class="enterprise-item-content-name">醍摩豆(成都)信息技术有限公司</p>
+              <p class="enterprise-item-content-code"><span>信用代码:</span><span>91510104MA62L1YP8J</span></p>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+  <div class="detailsbox" v-else-if="showModel ==='details'">
+    <Detalis @backState="changestate"></Detalis>
+  </div>
+</template>
+<script>
+import { Sort, OfficeBuilding, School } from '@element-plus/icons-vue'
+import { ref, getCurrentInstance, watch } from 'vue'
+import Detalis from './details.vue'
+export default {
+  components: {
+    Sort, OfficeBuilding, School, Detalis
+  },
+  setup () {
+    let bgUrl = require('@/assets/img/thirdparty-index.png')
+    let qiyebg = require('@/assets/img/tmd_logo.png')
+    let showModel = ref('default')
+    let { proxy } = getCurrentInstance()
+    let place = ref({
+      province: '',
+      city: '',
+      weather: '',
+      temp: '',
+      windDir: '',
+      windScale: '',
+      humidity: '',
+      vis: '',
+    })
+    let cityCode = ref()
+    function changestate (val) {
+      val === 'default' ? showModel.value = 'default' : ''
+    }
+    function getlocaltion () {
+      proxy.$api.getlocation('753b06a025d7fe62bdca1ff453149bfc', '182.139.161.4').then((res) => {
+        console.log(res)
+        cityCode.value = res.rectangle.split(';')
+        cityCode.value = cityCode.value[0]
+        console.log(cityCode.value)
+        place.value.province = res.province
+        place.value.city = res.city
+        test(cityCode.value)
+      })
+    }
+    function test (parameter) {
+      proxy.$api.getWeather('fc2fef828bb343a5aa135a64eba49cac', parameter)
+        .then(res => {
+          console.log(res, '6666666')
+          place.value.weather = res.now.text
+          place.value.temp = res.now.temp
+          place.value.windDir = res.now.windDir
+          place.value.windScale = res.now.windScale
+          place.value.humidity = res.now.humidity
+          place.value.vis = res.now.vis
+        })
+        .catch(error => {
+          console.log(error)
+        })
+    }
+    getlocaltion()
+    return { bgUrl, qiyebg, showModel, changestate, test, getlocaltion, cityCode, place }
+  },
+}
+</script>
+<style scoped>
+.loggedbox {
+  width: 100%;
+  height: 100vh;
+  background: #f0f2f5;
+}
+.header-basics,
+.center-entrance,
+.bottombox {
+  padding: 12px 16px;
+}
+.basics-content {
+  height: 260px;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  color: #777;
+  box-sizing: border-box;
+  background-color: #fff;
+  border-radius: 2px;
+  padding: 26px 30px;
+  overflow: hidden;
+  box-shadow: 0 0 7px 1px rgb(0 0 0 / 3%);
+}
+.basics-left {
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  width: 40%;
+}
+.basics-left-title {
+  font-size: 22px;
+  color: #343844;
+}
+.basics-left-weather {
+  font-size: 16px;
+  color: #6b7687;
+  margin-top: 8%;
+}
+.basics-left-content {
+  margin-top: 18px;
+  color: #6b7687;
+  width: 100%;
+  align-items: center;
+}
+.basics-content-row {
+  display: flex;
+  flex-wrap: wrap;
+  position: relative;
+  box-sizing: border-box;
+  padding: 10px 0;
+}
+.basics-text {
+  display: block;
+  max-width: 33.3333333333%;
+  flex: 0 0 33.3333333333%;
+}
+.basics-text-content {
+  display: flex;
+  align-items: center;
+}
+.bg-img {
+  height: 600px;
+  width: 35%;
+  margin-top: 28px;
+}
+.center-entrance-box {
+  box-sizing: border-box;
+  background-color: #fff;
+  border-radius: 2px;
+  height: auto;
+  padding: 15px 30px;
+  overflow: hidden;
+  box-shadow: 0 0 7px 1px rgb(0 0 0 / 3%);
+}
+.center-header {
+  padding: 0;
+  border-bottom: none;
+}
+.center-header-text,
+.header-title {
+  padding-bottom: 20px;
+  border-bottom: 1px solid #e8e8e8;
+  font-size: 16px;
+}
+.center-content {
+  padding-bottom: 0px;
+}
+.center-content-row {
+  padding: 10px 0px;
+  display: flex;
+  flex-wrap: wrap;
+  position: relative;
+  box-sizing: border-box;
+  justify-content: space-between;
+}
+.entrancebox {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  text-align: center;
+  color: #333;
+  padding-left: 10px;
+  padding-right: 10px;
+  max-width: 16.6666666667%;
+  flex: 0 0 16.6666666667%;
+}
+.entrancebox-item {
+  padding: 10px 20px;
+  /* margin-top: -16px;
+  margin-bottom: -16px; */
+  border-radius: 4px;
+  transition: all 0.2s;
+  cursor: pointer;
+  height: auto;
+  text-align: center;
+}
+.entrancebox-item-icons {
+  width: 50px;
+  height: 50px !important;
+  border-radius: 8px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  margin: 0 auto;
+  background-color: rgba(255, 156, 110, 0.3);
+  margin-top: 10px;
+}
+.schools {
+  background-color: rgba(105, 192, 255, 0.3);
+}
+.test {
+  background-color: rgba(179, 127, 235, 0.3);
+}
+.bottombox-content {
+  box-sizing: border-box;
+  background-color: #fff;
+  border-radius: 2px;
+  height: 45vh;
+  padding: 26px 30px;
+  overflow: hidden;
+  box-shadow: 0 0 7px 1px rgb(0 0 0 / 3%);
+}
+.entrancebox-item p {
+  margin-bottom: 0px;
+}
+.entrancebox-item:hover {
+  box-shadow: rgba(189, 195, 199, 0.7) 0px 3px 8px;
+}
+.school-List {
+  width: 100%;
+  height: 35vh;
+  overflow: auto;
+  display: flex;
+  justify-content: flex-start;
+  flex-wrap: wrap;
+}
+.school-List-item {
+  width: 25%;
+  padding: 1%;
+  border: 1px solid #ccc;
+  margin-top: 1%;
+  margin-left: 4%;
+  margin-right: 4%;
+  cursor: pointer;
+}
+.school-List-item:hover {
+  box-shadow: rgba(0, 0, 0, 0.16) 0px 10px 36px 0px,
+    rgba(0, 0, 0, 0.06) 0px 0px 0px 1px;
+}
+.school-List-item-img {
+  width: 30%;
+  margin: 0 auto;
+}
+.enterprise-item-content {
+  text-align: center;
+}
+.enterprise-item-content-name {
+  font-size: 16px;
+  font-weight: bold;
+  margin-top: 1%;
+}
+.enterprise-item-content-code {
+  font-size: 14px;
+  color: #7f8c8d;
+}
+.detailsbox {
+  width: 100%;
+  padding: 0% 1%;
+}
+.account {
+  display: flex;
+}
+.account-box {
+  width: 32%;
+}
+::-webkit-scrollbar {
+  width: 7px; /*滚动条宽度*/
+  height: 7px; /*滚动条高度*/
+  background-color: white;
+}
+/*定义滑块 内阴影+圆角*/
+::-webkit-scrollbar-thumb {
+  -webkit-box-shadow: inset 0 0 10px rgba(0, 0, 0, 0.3);
+  background-color: rgba(221, 222, 224); /*滚动条的背景颜色*/
+  border-radius: 5px;
+}
+</style>

+ 12 - 12
TEAMModelOS.FunctionV4/HttpTrigger/ScsYxptApis.cs

@@ -57,7 +57,7 @@ namespace TEAMModelOS.FunctionV4.HttpTrigger
             Code = "GetProjectInfoByTrainComID";
             parameterMap = new Dictionary<string, object>();
             parameterMap.Add("TrainComID", config.trainComID);
-            ScsResult result = new ScsResult { code = Code, title = "5.3.1.1获取项目列表" };
+            ScsResult result = new ScsResult { bizcode = Code, title = "5.3.1.1获取项目列表" };
             try
             {
                 result = await _thirdApisService.Post(config.url, Code, config.passKey, config.privateKey, parameterMap);
@@ -101,7 +101,7 @@ namespace TEAMModelOS.FunctionV4.HttpTrigger
             Code = "GetProjectInfoByTrainComID";
             parameterMap = new Dictionary<string, object>();
             parameterMap.Add("TrainComID", config.trainComID);
-            ScsResult result = new ScsResult { code = Code, title = "5.3.1.1获取项目列表" };
+            ScsResult result = new ScsResult { bizcode = Code, title = "5.3.1.1获取项目列表" };
             try
             {
                 result = await _thirdApisService.Post(config.url, Code, config.passKey, config.privateKey, parameterMap);
@@ -154,7 +154,7 @@ namespace TEAMModelOS.FunctionV4.HttpTrigger
                     {
                         parameterMap["ProjectID"] = ps.pd;
                         parameterMap["ProjectItemID"] = ps.pid;
-                        ScsResult result = new ScsResult { code = Code, title = " 5.3.1.18根据机构ID、项目ID、子项目ID返回学校列表" };
+                        ScsResult result = new ScsResult { bizcode = Code, title = " 5.3.1.18根据机构ID、项目ID、子项目ID返回学校列表" };
                         result = await _thirdApisService.Post(config.url, Code, config.passKey, config.privateKey, parameterMap);
                         if (result.result)
                         {
@@ -209,7 +209,7 @@ namespace TEAMModelOS.FunctionV4.HttpTrigger
                     {
                         parameterMap["ProjectID"] = ps.pd;
                         parameterMap["ProjectItemID"] = ps.pid;
-                        ScsResult result = new ScsResult { code = Code, title = "5.3.1.2获取学员名单" };
+                        ScsResult result = new ScsResult { bizcode = Code, title = "5.3.1.2获取学员名单" };
                         result = await _thirdApisService.Post(config.url, Code, config.passKey, config.privateKey, parameterMap);
                         if (result.result)
                         {
@@ -268,7 +268,7 @@ namespace TEAMModelOS.FunctionV4.HttpTrigger
                         parameterMap["ProjectItemID"] = ps.pid;
                         parameterMap["SchoolID"] = $"{schoolCode}";
                         parameterMap["School"] = $"{schoolCode}";
-                        ScsResult result = new ScsResult { code = Code, title = " 5.3.1.20获取学校设置的可选能力点" };
+                        ScsResult result = new ScsResult { bizcode = Code, title = " 5.3.1.20获取学校设置的可选能力点" };
                         result = await _thirdApisService.Post(config.url, Code, config.passKey, config.privateKey, parameterMap);
                         if (result.result)
                         {
@@ -349,7 +349,7 @@ namespace TEAMModelOS.FunctionV4.HttpTrigger
                     {
                         parameterMap["ProjectID"] = ps.pd;
                         parameterMap["ProjectItemID"] = ps.pid;
-                        ScsResult result = new ScsResult { code = Code, title = "5.3.1.19获取项目设置的可选能力点" };
+                        ScsResult result = new ScsResult { bizcode = Code, title = "5.3.1.19获取项目设置的可选能力点" };
                         result = await _thirdApisService.Post(config.url, Code, config.passKey, config.privateKey, parameterMap);
                         if (result.result)
                         {
@@ -422,7 +422,7 @@ namespace TEAMModelOS.FunctionV4.HttpTrigger
             parameterMap = new Dictionary<string, object>();
             parameterMap.Add("TrainComID", config.trainComID);
             parameterMap.Add("PXID", pxid);
-            ScsResult result = new ScsResult { code = Code, title = "5.3.1.3通过项目编号获取学员测评能力项V2" };
+            ScsResult result = new ScsResult { bizcode = Code, title = "5.3.1.3通过项目编号获取学员测评能力项V2" };
             try
             {
                 result = await _thirdApisService.Post(config.url, Code, config.passKey, config.privateKey, parameterMap);
@@ -491,7 +491,7 @@ namespace TEAMModelOS.FunctionV4.HttpTrigger
             parameterMap.Add("TrainComID", config.trainComID);
             parameterMap.Add("Pxid", $"{pxid}");
             parameterMap.Add("Tid", $"{tid}");
-            ScsResult result = new ScsResult { code = Code, title = "5.3.1.11获取跳转学员信息,用于sso单点,后端验证。" };
+            ScsResult result = new ScsResult { bizcode = Code, title = "5.3.1.11获取跳转学员信息,用于sso单点,后端验证。" };
             try
             {
                 ///{“result”:true,”reason”:null,”content”:”{“PXID”:””,”TID”:””,”TeacherName”:””,”ProjectTitle”:””,”ProjectItemTitle”:””,”CityName”:””,
@@ -821,19 +821,19 @@ namespace TEAMModelOS.FunctionV4.HttpTrigger
                 }
                 //推送数据
                 UpdateTeacherListSituation = await _thirdApisService.Post(config.url, "UpdateTeacherListSituation", config.passKey, config.privateKey, parameterContent53112);
-                UpdateTeacherListSituation.code = "UpdateTeacherListSituation";
+                UpdateTeacherListSituation.bizcode = "UpdateTeacherListSituation";
                 UpdateTeacherListSituation.title = "5.3.1.12学员培训基本情况批量回写";
 
                 UpdateTeacherListDiagnosis = await _thirdApisService.Post(config.url, "UpdateTeacherListDiagnosis", config.passKey, config.privateKey, parameterContent53113);
-                UpdateTeacherListDiagnosis.code = "UpdateTeacherListDiagnosis";
+                UpdateTeacherListDiagnosis.bizcode = "UpdateTeacherListDiagnosis";
                 UpdateTeacherListDiagnosis.title = "5.3.1.13学员能力点测评结果批量回写";
 
                 UploadKTSLList = await _thirdApisService.Post(config.url, "UploadKTSLList", config.passKey, config.privateKey, parameterContent53117);
-                UploadKTSLList.code = "UploadKTSLList";
+                UploadKTSLList.bizcode = "UploadKTSLList";
                 UploadKTSLList.title = "5.3.1.17学员课堂实录批量回写";
 
                 UploadSBTARPDFListV2 = await _thirdApisService.Post(config.url, "UploadSBTARPDFListV2", config.passKey, config.privateKey, parameterContent53122);
-                UploadSBTARPDFListV2.code = "UploadSBTARPDFListV2";
+                UploadSBTARPDFListV2.bizcode = "UploadSBTARPDFListV2";
                 UploadSBTARPDFListV2.title = "5.3.1.22学员校本教研PDF(每人可以返回多条)批量回写";
                 results.Add(UpdateTeacherListSituation);
                 results.Add(UpdateTeacherListDiagnosis);

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

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

+ 2 - 1
TEAMModelOS.SDK/Models/Cosmos/Teacher/Research/TeacherTrain.cs

@@ -124,7 +124,8 @@ namespace TEAMModelOS.SDK.Models
         /// 待更新的属性
         /// </summary>
         public HashSet<string> update { get; set; } = new HashSet<string>();
-        public string push { get; set; }
+        public HashSet<string> pushes { get; set; } = new HashSet<string>();
+         
         public Attachment offlineReport { get; set; }
        
     }

+ 4 - 1
TEAMModelOS.SDK/Models/Service/Third/Sc/ScYxptModel.cs

@@ -226,7 +226,8 @@ namespace TEAMModelOS.SDK.Models
         public bool result { get; set; }
         public string reason { get; set; }
         public string content { get; set; }
-        public string code { get; set; }
+        public string bizcode { get; set; }
+        public int  code { get; set; }
         public string title { get; set; }
     }
     public class Unbind
@@ -270,6 +271,8 @@ namespace TEAMModelOS.SDK.Models
         public string tmdid { get; set; }
         public string name { get; set; }
         public string picture { get; set; }
+        public string school { get; set; }
+        public string schoolname { get; set; }
         public List<KeyValuePair<string, string>> msgs { get; set; }
     }
     public class ScPush

+ 5 - 3
TEAMModelOS.SDK/Models/Service/Third/ThirdApisService.cs

@@ -22,9 +22,11 @@ namespace TEAMModelOS.SDK
         }
         public async   Task<ScsResult> Post(string url, string Code, string PassKey,string privateKey, Dictionary<string ,object> data)
         {
+            string result = "";
             HttpResponseMessage response=null;
             try {
-                string Content = AESHelper.AESEncrypt(data.ToJsonString(), privateKey);
+                string json = data.ToJsonString();
+                string Content = AESHelper.AESEncrypt(json, privateKey);
                 string paramStr = "Code={0}&PassKey={1}&Content={2}";
                 string sendMsg = string.Format(paramStr, Code, PassKey, Content);
                 #region 签名 Signature
@@ -36,7 +38,7 @@ namespace TEAMModelOS.SDK
                 string signatureStr = signatureDC.ToJsonString();
                 string signature = AESHelper.AESEncrypt(signatureStr, privateKey);
                 #endregion
-                string result = "";
+             
                 _httpClient.DefaultRequestHeaders.Add("Signature", signature);
                 using (var request = new HttpRequestMessage())
                 {
@@ -58,7 +60,7 @@ namespace TEAMModelOS.SDK
                 }
                 return scsResult;
             } catch (Exception ex ) {
-                throw new Exception($"{ex.Message}\n{ex.StackTrace}\n\n{data.ToJsonString()}\n{url}\n {Code}\n{PassKey}\n{privateKey}\n{response?.StatusCode}\n{response?.Content}");
+                throw new Exception($"{ex.Message}\n{ex.StackTrace}\n\n{data.ToJsonString()}\n{url}\n {Code}\n{PassKey}\n{privateKey}\n{response?.StatusCode}\n{response?.Content}\n{result}");
             }
             
         }

+ 198 - 90
TEAMModelOS.SDK/Models/Service/Third/ThirdService.cs

@@ -300,7 +300,8 @@ namespace TEAMModelOS.SDK.Models
 
 
         //5.3.1.22学员校本教研PDF(每人可以返回多条)批量回写-UploadSBTARPDFListV2
-        public   static (int t53122OK, List<KeyValuePair<string, string>> msgs) check53122(TeacherTrain teacherTrain, List<KeyValuePair<string, string>> msgs)
+        public  async static  Task<(int t53122OK, List<KeyValuePair<string, string>> msgs)> check53122(TeacherTrain teacherTrain, List<KeyValuePair<string, string>> msgs,string school,
+            string schoolPrefix,string sas, AzureStorageFactory _azureStorage)
         {
             int t53122OK = 1;
             if (teacherTrain.offlineRecords.Count <= 0)
@@ -317,7 +318,23 @@ namespace TEAMModelOS.SDK.Models
             if (teacherTrain.offlineReport==null) {
                 t53122OK = 0;
                 msgs.Add(new KeyValuePair<string, string>("offlineReport", $"校本研修汇总报告未生成。"));
+
+            }
+            List<string> unexistUrl = new List<string>();
+            foreach (var url in hasUrl) {
+                string blobItem = url.url.Replace($"{schoolPrefix}/", "");
+                bool Exist = await _azureStorage.GetBlobContainerClient(school).GetBlobClient(blobItem).ExistsAsync();
+                if (!Exist)
+                {
+                    unexistUrl.Add($"{url.url}?{sas}");
+                }
+            }
+            if (unexistUrl.Any())
+            {
+                t53122OK = 0;
+                msgs.Add(new KeyValuePair<string, string>("offlineRecord-url-unexist", $"校本研修文件不存在,{string.Join("  ,   " ,unexistUrl)}"));
             }
+
             //不需要检查每一个校本研修的文件记录。
             //teacherTrain.offlineRecords.ForEach(x => {
             //    if (string.IsNullOrEmpty(x.url)) {
@@ -328,11 +345,12 @@ namespace TEAMModelOS.SDK.Models
             //        msgs.Add(new KeyValuePair<string, string>("offlineRecord-size", $"文件大小"));
             //    }
             //});
-                return (t53122OK, msgs);
+            return (t53122OK, msgs);
         }
 
         //5.3.1.17学员课堂实录批量回写-UploadKTSLList
-        public   static (int t53117OK, List<KeyValuePair<string, string>> msgs) check53117(TeacherTrain teacherTrain, List<KeyValuePair<string, string>> msgs)
+        public async  static Task<(int t53117OK, List<KeyValuePair<string, string>> msgs)> check53117(TeacherTrain teacherTrain, List<KeyValuePair<string, string>> msgs, string school,
+            string schoolPrefix, string sas, AzureStorageFactory _azureStorage)
         {
             //校验 基本情况是否满足
             int t53117OK = 1;
@@ -354,6 +372,21 @@ namespace TEAMModelOS.SDK.Models
                     msgs.Add(new KeyValuePair<string, string>("teacherClasses", $"课堂实录链接无效"));
                 }
             });
+            List<string> unexistUrl = new List<string>();
+            foreach (var url in teacherTrain.teacherClasses)
+            {
+                string blobItem = url.url.Replace($"{schoolPrefix}/", "");
+                bool Exist = await _azureStorage.GetBlobContainerClient(school).GetBlobClient(blobItem).ExistsAsync();
+                if (!Exist)
+                {
+                    unexistUrl.Add($"{url.url}?{sas}");
+                }
+            }
+            if (unexistUrl.Any())
+            {
+                t53117OK = 0;
+                msgs.Add(new KeyValuePair<string, string>("teacherClasses-url-unexist", $"课堂实录文件不存在,{string.Join("  ,   ", unexistUrl)}"));
+            }
             return (t53117OK, msgs);
         }
         //5.3.1.12学员培训基本情况批量回写-UpdateTeacherListSituation
@@ -388,10 +421,13 @@ namespace TEAMModelOS.SDK.Models
             return (t53112OK, msgs);
         }
         //5.3.1.13学员能力点测评结果批量回写-UpdateTeacherListDiagnosis
-        public  async static Task<(int t53113OK, List<KeyValuePair<string, string>> msgs, List<AbilitySub> abilitySubs)> check53113(AzureCosmosFactory _azureCosmos,TeacherTrain teacherTrain, ScTeacherDiagnosis diagnosis, List<KeyValuePair<string, string>> msgs)
+        public  async static Task<(int t53113OK, List<KeyValuePair<string, string>> msgs, List<AbilitySub> abilitySubs, List<AbilitySub>  allRightAbility)> check53113(AzureCosmosFactory _azureCosmos,TeacherTrain teacherTrain, ScTeacherDiagnosis diagnosis, 
+            List<KeyValuePair<string, string>> msgs, string school,
+            string schoolPrefix, string sas, AzureStorageFactory _azureStorage)
         {
             //校验 基本情况是否满足
             int t53113OK = 1;
+            List<AbilitySub> allRightAbility = new List<AbilitySub>();
             List<AbilitySub> abilitySubs = new List<AbilitySub>();
             if (teacherTrain.currency.videoTime < 0)
             {
@@ -409,113 +445,184 @@ namespace TEAMModelOS.SDK.Models
                 msgs.Add(new KeyValuePair<string, string>("teacherAilities", $"已学习能力点:0"));
                 t53113OK = 0;
             }
-            if (diagnosis != null)
-            {
-                if (!string.IsNullOrWhiteSpace(diagnosis.abilityNos))
+            try {
+                if (diagnosis != null)
                 {
-                    List<string> nos = diagnosis.abilityNos.ToObject<List<string>>();
-                    if (nos.Count > 0 && teacherTrain.currency.teacherAilities.Count > 0)
+                    if (!string.IsNullOrWhiteSpace(diagnosis.abilityNos))
                     {
-                        var notin = nos.Except(teacherTrain.currency.teacherAilities.Select(x => x.no).Where(z => !string.IsNullOrWhiteSpace(z)));
-                        if (notin.Any())
-                        {
-                            msgs.Add(new KeyValuePair<string, string>("diagnosisNos", $"省平台勾选的能力点编号为学习完成:省平台:{string.Join(",", nos.OrderBy(x => x))}" + $" ,已学习:{string.Join(",", teacherTrain.currency.teacherAilities.Select(x => x.no).OrderBy(x => x))} "));
-                            t53113OK = 0;
-                        }
-                        else
+                        List<string> nos = diagnosis.abilityNos.ToObject<List<string>>();
+                        if (nos.Count > 0 && teacherTrain.currency.teacherAilities.Count > 0)
                         {
-                            string insql = "";
-                            if (teacherTrain.currency.teacherAilities.IsNotEmpty())
+                            var notin = nos.Except(teacherTrain.currency.teacherAilities.Select(x => x.no).Where(z => !string.IsNullOrWhiteSpace(z)));
+                            if (notin.Any())
                             {
-                                var abilites = teacherTrain.currency.teacherAilities.Where(c => !string.IsNullOrWhiteSpace(c.no) && nos.Contains(c.no));
-                                insql = $" where c.id in ({string.Join(",", abilites.Select(o => $"'{o.id}'"))})";
+                                msgs.Add(new KeyValuePair<string, string>("diagnosisNos", $"省平台勾选的能力点编号为学习完成:省平台:{string.Join(",", nos.OrderBy(x => x))}" + $" ,已学习:{string.Join(",", teacherTrain.currency.teacherAilities.Select(x => x.no).OrderBy(x => x))} "));
+                                t53113OK = 0;
                             }
-                            //认证材料
-                            await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher")
-                                     .GetItemQueryIterator<AbilitySub>(queryText: $"select value(c) from c {insql}", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"AbilitySub-{teacherTrain.school}-{teacherTrain.id}") }))
+                            else
                             {
-                                abilitySubs.Add(item);
-                            }
+                                string insql = "";
+                                if (teacherTrain.currency.teacherAilities.IsNotEmpty())
+                                {
+                                    var abilites = teacherTrain.currency.teacherAilities.Where(c => !string.IsNullOrWhiteSpace(c.no) && nos.Contains(c.no));
+                                    insql = $" where c.id in ({string.Join(",", abilites.Select(o => $"'{o.id}'"))})";
+                                }
+                                //认证材料
+                                await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher")
+                                         .GetItemQueryIterator<AbilitySub>(queryText: $"select value(c) from c {insql}", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"AbilitySub-{teacherTrain.school}-{teacherTrain.id}") }))
+                                {
+                                    abilitySubs.Add(item);
+                                }
 
-                            if (abilitySubs.Count() <= 3)
-                            {
-                                teacherTrain.currency.teacherAilities.ForEach(x =>
+                                if (abilitySubs.Count() <= 3)
                                 {
-                                    var abilitySub = abilitySubs.Find(z => z.id.Equals(x.id));
-                                    if (abilitySub == null || !abilitySub.uploads.Any())
+                                    teacherTrain.currency.teacherAilities.ForEach(x =>
                                     {
-                                        t53113OK = 0;
-                                        msgs.Add(new KeyValuePair<string, string>("uploads", $"未上传认证材料:{x.no},{x.name}"));
-                                    }
-                                    if (x.zpscore <= 0)
+                                        var abilitySub = abilitySubs.Find(z => z.id.Equals(x.id));
+                                        if (abilitySub == null || !abilitySub.uploads.Any())
+                                        {
+                                            t53113OK = 0;
+                                            msgs.Add(new KeyValuePair<string, string>("uploads", $"未上传认证材料:{x.no},{x.name}"));
+                                        }
+                                        if (x.zpscore <= 0)
+                                        {
+                                            t53113OK = 0;
+                                            msgs.Add(new KeyValuePair<string, string>("zpscore", $"认证材料,没有完成自评:{x.no},{x.name},{x.zpscore}"));
+                                        }
+                                        if (x.hpscore <= 0)
+                                        {
+                                            //t53113OK = 0;
+                                            //如果只有三个,且互评为未评状态,则直接为合格。
+                                            x.hpscore = 1;
+                                            // msgs.Add(new KeyValuePair<string, string>("hpscore", $"认证材料,没有完成互评:{x.no},{x.name},{x.hpscore}"));
+                                        }
+                                        if (x.xzscore <= 0)
+                                        {
+                                            //t53113OK = 0;
+                                            x.xzscore = 1;
+                                            //msgs.Add(new KeyValuePair<string, string>("xzscore", $"认证材料,没有完成小组评:{x.no},{x.name},{x.xzscore}"));
+                                        }
+                                    });
+
+                                    foreach (AbilitySub abilitySub in abilitySubs)
                                     {
-                                        t53113OK = 0;
-                                        msgs.Add(new KeyValuePair<string, string>("zpscore", $"认证材料,没有完成自评:{x.no},{x.name},{x.zpscore}"));
+                                        //当前能力点上传的文件是否完全有效
+                                        bool isAllRight = true;
+                                        List<string> urlUn = new List<string>();
+                                        foreach (var subUpload in abilitySub.uploads)
+                                        {
+                                            foreach (var url in subUpload.urls)
+                                            {
+                                                string blobItem = url.url.Replace($"{schoolPrefix}/", "");
+                                                bool Exist = await _azureStorage.GetBlobContainerClient(school).GetBlobClient(blobItem).ExistsAsync();
+                                                if (!Exist)
+                                                {
+                                                    isAllRight = false;
+                                                    urlUn.Add($"{url.url}?{sas}");
+                                                }
+                                            }
+                                        }
+                                        if (isAllRight)
+                                        {
+                                            allRightAbility.Add(abilitySub);
+                                        }
+                                        else
+                                        {
+                                            t53113OK = 0;
+                                            var x = teacherTrain.currency.teacherAilities.Find(x => x.id.Equals(abilitySub.id));
+                                            msgs.Add(new KeyValuePair<string, string>("uploads-url", $"{x.no},{x.name}上传的认证材料文件失效:{string.Join("   ,   ", urlUn)}"));
+                                        }
                                     }
-                                    if (x.hpscore <= 0)
+                                }
+                                else
+                                {
+                                    //一个都没上传
+                                    if (!abilitySubs.SelectMany(upsl => upsl.uploads).Any())
                                     {
-                                        //t53113OK = 0;
-                                        //如果只有三个,且互评为未评状态,则直接为合格。
-                                        x.hpscore = 1;
-                                       // msgs.Add(new KeyValuePair<string, string>("hpscore", $"认证材料,没有完成互评:{x.no},{x.name},{x.hpscore}"));
+                                        t53113OK = 0;
+                                        msgs.Add(new KeyValuePair<string, string>("uploads-all", $"没有上传认证材料。"));
                                     }
-                                    if (x.xzscore <= 0)
+                                    else
                                     {
-                                        //t53113OK = 0;
-                                        x.xzscore = 1;
-                                        //msgs.Add(new KeyValuePair<string, string>("xzscore", $"认证材料,没有完成小组评:{x.no},{x.name},{x.xzscore}"));
-                                    }
-                                });
-                            }
-                            else {
-                                //一个都没上传
-                                if (!abilitySubs.SelectMany(upsl => upsl.uploads).Any())
-                                {
-                                    t53113OK = 0;
-                                    msgs.Add(new KeyValuePair<string, string>("uploads-all", $"没有上传认证材料。"));
-                                }
-                                else {
-                                    //检查上传了认证材料的能力点,超过三个的。
-                                    var uploaded = abilitySubs.FindAll(x => x.uploads.Count > 0);
-                                    //不足三个的则需要记录
-                                    if (uploaded.Count < 3) {
-                                        t53113OK = 0;
-                                        abilitySubs.RemoveAll(x => x.uploads.Count > 0);
-                                        abilitySubs.ForEach(ab => {
-                                           var x =  teacherTrain.currency.teacherAilities.Find(x => x.id.Equals(ab.id));
-                                            if (x == null || !ab.uploads.Any())
-                                            {
-                                                t53113OK = 0;
-                                                msgs.Add(new KeyValuePair<string, string>("uploads", $"未上传认证材料:{x.no},{x.name}"));
-                                            }
-                                            if (x.zpscore <= 0)
+                                        //检查上传了认证材料的能力点,超过三个的。
+                                        var uploaded = abilitySubs.FindAll(x => x.uploads.Count > 0);
+                                        //不足三个的则需要记录
+                                        if (uploaded.Count < 3)
+                                        {
+                                            t53113OK = 0;
+                                            ///少于三个的,需要判断另外的不满足情况的
+                                            abilitySubs.RemoveAll(x => x.uploads.Count > 0);
+                                            abilitySubs.ForEach(ab => {
+                                                var x = teacherTrain.currency.teacherAilities.Find(x => x.id.Equals(ab.id));
+                                                if (x == null || !ab.uploads.Any())
+                                                {
+                                                    t53113OK = 0;
+                                                    msgs.Add(new KeyValuePair<string, string>("uploads", $"未上传认证材料:{x.no},{x.name}"));
+                                                }
+                                                if (x.zpscore <= 0)
+                                                {
+                                                    t53113OK = 0;
+                                                    msgs.Add(new KeyValuePair<string, string>("zpscore", $"认证材料,没有完成自评:{x.no},{x.name},{x.zpscore}"));
+                                                }
+                                                if (x.hpscore <= 0)
+                                                {
+                                                    t53113OK = 0;
+                                                    //如果只有三个,且互评为未评状态,则直接为合格。
+                                                    x.hpscore = 1;
+                                                    msgs.Add(new KeyValuePair<string, string>("hpscore", $"认证材料,没有完成互评:{x.no},{x.name},{x.hpscore}"));
+                                                }
+                                                if (x.xzscore <= 0)
+                                                {
+                                                    t53113OK = 0;
+                                                    msgs.Add(new KeyValuePair<string, string>("xzscore", $"认证材料,没有完成小组评:{x.no},{x.name},{x.xzscore}"));
+                                                }
+                                            });
+                                        }
+
+                                        //检查已经上传的文件是否正确。
+                                        foreach (AbilitySub abilitySub in uploaded)
+                                        {
+                                            //当前能力点上传的文件是否完全有效
+                                            bool isAllRight = true;
+                                            List<string> urlUn = new List<string>();
+                                            foreach (var subUpload in abilitySub.uploads)
                                             {
-                                                t53113OK = 0;
-                                                msgs.Add(new KeyValuePair<string, string>("zpscore", $"认证材料,没有完成自评:{x.no},{x.name},{x.zpscore}"));
+                                                foreach (var url in subUpload.urls)
+                                                {
+                                                    string blobItem = url.url.Replace($"{schoolPrefix}/", "");
+                                                    bool Exist = await _azureStorage.GetBlobContainerClient(school).GetBlobClient(blobItem).ExistsAsync();
+                                                    if (!Exist)
+                                                    {
+                                                        isAllRight = false;
+                                                        urlUn.Add($"{url.url}?{sas}");
+                                                    }
+                                                }
                                             }
-                                            if (x.hpscore <= 0)
+                                            if (isAllRight)
                                             {
-                                                t53113OK = 0;
-                                                //如果只有三个,且互评为未评状态,则直接为合格。
-                                                x.hpscore = 1;
-                                                msgs.Add(new KeyValuePair<string, string>("hpscore", $"认证材料,没有完成互评:{x.no},{x.name},{x.hpscore}"));
+                                                allRightAbility.Add(abilitySub);
                                             }
-                                            if (x.xzscore <= 0)
+                                            else
                                             {
                                                 t53113OK = 0;
-                                                msgs.Add(new KeyValuePair<string, string>("xzscore", $"认证材料,没有完成小组评:{x.no},{x.name},{x.xzscore}"));
+                                                var x = teacherTrain.currency.teacherAilities.Find(x => x.id.Equals(abilitySub.id));
+                                                msgs.Add(new KeyValuePair<string, string>("uploads-url", $"{x.no},{x.name}上传的认证材料文件失效:{string.Join("   ,   ", urlUn)}"));
                                             }
-                                        });
+                                        }
 
                                     }
-                                }
 
+                                }
+                                if (t53113OK != 1)
+                                {
+                                    msgs.Add(new KeyValuePair<string, string>("diagnosisNos", $"省平台勾选的能力点编号为学习完成:省平台:{string.Join(",", nos.OrderBy(x => x))}" + $" ,已学习:{string.Join(",", teacherTrain.currency.teacherAilities.Select(x => x.no).OrderBy(x => x))} "));
+                                }
                             }
-                            
-                            if (t53113OK != 1)
-                            {
-                                msgs.Add(new KeyValuePair<string, string>("diagnosisNos", $"省平台勾选的能力点编号为学习完成:省平台:{string.Join(",", nos.OrderBy(x => x))}" + $" ,已学习:{string.Join(",", teacherTrain.currency.teacherAilities.Select(x => x.no).OrderBy(x => x))} "));
-                            }
+                        }
+                        else
+                        {
+                            msgs.Add(new KeyValuePair<string, string>("teacherAilities", $"未同步省平台挑选的能力点"));
+                            t53113OK = 0;
                         }
                     }
                     else
@@ -529,15 +636,16 @@ namespace TEAMModelOS.SDK.Models
                     msgs.Add(new KeyValuePair<string, string>("teacherAilities", $"未同步省平台挑选的能力点"));
                     t53113OK = 0;
                 }
+            } catch (Exception ex) {
+                throw new Exception($"{ex.StackTrace},{ex.Message}");
             }
-            else
+            if (allRightAbility.Count < 3)
             {
-                msgs.Add(new KeyValuePair<string, string>("teacherAilities", $"未同步省平台挑选的能力点"));
                 t53113OK = 0;
+                msgs.Add(new KeyValuePair<string, string>("uploads-count", $"完整上传且有效的认证材料的 能力点数量小于3,当前数量:{allRightAbility.Count}"));
             }
 
-
-            return (t53113OK, msgs, abilitySubs);
+            return (t53113OK, msgs, abilitySubs, allRightAbility);
         }
     }
 }

+ 1 - 1
TEAMModelOS.SDK/TEAMModelOS.SDK.csproj

@@ -34,7 +34,7 @@
     <PackageReference Include="MSTest.TestFramework" Version="2.2.8" />
     <PackageReference Include="NUnit" Version="3.13.2" />
     <PackageReference Include="PinYinConverterCore" Version="1.0.2" />
-    <PackageReference Include="StackExchange.Redis" Version="2.5.43" />
+    <PackageReference Include="StackExchange.Redis" Version="2.6.45" />
     <PackageReference Include="SvgNet" Version="2.2.2" />
     <PackageReference Include="System.Drawing.Common" Version="6.0.0" />
     <PackageReference Include="Microsoft.Azure.Cosmos.Table" Version="2.0.0-preview" />

+ 1 - 4
TEAMModelOS/ClientApp/public/index.html

@@ -14,9 +14,6 @@
 	<meta http-equiv="Cache" content="no-cache">
 	<link rel="icon" href="<%= BASE_URL %>favicon.ico">
 	<link id="theme" type="text/css" rel="stylesheet" href="<%= BASE_URL %>theme/dark-theme.css">
-	<!-- <script src="<%= BASE_URL %>lang/zh-CN.js"></script>
-	<script src="<%= BASE_URL %>lang/zh-TW.js"></script>
-	<script src="<%= BASE_URL %>lang/en-US.js"></script> -->
 	<title></title>
 	<script>
 		// 自动根据浏览器系统语言设置语言(优先判断本地设置的语言,如果有则使用本地设置的语言,如果没有则使用浏览器系统语言)
@@ -62,7 +59,7 @@
 		document.write('<script id="iview"  src="' + blobHost + '/0-public/js/iview.min.js"><\/script>')
 		document.write('<script id="fabric"  src="' + blobHost + '/0-public/js/fabric.min.js"><\/script>')
 		document.write('<script id="vueRouter"  src="' + blobHost + '/0-public/js/vue-router.min.js"><\/script>')
-		document.write('<script id="echarts"  src="' + blobHost + '/0-public/js/echarts.js"><\/script>')
+		document.write('<script id="echarts"  src="' + blobHost + '/0-public/js/echarts.490.js"><\/script>')
 		document.write('<script id="jspdf"  src="' + blobHost + '/0-public/js/jspdf.umd.min.js"><\/script>')
 		document.write('<script id="mathjax"  src="' + blobHost + '/0-public/js/tex-mml-svg.js"><\/script>')
 		document.write('<script id="mediaInfo"  src="' + blobHost + '/0-public/js/checkMedia.js"><\/script>')

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

@@ -1167,7 +1167,9 @@ const LANG_EN_US = {
             evt3: 'Pick-out:',
             evt4: 'Collected:',
             evt5: 'Work Collected',
-            oldHT:'舊版HiTeach上傳的數據,無法查看課中評測'
+            oldHT:'舊版HiTeach上傳的數據,無法查看課中評測',
+            wrkCmp:'作品回帖',
+            dlStuWrk:'下載學生作品',
         }
     },
     // ElementUI相关

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

@@ -1167,7 +1167,9 @@ const LANG_ZH_CN = {
             evt3: '挑人:',
             evt4: '收集:',
             evt5: '收集的作品',
-            oldHT:'旧版HiTeach上传的数据,无法查看课中评测'
+            oldHT:'旧版HiTeach上传的数据,无法查看课中评测',
+            wrkCmp:'作品回帖',
+            dlStuWrk:'下载学生作品',
         }
     },
     // ElementUI相关

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

@@ -1167,7 +1167,9 @@ const LANG_ZH_TW = {
             evt3: '挑人:',
             evt4: '收集:',
             evt5: '收集的作品',
-            oldHT:'舊版HiTeach上傳的數據,無法查看課中評測'
+            oldHT:'舊版HiTeach上傳的數據,無法查看課中評測',
+            wrkCmp:'作品回帖',
+            dlStuWrk:'下載學生作品',
         }
     },
     // ElementUI相关

BIN
TEAMModelOS/ClientApp/src/assets/dashboard/student/award1.png


BIN
TEAMModelOS/ClientApp/src/assets/dashboard/student/award2.png


BIN
TEAMModelOS/ClientApp/src/assets/dashboard/student/award3.png


BIN
TEAMModelOS/ClientApp/src/assets/dashboard/student/sport1.png


BIN
TEAMModelOS/ClientApp/src/assets/dashboard/student/sport2.png


BIN
TEAMModelOS/ClientApp/src/assets/dashboard/student/sport3.png


BIN
TEAMModelOS/ClientApp/src/assets/dashboard/student/sport4.png


BIN
TEAMModelOS/ClientApp/src/assets/dashboard/student/sport5.png


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


+ 2 - 0
TEAMModelOS/ClientApp/src/boot-app.js

@@ -49,6 +49,8 @@ import fabric from 'fabric'
 import VideoPlayer from 'vue-video-player'
 import NewChooseContent from '@/components/selflearn/NewChooseContent'
 
+
+jsFn.setLocalLang()
 require('video.js/dist/video-js.css')
 require('vue-video-player/src/custom-theme.css')
 // 图片预览组件

+ 120 - 0
TEAMModelOS/ClientApp/src/components/dashboard/student/BaseArtCircle.vue

@@ -0,0 +1,120 @@
+<template>
+  <div id="artCircle" class="art-echart"></div>
+</template>
+<script>
+export default {
+  data() {
+    return {
+      option: null,
+    }
+  },
+  methods: {
+    doRender() {
+      let myChart = this.$echarts.init(document.getElementById('artCircle'))
+      let option = {
+        title: [
+          {
+            text: '美术',
+            x: 'center',
+            top: '65%',
+            textStyle: {
+              color: '#FFFFFF',
+              fontSize: 16,
+              fontWeight: '100',
+            },
+          },
+          {
+            text: '75',
+            x: 'center',
+            top: '35%',
+            textStyle: {
+              fontSize: '50',
+              color: '#FFFFFF',
+              fontFamily: 'DINAlternate-Bold, DINAlternate',
+              foontWeight: '600',
+            },
+          },
+        ],
+        polar: {
+          radius: ['70%', '82%'],
+          center: ['50%', '50%'],
+        },
+        angleAxis: {
+          max: 100,
+          show: false,
+        },
+        radiusAxis: {
+          type: 'category',
+          show: true,
+          axisLabel: {
+            show: false,
+          },
+          axisLine: {
+            show: false,
+          },
+          axisTick: {
+            show: false,
+          },
+        },
+        series: [
+          {
+            name: '',
+            type: 'bar',
+            roundCap: true,
+            barWidth: 30,
+            showBackground: true,
+            backgroundStyle: {
+              color: 'rgba(66, 66, 66, .3)',
+            },
+            data: [75],
+            coordinateSystem: 'polar',
+            itemStyle: {
+              normal: {
+                color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
+                  {
+                    offset: 0,
+                    color: '#16CEB9',
+                  },
+                  {
+                    offset: 1,
+                    color: '#6648FF',
+                  },
+                ]),
+              },
+            },
+          },
+
+        ],
+      };
+
+      myChart.clear()
+      myChart.setOption(option)
+      window.addEventListener('resize', function () {
+        myChart.resize()
+      })
+
+    }
+  },
+  mounted() {
+    this.doRender()
+  },
+  //   watch: {
+  //     '$store.state.dashboard.artDashboard': {
+  //       deep: true,
+  //       immediate: true,
+  //       handler(n, o) {
+
+  //       }
+  //     }
+  //   }
+}
+</script>
+
+<style>
+.art-echart {
+  width: 100%;
+  height: 100%;
+  margin: 0 auto;
+  display: block;
+}
+</style>

+ 258 - 0
TEAMModelOS/ClientApp/src/components/dashboard/student/BaseLine.vue

@@ -0,0 +1,258 @@
+<template>
+  <div id="BaseRankLine" class="art-echart"></div>
+</template>
+<script>
+export default {
+  data() {
+    return {
+      option: null,
+    }
+  },
+  methods: {
+    doRender() {
+      let myChart = this.$echarts.init(document.getElementById('BaseRankLine'))
+      var data1 = [14, 15, 65, 24, 75, 23, 24, 43, 27, 72, 12, 53];
+      var data2 = [45, 65, 24, 74, 75, 23, 42, 54, 13, 32, 52, 13];
+      var json = {
+        chart0: {
+          xcategory: ['第1周', '第2周', '第3周', '第4周', '第5周', '第6周', '第7周', '第8周', '第9周', '第10周', '第11周', '第12周'],
+          low: data1,
+          lowLine: [],
+        }
+      };
+      var json2 = {
+        chart0: {
+          xcategory: ['第1周', '第2周', '第3周', '第4周', '第5周', '第6周', '第7周', '第8周', '第9周', '第10周', '第11周', '第12周'],
+          low: data2,
+          lowLine: [],
+        }
+      };
+      var datacoords = [{
+        coords: []
+      }]
+      var datacoords2 = [{
+        coords: []
+      }]
+      for (var i = 0; i < json.chart0.xcategory.length; i++) {
+        datacoords[0].coords.push(
+          [json.chart0.xcategory[i], data1[i]]
+        )
+      }
+      for (var i = 0; i < json.chart0.xcategory.length; i++) {
+        datacoords2[0].coords.push(
+          [json2.chart0.xcategory[i], data2[i]]
+        )
+      }
+
+      var option = {
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            lineStyle: {
+              color: '#15ecf4'
+            }
+          },
+          formatter: function (params) {
+            var result = params[0].name + '<br>';
+            params.forEach(function (item) {
+              result += '<span style="display:inline-block;margin-right:5px;border-radius:10px;width:9px;height:9px;background-color:' + item.color + '"></span>';
+              // 判断设置增长还是降低
+              if (parseFloat(item.data) >= 50) {
+                result += item.seriesName + ": " + '<span class="growth">增长' + item.data + "%</span><br>"
+              } else if (parseFloat(item.data) < 50) {
+                result += item.seriesName + ": " + '<span class="reduce">降低' + item.data + "%</span><br>"
+              }
+            });
+            return result;
+          }
+        },
+        legend: {
+          data: ['学生', '班级'],
+          right: 10,
+          top: 0,
+          textStyle: {
+            fontSize: 12,
+            color: 'rgb(0,253,255,0.6)'
+          },
+        },
+        grid: {
+          left: '2%',
+          right: '4%',
+          bottom: '1%',
+          top: '16%',
+          containLabel: true
+        },
+        xAxis: {
+          axisLine: {
+            show: true,
+            lineStyle: {
+              color: '#15faff',
+            },
+
+          },
+          axisTick: {
+            show: false
+          },
+          axisLabel: {
+            show: true
+          },
+          data: ['第1周', '第2周', '第3周', '第4周', '第5周', '第6周', '第7周', '第8周', '第9周', '第10周', '第11周', '第12周'],
+        },
+        yAxis: {
+          max: 100,
+          splitNumber: 4,
+          interval: 25,
+          axisLine: {
+            show: false,
+          },
+          axisTick: {
+            show: false
+          },
+          splitLine: {
+            lineStyle: {
+              type: 'dashed',
+              color: '#4b4d64'
+            }
+          },
+          axisLabel: {
+            formatter: '{value} %',
+            textStyle: { //改变刻度字体样式
+              color: '#ffffff'
+            }
+          },
+        },
+        series: [{
+          name: '班级',
+          type: 'line',
+          // smooth: true,
+          symbol: 'none',
+          symbolSize: 10,
+          areaStyle: {
+            normal: {
+              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+                offset: 0,
+                color: 'rgba(255, 204,1, .9)'
+              }, {
+                offset: 0.8,
+                color: 'rgba(6, 8, 41,.1)'
+              }], false),
+              shadowColor: 'rgba(0, 0, 0, 0.1)',
+              shadowBlur: 10
+            }
+          },
+          itemStyle: {
+            normal: {
+              color: '#ffcb00'
+            }
+          },
+          data: data1
+        },
+        {
+          name: '班级',
+          type: 'lines',
+          coordinateSystem: 'cartesian2d',
+          zlevel: 1,
+          polyline: true,
+          smooth: true,
+          symbol: 'circle',
+          effect: {
+            show: true,
+            trailLength: 0.4,
+            symbol: "circle",
+            period: 8, //光点滑动速度
+            symbolSize: 8,
+          },
+          lineStyle: {
+            normal: {
+              color: '#ffcb00',
+              width: 0,
+              opacity: 0,
+              curveness: 0,
+            }
+          },
+          data: datacoords
+        },
+        {
+          name: '学生',
+          type: 'line',
+          // smooth: true,
+          symbol: 'none',
+          symbolSize: 10,
+          areaStyle: {
+            normal: {
+              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+                offset: 0,
+                color: 'rgba(21, 250, 255,.9)'
+              }, {
+                offset: 0.8,
+                color: 'rgba(6, 8, 41,.1)'
+              }], false),
+              shadowColor: 'rgba(0, 0, 0, 0.1)',
+              shadowBlur: 10
+            }
+          },
+          itemStyle: {
+            normal: {
+              color: '#15faff'
+            }
+          },
+          data: data2
+        },
+        {
+          name: '学生',
+          type: 'lines',
+          coordinateSystem: 'cartesian2d',
+          zlevel: 1,
+          smooth: true,
+          polyline: true,
+          symbol: 'circle',
+          effect: {
+            show: true,
+            trailLength: 0.4,
+            symbol: "circle",
+            period: 8, //光点滑动速度
+            symbolSize: 8,
+          },
+          lineStyle: {
+            normal: {
+              color: '#15faff',
+              width: 0,
+              opacity: 0,
+              curveness: 0,
+            }
+          },
+          data: datacoords2
+        },
+        ]
+      };
+      myChart.clear()
+      myChart.setOption(option)
+      window.addEventListener('resize', function () {
+        myChart.resize()
+      })
+
+    }
+  },
+  mounted() {
+    this.doRender()
+  },
+  //   watch: {
+  //     '$store.state.dashboard.artDashboard': {
+  //       deep: true,
+  //       immediate: true,
+  //       handler(n, o) {
+
+  //       }
+  //     }
+  //   }
+}
+</script>
+
+<style>
+.art-echart {
+  width: 100%;
+  height: 100%;
+  margin: 0 auto;
+  display: block;
+}
+</style>

+ 120 - 0
TEAMModelOS/ClientApp/src/components/dashboard/student/BaseMusicCircle.vue

@@ -0,0 +1,120 @@
+<template>
+  <div id="musicCircle" class="art-echart"></div>
+</template>
+<script>
+export default {
+  data() {
+    return {
+      option: null,
+    }
+  },
+  methods: {
+    doRender() {
+      let myChart = this.$echarts.init(document.getElementById('musicCircle'))
+      let option = {
+        title: [
+          {
+            text: '音乐',
+            x: 'center',
+            top: '65%',
+            textStyle: {
+              color: '#FFFFFF',
+              fontSize: 16,
+              fontWeight: '100',
+            },
+          },
+          {
+            text: '84',
+            x: 'center',
+            top: '35%',
+            textStyle: {
+              fontSize: '50',
+              color: '#FFFFFF',
+              fontFamily: 'DINAlternate-Bold, DINAlternate',
+              foontWeight: '600',
+            },
+          },
+        ],
+        polar: {
+          radius: ['70%', '82%'],
+          center: ['50%', '50%'],
+        },
+        angleAxis: {
+          max: 100,
+          show: false,
+        },
+        radiusAxis: {
+          type: 'category',
+          show: true,
+          axisLabel: {
+            show: false,
+          },
+          axisLine: {
+            show: false,
+          },
+          axisTick: {
+            show: false,
+          },
+        },
+        series: [
+          {
+            name: '',
+            type: 'bar',
+            roundCap: true,
+            barWidth: 30,
+            showBackground: true,
+            backgroundStyle: {
+              color: 'rgba(66, 66, 66, .3)',
+            },
+            data: [84],
+            coordinateSystem: 'polar',
+            itemStyle: {
+              normal: {
+                color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
+                  {
+                    offset: 0,
+                    color: '#16CEB9',
+                  },
+                  {
+                    offset: 1,
+                    color: '#6648FF',
+                  },
+                ]),
+              },
+            },
+          },
+
+        ],
+      };
+
+      myChart.clear()
+      myChart.setOption(option)
+      window.addEventListener('resize', function () {
+        myChart.resize()
+      })
+
+    }
+  },
+  mounted() {
+    this.doRender()
+  },
+  //   watch: {
+  //     '$store.state.dashboard.artDashboard': {
+  //       deep: true,
+  //       immediate: true,
+  //       handler(n, o) {
+
+  //       }
+  //     }
+  //   }
+}
+</script>
+
+<style>
+.art-echart {
+  width: 100%;
+  height: 100%;
+  margin: 0 auto;
+  display: block;
+}
+</style>

+ 170 - 0
TEAMModelOS/ClientApp/src/components/dashboard/student/BaseProgressBar.vue

@@ -0,0 +1,170 @@
+<template>
+  <div id="progressBar" class="art-echart"></div>
+</template>
+<script>
+export default {
+  data() {
+    return {
+      option: null,
+    }
+  },
+  methods: {
+    doRender() {
+      let myChart = this.$echarts.init(document.getElementById('progressBar'))
+      var attaData = [62, 52, 34, 61, 15, 25];
+      //十六进制颜色转RBG 拼接为rgba返回
+      function colorRgb(val) {
+        // 16进制颜色值的正则
+        var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
+        // 把颜色值变成小写
+        var color = val.toLowerCase();
+        if (reg.test(color)) {
+          // 如果只有三位的值,需变成六位,如:#fff => #ffffff
+          if (color.length === 4) {
+            var colorNew = "#";
+            for (var i = 1; i < 4; i += 1) {
+              colorNew += color.slice(i, i + 1).concat(color.slice(i, i + 1));
+            }
+            color = colorNew;
+          }
+          // 处理六位的颜色值,转为RGB
+          var colorChange = [];
+          for (var i = 1; i < 7; i += 2) {
+            colorChange.push(parseInt("0x" + color.slice(i, i + 2)));
+          }
+          return "rgba(" + colorChange.join(",") + ",0.4)";
+        } else {
+          return color;
+        }
+      }
+      //渐变底色
+      var attackSourcesColor1 = [
+        '#52A8FF',
+        '#00B389',
+        '#FFA940',
+        '#FF5A57',
+        '#29EFC4',
+      ];
+      //拼接itemStyle
+      function attackSourcesDataFmt(sData) {
+        var sss = [];
+        sData.forEach(function (item, i) {
+          let itemStyle = {
+            barBorderRadius: 20,
+            color: attackSourcesColor1[i],
+          };
+          sss.push({
+            value: item,
+            itemStyle: itemStyle,
+          });
+        });
+        return sss;
+      }
+      var option = {
+        tooltip: {
+          trigger: "axis",
+          borderColor: "#62FFFF",
+          formatter: " {b}     {c}%",
+          axisPointer: {
+            type: "shadow",
+          },
+        },
+        grid: {
+          x: 35,
+          y: 2,
+          x2: 20,
+          y2: 20,
+        },
+        xAxis: {
+          axisLine: {
+            lineStyle: {
+              color: "#44A0B7",
+            },
+          },
+          axisLabel: {
+            textStyle: {
+              color: "#fff",
+            },
+          },
+          show: true,
+          type: "value",
+          axisTick: {
+            show: false,
+          },
+          splitLine: {
+            show: false,
+          },
+        },
+        yAxis: {
+          type: "category",
+          data: ["评测", "问卷", "投票", "作业"],
+          axisLine: {
+            lineStyle: {
+              color: "#44A0B7",
+            },
+          },
+          axisLabel: {
+            textStyle: {
+              color: "#fff",
+            },
+          },
+          axisTick: {
+            show: false,
+          },
+          splitLine: {
+            show: false,
+          },
+        },
+        series: [
+          {
+            name: "",
+            type: "bar",
+            barWidth: 16,
+            label: { show: true, position: 'insideRight', offset: [-5, 2], color: '#fff' },
+            data: attackSourcesDataFmt(attaData),
+          },
+          {
+            name: "",
+            type: "bar",
+            barWidth: 16,
+            barGap: "-100%",
+            z: 0,
+            itemStyle: {
+              barBorderRadius: 20,
+              color: "rgba(0, 120, 121, 0.1)",
+            },
+            data: [100, 100, 100, 100, 100, 100],
+          },
+        ],
+      };
+      myChart.clear()
+      myChart.setOption(option)
+      window.addEventListener('resize', function () {
+        myChart.resize()
+      })
+
+    }
+  },
+  mounted() {
+    this.doRender()
+  },
+  //   watch: {
+  //     '$store.state.dashboard.artDashboard': {
+  //       deep: true,
+  //       immediate: true,
+  //       handler(n, o) {
+
+  //       }
+  //     }
+  //   }
+}
+</script>
+
+<style>
+.art-echart {
+  width: 100%;
+  height: 100%;
+  margin: 0 auto;
+  display: block;
+}
+</style>

File diff suppressed because it is too large
+ 227 - 0
TEAMModelOS/ClientApp/src/components/dashboard/student/BaseRadar.vue


+ 170 - 0
TEAMModelOS/ClientApp/src/components/dashboard/student/BaseSportRadar.vue

@@ -0,0 +1,170 @@
+<template>
+  <div id="sportRadar" class="art-echart"></div>
+</template>
+<script>
+export default {
+  data() {
+    return {
+      option: null,
+    }
+  },
+  methods: {
+    doRender() {
+      let myChart = this.$echarts.init(document.getElementById('sportRadar'))
+      var attaData = [62, 52, 34, 61, 15, 25];
+      //十六进制颜色转RBG 拼接为rgba返回
+      function colorRgb(val) {
+        // 16进制颜色值的正则
+        var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
+        // 把颜色值变成小写
+        var color = val.toLowerCase();
+        if (reg.test(color)) {
+          // 如果只有三位的值,需变成六位,如:#fff => #ffffff
+          if (color.length === 4) {
+            var colorNew = "#";
+            for (var i = 1; i < 4; i += 1) {
+              colorNew += color.slice(i, i + 1).concat(color.slice(i, i + 1));
+            }
+            color = colorNew;
+          }
+          // 处理六位的颜色值,转为RGB
+          var colorChange = [];
+          for (var i = 1; i < 7; i += 2) {
+            colorChange.push(parseInt("0x" + color.slice(i, i + 2)));
+          }
+          return "rgba(" + colorChange.join(",") + ",0.4)";
+        } else {
+          return color;
+        }
+      }
+      //渐变底色
+      var attackSourcesColor1 = [
+        '#52A8FF',
+        '#00B389',
+        '#FFA940',
+        '#FF5A57',
+        '#29EFC4',
+      ];
+      //拼接itemStyle
+      function attackSourcesDataFmt(sData) {
+        var sss = [];
+        sData.forEach(function (item, i) {
+          let itemStyle = {
+            barBorderRadius: 20,
+            color: attackSourcesColor1[i],
+          };
+          sss.push({
+            value: item,
+            itemStyle: itemStyle,
+          });
+        });
+        return sss;
+      }
+      var option = {
+        tooltip: {
+          trigger: "axis",
+          borderColor: "#62FFFF",
+          formatter: " {b}     {c}%",
+          axisPointer: {
+            type: "shadow",
+          },
+        },
+        grid: {
+          x: 35,
+          y: 2,
+          x2: 20,
+          y2: 20,
+        },
+        xAxis: {
+          axisLine: {
+            lineStyle: {
+              color: "#44A0B7",
+            },
+          },
+          axisLabel: {
+            textStyle: {
+              color: "#fff",
+            },
+          },
+          show: true,
+          type: "value",
+          axisTick: {
+            show: false,
+          },
+          splitLine: {
+            show: false,
+          },
+        },
+        yAxis: {
+          type: "category",
+          data: ["评测", "问卷", "投票", "作业"],
+          axisLine: {
+            lineStyle: {
+              color: "#44A0B7",
+            },
+          },
+          axisLabel: {
+            textStyle: {
+              color: "#fff",
+            },
+          },
+          axisTick: {
+            show: false,
+          },
+          splitLine: {
+            show: false,
+          },
+        },
+        series: [
+          {
+            name: "",
+            type: "bar",
+            barWidth: 16,
+            label: { show: true, position: 'insideRight', offset: [-5, 2], color: '#fff' },
+            data: attackSourcesDataFmt(attaData),
+          },
+          {
+            name: "",
+            type: "bar",
+            barWidth: 16,
+            barGap: "-100%",
+            z: 0,
+            itemStyle: {
+              barBorderRadius: 20,
+              color: "rgba(0, 120, 121, 0.1)",
+            },
+            data: [100, 100, 100, 100, 100, 100],
+          },
+        ],
+      };
+      myChart.clear()
+      myChart.setOption(option)
+      window.addEventListener('resize', function () {
+        myChart.resize()
+      })
+
+    }
+  },
+  mounted() {
+    this.doRender()
+  },
+  //   watch: {
+  //     '$store.state.dashboard.artDashboard': {
+  //       deep: true,
+  //       immediate: true,
+  //       handler(n, o) {
+
+  //       }
+  //     }
+  //   }
+}
+</script>
+
+<style>
+.art-echart {
+  width: 100%;
+  height: 100%;
+  margin: 0 auto;
+  display: block;
+}
+</style>

+ 109 - 0
TEAMModelOS/ClientApp/src/components/dashboard/student/BaseStuProfile.vue

@@ -0,0 +1,109 @@
+<template>
+  <div class="stu-profile-container">
+    <div class="stu-avatar">
+      <img src="https://paas-admin.xydqq.cn/img/avatar.647bbbfe.png" alt="">
+    </div>
+    <div class="stu-info">
+      <div class="stu-info-name">
+        <span>{{ stuInfo.stuName }}({{ stuInfo.id }})</span>
+      </div>
+      <div class="stu-info-grade">
+        <Tag color="primary">{{ stuInfo.gradeName }}{{ stuInfo.className }}</Tag>
+        <Tag color="warning">{{ stuInfo.job.join('、') }}</Tag>
+        <img src="@/assets/dashboard/student/award1.png" alt="" width="30">
+        <img src="@/assets/dashboard/student/award2.png" alt="" width="30">
+        <img src="@/assets/dashboard/student/award3.png" alt="" width="30">
+      </div>
+      <div class="stu-info-awards">
+        <div class="award-item">
+          <span><span class="award-count" style="color: #20d99d">96 </span>次</span>
+          <span>正常出勤</span>
+        </div>
+        <div class="award-item">
+          <span><span class="award-count" style="color:#ff8e2e">4 </span>次</span>
+          <span>迟到</span>
+        </div>
+        <div class="award-item">
+          <span><span class="award-count" style="color:#ff9090">2 </span>次</span>
+          <span>旷课</span>
+        </div>
+        <div class="award-item">
+          <span><span class="award-count" style="color:#20d99d">完成 </span></span>
+          <span>今日打卡</span>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      stuInfo: {
+        stuName: "欧阳旭",
+        gradeName: "一年级",
+        className: "一班",
+        id: '140015511001',
+        job: ['班长', '文娱委员']
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less">
+.stu-profile-container {
+  display: flex;
+  width: 100%;
+  .stu-avatar img {
+    width: 60px;
+    border-radius: 50%;
+    border: 4px solid #2488c2;
+  }
+
+  .stu-info {
+    width: calc(100% - 60px);
+    margin-left: 10px;
+    .stu-info-name {
+      font-size: 18px;
+      font-weight: bold;
+    }
+    .stu-info-grade {
+      font-size: 14px;
+      margin: 5px 0;
+      display: flex;
+      align-items: center;
+
+      img {
+        margin-left: 10px;
+      }
+    }
+    .stu-info-awards {
+      margin-top: 5px;
+      width: 80%;
+      display: flex;
+      justify-content: space-between;
+      img {
+        width: 35px;
+      }
+
+      .award-item {
+        display: flex;
+        flex-direction: column;
+        justify-content: center;
+        align-items: center;
+
+        span {
+          margin-top: 5px;
+          font-size: 12px;
+        }
+        .award-count {
+          font-size: 24px;
+          font-weight: bold;
+        }
+      }
+    }
+  }
+}
+</style>

+ 194 - 0
TEAMModelOS/ClientApp/src/components/dashboard/student/BaseWordCloud.vue

@@ -0,0 +1,194 @@
+<template>
+  <div id="wordCloud" class="art-echart"></div>
+</template>
+<script>
+export default {
+  data() {
+    return {
+      option: null,
+    }
+  },
+  methods: {
+    doRender() {
+      let myChart = this.$echarts.init(document.getElementById('wordCloud'))
+      let option = {
+        title: {
+          textStyle: {
+            align: 'center',
+            color: '#fff',
+            fontSize: 20,
+          },
+          top: '5%',
+          left: 'center',
+        },
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: { // 坐标轴指示器,坐标轴触发有效
+            type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
+          }
+        },
+        grid: {
+          left: '2%',
+          right: '4%',
+          bottom: '14%',
+          top: '16%',
+          containLabel: true
+        },
+        legend: {
+          data: ['年级平均', '班级平均', '学生得分'],
+          top: 12,
+          textStyle: {
+            color: "#fff"
+          },
+          itemWidth: 12,
+          itemHeight: 10,
+          // itemGap: 35
+        },
+        xAxis: {
+          type: 'category',
+          data: ['第一次月考', '第二次月考', '第三次月考', '第四次月考', '第五次月考', '第六次月考',],
+          axisLine: {
+            lineStyle: {
+              color: 'white'
+
+            }
+          },
+          axisLabel: {
+            // interval: 0,
+            // rotate: 40,
+            textStyle: {
+              fontFamily: 'Microsoft YaHei'
+            }
+          },
+        },
+
+        yAxis: {
+          type: 'value',
+          max: '1200',
+          axisLine: {
+            show: false,
+            lineStyle: {
+              color: 'white'
+            }
+          },
+          splitLine: {
+            show: true,
+            lineStyle: {
+              color: 'rgba(255,255,255,0.1)'
+            }
+          },
+          axisLabel: {}
+        },
+        "dataZoom": [{
+          "show": true,
+          "height": 12,
+          "xAxisIndex": [
+            0
+          ],
+          bottom: '8%',
+          "start": 10,
+          "end": 90,
+          handleIcon: 'path://M306.1,413c0,2.2-1.8,4-4,4h-59.8c-2.2,0-4-1.8-4-4V200.8c0-2.2,1.8-4,4-4h59.8c2.2,0,4,1.8,4,4V413z',
+          handleSize: '110%',
+          handleStyle: {
+            color: "#d3dee5",
+
+          },
+          textStyle: {
+            color: "#fff"
+          },
+          borderColor: "#90979c"
+        }, {
+          "type": "inside",
+          "show": true,
+          "height": 15,
+          "start": 1,
+          "end": 35
+        }],
+        series: [{
+          name: '年级平均',
+          type: 'bar',
+          barWidth: '15%',
+          itemStyle: {
+            normal: {
+              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+                offset: 0,
+                color: '#fccb05'
+              }, {
+                offset: 1,
+                color: '#f5804d'
+              }]),
+              barBorderRadius: 12,
+            },
+          },
+          data: [400, 400, 300, 300, 300, 400, 400, 400, 300]
+        },
+        {
+          name: '班级平均',
+          type: 'bar',
+          barWidth: '15%',
+          itemStyle: {
+            normal: {
+              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+                offset: 0,
+                color: '#8bd46e'
+              }, {
+                offset: 1,
+                color: '#09bcb7'
+              }]),
+              barBorderRadius: 11,
+            }
+
+          },
+          data: [400, 500, 500, 500, 500, 400, 400, 500, 500]
+        },
+        {
+          name: '学生得分',
+          type: 'bar',
+          barWidth: '15%',
+          itemStyle: {
+            normal: {
+              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+                offset: 0,
+                color: '#248ff7'
+              }, {
+                offset: 1,
+                color: '#6851f1'
+              }]),
+              barBorderRadius: 11,
+            }
+          },
+          data: [400, 600, 700, 700, 1000, 400, 400, 600, 700]
+        }]
+      };
+      myChart.clear()
+      myChart.setOption(option)
+      window.addEventListener('resize', function () {
+        myChart.resize()
+      })
+
+    }
+  },
+  mounted() {
+    this.doRender()
+  },
+  //   watch: {
+  //     '$store.state.dashboard.artDashboard': {
+  //       deep: true,
+  //       immediate: true,
+  //       handler(n, o) {
+
+  //       }
+  //     }
+  //   }
+}
+</script>
+
+<style>
+.art-echart {
+  width: 100%;
+  height: 100%;
+  margin: 0 auto;
+  display: block;
+}
+</style>

+ 2 - 2
TEAMModelOS/ClientApp/src/components/student-web/ClassRecord/ClassRecord.vue

@@ -154,7 +154,7 @@
                                                         <!-- 推送 -->
                                                         <Push class="event-item" v-if="event.Event === 'FastPgPush' && (currentfilterType === '' || currentfilterType === 'doc')" :pushData="event.data"></Push>
                                                         <!-- 作品收集 -->
-                                                        <StuReceive class="student-event event-item" v-if="event.Event === 'WrkSpaceEnd' && baseData" :nowStuInfo="nowStuInfo" :rcvData="event.data" :recordInfo="recordInfo" :students="baseData.student"></StuReceive>
+                                                        <StuReceive class="student-event event-item" v-if="event.Event === 'WrkSpaceLoad' && baseData" :nowStuInfo="nowStuInfo" :rcvData="event.data" :recordInfo="recordInfo" :students="baseData.student"></StuReceive>
                                                         <!-- 老师收集的所有作品目前不展示,只展示老师回贴的学生作品 -->
                                                         <!-- <Receive :recordInfo="recordInfo" class="student-event event-item" v-if="event.Event === 'WrkCmp' && baseData" :rcvData="event.data" :students="baseData.student"></Receive> -->
                                                         <ReceiveBack class="event-item" v-if="event.Event === 'WrkCmp' && event.data" :recordInfo="recordInfo" :rcvData="event.data" :students="baseData.student"></ReceiveBack>
@@ -510,7 +510,7 @@ export default {
                 this.pageList.push(page)
             })
             this.haveInteraction = havePage != 0
-            let pageEvent = pageEvents.filter(item => item.Event === 'PopQuesLoad' || item.Event === 'ReAtmpAnsStrt' || item.Event === 'FastPgPush' || item.Event === 'WrkSpaceEnd' || item.Event === 'SPQStrt')
+            let pageEvent = pageEvents.filter(item => item.Event === 'PopQuesLoad' || item.Event === 'ReAtmpAnsStrt' || item.Event === 'FastPgPush' || item.Event === 'WrkSpaceLoad' || item.Event === 'SPQStrt')
             this.markers = pageEvent.map((item, index) => {
                 return {
                     time: item.Time,

+ 2 - 2
TEAMModelOS/ClientApp/src/components/student-web/ClassRecord/newClassRecord.vue

@@ -135,7 +135,7 @@
                                                         <!-- 推送 -->
                                                         <Push class="event-item" v-if="event.Event === 'FastPgPush' && (currentfilterType === '' || currentfilterType === 'doc')" :pushData="event.data"></Push>
                                                         <!-- 作品收集 -->
-                                                        <StuReceive class="student-event event-item" v-if="event.Event === 'WrkSpaceEnd' && baseData" :nowStuInfo="nowStuInfo" :rcvData="event.data" :recordInfo="recordInfo" :students="baseData.student"></StuReceive>
+                                                        <StuReceive class="student-event event-item" v-if="event.Event === 'WrkSpaceLoad' && baseData" :nowStuInfo="nowStuInfo" :rcvData="event.data" :recordInfo="recordInfo" :students="baseData.student"></StuReceive>
                                                         <!-- 老师收集的所有作品目前不展示,只展示老师回贴的学生作品 -->
                                                         <!-- <Receive :recordInfo="recordInfo" class="student-event event-item" v-if="event.Event === 'WrkCmp' && baseData" :rcvData="event.data" :students="baseData.student"></Receive> -->
                                                         <ReceiveBack class="event-item" v-if="event.Event === 'WrkCmp' && event.data && baseData" :recordInfo="recordInfo" :rcvData="event.data" :students="baseData.student"></ReceiveBack>
@@ -517,7 +517,7 @@ export default {
             }
             this.showPageList = [...this.pageList]
             this.haveInteraction = havePage != 0
-            let pageEvent = pageEvents.filter(item => item.Event === 'PopQuesLoad' || item.Event === 'ReAtmpAnsStrt' || item.Event === 'FastPgPush' || item.Event === 'WrkSpaceEnd' || item.Event === 'SPQStrt')
+            let pageEvent = pageEvents.filter(item => item.Event === 'PopQuesLoad' || item.Event === 'ReAtmpAnsStrt' || item.Event === 'FastPgPush' || item.Event === 'WrkSpaceLoad' || item.Event === 'SPQStrt')
             this.markers = pageEvent.map((item, index) => {
                 return {
                     time: item.Time,

+ 5 - 0
TEAMModelOS/ClientApp/src/css/site.css

@@ -362,3 +362,8 @@ dot::before {
 	left: 0;
 	background: url('https://teammodeltest.blob.core.chinacloudapi.cn/download/dot.png') repeat-x 0 center;
 }
+
+@font-face{
+    font-family: yjsz;
+    src:url('../assets/iconfont/NUMBER.ttf');
+}

+ 2 - 6
TEAMModelOS/ClientApp/src/locale/index.js

@@ -1,15 +1,11 @@
 import Vue from 'vue'
 import VueI18n from 'vue-i18n'
+import jsFn from '@/utils/js-fn.js'
 import tools from '@/utils/public.js'
 import ElementLocale from 'element-ui/lib/locale'
 ElementLocale.i18n((key, value) => i18n.t(key, value))
 Vue.use(VueI18n)
-// 自动根据浏览器系统语言设置语言(优先判断本地设置的语言,如果有则使用本地设置的语言,如果没有则使用浏览器系统语言)
-const curLang = localStorage.getItem('cloudSetting') ? JSON.parse(localStorage.getItem('cloudSetting')).curLang : null
-const navLang = curLang || navigator.language.toLowerCase()
-const localLang = (navLang === 'zh' || navLang === 'zh-tw' || navLang === 'zh-cn' || navLang === 'zh-hk') ? navLang : false
-let lang = localLang || 'en-us'
-localStorage.setItem('local', lang)
+let lang = jsFn.setLocalLang()
 Vue.config.lang = lang
 Vue.locale = () => { }
 const i18n = new VueI18n({

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

@@ -1131,6 +1131,11 @@ export const routes = [{
 		path: '/sportDashboard',
 		component: resolve => require(['@/view/dashboard/Sport.vue'], resolve)
 	},
+	{
+		name: 'stuDashboard',
+		path: '/stuDashboard',
+		component: resolve => require(['@/view/dashboard/Student.vue'], resolve)
+	},
 
 	//教研课例中心
 	{

+ 2 - 2
TEAMModelOS/ClientApp/src/static/Global.js

@@ -359,7 +359,7 @@ const TRAIN_TYPE = () => {
 // PopQuesLoad, 互動問答(選擇,填空等)關聯 irs.json
 // ReAtmpAnsStrt, 二次作答開始 也是關聯 irs.json
 // FastPgPush, 頁面推送, 關聯 push.json
-// WrkSpaceLoad(改用--> WrkSpaceEnd), 作品收集, 關聯 task.json
+// WrkSpaceLoad(改用--> WrkSpaceEnd,根据TimeLine解析会有问题,已换回WrkSpaceLoad), 作品收集, 關聯 task.json
 // WrkCmp, 作品貼上 (沒有特別關聯)
 // BuzrLoad (改用--> BuzrAns), 搶權, 關聯 irs.json. 屬性 isBuzz: true, buzzClients[] 列出所有搶進來的人 
 // SPQStrt, 測驗模式(書面問答), 關聯測驗 \Exam\號碼\exam.json, 這段可能要改良明確關聯到某個測驗
@@ -388,7 +388,7 @@ const HI_TEACH_EVENT = () => {
 			type: 'fn',
 			relation: 'push'
 		},
-		WrkSpaceEnd: {
+		WrkSpaceLoad: {
 			text: '作品收集',
 			type: 'fn',
 			relation: 'task'

+ 20 - 0
TEAMModelOS/ClientApp/src/utils/blobTool.js

@@ -302,6 +302,26 @@ export default class BlobTool {
         return parseRes
     }
 
+    /**
+     * 下载文件
+     * @param {string} filePath 
+     * @param {number} offset 
+     * @param {number} count 
+     * @param {object} options 
+     * @returns 
+     */
+    downloadFolder(folder) {
+        this.listBlob({
+            prefix: folder
+        }).then(
+            res => {
+                res.blobList.forEach(blob => {
+                    this.downloadToFile(blob.blob.substring(1))
+                })
+            }
+        )
+    }
+
     /**
      * 列出目录结构
      * @param {string} delimiter  分割符 默认'/'

+ 12 - 1
TEAMModelOS/ClientApp/src/utils/js-fn.js

@@ -430,6 +430,16 @@ function getBlobInfo(scope) {
     }
 }
 
+function setLocalLang() {
+    // 自动根据浏览器系统语言设置语言(优先判断本地设置的语言,如果有则使用本地设置的语言,如果没有则使用浏览器系统语言)
+    const curLang = localStorage.getItem('cloudSetting') ? JSON.parse(localStorage.getItem('cloudSetting')).curLang : null
+    const navLang = curLang || navigator.language.toLowerCase()
+    const localLang = (navLang === 'zh' || navLang === 'zh-tw' || navLang === 'zh-cn' || navLang === 'zh-hk') ? navLang : false
+    let lang = localLang || 'en-us'
+    localStorage.setItem('local', lang)
+    return lang
+}
+
 export default {
     groupBy,
     isObjEqual,
@@ -453,5 +463,6 @@ export default {
     checkJinNiu,
     checkTrain,
     handleStudentAnswer,
-    getBlobInfo
+    getBlobInfo,
+    setLocalLang
 }

+ 6 - 0
TEAMModelOS/ClientApp/src/view/ability/Review.vue

@@ -356,6 +356,12 @@ export default {
           this.previewFile.type = type
           this.previewStatus = true
           break;
+        case 'image':
+          this.previewFile = JSON.parse(JSON.stringify(file))
+          this.previewFile.link = fullFilePath
+          this.previewFile.type = type
+          this.previewStatus = true
+          break;
         case 'other':
           this.$Message.warning(this.$t('syllabus.noPreview'))
           break;

+ 1 - 1
TEAMModelOS/ClientApp/src/view/classrecord/ClassRecord.vue

@@ -110,7 +110,7 @@
                                         <!-- 推送 -->
                                         <Push class="event-item" v-else-if="event.Event === 'FastPgPush'" :pushData="event.data"></Push>
                                         <!-- 作品收集 -->
-                                        <Receive :recordInfo="recordInfo" class="student-event event-item" v-else-if="event.Event === 'WrkSpaceEnd'" :rcvData="event.data" :students="baseData.student"></Receive>
+                                        <Receive :recordInfo="recordInfo" class="student-event event-item" v-else-if="event.Event === 'WrkSpaceLoad'" :rcvData="event.data" :students="baseData.student"></Receive>
                                         <!-- 随机挑人 -->
                                         <Pick class="event-item student-event" :pickData="event.data" v-else-if="event.Event === 'PickupResult'" :students="baseData.student"></Pick>
                                         <!-- 课中评测 -->

+ 27 - 4
TEAMModelOS/ClientApp/src/view/classrecord/ClassRecordNew.vue

@@ -18,6 +18,11 @@
                 </span>
             </div>
             <div class="action-wrap">
+                <!-- 下载学生作品 -->
+                <!-- <span class="e-note-tag" @click="downloadStuWork">
+                    <Icon type="md-download" />
+                    {{$t('cusMgt.rcd.dlStuWrk')}}
+                </span> -->
                 <!-- 电子笔记 -->
                 <span class="e-note-tag" @click="viewENote">
                     <Icon type="ios-paper" />
@@ -101,7 +106,9 @@
                                             <!-- 推送 -->
                                             <Push class="event-item" v-else-if="event.Event === 'FastPgPush'" :pushData="event.data"></Push>
                                             <!-- 作品收集 -->
-                                            <Receive :recordInfo="recordInfo" class="student-event event-item" v-else-if="event.Event === 'WrkSpaceEnd'" :rcvData="event.data" :students="baseData.student"></Receive>
+                                            <Receive :recordInfo="recordInfo" class="student-event event-item" v-else-if="event.Event === 'WrkSpaceLoad'" :rcvData="event.data" :students="baseData.student"></Receive>
+                                            <!-- 作品回帖 -->
+                                            <WrkCmp :recordInfo="recordInfo" class="student-event event-item" v-else-if="event.Event === 'WrkCmp'" :cmpData="event.data" :students="baseData.student"></WrkCmp>
                                             <!-- 随机挑人 -->
                                             <Pick class="event-item student-event" :pickData="event.data" v-else-if="event.Event === 'PickupResult'" :students="baseData.student"></Pick>
                                             <!-- 课中评测 -->
@@ -124,6 +131,7 @@
     </div>
 </template>
 <script>
+import WrkCmp from './eventchart/WrkCmp.vue'
 import PopQues from './eventchart/PopQues.vue'
 import Buzr from './eventchart/Buzr.vue'
 import Pick from './eventchart/Pick.vue'
@@ -132,9 +140,10 @@ import Exam from './eventchart/Exam.vue'
 import Receive from './eventchart/Receive.vue'
 import DataCount from './eventchart/DataCount.vue'
 import CountTo from 'vue-count-to'
+import BlobTool from '@/utils/blobTool.js'
 export default {
     components: {
-        PopQues, Pick, Push, Receive, DataCount, CountTo, Buzr, Exam
+        PopQues, Pick, Push, Receive, DataCount, CountTo, Buzr, Exam, WrkCmp
     },
     data() {
         return {
@@ -150,7 +159,7 @@ export default {
                     count: 0
                 },
                 {
-                    value: 'WrkSpaceEnd',
+                    value: 'WrkSpaceLoad',
                     text: this.$t('cusMgt.rcd.filter3'),
                     count: 0
                 },
@@ -219,6 +228,12 @@ export default {
         }
     },
     methods: {
+        // 下载学生作品
+        downloadStuWork() {
+            const containerClient = BlobTool.CreateBlobTool(this.recordInfo.scope)
+            containerClient.downloadFolder(`records/${this.recordInfo.id}/Clients`)
+            // containerClient.download('records/327353629404041216/Clients/202106001/Task/22062215471414fae910033d7c165588403418554845256588419audio.mp3')
+        },
         //下载统计表格
         downloadData() {
             let blobInfo = this.recordInfo.scope === 'school' ? this.$store.state.user.schoolProfile : this.$store.state.user.userProfile
@@ -390,6 +405,14 @@ export default {
             })
             console.log(this.pageList)
             this.pageListShow = this.pageList
+            console.log('互动数据', this.pageList)
+            this.pageList.forEach((pageInfo, pageIndex) => {
+                pageInfo.pageData.forEach(e => {
+                    if (e.Event == 'WrkCmp') {
+                        console.log(pageIndex, e)
+                    }
+                })
+            })
             let pageEvent = this.pageEvents.filter(item => item.Event === 'PgJump' || item.Event === 'PgAdd' || item.Event === 'DiscussStart')
             let page = this.markers.length
             pageEvent.forEach((item, index) => {
@@ -487,7 +510,7 @@ export default {
                 this.pageListShow = this.pageList
             } else {
                 let data = this._.cloneDeep(this.pageList)
-                let events = ['FastPgPush', 'WrkSpaceEnd', 'SPQStrt',]
+                let events = ['FastPgPush', 'WrkSpaceLoad', 'SPQStrt',]
                 this.pageListShow = data.map(item => {
                     if (item.pageData.length) {
                         item.pageData = item.pageData.filter(event => {

+ 14 - 12
TEAMModelOS/ClientApp/src/view/classrecord/eventchart/Receive.vue

@@ -3,44 +3,43 @@
     <div class="receive-wrap">
         <p class="clt-type">
             <!-- {{cltTypeMap[collateType].text}}收集:{{collateType}} -->
-            {{$t('cusMgt.rcd.evt4')}}{{collateType}}
+            {{$t('cusMgt.rcd.evt4')}}
         </p>
         <div v-for="(item) in receiveData" :key="item.seatID+item.groupID" class="receive-item">
             <div v-if="collateType == 0">
                 {{$t('cusMgt.rcd.evt5')}}
             </div>
             <!-- 图片类型作品 -->
-            <div v-else-if="collateType == 1">
+            <div v-else-if="collateType == 'Image'">
                 <img v-for="(blob,index) in item.blobFiles" :key="index" class="receive-img" :src="blob" alt="" @click="viewImage(blob)">
             </div>
             <!-- HTEX作品类型 -->
-            <div v-else-if="collateType == 2">
+            <div v-else-if="collateType == 'Htex'">
                 <!-- 收集的HTEX作品 -->
             </div>
             <!-- 音频 -->
-            <div v-else-if="collateType == 3">
+            <div v-else-if="collateType == 'Audio'">
                 <div v-for="(blob,index) in item.blobFiles" :key="index" class="audio-box" @click="viewAudio(blob)">
                     <Icon class="collate-type-icon" custom="iconfont icon-audio-outline" />
                 </div>
             </div>
             <!-- 视频 -->
-            <div v-else-if="collateType == 4">
+            <div v-else-if="collateType == 'Video'">
                 <div v-for="(blob,index) in item.blobFiles" :key="index" class="audio-box" @click="viewAudio(blob)">
                     <Icon class="collate-type-icon" custom="iconfont icon-video-outline" />
                 </div>
             </div>
             <!-- 文字 -->
-            <div v-else-if="collateType == 5">
+            <div v-else-if="collateType == 'Text'">
                 收集的文字
             </div>
             <!-- 附件 -->
-            <div v-else-if="collateType == 6">
+            <div v-else-if="collateType == 'File'">
                 <div v-for="(blob,index) in item.blobFiles" :key="index" class="audio-box" @click="downloadFile(blob,item)">
                     <Icon class="collate-type-icon" custom="iconfont icon-file" />
                 </div>
             </div>
-            <p>
-                <!-- {{ item.isGroupItem ? 'groupID' : 'seatID'}}: -->
+            <p class="name-text">
                 {{ item.isGroupItem ? item.groupID : item.sName}}
             </p>
         </div>
@@ -49,10 +48,10 @@
         <div v-if="previewStatus" class="image-viewer">
             <div style="width:fit-content;position:relative;margin:auto;">
                 <Icon type="md-close" class="close-icon" @click="closePreview" />
-                <video v-if="collateType == 4" id="previewVideo" :src="prevUrl" width="870" controls="controls" style="max-height: 800px;">
+                <video v-if="collateType == 'Video'" id="previewVideo" :src="prevUrl" width="870" controls="controls" style="max-height: 800px;">
                     {{$t('teachContent.tips8')}}
                 </video>
-                <audio v-else-if="collateType == 3" controls>
+                <audio v-else-if="collateType == 'Audio'" controls>
                     <source :src="prevUrl">
                     {{$t('teachContent.notAudio')}}
                 </audio>
@@ -169,7 +168,7 @@ export default {
                 })
             }
             return data
-        }
+        },
     },
     watch: {
         rcvData: {
@@ -185,6 +184,9 @@ export default {
 }
 </script>
 <style lang="less" scoped>
+.name-text{
+    color: #2d8cf0;
+}
 .image-viewer {
     background-color: rgba(0, 0, 0, 0.8);
     z-index: 9999;

+ 255 - 0
TEAMModelOS/ClientApp/src/view/classrecord/eventchart/WrkCmp.vue

@@ -0,0 +1,255 @@
+<template>
+    <!-- 作品收集 -->
+    <div class="receive-wrap">
+        <p class="clt-type">
+            {{$t('cusMgt.rcd.wrkCmp')}}:
+        </p>
+        <div v-for="(item) in cmpDataList" :key="item.url" class="receive-item">
+            <div v-if="collateType == 0">
+                {{$t('cusMgt.rcd.evt5')}}
+            </div>
+            <!-- 图片类型作品 -->
+            <div v-else-if="collateType == 1">
+                <img class="receive-img" :src="item.url" alt="" @click="viewImage(item.url)">
+            </div>
+            <!-- HTEX作品类型 -->
+            <div v-else-if="collateType == 2">
+                <!-- 收集的HTEX作品 -->
+            </div>
+            <!-- 音频 -->
+            <div v-else-if="collateType == 3">
+                <div class="audio-box" @click="viewAudio(item.url)">
+                    <Icon class="collate-type-icon" custom="iconfont icon-audio-outline" />
+                </div>
+            </div>
+            <!-- 视频 -->
+            <div v-else-if="collateType == 4">
+                <div v-for="(blob,index) in item.blobFiles" :key="index" class="audio-box" @click="viewAudio(item.url)">
+                    <Icon class="collate-type-icon" custom="iconfont icon-video-outline" />
+                </div>
+            </div>
+            <!-- 文字 -->
+            <div v-else-if="collateType == 5">
+                收集的文字
+            </div>
+            <!-- 附件 -->
+            <div v-else-if="collateType == 6">
+                <div class="audio-box" @click="downloadFile(item.url,item)">
+                    <Icon class="collate-type-icon" custom="iconfont icon-file" />
+                </div>
+            </div>
+            <p class="name-text">
+                {{ item.isGroupItem ? item.groupID : item.sName}}
+            </p>
+        </div>
+        <StudentClient></StudentClient>
+        <!--文件预览-->
+        <div v-if="previewStatus" class="image-viewer">
+            <div style="width:fit-content;position:relative;margin:auto;">
+                <Icon type="md-close" class="close-icon" @click="closePreview" />
+                <video v-if="collateType == 4" id="previewVideo" :src="prevUrl" width="870" controls="controls" style="max-height: 800px;">
+                    {{$t('teachContent.tips8')}}
+                </video>
+                <audio v-else-if="collateType == 3" controls>
+                    <source :src="prevUrl">
+                    {{$t('teachContent.notAudio')}}
+                </audio>
+            </div>
+        </div>
+    </div>
+</template>
+<script>
+import StudentClient from './StudentClient.vue'
+export default {
+    props: {
+        recordInfo: {
+            type: Object,
+            default: () => {
+                return {}
+            }
+        },
+        cmpData: {
+            type: Object,
+            default: () => {
+                return {}
+            }
+        },
+        students: {
+            type: Array,
+            default: () => {
+                return []
+            }
+        }
+    },
+    components: {
+        StudentClient
+    },
+    data() {
+        return {
+            prevUrl: '',
+            previewStatus: false,
+            collateType: 0,
+            cltTypeMap: {
+                0: {
+                    type: 'None',
+                    text: ''
+                },
+                1: {
+                    type: 'Image',
+                    text: '图片'
+                },
+                2: {
+                    type: 'Htex',
+                    text: 'HTEX'
+                },
+                3: {
+                    type: 'Audio',
+                    text: '音频'
+                },
+                4: {
+                    type: 'Video',
+                    text: '视频'
+                },
+                5: {
+                    type: 'Text',
+                    text: '文字'
+                },
+                6: {
+                    type: 'File',
+                    text: '附件'
+                },
+            }
+        }
+    },
+    methods: {
+        viewAudio(url) {
+            this.prevUrl = url
+            this.previewStatus = true
+        },
+        closePreview() {
+            this.previewStatus = false
+        },
+        viewImage(url) {
+            this.$hevueImgPreview(url)
+        },
+        downloadFile(url, taskInfo) {
+            const downloadRes = async () => {
+                let response = await fetch(url); // 内容转变成blob地址
+                let blob = await response.blob(); // 创建隐藏的可下载链接
+                let objectUrl = window.URL.createObjectURL(blob);
+                let a = document.createElement('a');
+                a.href = objectUrl;
+                let fileName = url.substring(url.lastIndexOf('/' + 1), url.lastIndexOf('?'))
+                a.download = `${taskInfo.sName}-${fileName}`
+                a.click()
+                a.remove();
+            }
+            downloadRes();
+        }
+    },
+    computed: {
+        cmpDataList() {
+            let data = []
+            if (this.cmpData.Works) {
+                data = this._.cloneDeep(this.cmpData.Works)
+                let blobInfo = this.recordInfo.scope == 'school' ? this.$store.state.user.schoolProfile : this.$store.state.user.userProfile
+                data = data.map(u => {
+                    //处理学生姓名和组名
+
+                    let sID = u.substring(9, u.indexOf('Task') - 1)
+                    console.log(this.students)
+                    let s = this.students.find(student => student.id == sID)
+                    let sName = s ? s.name : ''
+                    //处理完整文件路径
+                    return {
+                        url: `${blobInfo.blob_uri}/records/${this.recordInfo.id}${u}?${blobInfo.blob_sas}`,
+                        sID: sID,
+                        sName
+                    }
+
+                })
+            }
+            return data
+        }
+    },
+    watch: {
+        cmpData: {
+            deep: true,
+            immediate: true,
+            handler(n, o) {
+                if (n && n.WrkType) {
+                    this.collateType = n.WrkType
+                }
+            }
+        }
+    }
+}
+</script>
+<style lang="less" scoped>
+.name-text{
+    color: #2d8cf0;
+}
+.image-viewer {
+    background-color: rgba(0, 0, 0, 0.8);
+    z-index: 9999;
+    width: 100%;
+    height: 100%;
+    position: fixed;
+    top: 0;
+    left: 0;
+    overflow-y: scroll;
+    overflow-x: hidden;
+    text-align: center;
+    padding: 50px;
+    padding-top: 8%;
+    .close-icon {
+        position: absolute;
+        right: -16px;
+        top: -16px;
+        font-size: 24px;
+        color: black;
+        cursor: pointer;
+        border-radius: 50px;
+        background: white;
+        padding: 2px;
+        z-index: 9999;
+    }
+}
+.receive-wrap {
+    display: flex;
+}
+.receive-item {
+    margin-right: 20px;
+}
+.receive-img {
+    max-width: 150px;
+    max-height: 150px;
+    border: 1px solid #eeeeee;
+    cursor: pointer;
+}
+.audio-box {
+    width: 80px;
+    height: 80px;
+    border: 1px solid #eeeeee;
+    background: #f3f3f3;
+    text-align: center;
+    line-height: 80px;
+    border-radius: 5px;
+    cursor: pointer;
+    &:hover {
+        // background: #f9f9f9;
+        border-color: #2d8cf0;
+    }
+    &:hover .collate-type-icon {
+        color: #2d8cf0;
+    }
+}
+.collate-type-icon {
+    font-size: 30px;
+}
+.clt-type {
+    margin-right: 10px;
+    font-size: 15px;
+    font-weight: 600;
+}
+</style>

+ 3 - 1
TEAMModelOS/ClientApp/src/view/dashboard/Index.vue

@@ -106,11 +106,12 @@ export default {
         this.$router.push('/researchDashboard')
       } else if (item.path === 'moral' && localStorage.getItem('srvAdr') === 'China' && ['habook', 'ydzt', 'hbcn'].includes(this.$store.state.userInfo.schoolCode)) {
         this.$router.push('/moralDashboard')
-        // window.open('//paas-admin.husiwei.com/GkI043vXpK9sat5yDW008oaWt9yZ1dwIIq7rdiUywbU4HgI656W2cIbzOWRzoI93vzv82l28DyQKxVVd9qPqFkLLmrlCkIvDlWecschool-datawuhZVGb2K8KM5hlGfU0123tKhKd6b5f84EPUOcszar3ltNpImTPa8BeQtVbcuUtdWUL0zmRaUJRHOlYRVbDofmn9K7XTNwf4Q9mh')
       } else if (item.path === 'art' && localStorage.getItem('srvAdr') === 'China' && ['habook', 'ydzt', 'hbcn'].includes(this.$store.state.userInfo.schoolCode)) {
         this.$router.push('/artDashboard')
       } else if (item.path === 'sport' && localStorage.getItem('srvAdr') === 'China' && ['habook', 'ydzt', 'hbcn'].includes(this.$store.state.userInfo.schoolCode)) {
         this.$router.push('/sportDashboard')
+      } else if (item.path === 'stu' && localStorage.getItem('srvAdr') === 'China' && ['habook', 'ydzt', 'hbcn'].includes(this.$store.state.userInfo.schoolCode)) {
+        this.$router.push('/stuDashboard')
       } else {
         this.$Message.warning(this.$t('researchCenter.dashboard.comingSoon'))
       }
@@ -146,6 +147,7 @@ export default {
   align-items: center;
   justify-content: center;
   padding-bottom: 100px;
+  font-family: "微軟正黑體", "Microsoft JhengHei UI", "Microsoft JhengHei";
 
   .dashboard-title {
     font-size: 28px;

+ 405 - 0
TEAMModelOS/ClientApp/src/view/dashboard/Student.less

@@ -0,0 +1,405 @@
+@mainColor: #568aea;
+
+#stuIndex {
+  color: #d3d6dd;
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+  position: relative;
+  font-family: "微軟正黑體",
+    "Microsoft JhengHei UI",
+    "Microsoft JhengHei";
+
+  .dashboard-block {
+    position: relative;
+    width: 98%;
+    height: 97%;
+    margin: 1%;
+    padding: 1%;
+    display: inline-flex;
+    flex-direction: column;
+    border-radius: 10px;
+    background-color: #266ae70f;
+
+    .person {
+      position: absolute;
+      left: 0;
+      top: 0;
+      bottom: 0;
+      right: 0;
+      margin: auto;
+      width: 280px;
+    }
+
+    .block-title {
+      width: 100%;
+      display: flex;
+      padding: 10px;
+      font-size: 18px;
+      font-weight: bold;
+      align-items: center;
+
+
+      &::before {
+        content: '';
+        display: inline-block;
+        width: 5px;
+        height: 15px;
+        margin-right: 10px;
+        border-radius: 5px;
+        background-color: #6184ec;
+      }
+    }
+
+    .block-content {
+      width: 100%;
+      height: 100%;
+      display: flex;
+      padding: 10px;
+    }
+
+    .cicle2 {
+      width: 80%;
+      height: 100%;
+      background: url(./circle.png) no-repeat center;
+      background-size: 100%;
+      position: absolute;
+      top: 27%;
+      left: 10%;
+      transform-style: preserve-3d;
+      transform: translateX(-50%) rotateX(75deg);
+      animation: rotate2 15s linear infinite;
+    }
+
+    @keyframes rotate2 {
+      0% {
+        transform: rotateX(75deg) rotateZ(0);
+      }
+
+      100% {
+        transform: rotateX(75deg) rotateZ(360deg);
+      }
+    }
+  }
+
+
+
+  .tools {
+    position: absolute;
+    right: 30px;
+    top: 40px;
+    font-size: 26px;
+    font-weight: bold;
+    display: flex;
+    align-items: center;
+    cursor: pointer;
+
+    .time-text {
+      font-size: 30px;
+      margin-right: 20px;
+      font-weight: 200;
+      color: #9f9f9f;
+      font-family: 'yjsz';
+    }
+  }
+
+  .ivu-select,
+  .ivu-input,
+  .ivu-select-placeholder {
+    color: @mainColor  !important;
+  }
+
+  .ivu-select-selection,
+  .ivu-input {
+    background-color: #021f554a !important;
+    width: 130px;
+    border-color: @mainColor;
+    border-radius: 5px;
+    height: 30px;
+    margin-right: 10px;
+  }
+
+  .ivu-input {
+    width: 200px;
+    color: #fff !important;
+    font-weight: bold;
+  }
+
+  .ivu-cascader .ivu-cascader-menu-item {
+    color: #fff !important;
+  }
+
+  .ivu-cascader-menu {
+    border-right-color: #4f62b9;
+  }
+
+  .ivu-cascader .ivu-cascader-menu-item:hover,
+  .ivu-cascader-menu .ivu-cascader-menu-item-active {
+    background-color: #01928bd6;
+    color: #e3e6ebc2;
+  }
+
+  .ivu-select-dropdown {
+    // min-width: 200px !important;
+    background-color: #2761c5c2;
+  }
+
+  .ivu-select-item-focus {
+    background-color: #01928bd6;
+  }
+
+  .ivu-select-selected-value {
+    font-size: 18px;
+    color: #fff;
+  }
+
+  .ivu-select-item {
+    color: #fff;
+
+    &:hover {
+      background-color: #01928bd6;
+    }
+  }
+
+  .school-info {
+    position: absolute;
+    left: 30px;
+    top: 40px;
+    font-size: 20px;
+    font-weight: bold;
+    cursor: pointer;
+    display: flex;
+    align-items: center;
+
+
+
+    &-name {
+      margin: 0 10px;
+    }
+
+    &-period {
+      font-size: 12px;
+      background-color: #2d2d2d;
+      display: inline-block;
+      padding: 2px 10px;
+      border-radius: 4px;
+      margin-right: 5px;
+    }
+
+    &-semester {
+      font-size: 12px;
+      background-color: #2d2d2d;
+      display: inline-block;
+      padding: 2px 10px;
+      border-radius: 4px;
+      margin-right: 5px;
+    }
+
+    .dashboard-menu {
+      margin-left: 20px;
+      cursor: pointer;
+
+      &-active {
+        border-bottom: 2px solid #fff;
+      }
+    }
+
+    img {
+      border-radius: 50%;
+      width: 25px;
+    }
+  }
+
+  .bg {
+    width: 100%;
+    height: 100%;
+    padding: 16px 16px 0 16px;
+    background-image: url("../../assets/image/pageBg.png");
+    background-size: cover;
+    background-position: center center;
+  }
+
+  .host-body {
+
+    .dv-dec-10,
+    .dv-dec-10-s {
+      width: 33.3%;
+      height: 5px;
+    }
+
+    .dv-dec-10-s {
+      transform: rotateY(180deg);
+    }
+
+    .dv-dec-8 {
+      width: 200px;
+      height: 50px;
+    }
+
+    .title {
+      position: relative;
+      width: 500px;
+      text-align: center;
+      background-size: cover;
+      background-repeat: no-repeat;
+
+      .title-text {
+        font-size: 24px;
+        font-weight: bold;
+        position: absolute;
+        bottom: 20px;
+        left: 50%;
+        transform: translate(-50%);
+      }
+
+      .dv-dec-6 {
+        position: absolute;
+        bottom: 0;
+        left: 50%;
+        width: 250px;
+        height: 8px;
+        transform: translate(-50%);
+      }
+    }
+
+    // 第二行
+    .aside-width {
+      width: 40%;
+    }
+
+    // 平行四边形
+    .react-right {
+      &.react-l-s {
+        text-align: left;
+        width: 500px;
+      }
+
+      font-size: 18px;
+      width: 300px;
+      line-height: 50px;
+      text-align: center;
+      transform: skewX(-45deg);
+
+      .react-after {
+        position: absolute;
+        right: -25px;
+        top: 0;
+        height: 50px;
+        width: 50px;
+        background-color: #0f1325;
+        transform: skewX(45deg);
+      }
+
+      .text {
+        display: inline-block;
+        transform: skewX(45deg);
+      }
+    }
+
+    .react-left {
+      &.react-l-s {
+        width: 500px;
+        text-align: left;
+      }
+
+      font-size: 18px;
+      width: 300px;
+      height: 50px;
+      line-height: 50px;
+      text-align: center;
+      transform: skewX(45deg);
+      background-color: #0f1325;
+
+      .react-before {
+        position: absolute;
+        left: -25px;
+        top: 0;
+        height: 50px;
+        width: 50px;
+        background-color: #0f1325;
+        transform: skewX(-45deg);
+      }
+
+      .text {
+        display: inline-block;
+        transform: skewX(-45deg);
+      }
+    }
+
+    .body-box {
+      margin-top: 20px;
+      display: flex;
+      justify-content: space-between;
+
+      //下方区域的布局
+      .left-box {
+        width: 25%;
+        height: calc(100vh - 75px);
+        display: flex;
+        flex-direction: column;
+
+        &-top {
+          width: 100%;
+          height: 23%;
+        }
+
+        &-center {
+          width: 100%;
+          height: 42%;
+        }
+
+        &-bottom {
+          width: 100%;
+          height: 30%;
+        }
+      }
+
+      .mid-box {
+        width: 50%;
+        height: calc(100vh - 75px);
+        display: flex;
+        flex-direction: column;
+
+        &-top {
+          width: 100%;
+          height: 65%;
+        }
+
+        &-bottom {
+          width: 100%;
+          height: 30%;
+          display: flex;
+        }
+      }
+
+      // 底部数据
+      .right-box {
+        width: 25%;
+        height: calc(100vh - 75px);
+        display: flex;
+        flex-direction: column;
+
+        &-top {
+          width: 100%;
+          height: 30%;
+        }
+
+        &-center {
+          width: 100%;
+          height: 35%;
+        }
+
+        &-bottom {
+          width: 100%;
+          height: 30%;
+          display: flex;
+
+          .right-bottom-single {
+            width: 50%;
+            height: 100%;
+          }
+        }
+      }
+    }
+  }
+}

+ 169 - 65
TEAMModelOS/ClientApp/src/view/dashboard/Student.vue

@@ -1,20 +1,9 @@
 <template>
-  <div id="artIndex" ref="appRef">
+  <div id="stuIndex" ref="appRef">
     <div class="bg">
       <dv-loading v-if="loading">{{ $t('researchCenter.dashboard.loading') }}</dv-loading>
       <div v-else class="host-body">
         <div class="tools">
-          <!-- <span style="display:flex;">
-            <Select v-model="activeGradeIndex" class-name="dashboard-select" @on-change="onChangeGrade(activeGradeIndex)">
-              <Option v-for="(item,index) in grades" :value="index">{{ item }}</Option>
-            </Select>
-          </span>
-          <span style="display:flex;">
-            <Select v-model="activeClassIndex" class-name="dashboard-select" @on-change="onChangeClass(activeClassIndex)">
-              <Option :value="-1">所有班级</Option>
-              <Option v-for="(item,index) in classes" :value="index">{{ item }}</Option>
-            </Select>
-          </span> -->
           <span class="time-text">{{ dateYear }} <span style="display: inline-block; margin: 0 5px;color: #0fa2fe;">{{ dateDay }}</span> </span>
           <span class="icon iconfont icon-tuichuquanping" style="font-size: 22px;" :title="$t('researchCenter.dashboard.quit')" @click="goBack"></span>
         </div>
@@ -23,16 +12,8 @@
           <span class="school-info-name">{{ schoolInfo.schoolName }}</span>
           <span class="school-info-period">{{ schoolInfo.periodName }}</span>
           <span class="school-info-semester">{{ schoolInfo.curSemester }}</span>
-          <!-- <span>
-            <Select v-model="activeMenu" class-name="dashboard-select" @on-change="onChangeSubject(activeMenu)">
-              <Option value="paint">美术</Option>
-              <Option value="music">音乐</Option>
-            </Select>
-          </span> -->
-          <span :class="['dashboard-menu',activeMenu === 'music' ? 'dashboard-menu-active' : '']" @click="onChangeSubject('music')">音乐</span>
-          <span :class="['dashboard-menu',activeMenu === 'paint' ? 'dashboard-menu-active' : '']" @click="onChangeSubject('paint')">美术</span>
         </div>
-        <div class="d-flex jc-center" style="margin-top:-5px">
+        <div class="d-flex jc-center">
           <dv-decoration-10 class="dv-dec-10" />
           <div class="d-flex jc-center">
             <dv-decoration-8 class="dv-dec-8" :color="['#568aea', '#000000']" />
@@ -46,41 +27,114 @@
         </div>
 
         <div class="body-box">
+          <!-- 左侧 -->
           <div class="left-box">
             <div class="left-box-top">
-              <dv-border-box-12>
-                <LeftTop />
-              </dv-border-box-12>
+              <dv-border-box-13>
+                <div class="dashboard-block">
+                  <div class="block-title">
+                    <span>学生信息</span>
+                    <dv-decoration-1 style="width:150px;height:20px;" />
+                  </div>
+                  <div class="block-content">
+                    <BaseStuProfile></BaseStuProfile>
+                  </div>
+                </div>
+              </dv-border-box-13>
             </div>
             <div class="left-box-center">
-              <dv-border-box-12>
-                <RightTop />
-              </dv-border-box-12>
+              <dv-border-box-13>
+                <div class="dashboard-block">
+                  <div class="block-title">
+                    <span>近期考试成绩统计</span>
+                    <dv-decoration-1 style="width:150px;height:20px;" />
+                  </div>
+                  <div class="block-content">
+                    <BaseWordCloud></BaseWordCloud>
+                  </div>
+                </div>
+              </dv-border-box-13>
             </div>
-            <!-- <div class="left-box-bottom">
+            <div class="left-box-bottom">
+              <dv-border-box-13>
+                <div class="dashboard-block">
+                  <div class="block-title">
+                    <span>本学期活动完成进度</span>
+                    <dv-decoration-1 style="width:150px;height:20px;" />
+                  </div>
+                  <div class="block-content">
+                    <BaseProgressBar></BaseProgressBar>
+                  </div>
+                </div>
+              </dv-border-box-13>
+            </div>
+          </div>
+          <!-- 中间 -->
+          <div class="mid-box">
+            <div class="mid-box-top">
               <dv-border-box-12>
-                <LeftCenter />
+                <div class="dashboard-block">
+                  <div class="cicle2"></div>
+                  <!-- <img src="https://paas-admin.xydqq.cn/img/person.294648df.png" alt="" class="person"> -->
+                  <BaseRadar></BaseRadar>
+                </div>
               </dv-border-box-12>
-            </div> -->
+            </div>
+            <div class="mid-box-bottom">
+              <dv-border-box-13>
+                <div class="dashboard-block">
+                  <div class="block-title">
+                    <span>排名变化</span>
+                    <dv-decoration-1 style="width:150px;height:20px;" />
+                  </div>
+                  <div class="block-content">
+                    <BaseLine></BaseLine>
+                  </div>
+                </div>
+              </dv-border-box-13>
+            </div>
           </div>
-
+          <!-- 右侧 -->
           <div class="right-box">
             <div class="right-box-top">
-              <dv-border-box-12>
-                <LeftBottom />
-              </dv-border-box-12>
+              <dv-border-box-13>
+                <div class="dashboard-block">
+                  <div class="block-title">
+                    <span>课堂积分变化</span>
+                    <dv-decoration-1 style="width:150px;height:20px;" />
+                  </div>
+                  <div class="block-content">
+                    <dv-scroll-board :config="lessonConfig" />
+                  </div>
+                </div>
+              </dv-border-box-13>
+            </div>
+            <div class="right-box-center">
+              <dv-border-box-13>
+                <div class="dashboard-block">
+                  <div class="block-title">
+                    <span>体育学科表现</span>
+                    <dv-decoration-1 style="width:150px;height:20px;" />
+                  </div>
+                  <div class="block-content">
+                    <dv-conical-column-chart :config="sportConfig" />
+                  </div>
+                </div>
+              </dv-border-box-13>
             </div>
             <div class="right-box-bottom">
-              <div class="right-bottom-single">
-                <dv-border-box-12>
-                  <RightBotL />
-                </dv-border-box-12>
-              </div>
-              <div class="right-bottom-single">
-                <dv-border-box-12>
-                  <RightBotR />
-                </dv-border-box-12>
-              </div>
+              <dv-border-box-13>
+                <div class="dashboard-block">
+                  <div class="block-title">
+                    <span>艺术学科表现</span>
+                    <dv-decoration-1 style="width:150px;height:20px;" />
+                  </div>
+                  <div class="block-content">
+                    <BaseArtCircle></BaseArtCircle>
+                    <BaseMusicCircle></BaseMusicCircle>
+                  </div>
+                </div>
+              </dv-border-box-13>
             </div>
           </div>
         </div>
@@ -90,15 +144,14 @@
 </template>
 
 <script>
-import centerLeft1 from '@/components/research-dashboard/centerLeft1'
-import centerLeft2 from '@/components/research-dashboard/centerLeft2'
-import RightBotR from '@/components/dashboard/art/RightBotR'
-import RightBotL from '@/components/dashboard/art/RightBotL'
-import LeftTop from '@/components/dashboard/art/LeftTop'
-import LeftCenter from '@/components/dashboard/art/LeftCenter'
-import LeftBottom from '@/components/dashboard/art/LeftBottom'
-import RightTop from '@/components/dashboard/art/RightTop'
-import bottomRight from '@/components/research-dashboard/bottomRight'
+import BaseRadar from '@/components/dashboard/student/BaseRadar'
+import BaseStuProfile from '@/components/dashboard/student/BaseStuProfile'
+import BaseWordCloud from '@/components/dashboard/student/BaseWordCloud'
+import BaseLine from '@/components/dashboard/student/BaseLine'
+import BaseProgressBar from '@/components/dashboard/student/BaseProgressBar'
+import BaseSportRadar from '@/components/dashboard/student/BaseSportRadar'
+import BaseArtCircle from '@/components/dashboard/student/BaseArtCircle'
+import BaseMusicCircle from '@/components/dashboard/student/BaseMusicCircle'
 export default {
   data() {
     return {
@@ -111,22 +164,73 @@ export default {
       dateYear: null,
       dateWeek: null,
       classes: ['1班', '2班', '3班', '4班', '5班', '6班'],
-      grades: ['五年级', '六年级']
+      grades: ['五年级', '六年级'],
+      lessonConfig: {
+        header: ['<span style="color:#32c5e9;font-weight: bold;">时间</span>', '<span style="color:#32c5e9;font-weight: bold;">项目</span>', '<span style="color:#32c5e9;font-weight: bold;">结果</span>'],
+        data: [
+          ['6-20', '上课迟到', '-5'],
+          ['6-21', '积极发言', '+5'],
+          ['6-22', '上课迟到', '-5'],
+          ['6-23', '上课迟到', '-5'],
+          ['6-24', '上课迟到', '-5'],
+          ['6-25', '上课迟到', '-5'],
+          ['6-26', '上课迟到', '-5'],
+        ],
+        index: true,
+        align: ['center'],
+        headerHeight: 30,
+        headerBGC: "transparent", //表头
+        oddRowBGC: "transparent", //奇数行
+        evenRowBGC: "transparent", //偶数行
+        columnWidth: [70],
+      },
+      sportConfig: {
+        data: [
+          {
+            name: '篮球',
+            value: 55
+          },
+          {
+            name: '足球',
+            value: 120
+          },
+          {
+            name: '排球',
+            value: 71
+          },
+          {
+            name: '羽毛球',
+            value: 66
+          },
+          {
+            name: '网球',
+            value: 80
+          },
+        ],
+        img: [
+          require('@/assets/dashboard/student/sport2.png'),
+          require('@/assets/dashboard/student/sport5.png'),
+          require('@/assets/dashboard/student/sport3.png'),
+          require('@/assets/dashboard/student/sport4.png'),
+          require('@/assets/dashboard/student/sport1.png'),
+        ],
+        imgSideLength: 20,
+        showValue: true
+      }
     }
   },
   components: {
-    centerLeft1,
-    centerLeft2,
-    RightBotR,
-    RightBotL,
-    LeftTop,
-    LeftCenter,
-    LeftBottom,
-    RightTop,
-    bottomRight
+    BaseMusicCircle,
+    BaseArtCircle,
+    BaseSportRadar,
+    BaseProgressBar,
+    BaseRadar,
+    BaseLine,
+    BaseWordCloud,
+    BaseStuProfile,
   },
   mounted() {
-    this.$tools.fullScreen(document.getElementById('artIndex'))
+    this.$tools.fullScreen(document.getElementById('stuIndex'))
     this.timeFn()
     // this.cancelLoading()
   },
@@ -197,7 +301,7 @@ export default {
 </script>
 
 <style lang="less">
-@import "Art.less";
+@import "Student.less";
 @import "style.less";
 </style>
 

BIN
TEAMModelOS/ClientApp/src/view/dashboard/circle.png


+ 24 - 5
TEAMModelOS/ClientApp/src/view/mycourse/MyCourse.vue

@@ -369,11 +369,21 @@ export default {
             return data
         },
         courseListShow() {
+            if(!this.courseList.length){
+                return []
+            }
             let data = this.courseList.filter(item => item.scope == this.listType)
             if (data.length) {
                 this.courseId = data[0].id
             }
-            return data
+            if (data.length) {
+                return data
+            } else {
+                setTimeout(()=>{
+                    this.listType = this.listType == 'school' ? 'private' : 'school'
+                },100)
+                return []
+            }
         },
         //课程名单 —— 去重处理后的数据
         teaClassList() {
@@ -412,8 +422,14 @@ export default {
     },
     methods: {
         setSourceId(value, selectData) {
-            this.startCusInfo.rid = value[1]
-            this.startCusInfo.rp = value[0]
+            console.log(value)
+            if (value.length) {
+                this.startCusInfo.rid = value[1]
+                this.startCusInfo.rp = value[0]
+            } else {
+                this.startCusInfo.rid = ''
+                this.startCusInfo.rp = ''
+            }
         },
         //获取快速登录的code
         getLoginCode() {
@@ -430,7 +446,9 @@ export default {
                 }
                 this.getLoginCode().then(
                     res => {
-                        let url = `${this.siteConfig.ccUrl}?code=${res.code}&school=${this.$store.state.userInfo.schoolCode}&cid=${cid}&cname=${cname}&sp=${sp}&sid=${sid}&sname=${sname}${sourceInfo}`
+                        let schoolCode = this.$store.state.userInfo.schoolCode
+                        let schoolname = this.$store.state.user?.userProfile?.schools?.find(s => s.schoolId == schoolCode)?.name
+                        let url = `${this.siteConfig.ccUrl}?code=${res.code}&school=${schoolCode}&schoolname=${schoolname}&cid=${cid}&cname=${cname}&sp=${sp}&sid=${sid}&sname=${sname}${sourceInfo}`
                         console.log(url)
                         window.open(url)
                     }
@@ -455,6 +473,8 @@ export default {
             this.startCusInfo.sname = this.teaClassList[index].listName || this.teaClassList[index].classInfo?.name
             this.startCusInfo.sId = ''
             this.startCusInfo.sIdValue = []
+            this.startCusInfo.rid = ''
+            this.startCusInfo.rp = ''
             this.startCusStatus = true
         },
         //查询pdf列表
@@ -806,7 +826,6 @@ export default {
                                 }
 
                                 // 删除列表数据
-                                let index = this.curCusIndex
                                 this.curCusIndex = 0
                                 this.$Message.success(this.$t('cusMgt.delOk'))
                             } else {

+ 1 - 2
TEAMModelOS/ClientApp/src/view/mycourse/student/Student.vue

@@ -47,7 +47,7 @@
             </Dropdown>
         </div>
         <vuescroll style="height:100%;">
-            <Alert @on-close="isClose = true" v-show="!isClose" show-icon type="warning" style="margin-bottom:0px" closable>
+            <Alert v-show="!isStuList" show-icon type="warning" style="margin-bottom:0px" closable>
                 {{$t('cusMgt.groupTips')}}
             </Alert>
             <Table :columns="isStuList ? listColumn : classColumn" :data="students" @on-selection-change="(selections)=>{delSelection = selections}" class="system-classroom-table" :loading="stuLoading" :no-data-text="$t('cusMgt.noStu')">
@@ -140,7 +140,6 @@ export default {
             editIndex: -1,
             delSelection: [],
             stuLoading: false,
-            isClose: false,
             classColumn: [
                 {
                     title: ' ',

+ 25 - 25
TEAMModelOS/Controllers/Third/Sc/ScApiController.cs

@@ -93,7 +93,7 @@ namespace TEAMModelOS.Controllers
             Dictionary<string, object> parameterMap = new Dictionary<string, object>();
             parameterMap.Add("TrainComID", scsyxptConfig.trainComID);
             ScsResult GetProjectInfoByTrainComID = await _scsApisService.Post(scsyxptConfig.url, Code, scsyxptConfig.passKey, scsyxptConfig.privateKey, parameterMap);
-            GetProjectInfoByTrainComID.code = Code;
+            GetProjectInfoByTrainComID.bizcode = Code;
             GetProjectInfoByTrainComID.title = "5.3.1.1获取项目列表";
 
 
@@ -106,7 +106,7 @@ namespace TEAMModelOS.Controllers
                 { "ProjectItemID", "1131" }
             };
             ScsResult GetSchoolList1 = await _scsApisService.Post(scsyxptConfig.url, Code, scsyxptConfig.passKey, scsyxptConfig.privateKey, parameterMap);
-            GetSchoolList1.code = Code;
+            GetSchoolList1.bizcode = Code;
             GetSchoolList1.title = "5.3.1.18根据机构ID、项目ID、子项目ID返回学校列表";
 
             // 5.3.1.19获取项目设置的可选能力点,
@@ -118,7 +118,7 @@ namespace TEAMModelOS.Controllers
                 { "ProjectItemID", "1086" }
             };
             ScsResult GetProjectDiagnosis = await _scsApisService.Post(scsyxptConfig.url, Code, scsyxptConfig.passKey, scsyxptConfig.privateKey, parameterMap);
-            GetProjectDiagnosis.code = Code;
+            GetProjectDiagnosis.bizcode = Code;
             GetProjectDiagnosis.title = "5.3.1.19获取项目设置的可选能力点";
             // 补充
             //  5.3.1.3通过项目编号获取学员测评能力项,需要确认每个教师是是否一样。
@@ -131,7 +131,7 @@ namespace TEAMModelOS.Controllers
                 { "PXID", "242849" }
             };
             ScsResult GetDiagnosisListByProject_V2 = await _scsApisService.Post(scsyxptConfig.url, Code, scsyxptConfig.passKey, scsyxptConfig.privateKey, parameterMap);
-            GetDiagnosisListByProject_V2.code = Code;
+            GetDiagnosisListByProject_V2.bizcode = Code;
             GetDiagnosisListByProject_V2.title = "5.3.1.3通过项目编号获取学员测评能力项V2";
 
 
@@ -144,7 +144,7 @@ namespace TEAMModelOS.Controllers
                 { "ProjectItemID", "1086" }
             };
             ScsResult GetTeachersListByProject = await _scsApisService.Post(scsyxptConfig.url, Code, scsyxptConfig.passKey, scsyxptConfig.privateKey, parameterMap);
-            GetTeachersListByProject.code = Code;
+            GetTeachersListByProject.bizcode = Code;
 
 
             GetTeachersListByProject.title = "5.3.1.2获取学员名单"; return Ok(GetProjectInfoByTrainComID);
@@ -156,7 +156,7 @@ namespace TEAMModelOS.Controllers
             parameterMap.Add("Pxid", "254175");
             parameterMap.Add("Tid", "422152");
             ScsResult GetSingleTeacherByProject = await _scsApisService.Post(scsyxptConfig.url, Code, scsyxptConfig.passKey, scsyxptConfig.privateKey, parameterMap);
-            GetSingleTeacherByProject.code = Code;
+            GetSingleTeacherByProject.bizcode = Code;
             GetSingleTeacherByProject.title = "5.3.1.11获取跳转学员信息";
 
             return Ok(new { GetSingleTeacherByProject, GetProjectDiagnosis });
@@ -172,7 +172,7 @@ namespace TEAMModelOS.Controllers
             parameterMap.Add("ProjectItemID", "24");
             parameterMap.Add("PXID", "65321");
             ScsResult GetDiagnosisListByProject = await _scsApisService.Post(scsyxptConfig.url, Code, scsyxptConfig.passKey, scsyxptConfig.privateKey, parameterMap);
-            GetDiagnosisListByProject.code = Code;
+            GetDiagnosisListByProject.bizcode = Code;
             GetDiagnosisListByProject.title = "5.3.1.3通过项目编号获取学员测评能力项";
 
 
@@ -185,7 +185,7 @@ namespace TEAMModelOS.Controllers
             //parameterMap.Add("ProjectItemID", "22");
             parameterMap.Add("PXID", "244188");
             ScsResult GetDiagnosisListByProject_V2T = await _scsApisService.Post(scsyxptConfig.url, Code, scsyxptConfig.passKey, scsyxptConfig.privateKey, parameterMap);
-            GetDiagnosisListByProject_V2T.code = Code;
+            GetDiagnosisListByProject_V2T.bizcode = Code;
             GetDiagnosisListByProject_V2T.title = "5.3.1.3通过项目编号获取学员测评能力项V2";
 
             ScsResult UpdateTeacherSituation = null;
@@ -202,7 +202,7 @@ namespace TEAMModelOS.Controllers
                 parameterMap.Add("ResearchText", "");//学习成果描述,字符长度<=300
                 parameterMap.Add("ComPassed", "1");//0、未认定  1、合格  2、优秀  3、不合格  4、其他
                 UpdateTeacherSituation = await _scsApisService.Post(scsyxptConfig.url, Code, scsyxptConfig.passKey, scsyxptConfig.privateKey, parameterMap);
-                UpdateTeacherSituation.code = Code;
+                UpdateTeacherSituation.bizcode = Code;
                 UpdateTeacherSituation.title = "5.3.1.4学员培训基本情况回写";
             }
             catch (Exception ex) { }
@@ -230,7 +230,7 @@ namespace TEAMModelOS.Controllers
                 pfileMapA.Add("fileType", "pdf");
                 pfilesA.Add(pfileMapA);
                 UpdateTeacherDiagnosis = await _scsApisService.Post(scsyxptConfig.url, Code, scsyxptConfig.passKey, scsyxptConfig.privateKey, parameterMap);
-                UpdateTeacherDiagnosis.code = Code;
+                UpdateTeacherDiagnosis.bizcode = Code;
                 UpdateTeacherDiagnosis.title = "5.3.1.5学员能力点测评结果回写";
             }
             catch (Exception ex)
@@ -243,7 +243,7 @@ namespace TEAMModelOS.Controllers
             parameterMap = new Dictionary<string, object>();
             parameterMap.Add("TrainComID", trainComID);
             ScsResult GetDiagnosisDic = await _scsApisService.Post(scsyxptConfig.url, Code, scsyxptConfig.passKey, scsyxptConfig.privateKey, parameterMap);
-            GetDiagnosisDic.code = Code;
+            GetDiagnosisDic.bizcode = Code;
             GetDiagnosisDic.title = "5.3.1.6获取能力测评体系字典值数据";
 
 
@@ -253,7 +253,7 @@ namespace TEAMModelOS.Controllers
             parameterMap.Add("TrainComID", trainComID);
             parameterMap.Add("DiagnosisDicID", "3");
             ScsResult GetDiagnosisItemDic = await _scsApisService.Post(scsyxptConfig.url, Code, scsyxptConfig.passKey, scsyxptConfig.privateKey, parameterMap);
-            GetDiagnosisItemDic.code = Code;
+            GetDiagnosisItemDic.bizcode = Code;
             GetDiagnosisItemDic.title = "5.3.1.7获取能力测评评价类型字典值数据";
 
 
@@ -263,7 +263,7 @@ namespace TEAMModelOS.Controllers
             parameterMap.Add("TrainComID", trainComID);
             parameterMap.Add("DiagnosisItemID", "4");
             ScsResult GetchoiceDic = await _scsApisService.Post(scsyxptConfig.url, Code, scsyxptConfig.passKey, scsyxptConfig.privateKey, parameterMap);
-            GetchoiceDic.code = Code;
+            GetchoiceDic.bizcode = Code;
             GetchoiceDic.title = "5.3.1.8获取能力测评评价类型细则字典值数据";
 
 
@@ -273,7 +273,7 @@ namespace TEAMModelOS.Controllers
             parameterMap.Add("TrainComID", trainComID);
             parameterMap.Add("PXID", "65321");
             ScsResult GetTeacherInfoByPXID = await _scsApisService.Post(scsyxptConfig.url, Code, scsyxptConfig.passKey, scsyxptConfig.privateKey, parameterMap);
-            GetTeacherInfoByPXID.code = Code;
+            GetTeacherInfoByPXID.bizcode = Code;
             GetTeacherInfoByPXID.title = "5.3.1.9根据培训ID与机构ID获取老师信息";
 
 
@@ -285,7 +285,7 @@ namespace TEAMModelOS.Controllers
             parameterMap.Add("SchoolID", "220913");
             parameterMap.Add("Type", "0");
             ScsResult GetSchoolPlanBySchoolID = await _scsApisService.Post(scsyxptConfig.url, Code, scsyxptConfig.passKey, scsyxptConfig.privateKey, parameterMap);
-            GetSchoolPlanBySchoolID.code = Code;
+            GetSchoolPlanBySchoolID.bizcode = Code;
             GetSchoolPlanBySchoolID.title = "5.3.1.10根据培训项目ID与学校ID获取学校方案";
 
 
@@ -340,7 +340,7 @@ namespace TEAMModelOS.Controllers
                     //list.Add(parameterMapData);
                 }
                 UpdateTeacherListSituation = await _scsApisService.Post(scsyxptConfig.url, Code, scsyxptConfig.passKey, scsyxptConfig.privateKey, parameterContent);
-                UpdateTeacherListSituation.code = Code;
+                UpdateTeacherListSituation.bizcode = Code;
                 UpdateTeacherListSituation.title = "5.3.1.12学员培训基本情况批量回写";
             }
             catch (Exception ex) { }
@@ -418,7 +418,7 @@ namespace TEAMModelOS.Controllers
                 //    list.Add(parameterMapData);
                 //}
                 UpdateTeacherListDiagnosis = await _scsApisService.Post(scsyxptConfig.url, Code, scsyxptConfig.passKey, scsyxptConfig.privateKey, parameterContent);
-                UpdateTeacherListDiagnosis.code = Code;
+                UpdateTeacherListDiagnosis.bizcode = Code;
                 UpdateTeacherListDiagnosis.title = "5.3.1.13学员能力点测评结果批量回写";
             }
             catch (Exception ex)
@@ -441,7 +441,7 @@ namespace TEAMModelOS.Controllers
                 parameterMap.Add("md5", "9c3da8c5c07c2c660cd73c01f56d7fca");
                 parameterMap.Add("fileType", "pdf");
                 UploadSBTARPDF = await _scsApisService.Post(scsyxptConfig.url, Code, scsyxptConfig.passKey, scsyxptConfig.privateKey, parameterMap);
-                UploadSBTARPDF.code = Code;
+                UploadSBTARPDF.bizcode = Code;
                 UploadSBTARPDF.title = "5.3.1.14学员校本研修PDF回写";
             }
             catch (Exception ex)
@@ -479,7 +479,7 @@ namespace TEAMModelOS.Controllers
                     list.Add(parameterMapData);
                 }
                 UploadSBTARPDFList = await _scsApisService.Post(scsyxptConfig.url, Code, scsyxptConfig.passKey, scsyxptConfig.privateKey, parameterContent);
-                UploadSBTARPDFList.code = Code;
+                UploadSBTARPDFList.bizcode = Code;
                 UploadSBTARPDFList.title = "5.3.1.15学员校本教研PDF批量回写";
             }
             catch (Exception ex) { }
@@ -499,7 +499,7 @@ namespace TEAMModelOS.Controllers
                 parameterMap.Add("md5", "9c3da8c5c07c2c660cd73c01f56d7fca");
                 parameterMap.Add("fileType", "mp4");
                 UploadKTSL = await _scsApisService.Post(scsyxptConfig.url, Code, scsyxptConfig.passKey, scsyxptConfig.privateKey, parameterMap);
-                UploadKTSL.code = Code;
+                UploadKTSL.bizcode = Code;
                 UploadKTSL.title = "5.3.1.16学员课堂实录回写";
             }
             catch (Exception ex) { }
@@ -537,7 +537,7 @@ namespace TEAMModelOS.Controllers
                     list.Add(parameterMapData);
                 }
                 UploadKTSLList = await _scsApisService.Post(scsyxptConfig.url, Code, scsyxptConfig.passKey, scsyxptConfig.privateKey, parameterContent);
-                UploadKTSLList.code = Code;
+                UploadKTSLList.bizcode = Code;
                 UploadKTSLList.title = "5.3.1.17学员课堂实录批量回写";
 
             }
@@ -550,7 +550,7 @@ namespace TEAMModelOS.Controllers
             parameterMap.Add("ProjectID", "22");
             parameterMap.Add("ProjectItemID", "24");
             ScsResult GetSchoolList = await _scsApisService.Post(scsyxptConfig.url, Code, scsyxptConfig.passKey, scsyxptConfig.privateKey, parameterMap);
-            GetSchoolList.code = Code;
+            GetSchoolList.bizcode = Code;
             GetSchoolList.title = "5.3.1.18根据机构ID、项目ID、子项目ID返回学校列表";
 
 
@@ -566,7 +566,7 @@ namespace TEAMModelOS.Controllers
             parameterMap.Add("ProjectItemID", "21");
             parameterMap.Add("SchoolID", "200001");
             ScsResult GetSchoolDiagnosis = await _scsApisService.Post(scsyxptConfig.url, Code, scsyxptConfig.passKey, scsyxptConfig.privateKey, parameterMap);
-            GetSchoolDiagnosis.code = Code;
+            GetSchoolDiagnosis.bizcode = Code;
             GetSchoolDiagnosis.title = "5.3.1.20获取学校设置的可选能力点";
 
             // 5.3.1.21分页获取学员名单
@@ -578,7 +578,7 @@ namespace TEAMModelOS.Controllers
             parameterMap.Add("curPage", "1");
             parameterMap.Add("pageSize", "10");
             ScsResult GetTeachersPageListByProject = await _scsApisService.Post(scsyxptConfig.url, Code, scsyxptConfig.passKey, scsyxptConfig.privateKey, parameterMap);
-            GetTeachersPageListByProject.code = Code;
+            GetTeachersPageListByProject.bizcode = Code;
             GetTeachersPageListByProject.title = "5.3.1.21分页获取学员名单";
 
             // 5.3.1.22学员校本教研PDF(每人可以返回多条)批量回写
@@ -633,7 +633,7 @@ namespace TEAMModelOS.Controllers
                 list.Add(parameterMapData);
             }
             ScsResult UploadSBTARPDFListV2 = await _scsApisService.Post(scsyxptConfig.url, Code, scsyxptConfig.passKey, scsyxptConfig.privateKey, parameterContent);
-            UploadSBTARPDFListV2.code = Code;
+            UploadSBTARPDFListV2.bizcode = Code;
             UploadSBTARPDFListV2.title = "5.3.1.22学员校本教研PDF(每人可以返回多条)批量回写";
 
 

+ 1 - 1
TEAMModelOS/Controllers/Third/Sc/ScDataInitController.cs

@@ -95,7 +95,7 @@ namespace TEAMModelOS.Controllers.Third
             {
                 Dictionary<string, object> parameterMap = new Dictionary<string, object>();
                 parameterMap.Add("TrainComID", config.trainComID);
-                ScsResult result = new ScsResult { code = Code, title = "5.3.1.1获取项目列表" };
+                ScsResult result = new ScsResult { bizcode = Code, title = "5.3.1.1获取项目列表" };
                 result = await _thirdApisService.Post(config.url, Code, config.passKey, config.privateKey, parameterMap);
                 List<ScProject> projects = result.content.ToObject<List<ScProject>>(new JsonSerializerOptions { PropertyNameCaseInsensitive = false });
                 List<ScProject> scProjects = await table.FindListByDict<ScProject>(new Dictionary<string, object> { { Constant.PartitionKey, "ScProject" }, { "trainComID", $"{config.trainComID}" } });

+ 435 - 303
TEAMModelOS/Controllers/Third/Sc/ScDataPushController.cs

@@ -31,15 +31,15 @@ namespace TEAMModelOS.Controllers
  
         public IConfiguration _configuration { get; set; }
 
-        //private readonly ThirdApisService _thirdApisService;
-        public ScDataPushController( AzureCosmosFactory azureCosmos,   AzureStorageFactory azureStorage,  IConfiguration configuration)
+        private readonly ThirdApisService _thirdApisService;
+        public ScDataPushController(ThirdApisService thirdApisService, AzureCosmosFactory azureCosmos,   AzureStorageFactory azureStorage,  IConfiguration configuration)
         {
             _azureCosmos = azureCosmos;
            
             _azureStorage = azureStorage;
           
             _configuration = configuration;
-           // _thirdApisService = thirdApisService;
+            _thirdApisService = thirdApisService;
         }
      
         [ProducesDefaultResponseType]
@@ -48,356 +48,488 @@ namespace TEAMModelOS.Controllers
              
             var client = _azureCosmos.GetCosmosClient();
             JsonElement areaIdJson = json.GetProperty("areaId");
+           // JsonElement school = json.GetProperty("school");
+            JsonElement schoolsJson = json.GetProperty("schools");
+            Dictionary<string, Dictionary<string, object>> pushDatas = new Dictionary<string, Dictionary<string, object>>();
+            List<Dictionary<string, object>> dicts = new List<Dictionary<string, object>>();
+            List<string> pushTeachers = json.GetProperty("pushTeachers").ToObject<List<string>>();
+            List<ScsResult> results = new List<ScsResult>();
             AreaSetting areaSetting = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemAsync<AreaSetting>($"{areaIdJson}", new PartitionKey("AreaSetting"));
             ScAccessConfig config = areaSetting.accessConfig.ToObject<ScAccessConfig>();
-            JsonElement school = json.GetProperty("school");
-            List<string> pushTeachers = json.GetProperty("pushTeachers").ToObject<List<string>>();
-            StringBuilder queryText = new StringBuilder($"SELECT distinct value(c) FROM c where c.type='yxtrain'");
-            List<GroupList> yxtrain = new List<GroupList>();
-            await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<GroupList>(queryText: queryText.ToString(),
-            requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"GroupList-{school}") }))
-            {
-                yxtrain.Add(item);
-            }
-            List<TeacherTrain> trains = new List<TeacherTrain>();
-            var members = yxtrain.SelectMany(x => x.members).ToList();
-            //指定推送一部分的教师 
-            if (pushTeachers.IsNotEmpty())
-            {
-                members = members.FindAll(x => pushTeachers.Contains(x.id));
-            }
-            if (members.IsNotEmpty())
-            {
-                queryText = new StringBuilder($"SELECT distinct value(c) FROM c where 1=1  " +
-                    $"and  c.id in ({string.Join(",", members.Select(x => $"'{x.id}'"))}) ");
-                await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<TeacherTrain>(queryText: queryText.ToString(),
-                requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"TeacherTrain-{school}") }))
+            Dictionary<string, dynamic > checkDatas = new  Dictionary<string, dynamic >();
+
+
+
+
+            List<string> schools = schoolsJson.ToObject<List<string>>();
+            foreach (var school in schools) {
+                StringBuilder queryText = new StringBuilder($"SELECT distinct value(c) FROM c where c.type='yxtrain'");
+                List<GroupList> yxtrain = new List<GroupList>();
+                await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<GroupList>(queryText: queryText.ToString(),
+                requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"GroupList-{school}") }))
                 {
-                    trains.Add(item);
+                    yxtrain.Add(item);
                 }
-            }
+                List<TeacherTrain> trains = new List<TeacherTrain>();
+                var members = yxtrain.SelectMany(x => x.members).ToList();
+                //指定推送一部分的教师 
+                if (pushTeachers.IsNotEmpty())
+                {
+                    members = members.FindAll(x => pushTeachers.Contains(x.id));
+                }
+                if (members.IsNotEmpty())
+                {
+                    queryText = new StringBuilder($"SELECT distinct value(c) FROM c where 1=1  " +
+                        $"and  c.id in ({string.Join(",", members.Select(x => $"'{x.id}'"))}) ");
+                    await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<TeacherTrain>(queryText: queryText.ToString(),
+                    requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"TeacherTrain-{school}") }))
+                    {
+                        trains.Add(item);
+                    }
+                }
+                var table = _azureStorage.GetCloudTableClient().GetTableReference("ScYxpt");
+                List<ScTeacher> scTeachers = await table.FindListByDict<ScTeacher>(new Dictionary<string, object> { { "PartitionKey", "ScTeacher" }, { "schoolCode", $"{school}" } });
+                List<ScTeacherDiagnosis> scTeacherDiagnoses = await table.FindListByDict<ScTeacherDiagnosis>(new Dictionary<string, object> { { "PartitionKey", "ScTeacherDiagnosis" }, { "schoolCode", $"{school}" } });
 
-            //string sql = $" SELECT value(c) FROM c join a in c.binds where ARRAY_LENGTH(c.binds)>0 and a.type='{config.config}' ";
-            //List<Teacher> teachers = new List<Teacher>();
-            //await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<Teacher>(queryText: sql,
-            //    requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base") }))
-            //{
-            //    teachers.Add(item);
-            //}
-            var table = _azureStorage.GetCloudTableClient().GetTableReference("ScYxpt");
-            List<ScTeacher> scTeachers = await table.FindListByDict<ScTeacher>(new Dictionary<string, object> { { "PartitionKey", "ScTeacher" }, { "schoolCode", $"{school}" } });
-            List<ScTeacherDiagnosis> scTeacherDiagnoses = await table.FindListByDict<ScTeacherDiagnosis>(new Dictionary<string, object> { { "PartitionKey", "ScTeacherDiagnosis" }, { "schoolCode", $"{school}" } });
+                List<KeyValuePair<TeacherTrain, string>> trainsNO = new List<KeyValuePair<TeacherTrain, string>>();
 
-            List<KeyValuePair<TeacherTrain, string>> trainsNO = new List<KeyValuePair<TeacherTrain, string>>();
 
-            List<ScsResult> results = new List<ScsResult>();
-            Dictionary<string, Dictionary<string, object>> pushDatas = new Dictionary<string, Dictionary<string, object>>();
-            List<Dictionary<string, object>> dicts = new List<Dictionary<string, object>>();
-            int pages = (trains.Count + 19) / 20; //pages = (total + max -1) / max;
-            for (int i = 0; i < pages; i++)
-            {
-                List<TeacherTrain> lists = trains.Skip((i) * 20).Take(20).ToList();
-                //5.3.1.12学员培训基本情况批量回写-UpdateTeacherListSituation
-                List<TeacherTrain> trains53112OK = new List<TeacherTrain>();
-                ScsResult UpdateTeacherListSituation = null;
-                Dictionary<string, object> parameterContent53112 = new Dictionary<string, object>();
-                List<Dictionary<string, object>> list53112 = new List<Dictionary<string, object>>();
-                parameterContent53112.Add("TrainComID", config.trainComID);
-                parameterContent53112.Add("List", list53112);
+                int pages = (trains.Count + 49) / 50; //pages = (total + max -1) / max;
 
-                //5.3.1.13学员能力点测评结果批量回写-UpdateTeacherListDiagnosis  300条限制 
-                List<TeacherTrain> trains53113OK = new List<TeacherTrain>();
-                ScsResult UpdateTeacherListDiagnosis = null;
-                Dictionary<string, object> parameterContent53113 = new Dictionary<string, object>();
-                List<Dictionary<string, object>> list53113 = new List<Dictionary<string, object>>();
-                parameterContent53113.Add("TrainComID", config.trainComID);
-                parameterContent53113.Add("List", list53113);
+                var teammodelossas = _azureStorage.GetBlobContainerSAS99Year("teammodelos", Azure.Storage.Sas.BlobContainerSasPermissions.Read);
+                var schoolsas = _azureStorage.GetBlobContainerSAS99Year($"{school}", Azure.Storage.Sas.BlobContainerSasPermissions.Read);
+                HashSet<TeacherTrain> updatePush = new HashSet<TeacherTrain>();
+                for (int i = 0; i < pages; i++)
+                {
+                    List<TeacherTrain> lists = trains.Skip((i) * 50).Take(50).ToList();
+                    //5.3.1.12学员培训基本情况批量回写-UpdateTeacherListSituation
+                    List<TeacherTrain> trains53112OK = new List<TeacherTrain>();
+                    ScsResult UpdateTeacherListSituation = null;
+                    Dictionary<string, object> parameterContent53112 = new Dictionary<string, object>();
+                    List<Dictionary<string, object>> list53112 = new List<Dictionary<string, object>>();
+                    parameterContent53112.Add("TrainComID", config.trainComID);
+                    parameterContent53112.Add("List", list53112);
+
+                    //5.3.1.13学员能力点测评结果批量回写-UpdateTeacherListDiagnosis  300条限制 
+                    List<TeacherTrain> trains53113OK = new List<TeacherTrain>();
+                    ScsResult UpdateTeacherListDiagnosis = null;
+                    Dictionary<string, object> parameterContent53113 = new Dictionary<string, object>();
+                    List<Dictionary<string, object>> list53113 = new List<Dictionary<string, object>>();
+                    parameterContent53113.Add("TrainComID", config.trainComID);
+                    parameterContent53113.Add("List", list53113);
+
+                    //5.3.1.17学员课堂实录批量回写-UploadKTSLList     300条限制 
+                    List<TeacherTrain> trains53117OK = new List<TeacherTrain>();
+                    ScsResult UploadKTSLList = null;
+                    Dictionary<string, object> parameterContent53117 = new Dictionary<string, object>();
+                    List<Dictionary<string, object>> list53117 = new List<Dictionary<string, object>>();
+                    parameterContent53117.Add("TrainComID", config.trainComID);
+                    parameterContent53117.Add("List", list53117);
 
-                //5.3.1.17学员课堂实录批量回写-UploadKTSLList     300条限制 
-                List<TeacherTrain> trains53117OK = new List<TeacherTrain>();
-                ScsResult UploadKTSLList = null;
-                Dictionary<string, object> parameterContent53117 = new Dictionary<string, object>();
-                List<Dictionary<string, object>> list53117 = new List<Dictionary<string, object>>();
-                parameterContent53117.Add("TrainComID", config.trainComID);
-                parameterContent53117.Add("List", list53117);
+                    //5.3.1.22学员校本教研PDF(每人可以返回多条)批量回写-UploadSBTARPDFListV2   100条限制
+                    List<TeacherTrain> trains53122OK = new List<TeacherTrain>();
+                    ScsResult UploadSBTARPDFListV2 = null;
+                    Dictionary<string, object> parameterContent53122 = new Dictionary<string, object>();
+                    List<Dictionary<string, object>> list53122 = new List<Dictionary<string, object>>();
+                    parameterContent53122.Add("TrainComID", config.trainComID);
+                    parameterContent53122.Add("List", list53122);
+                    //装载数据
+                    List<Task> tasks = new List<Task>();
+                    lists.ForEach(x =>
+                    {
+                        tasks.Add(CheckTeacher(x, scTeachers, scTeacherDiagnoses, $"{school}", schoolsas, list53112, list53113, list53117, list53122, teammodelossas, pushDatas, updatePush));
+                    });
+                    await Task.WhenAll(tasks);
+                    //推送数据
+                    if (list53112.IsNotEmpty())
+                    {
 
-                //5.3.1.22学员校本教研PDF(每人可以返回多条)批量回写-UploadSBTARPDFListV2   100条限制
-                List<TeacherTrain> trains53122OK = new List<TeacherTrain>();
-                ScsResult UploadSBTARPDFListV2 = null;
-                Dictionary<string, object> parameterContent53122 = new Dictionary<string, object>();
-                List<Dictionary<string, object>> list53122 = new List<Dictionary<string, object>>();
-                parameterContent53122.Add("TrainComID", config.trainComID);
-                parameterContent53122.Add("List", list53122);
-                //装载数据
-                dicts.Add(parameterContent53112);
-                dicts.Add(parameterContent53113);
-                dicts.Add(parameterContent53117);
-                dicts.Add(parameterContent53122);
-                foreach (var x in lists)
+                        dicts.Add(parameterContent53112);
+                        UpdateTeacherListSituation = await _thirdApisService.Post(config.url, "UpdateTeacherListSituation", config.passKey, config.privateKey, parameterContent53112);
+                        UpdateTeacherListSituation.bizcode = "UpdateTeacherListSituation";
+                        UpdateTeacherListSituation.title = "5.3.1.12学员培训基本情况批量回写";
+                        results.Add(UpdateTeacherListSituation);
+                    }
+
+                    if (list53113.IsNotEmpty())
+                    {
+                        dicts.Add(parameterContent53113);
+                        UpdateTeacherListDiagnosis = await _thirdApisService.Post(config.url, "UpdateTeacherListDiagnosis", config.passKey, config.privateKey, parameterContent53113);
+                        UpdateTeacherListDiagnosis.bizcode = "UpdateTeacherListDiagnosis";
+                        UpdateTeacherListDiagnosis.title = "5.3.1.13学员能力点测评结果批量回写";
+                        results.Add(UpdateTeacherListDiagnosis);
+                    }
+
+                    if (list53117.IsNotEmpty())
+                    {
+                        dicts.Add(parameterContent53117);
+                        UploadKTSLList = await _thirdApisService.Post(config.url, "UploadKTSLList", config.passKey, config.privateKey, parameterContent53117);
+                        UploadKTSLList.bizcode = "UploadKTSLList";
+                        UploadKTSLList.title = "5.3.1.17学员课堂实录批量回写";
+                        results.Add(UploadKTSLList);
+                    }
+
+                    if (list53122.IsNotEmpty())
+                    {
+                        dicts.Add(parameterContent53122);
+                        UploadSBTARPDFListV2 = await _thirdApisService.Post(config.url, "UploadSBTARPDFListV2", config.passKey, config.privateKey, parameterContent53122);
+                        UploadSBTARPDFListV2.bizcode = "UploadSBTARPDFListV2";
+                        UploadSBTARPDFListV2.title = "5.3.1.22学员校本教研PDF(每人可以返回多条)批量回写";
+                        results.Add(UploadSBTARPDFListV2);
+                    }
+                }
+                List<Task<ItemResponse<TeacherTrain>>> tas = new List<Task<ItemResponse<TeacherTrain>>>();
+                updatePush.ToList().ForEach(x =>
                 {
-                    List<KeyValuePair<string, string>> msgs = new List<KeyValuePair<string, string>>();
-                    List<ScTeacher> teacher = scTeachers.FindAll(t => !string.IsNullOrWhiteSpace(t.tmdid) && t.tmdid.Equals(x.id));
-                    foreach (var t in teacher)
+                    tas.Add(client.GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReplaceItemAsync(x, x.id, new PartitionKey(x.code)));
+                });
+                await Task.WhenAll(tas);
+               
+                pushDatas.Keys.ToList().ForEach(x => {
+                    if (pushDatas[x].Keys.Any())
                     {
-                        List<PushFail> fails = new List<PushFail>();
-                        Dictionary<string, object> pushData = new Dictionary<string, object>();
-                        string jsonTech = scTeacherDiagnoses.ToJsonString();
-                        ScTeacherDiagnosis diagnosis = scTeacherDiagnoses.Find(x => x.RowKey.Equals($"{t.PXID}"));
-                        (int t53112OK, List<KeyValuePair<string, string>> msgs53112) = ThirdService. check53112(x, msgs);
-                        (int t53113OK, List<KeyValuePair<string, string>> msgs53113, List<AbilitySub> abilitySubs) = await ThirdService.check53113(_azureCosmos,x, diagnosis, msgs);
-                        (int t53117OK, List<KeyValuePair<string, string>> msgs53117) = ThirdService.check53117(x, msgs);
-                        (int t53122OK, List<KeyValuePair<string, string>> msgs53122) = ThirdService.check53122(x, msgs);
+                        Dictionary<string, dynamic> dict = new Dictionary<string, dynamic>();
+                        dict.Add($"tmdid", x);
+                         
+                        List<string> types = new List<string>();
+                        pushDatas[x].Keys.ToList().ForEach(y => {
+                            if (y.Contains("fail-"))
+                            {
+                                types.Add(y);
+                            }
+                        });
+                        dict.Add($"msg", pushDatas[x][pushDatas[x].Keys.First()]);
+                        dict.Add($"types", types);
+                        if (types.Any())
+                        {
+                            checkDatas[x] = dict;
+                        }
+                    }
+                });
+                
+            }
+            
 
-                        //5.3.1.12学员培训基本情况批量回写-UpdateTeacherListSituation
-                        if (t53112OK == 1)
+
+           
+            
+            return Ok(new { data = new { results, checkDatas, dicts } });        
+        }
+
+        private async Task CheckTeacher(TeacherTrain x, List<ScTeacher> scTeachers, List<ScTeacherDiagnosis> scTeacherDiagnoses, string school,(string uri ,string sas) schoolsas,
+            List<Dictionary<string, object>> list53112, List<Dictionary<string, object>> list53113, List<Dictionary<string, object>> list53117, List<Dictionary<string, object>> list53122,
+            (string uri, string sas ) teammodelossas, Dictionary<string, Dictionary<string, object>> pushDatas,HashSet<TeacherTrain> updatePush
+            )
+        {
+            List<KeyValuePair<string, string>> msgs = new List<KeyValuePair<string, string>>();
+            List<ScTeacher> teacher = scTeachers.FindAll(t => !string.IsNullOrWhiteSpace(t.tmdid) && t.tmdid.Equals(x.id));
+            foreach (var t in teacher)
+            {
+                List<PushFail> fails = new List<PushFail>();
+                Dictionary<string, object> pushData = new Dictionary<string, object>();
+                string jsonTech = scTeacherDiagnoses.ToJsonString();
+                ScTeacherDiagnosis diagnosis = scTeacherDiagnoses.Find(x => x.RowKey.Equals($"{t.PXID}"));
+
+                ///检查是否全部已经上传
+                bool pushAll = true;
+                int t53112OK = 1, t53113OK=1, t53117OK=1 , t53122OK=1 ;
+                List<KeyValuePair<string, string>> msgs53112 = null;
+                List<KeyValuePair<string, string>> msgs53113 = null;
+
+                List<KeyValuePair<string, string>> msgs53117 = null;
+                List<KeyValuePair<string, string>> msgs53122 = null;
+                List<AbilitySub> allRightAbility = new List<AbilitySub>();
+                List<AbilitySub> abilitySubs = new List<AbilitySub>(); 
+                if (!x.pushes.Contains("53112")) {
+                    pushAll = false;
+                    (t53112OK,   msgs53112) = ThirdService.check53112(x, msgs);
+                }
+                if (!x.pushes.Contains("53113")) {
+                    pushAll = false;
+                    ( t53113OK,   msgs53113,   abilitySubs, allRightAbility) = await ThirdService.check53113(_azureCosmos, x, diagnosis, msgs, $"{school}", schoolsas.uri, schoolsas.sas, _azureStorage);
+                }
+                if (!x.pushes.Contains("53117"))
+                {
+                    pushAll = false;
+                    (  t53117OK,   msgs53117) = await ThirdService.check53117(x, msgs, $"{school}", schoolsas.uri, schoolsas.sas, _azureStorage);
+                }
+                if (!x.pushes.Contains("53122"))
+                {
+                    pushAll = false;
+                    (  t53122OK,  msgs53122) = await ThirdService.check53122(x, msgs, $"{school}", schoolsas.uri, schoolsas.sas, _azureStorage);
+                }
+                if (pushAll== false &&  t53112OK == 1 && t53113OK == 1 && t53117OK == 1 && t53122OK == 1)
+                {
+                    //5.3.1.12学员培训基本情况批量回写-UpdateTeacherListSituation
+                    if (t53112OK == 1)
+                    {
+                        Dictionary<string, object> parameterMapData = new Dictionary<string, object>();
+                        parameterMapData.Add("PXID", $"{t.PXID}");
+                        parameterMapData.Add("TID", $"{t.TID}");
+                        parameterMapData.Add("TeacherName", $"{t.TeacherName}");
+                        parameterMapData.Add("CourseHour", $"{x.totalTime}");
+                        parameterMapData.Add("ResearchText", $"{x.summary}");
+                        /// <summary>
+                        ///省上标准  最终结果 0未认定,1合格,2优秀,3不合格,4其他
+                        ///系统标准 -2 其他 -1 未认定,0不合格,1合格,2优秀
+                        /// </summary>
+                        string ComPassed = "0";
+                        switch (x.finalScore)
+                        {
+                            case -2:
+                                ComPassed = "4";
+                                break;
+                            case -1:
+                                ComPassed = "0";
+                                break;
+                            case 0:
+                                ComPassed = "3";
+                                break;
+                            case 1:
+                                ComPassed = "1";
+                                break;
+                            case 2:
+                                ComPassed = "2";
+                                break;
+                            default:
+                                ComPassed = "4";
+                                break;
+                        }
+                        parameterMapData.Add("ComPassed", ComPassed);//0、未认定  1、合格  2、优秀  3、不合格  4、其他
+                        pushData.Add("success-UpdateTeacherListSituation", parameterMapData);
+                        x.pushes.Add("53112");
+                        updatePush.Add(x);
+                        list53112.Add(parameterMapData);
+                    }
+                    //5.3.1.13学员能力点测评结果批量回写-UpdateTeacherListDiagnosis
+                    if (t53113OK == 1)
+                    {
+                        List<Dictionary<string, object>> parameterMapDatas = new List<Dictionary<string, object>>();
+                        var uploadedAbility = abilitySubs.FindAll(ab => ab.uploads.Count > 0);
+                        x.currency.teacherAilities.ForEach(a =>
                         {
                             Dictionary<string, object> parameterMapData = new Dictionary<string, object>();
                             parameterMapData.Add("PXID", $"{t.PXID}");
                             parameterMapData.Add("TID", $"{t.TID}");
-                            parameterMapData.Add("TeacherName", $"{t.TeacherName}");
-                            parameterMapData.Add("CourseHour", $"{x.totalTime}");
-                            parameterMapData.Add("ResearchText", $"{x.summary}");
-                            /// <summary>
-                            ///省上标准  最终结果 0未认定,1合格,2优秀,3不合格,4其他
-                            ///系统标准 -2 其他 -1 未认定,0不合格,1合格,2优秀
-                            /// </summary>
-                            string ComPassed = "0";
-                            switch (x.finalScore)
+                            parameterMapData.Add("DiagnosisNum", $"{a.no}");
+                            List<Dictionary<string, object>> pfiles = new List<Dictionary<string, object>>();
+                            parameterMapData.Add("pfiles", pfiles);
+
+                            AbilitySub allRight = allRightAbility.Find(sub => sub.id.Equals(a.id));
+                            if (allRight != null)
                             {
-                                case -2:
-                                    ComPassed = "4";
+                                allRight.uploads.ForEach(upload =>
+                                {
+                                    upload.urls.ForEach(url =>
+                                    {
+                                        Dictionary<string, object> pfileMap = new Dictionary<string, object>();
+                                        string fileext = url.url.Substring(url.url.LastIndexOf(".") > 0 ? url.url.LastIndexOf(".") + 1 : 0);
+                                        pfileMap.Add("url", $"{url.url}?{schoolsas.sas}");
+                                        pfileMap.Add("fileName", url.name.Length > 95 ? $"{url.name.Substring(0, 95)}.{fileext}" : url.name);
+                                        pfileMap.Add("fileSize", $"{url.size}");
+                                        pfileMap.Add("md5", url.hash);
+
+                                        pfileMap.Add("fileType", fileext);
+                                        pfiles.Add(pfileMap);
+                                    });
+                                });
+                            }
+
+
+                            //0"未认定", 1"合格", 2"优秀", 3"不合格"
+                            //系统 -1 未认定,0 不合格,1 合格,2 优秀
+                            string zpscore = "0";
+                            switch (a.zpscore)
+                            {
+                                case -1:
+                                    zpscore = "0";
                                     break;
+                                case 0:
+                                    zpscore = "3";
+                                    break;
+                                case 1:
+                                    zpscore = "1";
+                                    break;
+                                case 2:
+                                    zpscore = "2";
+                                    break;
+                                default:
+                                    zpscore = "4";
+                                    break;
+                            }
+                            string hpscore = "0";
+                            switch (a.hpscore)
+                            {
                                 case -1:
-                                    ComPassed = "0";
+                                    hpscore = "0";
                                     break;
                                 case 0:
-                                    ComPassed = "3";
+                                    hpscore = "3";
                                     break;
                                 case 1:
-                                    ComPassed = "1";
+                                    hpscore = "1";
                                     break;
                                 case 2:
-                                    ComPassed = "2";
+                                    hpscore = "2";
                                     break;
                                 default:
-                                    ComPassed = "4";
+                                    hpscore = "4";
                                     break;
                             }
-                            parameterMapData.Add("ComPassed", ComPassed);//0、未认定  1、合格  2、优秀  3、不合格  4、其他
-                            pushData.Add("success-UpdateTeacherListSituation", parameterMapData);
-                            list53112.Add(parameterMapData);
-                        }
-                        else
-                        {
-                            pushData.Add("fail-UpdateTeacherListSituation", new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53112 });
-                            fails.Add(new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53112 });
-                        }
-                        //5.3.1.13学员能力点测评结果批量回写-UpdateTeacherListDiagnosis
-                        if (t53113OK == 1)
-                        {
-                            List<Dictionary<string, object>> parameterMapDatas = new List<Dictionary<string, object>>();
-                            var uploadedAbility= abilitySubs.FindAll(ab => ab.uploads.Count > 0);
-                            x.currency.teacherAilities.ForEach(a => {
-                                Dictionary<string, object> parameterMapData = new Dictionary<string, object>();
-                                parameterMapData.Add("PXID", $"{t.PXID}");
-                                parameterMapData.Add("TID", $"{t.TID}");
-                                parameterMapData.Add("DiagnosisNum", $"{a.no}");
-                                List<Dictionary<string, object>> pfiles = new List<Dictionary<string, object>>();
-                                parameterMapData.Add("pfiles", pfiles);
-
-                                AbilitySub abilitySub = abilitySubs.Find(sub => sub.id.Equals(a.id));
-                                if (abilitySub != null)
+                            string xzpresult = "0";
+                            switch (a.xzscore)
+                            {
+                                case -1:
+                                    xzpresult = "0";
+                                    break;
+                                case 0:
+                                    xzpresult = "3";
+                                    break;
+                                case 1:
+                                    xzpresult = "1";
+                                    break;
+                                case 2:
+                                    xzpresult = "2";
+                                    break;
+                                default:
+                                    xzpresult = "4";
+                                    break;
+                            }
+                            ///上传了三个,且当前没有上传的能力点,标记为为学习状态。
+                            if (uploadedAbility.Count >= 3)
+                            {
+                                if (pfiles.Count == 0)
                                 {
-                                    abilitySub.uploads.ForEach(upload => {
-                                        upload.urls.ForEach(url => {
-                                            Dictionary<string, object> pfileMap = new Dictionary<string, object>();
-                                            pfileMap.Add("url", url.url);
-                                            pfileMap.Add("fileName", url.name);
-                                            pfileMap.Add("fileSize", url.size);
-                                            pfileMap.Add("md5", url.hash);
-                                            string fileext = url.url.Substring(url.url.LastIndexOf(".") > 0 ? url.url.LastIndexOf(".") + 1 : 0);
-                                            pfileMap.Add("fileType", fileext);
-                                            pfiles.Add(pfileMap);
-                                        });
-                                    });
+                                    zpscore = "4";
+                                    hpscore = "4";
+                                    xzpresult = "4";
                                 }
+                            }
+                            parameterMapData.Add("zpresult", zpscore);
+                            parameterMapData.Add("hpresult", hpscore);
+                            parameterMapData.Add("xzpresult", xzpresult);
 
+                            list53113.Add(parameterMapData);
+                            parameterMapDatas.Add(parameterMapData);
+                        });
+                        x.pushes.Add("53113");
+                        updatePush.Add(x);
+                        pushData.Add("success-UpdateTeacherListDiagnosis", parameterMapDatas);
 
-                                //0"未认定", 1"合格", 2"优秀", 3"不合格"
-                                //系统 -1 未认定,0 不合格,1 合格,2 优秀
-                                string zpscore = "0";
-                                switch (a.zpscore)
-                                {
-                                    case -1:
-                                        zpscore = "0";
-                                        break;
-                                    case 0:
-                                        zpscore = "3";
-                                        break;
-                                    case 1:
-                                        zpscore = "1";
-                                        break;
-                                    case 2:
-                                        zpscore = "2";
-                                        break;
-                                    default:
-                                        zpscore = "4";
-                                        break;
-                                }
-                                string hpscore = "0";
-                                switch (a.hpscore)
-                                {
-                                    case -1:
-                                        hpscore = "0";
-                                        break;
-                                    case 0:
-                                        hpscore = "3";
-                                        break;
-                                    case 1:
-                                        hpscore = "1";
-                                        break;
-                                    case 2:
-                                        hpscore = "2";
-                                        break;
-                                    default:
-                                        hpscore = "4";
-                                        break;
-                                }
-                                string xzpresult = "0";
-                                switch (a.xzscore)
-                                {
-                                    case -1:
-                                        xzpresult = "0";
-                                        break;
-                                    case 0:
-                                        xzpresult = "3";
-                                        break;
-                                    case 1:
-                                        xzpresult = "1";
-                                        break;
-                                    case 2:
-                                        xzpresult = "2";
-                                        break;
-                                    default:
-                                        xzpresult = "4";
-                                        break;
-                                }
-                                ///上传了三个,且当前没有上传的能力点,标记为为学习状态。
-                                if (uploadedAbility.Count >=3) {
-                                    if (pfiles.Count == 0) {
-                                        zpscore = "4";
-                                        hpscore = "4";
-                                        xzpresult = "4";
-                                    }
-                                }
-                                parameterMapData.Add("zpresult", zpscore);
-                                parameterMapData.Add("hpresult", hpscore);
-                                parameterMapData.Add("xzpresult", xzpresult);
-                               
-                                list53113.Add(parameterMapData);
-                                parameterMapDatas.Add(parameterMapData);
-                            });
-                            pushData.Add("success-UpdateTeacherListDiagnosis", parameterMapDatas);
-
-                        }
-                        else
-                        {
-                            pushData.Add("fail-UpdateTeacherListDiagnosis", new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53113 });
-                            fails.Add(new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53113 });
-                        }
-                        //5.3.1.17学员课堂实录批量回写-UploadKTSLList
-                        if (t53117OK == 1)
-                        {
-                            List<Dictionary<string, object>> parameterMapDatas = new List<Dictionary<string, object>>();
-                            x.teacherClasses.ForEach(clss =>
-                            {
-                                Dictionary<string, object> parameterMapData = new Dictionary<string, object>();
-                                parameterMapData.Add("PXID", $"{t.PXID}");
-                                parameterMapData.Add("TID", $"{t.TID}");
-                                parameterMapData.Add("url", clss.url);//添加访问授权
-                                parameterMapData.Add("url2", clss.url);
-                                parameterMapData.Add("fileName", clss.name);
-                                parameterMapData.Add("fileSize", clss.size);
-                                parameterMapData.Add("md5", clss.hash);
-                                string fileext = clss.url.Substring(clss.url.LastIndexOf(".") > 0 ? clss.url.LastIndexOf(".") + 1 : 0);
-                                parameterMapData.Add("fileType", fileext);
-                                list53117.Add(parameterMapData);
-                                parameterMapDatas.Add(parameterMapData);
-                            });
-                            pushData.Add("success-UploadKTSLList", parameterMapDatas);
-                        }
-                        else
-                        {
-                            pushData.Add("fail-UploadKTSLList", new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53117 });
-                            fails.Add(new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53117 });
-                        }
-                        //5.3.1.22学员校本教研PDF(每人可以返回多条)批量回写-UploadSBTARPDFListV2
-                        if (t53122OK == 1)
+                    }
+                    //5.3.1.17学员课堂实录批量回写-UploadKTSLList
+                    if (t53117OK == 1)
+                    {
+                        List<Dictionary<string, object>> parameterMapDatas = new List<Dictionary<string, object>>();
+                        x.teacherClasses.ForEach(clss =>
                         {
                             Dictionary<string, object> parameterMapData = new Dictionary<string, object>();
+                            string fileext = clss.url.Substring(clss.url.LastIndexOf(".") > 0 ? clss.url.LastIndexOf(".") + 1 : 0);
                             parameterMapData.Add("PXID", $"{t.PXID}");
                             parameterMapData.Add("TID", $"{t.TID}");
-                            List<Dictionary<string, object>> files = new List<Dictionary<string, object>>();
-                            x.offlineRecords.ForEach(record => {
-                                if (!string.IsNullOrWhiteSpace(record.url))
-                                {
-                                    Dictionary<string, object> fileMap = new Dictionary<string, object>();
-                                    fileMap.Add("url", record.url);
-                                    fileMap.Add("fileName", record.name);
-                                    fileMap.Add("fileSize", record.size);
-                                    fileMap.Add("md5", record.hash);
-                                    string fileext = record.url.Substring(record.url.LastIndexOf(".") > 0 ? record.url.LastIndexOf(".") + 1 : 0);
-                                    fileMap.Add("fileType", fileext);
-                                    files.Add(fileMap);
-                                }
-                            });
-                            if (x.offlineReport != null) {
+                            parameterMapData.Add("url", $"{clss.url}?{schoolsas.sas}");//添加访问授权
+                            parameterMapData.Add("url2", $"{clss.url}?{schoolsas.sas}");
+                            parameterMapData.Add("fileName", clss.name.Length > 95 ? $"{clss.name.Substring(0, 95)}.{fileext}" : clss.name);
+                            parameterMapData.Add("fileSize", $"{clss.size}");
+                            parameterMapData.Add("md5", clss.hash);
+
+                            parameterMapData.Add("fileType", fileext);
+                            list53117.Add(parameterMapData);
+                            parameterMapDatas.Add(parameterMapData);
+                        });
+                        x.pushes.Add("53117");
+                        updatePush.Add(x);
+                        pushData.Add("success-UploadKTSLList", parameterMapDatas);
+                    }
+                    //5.3.1.22学员校本教研PDF(每人可以返回多条)批量回写-UploadSBTARPDFListV2
+                    if (t53122OK == 1)
+                    {
+                        Dictionary<string, object> parameterMapData = new Dictionary<string, object>();
+                        parameterMapData.Add("PXID", $"{t.PXID}");
+                        parameterMapData.Add("TID", $"{t.TID}");
+                        List<Dictionary<string, object>> files = new List<Dictionary<string, object>>();
+                        x.offlineRecords.ForEach(record =>
+                        {
+                            if (!string.IsNullOrWhiteSpace(record.url))
+                            {
                                 Dictionary<string, object> fileMap = new Dictionary<string, object>();
-                                fileMap.Add("url", x.offlineReport.blob);
-                                fileMap.Add("fileName", x.offlineReport.name);
-                                fileMap.Add("fileSize", x.offlineReport.size);
-                                fileMap.Add("md5", x.offlineReport.hash);
-                                string fileext = x.offlineReport.extension;
+                                string fileext = record.url.Substring(record.url.LastIndexOf(".") > 0 ? record.url.LastIndexOf(".") + 1 : 0);
+                                fileMap.Add("url", $"{record.url}?{schoolsas.sas}");
+                                fileMap.Add("fileName", record.name.Length > 95 ? $"{record.name.Substring(0, 95)}.{fileext}" : record.name);
+                                fileMap.Add("fileSize", $"{record.size}");
+                                fileMap.Add("md5", record.hash);
+
                                 fileMap.Add("fileType", fileext);
                                 files.Add(fileMap);
                             }
-                            parameterMapData.Add("files", files);
-                            list53122.Add(parameterMapData);
-                            pushData.Add("success-UploadSBTARPDFListV2", parameterMapData);
-                        }
-                        else
+                        });
+                        if (x.offlineReport != null)
                         {
-                            pushData.Add("fail-UploadSBTARPDFListV2", new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53122 });
-                            fails.Add(new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53122 });
+                            Dictionary<string, object> fileMap = new Dictionary<string, object>();
+                            fileMap.Add("url", $"{x.offlineReport.blob}?{teammodelossas.sas}");
+                            fileMap.Add("fileName", x.offlineReport.name);
+                            fileMap.Add("fileSize", $"{x.offlineReport.size}");
+                            fileMap.Add("md5", x.offlineReport.hash);
+                            string fileext = x.offlineReport.extension;
+                            fileMap.Add("fileType", fileext);
+                            files.Add(fileMap);
+                        }
+                        parameterMapData.Add("files", files);
+                        list53122.Add(parameterMapData);
+                        x.pushes.Add("53122");
+                        updatePush.Add(x);
+                        pushData.Add("success-UploadSBTARPDFListV2", parameterMapData);
+                    }
+                    if (!pushAll)
+                    {
+                        if (pushData.Any()) {
+                            pushDatas.Add(t.tmdid, pushData);
                         }
+                    }
+                }
+                else {
+                    if (t53112OK != 1) {
+                        pushData.Add("fail-UpdateTeacherListSituation", new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53112, school = t.schoolCode, schoolname = t.SchoolName });
+                        fails.Add(new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53112 ,school= t.schoolCode,schoolname=t.SchoolName });
+                    }
+                    if (t53113OK != 1)
+                    {
+                        pushData.Add("fail-UpdateTeacherListDiagnosis", new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53113, school = t.schoolCode, schoolname = t.SchoolName });
+                        fails.Add(new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53113, school = t.schoolCode, schoolname = t.SchoolName });
+                    }
+                    if (t53117OK != 1) {
+                        pushData.Add("fail-UploadKTSLList", new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53117, school = t.schoolCode, schoolname = t.SchoolName });
+                        fails.Add(new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53117, school = t.schoolCode, schoolname = t.SchoolName });
+                    }
+                    if (t53122OK != 1) {
+                        pushData.Add("fail-UploadSBTARPDFListV2", new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53122, school = t.schoolCode, schoolname = t.SchoolName });
+                        fails.Add(new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53122, school = t.schoolCode, schoolname = t.SchoolName });
+                    }
+                    if (pushData.Any())
+                    {
                         pushDatas.Add(t.tmdid, pushData);
                     }
                 }
-                //推送数据
-                //UpdateTeacherListSituation = await _thirdApisService.Post(config.url, "UpdateTeacherListSituation", config.passKey, config.privateKey, parameterContent53112);
-                //UpdateTeacherListSituation.code = "UpdateTeacherListSituation";
-                //UpdateTeacherListSituation.title = "5.3.1.12学员培训基本情况批量回写";
-
-                //UpdateTeacherListDiagnosis = await _thirdApisService.Post(config.url, "UpdateTeacherListDiagnosis", config.passKey, config.privateKey, parameterContent53113);
-                //UpdateTeacherListDiagnosis.code = "UpdateTeacherListDiagnosis";
-                //UpdateTeacherListDiagnosis.title = "5.3.1.13学员能力点测评结果批量回写";
-
-                //UploadKTSLList = await _thirdApisService.Post(config.url, "UploadKTSLList", config.passKey, config.privateKey, parameterContent53117);
-                //UploadKTSLList.code = "UploadKTSLList";
-                //UploadKTSLList.title = "5.3.1.17学员课堂实录批量回写";
-
-                //UploadSBTARPDFListV2 = await _thirdApisService.Post(config.url, "UploadSBTARPDFListV2", config.passKey, config.privateKey, parameterContent53122);
-                //UploadSBTARPDFListV2.code = "UploadSBTARPDFListV2";
-                //UploadSBTARPDFListV2.title = "5.3.1.22学员校本教研PDF(每人可以返回多条)批量回写";
-                //results.Add(UpdateTeacherListSituation);
-                //results.Add(UpdateTeacherListDiagnosis);
-                //results.Add(UploadKTSLList);
-                //results.Add(UploadSBTARPDFListV2);
             }
-         
-            return Ok(new { data = new { results, pushDatas, dicts } });        
         }
 
+        [ProducesDefaultResponseType]
+        [HttpPost("sc-check")]
+        public async Task<IActionResult> css(JsonElement json) 
+        {
+            JsonElement areaIdJson = json.GetProperty("areaId");
+            AreaSetting areaSetting = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemAsync<AreaSetting>($"{areaIdJson}", new PartitionKey("AreaSetting"));
+            ScAccessConfig config = areaSetting.accessConfig.ToObject<ScAccessConfig>();
+            Dictionary<string, object> parameterContent53123 = new Dictionary<string, object>();
+            parameterContent53123.Add("Content", new { TrainComID = config.trainComID, ProjectID =config.p.First().pd, ProjectItemID =config.p.First().pid, PXID = "277838", TID= "624316" });
+            parameterContent53123.Add("TrainComID", config.trainComID);
+            parameterContent53123.Add("ProjectID", config.p.First().pd);
+            parameterContent53123.Add("ProjectItemID", config.p.First().pid);
+            parameterContent53123.Add("PXID", "277838");
+            parameterContent53123.Add("TID", "624316");
+            ScsResult GetDiagnosisResultByPXIDCommand = await _thirdApisService.Post(config.url, "GetDiagnosisResultByPXIDCommand", config.passKey, config.privateKey, parameterContent53123);
+            return Ok(GetDiagnosisResultByPXIDCommand);
+        }
       
     }
 }

+ 46 - 30
TEAMModelOS/Controllers/XTest/FixDataController.cs

@@ -2732,46 +2732,62 @@ namespace TEAMModelOS.Controllers
                 tmdidSchooCode.Add(item);
             }
             var blobclient = _azureStorage.GetBlobContainerClient($"teammodelos");
-           var s= _azureStorage.GetBlobContainerSAS99Year("teammodelos", Azure.Storage.Sas.BlobContainerSasPermissions.Read);
-            string sas= s.sas;
-            foreach (var idcode in tmdidSchooCode) {
+            List<Task> tasks = new List<Task>();
+            tmdidSchooCode.ForEach(idcode =>
+            {
+                tasks.Add(resot(idcode, blobclient));
+            });
+            int pagesize = 500;
+            if (tasks.Count <= pagesize)
+            {
+                await Task.WhenAll(tasks);
+            }
+            else
+            {
+                int pages = (tasks.Count + pagesize) / pagesize; //256是批量操作最大值,pages = (total + max -1) / max;
+                for (int i = 0; i < pages; i++)
+                {
+                    var listssb = tasks.Skip((i) * pagesize).Take(pagesize).ToList();
+                    await Task.WhenAll(listssb);
+                }
+            }
+            return Ok();
+        }
 
-                Azure.Response teacherTrainRes = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReadItemStreamAsync(idcode.id, new PartitionKey($"TeacherTrain-{idcode.code}"));
-                if (teacherTrainRes.Status == 200)
+        private async Task resot(IdNameCode idcode, BlobContainerClient blobclient) {
+            Azure.Response teacherTrainRes = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReadItemStreamAsync(idcode.id, new PartitionKey($"TeacherTrain-{idcode.code}"));
+            if (teacherTrainRes.Status == 200)
+            {
+                TeacherTrain teacherTrain = JsonDocument.Parse(teacherTrainRes.Content).RootElement.Deserialize<TeacherTrain>();
+                try
                 {
-                    TeacherTrain teacherTrain = JsonDocument.Parse(teacherTrainRes.Content).RootElement.Deserialize<TeacherTrain>();
-                    try
+                    if (!string.IsNullOrWhiteSpace(teacherTrain.offlineUrl))
                     {
-                        if (!string.IsNullOrWhiteSpace(teacherTrain.offlineUrl)) {
-                            BlobDownloadInfo blobDownload = await blobclient.GetBlobClient(teacherTrain.offlineUrl).DownloadAsync(range: new HttpRange(0, 4 * 1048576), rangeGetContentHash: true);
-                            if (blobDownload.Details.ContentHash != null)
-                            {
+                        BlobDownloadInfo blobDownload = await blobclient.GetBlobClient(teacherTrain.offlineUrl).DownloadAsync(range: new HttpRange(0, 4 * 1048576), rangeGetContentHash: true);
+                        if (blobDownload.Details.ContentHash != null)
+                        {
 
-                                string hash = Md5Hash.GetbyteToString(blobDownload.Details.ContentHash);
-                                teacherTrain.offlineReport = new Attachment
-                                {
-                                    hash = hash,
-                                    url = teacherTrain.offlineUrl,
-                                    blob = $"{blobclient.Uri}/{teacherTrain.offlineUrl}",
-                                    extension = "pdf",
-                                    name = $"{teacherTrain.nickname}-校本研修汇总报告.pdf",
-                                    type = "doc",
-                                    size = blobDownload.ContentLength
-                                };
-                                await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReplaceItemAsync<TeacherTrain>(teacherTrain, idcode.id, new PartitionKey($"TeacherTrain-{idcode.code}"));
-                            }
+                            string hash = Md5Hash.GetbyteToString(blobDownload.Details.ContentHash);
+                            teacherTrain.offlineReport = new Attachment
+                            {
+                                hash = hash,
+                                url = teacherTrain.offlineUrl,
+                                blob = $"{blobclient.Uri}/{teacherTrain.offlineUrl}",
+                                extension = "pdf",
+                                name = $"{teacherTrain.nickname}-校本研修汇总报告.pdf",
+                                type = "doc",
+                                size = blobDownload.ContentLength
+                            };
+                            await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReplaceItemAsync<TeacherTrain>(teacherTrain, idcode.id, new PartitionKey($"TeacherTrain-{idcode.code}"));
                         }
                     }
-                    catch
-                    {
-                    }
+                }
+                catch
+                {
                 }
             }
-            return Ok();
         }
 
-
-
         /// <summary>
         /// 修复学校课例及blob计算
         /// </summary>

+ 5 - 5
TEAMModelOS/TEAMModelOS.csproj

@@ -39,11 +39,11 @@
     <SpaRoot>ClientApp\</SpaRoot>
     <DefaultItemExcludes>$(DefaultItemExcludes);$(SpaRoot)node_modules\**</DefaultItemExcludes>
     <UserSecretsId>078b5d89-7d90-4f6a-88fc-7d96025990a8</UserSecretsId>
-    <Version>5.2206.15</Version>
-    <AssemblyVersion>5.2206.15.1</AssemblyVersion>
-    <FileVersion>5.2206.15.1</FileVersion>
+    <Version>5.2206.22</Version>
+    <AssemblyVersion>5.2206.22.1</AssemblyVersion>
+    <FileVersion>5.2206.22.1</FileVersion>
     <Description>TEAMModelOS(IES5)</Description>
-    <PackageReleaseNotes>IES版本说明版本切换标记20220615</PackageReleaseNotes>
+    <PackageReleaseNotes>IES版本说明版本切换标记20220622</PackageReleaseNotes>
     <PackageId>TEAMModelOS</PackageId>
     <Authors>teammodel</Authors>
     <Company>醍摩豆(成都)信息技术有限公司</Company>
@@ -92,5 +92,5 @@
     </ItemGroup>
   </Target>
 
-  <ProjectExtensions><VisualStudio><UserProperties appsettings_1development_1json__JsonSchema="https://appsemble.app/api.json" appsettings_1json__JsonSchema="" clientapp_4package_1json__JsonSchema="" /></VisualStudio></ProjectExtensions>
+  <ProjectExtensions><VisualStudio><UserProperties appsettings_1json__JsonSchema="" clientapp_4package_1json__JsonSchema="" /></VisualStudio></ProjectExtensions>
 </Project>