فهرست منبع

Merge branch 'develop' into TPE/develop

jeff 1 سال پیش
والد
کامیت
7b552f61ea
33فایلهای تغییر یافته به همراه1745 افزوده شده و 955 حذف شده
  1. BIN
      TEAMModelBI/ClientApp/src/assets/img/default1.png
  2. BIN
      TEAMModelBI/ClientApp/src/assets/img/default2.png
  3. BIN
      TEAMModelBI/ClientApp/src/assets/img/default3.png
  4. BIN
      TEAMModelBI/ClientApp/src/assets/img/default4.png
  5. 9 6
      TEAMModelBI/ClientApp/src/view/product/index.vue
  6. 379 46
      TEAMModelBI/ClientApp/src/view/userInquire/details.vue
  7. 9 2
      TEAMModelBI/ClientApp/src/view/userInquire/ies.vue
  8. 54 7
      TEAMModelBI/ClientApp/src/view/userInquire/index.vue
  9. 12 5
      TEAMModelBI/ClientApp/src/view/userInquire/iot.vue
  10. 12 3
      TEAMModelBI/ClientApp/src/view/userInquire/socrates.vue
  11. 7 2
      TEAMModelBI/ClientApp/src/view/userInquire/ticket.vue
  12. 62 63
      TEAMModelBI/Controllers/BINormal/BatchAreaController.cs
  13. 20 21
      TEAMModelBI/Controllers/RepairApi/InitialAreaController.cs
  14. 3 3
      TEAMModelBI/TEAMModelBI.csproj
  15. 5 2
      TEAMModelOS.FunctionV4/CosmosDB/TriggerExam.cs
  16. 3 3
      TEAMModelOS.FunctionV4/TEAMModelOS.FunctionV4.csproj
  17. 29 0
      TEAMModelOS.SDK/Extension/JwtAuthExtension.cs
  18. 21 3
      TEAMModelOS.SDK/Models/Cosmos/Common/Activity.cs
  19. 1 0
      TEAMModelOS.SDK/Models/Cosmos/Student/ErrorItems.cs
  20. 3 3
      TEAMModelOS.SDK/TEAMModelOS.SDK.csproj
  21. 24 7
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperViewBox/PaperView.vue
  22. 28 21
      TEAMModelOS/ClientApp/src/view/artexam/Create.vue
  23. 27 14
      TEAMModelOS/ClientApp/src/view/artexam/ExamSetting.vue
  24. 658 696
      TEAMModelOS/ClientApp/src/view/artexam/Mgt.vue
  25. 129 25
      TEAMModelOS/ClientApp/src/view/signupActivity/createActivity.vue
  26. 24 2
      TEAMModelOS/ClientApp/src/view/signupActivity/infoGoing.vue
  27. 23 0
      TEAMModelOS/ClientApp/src/view/signupActivity/infoReleased.vue
  28. 0 1
      TEAMModelOS/ClientApp/src/view/signupActivity/processActivity.vue
  29. 189 12
      TEAMModelOS/Controllers/Common/ActivityController.cs
  30. 8 2
      TEAMModelOS/Controllers/Common/ExamController.cs
  31. 4 4
      TEAMModelOS/TEAMModelOS.csproj
  32. 1 1
      TEAMModelOS/appsettings.Development.json
  33. 1 1
      TEAMModelOS/appsettings.json

BIN
TEAMModelBI/ClientApp/src/assets/img/default1.png


BIN
TEAMModelBI/ClientApp/src/assets/img/default2.png


BIN
TEAMModelBI/ClientApp/src/assets/img/default3.png


BIN
TEAMModelBI/ClientApp/src/assets/img/default4.png


+ 9 - 6
TEAMModelBI/ClientApp/src/view/product/index.vue

@@ -1,6 +1,6 @@
 <template>
   <!--外层所有数据-->
-  <div class="productbox" v-if="showState==='default'">
+  <div class="productbox" v-loading="" v-if="showState==='default'">
     <div class="header-select">
       <el-collapse v-model="activeNames" accordion>
         <el-collapse-item title="数据筛选" name="1">
@@ -95,7 +95,7 @@
                   <span class="filtratebox-phase-title subclass">精准选择:</span>
                   <div class="filtratebox-phase-content precise">
                     <div v-if="clickNum.district ===1" class="schoolclass">
-                      <el-cascader v-model="optionsValue" :options="options" :props="areaProps" clearable />
+                      <el-cascader v-model="optionsValue" :options="options" :props="areaProps" clearable   placeholder="请选择要统计的城市或区"/>
                     </div>
                     <div v-else-if="clickNum.district ===0" class="aresclass">
                       <el-select v-model="optionsValue" placeholder="请选择要统计的省份" clearable>
@@ -267,6 +267,7 @@
 </template>
 <script setup>
 import option_cn from '@/static/regions/region_cn.json'
+import option_gl from '@/static/regions/region_gl.json'
 import { ref, getCurrentInstance, watch, h, nextTick } from 'vue'
 import { ElMessage, TableV2SortOrder, ElLoading, ElCheckbox,HeaderCellSlotProps,ElPopover} from 'element-plus'
 import { Filter } from '@element-plus/icons'
@@ -368,6 +369,8 @@ let columns = ref([
   },
 ])
 const popoverRef = ref()
+const siteValue = window.location.host === 'localhost:5001' ? 'cn' : window.location.host === 'bi.teammodel.cn' ? 'cn' : window.location.host === 'bitest.teammodel.cn' ? 'cn' : 'international'
+const optionsData = siteValue === 'cn' ? option_cn : option_gl
 columns.value[0].headerCellRenderer = (props = HeaderCellSlotProps) => {
       return (
         <div class="items-center justify-center">
@@ -396,7 +399,7 @@ columns.value[0].headerCellRenderer = (props = HeaderCellSlotProps) => {
           </ElPopover>
         </div>
       )
-    }
+}
 const sortState = ref({
   'deviceCnt':TableV2SortOrder.ASC,
   'tmidCnt': TableV2SortOrder.ASC,
@@ -570,7 +573,7 @@ const props2 = {
 }
 const areaProps = {
   multiple: false,
-  checkStrictly: false,
+  checkStrictly:true,
   label: "name",
   value: "name",
 }
@@ -957,9 +960,9 @@ function serarchInit (value) {
     // dataSource.value.composite=
     console.log(clickNum.value.subject, '0学区值0')
     options.value = dataSource.value.composite
-    clickNum.value.subject === 2 ? options.value = option_cn : ''
+    clickNum.value.subject === 2 ? options.value = optionsData : ''
   } else if (filterKey === 1) {
-    options.value = option_cn
+    options.value = optionsData
     console.log(clickNum.value.district, '1学区值1')
     clickNum.value.district === 2 ? options.value = dataSource.value.composite : ''
   }

+ 379 - 46
TEAMModelBI/ClientApp/src/view/userInquire/details.vue

@@ -1,8 +1,11 @@
 <template>
-    <div class="userdetails">
+    <div class="entirety">
+        <div class="groupdata" v-show="detailsData.length >1">
+        <span class="nowgroup-num">{{transferNum+1}}</span>/<span class="totalgroup-num">{{detailsData.length}}</span></div>
+    <div class="userdetails" v-loading="loading" element-loading-text="数据加载中...">
         <div class="topbox">
            <div class="img-name">
-            <div class="topbox-images"><el-image src="https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg" fit="fill" /></div>
+            <div class="topbox-images"><el-image :src="randomImage" fit="contain" /></div>
             <div class="topbox-name">
                 <div class="topbox-name-text">{{usernames}}</div>
                 <div class="topbox-name-advance" @click="userdetailState=true">查看账户进阶数据<el-icon><MoreFilled /></el-icon></div>
@@ -61,7 +64,8 @@
                     </div>
                 </div>
                 <el-divider />
-                <replaceHiTeach :detailsData="detailsIot"></replaceHiTeach>
+                <replaceHiTeach :detailsData="detailsIot" v-if="iotState"></replaceHiTeach>
+                <div v-else class="not-coupons">暂无数据</div>
             </div>
             <!-- <div class="hitadiv">
                 <div  class="common-header-title">
@@ -92,8 +96,8 @@
                 <div class="equitystate" v-else>
                     <div class="rightsbox">
                         <div class="rightsbox-content">
-                            <el-carousel trigger="click" height="62vh" :autoplay="false">
-                                <el-carousel-item v-for="item in powerList" :key="item">
+                            <!-- <el-carousel trigger="click" height="60vh" :autoplay="false">
+                                <el-carousel-item v-for="item in powerList" :key="item"  v-show="powerList.length >0">
                                     <div class="rightsbox-item">
                                         <div class="rightsbox-item-title">
                                             <p>[ID授权] {{item.name}}</p>
@@ -107,17 +111,15 @@
                                         </div>
                                         <div class="rightsbox-item-expansion" v-show="item.prodCode ==='Z6ELB6EZ'">
                                             <p class="expansion-title">产品扩充项</p>
-                                            <!--产品扩充-->
                                             <div v-for="iteml in item.apruleArr" :key="iteml.key">
                                                 -<span :class="[iteml.state ? 'start-title':'error-title' ]">
                                                     {{iteml.title}}
                                                     <span v-show="iteml.key ==='cligroup' || iteml.key ==='client_volume' || iteml.key ==='soknumber'">({{iteml.value}})</span>
                                                  </span>
                                             </div>
-                                            <!--产品扩充 end-->
-                                            <!--HiTeach 附加功能-->
-                                            <el-divider /> 
-                                            <div class="subjoin">
+                                        </div>
+                                         <el-divider /> 
+                                        <div class="subjoin" v-show="item.prodCode ==='Z6ELB6EZ'">
                                                 <div class="subjoin-item" >
                                                     <p class="subjoin-title">{{subjoinData.hiteachTitle}}</p>
                                                     <div class="subjoin-content" v-for="item in subjoinData.hiteach" :key="item.key">
@@ -138,17 +140,116 @@
                                                             <span class="endtimes">(到期日:{{itemc.end}})</span>
                                                         </div>
                                                     </div>
+                                        </div>
+                                        <div class="rightsbox-item-expansion" v-show="item.prodCode ==='IPALB6EY'">
+                                            <p class="expansion-title">产品详细</p>
+                                            <div><span>空间大小:</span> <span class="expansion-sizenum">{{item.number}}   GB</span></div>
+                                        </div>
+                                    </div>
+                                </el-carousel-item>
+                                <el-carousel-item v-show="powerList.length ===0">
+                                    <div class="power-notdata">暂无权益内容</div>
+                                    <div class="subjoin">
+                                                <div class="subjoin-item" >
+                                                    <p class="subjoin-title">{{subjoinData.hiteachTitle}}</p>
+                                                    <div class="subjoin-content" v-for="item in subjoinData.hiteach" :key="item.key">
+                                                        <div v-show="item.exps < notTime || item.end ===0">
+                                                            <span class="expire">{{item.title}}</span>
+                                                            <span class="ccnums expire" v-show="item.key==='webirs'">{{item.value}}</span>
+                                                            <span class="endtimes-error">(到期日:{{item.end}})</span>
+                                                        </div>
+                                                        <div v-show="item.exps >= notTime">
+                                                            <span>{{item.title}}</span>
+                                                            <span class="ccnums" v-show="item.key==='webirs'">{{item.value}}</span>
+                                                            <span class="endtimes" >(到期日:{{item.end}})</span>
+                                                        </div>
+                                                </div>
+                                            </div>
+                                                <div class="subjoin-item" >
+                                                    <p class="subjoin-title">{{subjoinData.hiteachCCTitle}}</p>
+                                                    <div class="subjoin-content" v-for="itemc in subjoinData.hiteachCC" :key="itemc.key">
+                                                        <div v-show="itemc.end < notTime || itemc.end ===0">
+                                                            <span class="expire">{{itemc.title}}</span>
+                                                            <span class="ccnums expire">{{itemc.num}}</span>
+                                                            <span class="endtimes expire">(到期日:{{itemc.end}})</span>
+                                                        </div>
+                                                        <div v-show="itemc.end > notTime">
+                                                            <span>{{itemc.title}}</span>
+                                                            <span class="ccnums">{{itemc.num}}</span>
+                                                            <span class="endtimes">(到期日:{{itemc.end}})</span>
+                                                        </div>
+                                                    </div>
                                             </div>
-                                            <!--HiTeach 附加功能 end-->
+                                    </div>
+                                </el-carousel-item>
+                            </el-carousel> -->
+                            <div class="prodlist">
+                                <div v-if="powerList.length >0">
+                                    <div class="prodlist-item" v-for="item in powerList" :key="item">
+                                    <div class="rightsbox-item">
+                                        <div class="rightsbox-item-title">
+                                            <p>[ID授权] {{item.name}}</p>
                                         </div>
+                                        <div class="rightsbox-item-time">
+                                            <p>
+                                                <span>时间:</span>
+                                                <span class="rightsbox-item-time-num">{{item.startDateText}}~{{item.endDateText}}</span>
+                                                <span>共<span class="rightsbox-item-timenums">{{item.intervalTime}}</span>天</span>
+                                            </p>
                                         </div>
-                                        <!-- <div class="rightsbox-item-expansion" v-show="item.prodCode ==='IPALB6EY'">
+                                        <div class="rightsbox-item-expansion" v-show="item.prodCode ==='Z6ELB6EZ'">
+                                            <p class="expansion-title">产品扩充项</p>
+                                            <!--产品扩充-->
+                                            <div v-for="iteml in item.apruleArr" :key="iteml.key">
+                                                -<span :class="[iteml.state ? 'start-title':'error-title' ]">
+                                                    {{iteml.title}}
+                                                    <span v-show="iteml.key ==='cligroup' || iteml.key ==='client_volume' || iteml.key ==='soknumber'">({{iteml.value}})</span>
+                                                 </span>
+                                            </div>
+                                            <!--产品扩充 end-->
+                                        </div>
+                                        <div class="rightsbox-item-expansion" v-show="item.prodCode ==='IPALB6EY'">
                                             <p class="expansion-title">产品详细</p>
                                             <div><span>空间大小:</span> <span class="expansion-sizenum">{{item.number}}   GB</span></div>
-                                        </div> -->
+                                        </div>
                                     </div>
-                                </el-carousel-item>
-                            </el-carousel>
+                                    <el-divider /> 
+                                </div>
+                                </div>
+                                <div class="power-notdata" v-else>暂无权益内容</div>
+                                   <!--HiTeach 附加功能-->
+                                <div class="subjoin">
+                                    <div class="subjoin-item" >
+                                        <p class="subjoin-title">{{subjoinData.hiteachTitle}}</p>
+                                            <div v-if="subjoinData.hiteach.length >0">
+                                                <div class="subjoin-content" v-for="item in subjoinData.hiteach" :key="item.key">
+                                                <div>
+                                                    <span>{{item.title}}</span>
+                                                    <span class="ccnums" v-show="item.key==='webirs'">{{item.value}}</span>
+                                                    <span class="endtimes" v-if="item.exps >= notTime">(到期日:{{item.end}})</span>
+                                                    <span class="endtimes-error" v-else>(到期日:{{item.end}})</span>
+                                                </div>
+                                            </div>
+                                            </div>
+                                            <div class="not-datas" v-else>暂无数据</div>
+                                            <el-divider /> 
+                                            </div>
+                                    <div class="subjoin-item" >
+                                        <p class="subjoin-title">{{subjoinData.hiteachCCTitle}}</p>
+                                        <div v-if="subjoinData.hiteachCC.length >0">
+                                            <div class="subjoin-content" v-for="itemc in subjoinData.hiteachCC" :key="itemc.key">
+                                                <div>
+                                                    <span>{{itemc.title}}</span>
+                                                    <span class="ccnums">{{itemc.num}}</span>
+                                                    <span class="endtimes">(到期日:{{itemc.end}})</span>
+                                                 </div>
+                                            </div>
+                                        </div>
+                                        <div class="not-datas" v-else>暂无数据</div>
+                                    </div>
+                                </div>
+                                        <!--HiTeach 附加功能 end-->
+                            </div>
                         </div>
                     </div>
                 </div>
@@ -197,7 +298,7 @@
         <!--back end-->
         <!--所有登入时间dialog-->
         <div class="login-total">
-            <el-dialog v-model="loginDialog" title="所有登入情况" width="65%" :before-close="handleClose">
+            <el-dialog v-model="loginDialog" title="所有登入情况" width="70%" :before-close="handleClose">
                 <div class="logintotal-box">
                     <div class="logintotal-box-list">
                         <div :class="[item.state ? item.key:'notenabled-total','listbox-item-total']" v-for="item in productdata" :key="item.id">
@@ -216,7 +317,7 @@
                         <p class="logintotal-box-table-title">登入详细:</p>
                         <el-table :data="logintotalTable" style="width: 100%" height="35vh" border >
                             <el-table-column prop="product" label="平台" align="center"/>
-                            <el-table-column prop="time" label="时间" align="center"/>
+                            <el-table-column prop="timeText" label="时间" align="center"/>
                         </el-table>
                     </div>
                 </div>
@@ -229,9 +330,32 @@
         </div>
          <!--所有登入时间dialog end-->
     </div>
+    <div class="lastbtn" v-show="detailsData.length >1 && transferNum !==0" @click="lastUser()">
+        <div class="btn-ls">
+          <svg class="last-btns" aria-hidden="true">
+            <use xlink:href="#icon-icon-test"></use>
+          </svg>
+        </div>
+        <div class="btn-ls-text">
+          <!-- <p class="next-school">{{advancevalue.last.name}}</p> -->
+          <p class="next-title">上一个</p>
+        </div>
+    </div>
+    <div class="nextbtn" v-show="detailsData.length >1 && transferNum+1 !==detailsData.length" @click="nextUser()">
+        <div class="btn-ls">
+          <svg class="last-btns" aria-hidden="true">
+            <use xlink:href="#icon-icon-test1"></use>
+          </svg>
+        </div>
+        <div class="btn-ls-text">
+          <!-- <p class="next-school">{{advancevalue.next.name}}</p> -->
+          <p class="next-title">下一个</p>
+        </div>
+    </div>
+    </div>
 </template>
 <script setup>
-import { ref, getCurrentInstance, watch, h, nextTick,onMounted,defineProps,defineEmits } from 'vue'
+import { ref, getCurrentInstance, watch, h, nextTick,onMounted,defineProps,defineEmits,computed } from 'vue'
 import { Iphone,More,MoreFilled,ArrowLeft,Right } from '@element-plus/icons'
 import commonHeatmapVue from '../../components/echarts/commonHeatmap.vue'
 import commonGaugeVue from '../../components/echarts/commonGauge.vue'
@@ -246,7 +370,7 @@ import replaceHiTeach from './iot.vue'
 let props = defineProps({
     searchdata: Object,
 })
-let { proxy } = getCurrentInstance()
+let {ctx:that,proxy } = getCurrentInstance()
 let activeName = ref('basics')
 let userdetailState=ref(false)
 let tabPosition = ref('left')
@@ -263,11 +387,11 @@ let userdata = ref([
 let productdata = ref([
     { id: 1, title: 'HiTeach', value:0,key:'HiTeach',state: false },
     { id: 2, title: 'HiTA',value:0, key:'HiTA',state: false },
-    { id: 3, title: 'IES', value:0,key:'IES', state: false },
-    { id: 4, title: '苏格拉底', value:0,key:'Socrates', state: false },
-    { id: 5, title: 'HiTeach CC', value:0,key:'cc', state: false },
-    { id: 6, title: '通用账号', value:0,key:'general', state: false },
-    { id: 7, title: 'IRS', value:0,key:'irs', state: false },
+    { id: 3, title: 'IES', value:0,key:'IES5', state: false },
+    { id: 4, title: '苏格拉底', value:0,key:'Sokrates', state: false },
+    { id: 5, title: '觀議課 APP', value:0,key:'SokAPP', state: false },
+    { id: 6, title: '通用账号', value:0,key:'Account ', state: false },
+    { id: 7, title: 'WebIRS5', value:0,key:'IRS', state: false },
 ])
 let tableData = ref([
     { time: '2023-07-05 15:33', ip: '222.209.14.199', location: '四川省成都市',platform:'HiTeach' },
@@ -532,9 +656,10 @@ let rightsdata=ref([
 ])
 let detailsData = ref()
 detailsData.value = props.searchdata?.length > 0 ? props.searchdata : ''
-let ies5datas=detailsData.value[0].ies5
-let sokratesData=detailsData.value[0].sokrates
-let pointsData=detailsData.value[0]
+let transferNum=ref(0)   //*滚动的数值*
+let ies5datas=ref(detailsData.value[transferNum.value].ies5)
+let sokratesData=ref(detailsData.value[transferNum.value].sokrates)
+let pointsData=ref(detailsData.value[transferNum.value])
 console.log(props.searchdata, '传输的值')
 console.log(detailsData.value, '最终数据')
 let powerExtension=ref([
@@ -576,6 +701,24 @@ let buttonSelect = ref([
 ])
 let loginDialog=ref(false)
 let logintotalTable=ref([])
+let iotState=ref(true)
+let advancevalue=ref({
+    last:'',
+    next:''
+})
+let loading=ref(false)
+let headeronly=ref(require('@/assets/img/default1.png'))
+let headerData=ref([
+    require('@/assets/img/default1.png'),
+    require('@/assets/img/default2.png'),
+    require('@/assets/img/default3.png'),
+    require('@/assets/img/default4.png'),
+    ])
+const randomImage = computed(()=>{
+    const randomIndex = Math.floor(Math.random() * headerData.value.length);
+    console.log(randomIndex,'随机头像')
+    return headerData.value[randomIndex];
+})
 const handleChildEvent = (payload) => {
     userdetailState.value=false
 }
@@ -585,7 +728,8 @@ const backClick = () => {
         emits('parentClick','default') // 使用方式和 vue2 this.$emit 一样
 }
 function initdata() {
-    let transmitData = detailsData.value[0]
+    console.log(detailsData.value,'进入方法查看')
+    let transmitData = detailsData.value[transferNum.value]
     console.log(transmitData,'数据')
     //header 基础信息 
     let { name,id,mobile, mail, schoolCode, schoolCodeW, points,country,province,city,} = transmitData
@@ -599,16 +743,23 @@ function initdata() {
     //产品使用及安装情况 登入时间
     let {login}=transmitData
     let logintimes = login.length >0 ? login.sort(function(a,b){return b.time-a.time}):'无'
+    console.log(logintimes,'时间!')
     logintimes !=='无' ?  userdata.value[5].value=proxy.$common.timestampToTime(logintimes[0].time,'all'):userdata.value[5].value='暂无'
     if(login.length >0){
+       logintotalTable.value=[]
        login.forEach(item => {
          let typename=item.product
          productdata.value.forEach(items=>{
             typename === items.key ? items.value === 0 ? (items.value=proxy.$common.timestampToTime(item.time,'all'),items.state=true): item.time > items.value ? (items.value=proxy.$common.timestampToTime(item.time,'all'),items.state=true):'':''
          })
-         item.time=proxy.$common.timestampToTime(item.time,'all')
+         item.timeText=proxy.$common.timestampToTime(item.time,'all')
          logintotalTable.value.push(item)
        })
+    }else{
+        logintotalTable.value=[]
+        productdata.value.forEach((item)=>{
+            item.state=false
+        })
     }
     //空间与权益
     let {usedSize,teachSize,totalSize,surplusSize}=transmitData.ies5
@@ -644,12 +795,13 @@ function initdata() {
         let days = Math.floor(timeDifference / (24 * 60 * 60 ));
         console.log(days,'天数')
         item.intervalTime=days
-        item.startDateText=item.startDateText ? proxy.$common.timestampToTime(item.startDate):0
-        item.endDateText= item.endDateText? proxy.$common.timestampToTime(item.endDate):0
+        item.startDateText=item.startDate ? proxy.$common.timestampToTime(item.startDate):0
+        item.endDateText= item.endDate? proxy.$common.timestampToTime(item.endDate):0
         powerList.value.push(item)  
     })
     //处理权益内 附加功能(HITeach附加 CC权限)
     let hiteachData=benefits.hiteach !==null ?benefits.hiteach:[] ; let ccData=benefits.hiteachcc !==null  ?benefits.hiteachcc:[]
+    console.log(hiteachData,ccData)
     if(hiteachData.length >0){
         hiteachData.forEach((item)=>{
             let funcKey=item.func;let startTime=proxy.$common.timestampToTime(item.get);let endTime=proxy.$common.timestampToTime(item.exp)
@@ -657,6 +809,7 @@ function initdata() {
                 funcKey === items.key ? (items.start=startTime,items.end=endTime,items.value=item.para,items.gets=item.get,items.exps=item.exp):''
             })
         })
+        console.log(subjoinData.value)
     }
     if(ccData.length >0 ){
         ccData.forEach((itemA)=>{
@@ -683,40 +836,98 @@ function initdata() {
     gaugedata.value.series[0].data[0].value=transitionUsed !==0 ? Math.round((transitionUsed/transitionTotal).toFixed(2)*100):0
     gaugedata.value.title[0].text=useGsize+' G'
     console.log(transitionUsed,transitionSuplus,transitionTeach,transitionTotal,'结果')
+
+    //处理上下一个
+    advancevalue.value.next=detailsData.value[transferNum.value+1]
+    loading.value=false
 }
 function bytesToGB(bytes) {
   const gb = bytes / (1024 * 1024 * 1024);
   return gb.toFixed(2); // 将结果保留两位小数
 }
 function init(){
+    loading.value=true
+    console.log(detailsData.value,transferNum.value,'查看IOT')
     //处理关于iot问题
-    detailsData.value[0].iot.hiteach.day ? 
-    (buttonSelect.value[0].click=true,detailsIot.value=detailsData.value[0].iot.hiteach.day):
-    detailsData.value[0].iot.hiteach.month ? 
-    (buttonSelect.value[1].click=true,detailsIot.value=detailsData.value[0].iot.hiteach.month):
-    detailsData.value[0].iot.hiteach.year ? 
-    (buttonSelect.value[2].click=true,detailsIot.value=detailsData.value[0].iot.hiteach.year):''
+    detailsData.value[transferNum.value].iot.hiteach.day !==null ? 
+    (buttonSelect.value[0].click=true,detailsIot.value=detailsData.value[transferNum.value].iot.hiteach.day,iotState.value=true):
+    detailsData.value[transferNum.value].iot.hiteach.month !==null ? 
+    (buttonSelect.value[1].click=true,detailsIot.value=detailsData.value[transferNum.value].iot.hiteach.month,iotState.value=true):
+    detailsData.value[transferNum.value].iot.hiteach.year !==null ? 
+    (buttonSelect.value[2].click=true,detailsIot.value=detailsData.value[transferNum.value].iot.hiteach.year,iotState.value=true):iotState.value=false
 
     //BTN显示问题
-    detailsData.value[0].iot.hiteach.day ? buttonSelect.value[0].disabled=false:buttonSelect.value[0].disabled=true
-    detailsData.value[0].iot.hiteach.month ? buttonSelect.value[1].disabled=false:buttonSelect.value[1].disabled=true
-    detailsData.value[0].iot.hiteach.year ? buttonSelect.value[2].disabled=false:buttonSelect.value[2].disabled=true
+    console.log(detailsData.value,'按钮问题')
+    detailsData.value[transferNum.value].iot.hiteach.day ? (buttonSelect.value[0].disabled=false,buttonSelect.value[0].click=true):(buttonSelect.value[0].disabled=true,buttonSelect.value[0].click=false)
+    detailsData.value[transferNum.value].iot.hiteach.month ? (buttonSelect.value[1].disabled=false,buttonSelect.value[1].click=true):(buttonSelect.value[1].disabled=true,buttonSelect.value[1].click=false)
+    detailsData.value[transferNum.value].iot.hiteach.year  ? (buttonSelect.value[2].disabled=false,buttonSelect.value[2].click=true):(buttonSelect.value[2].disabled=true,buttonSelect.value[2].click=false)
 }
 function selectTime(value){
     console.log(value,'值')
     value =='day' ? 
-    (buttonSelect.value[0].click=true,buttonSelect.value[1].click=false,buttonSelect.value[2].click=false,detailsIot.value=detailsData.value[0].iot.hiteach.day):
+    (buttonSelect.value[0].click=true,buttonSelect.value[1].click=false,buttonSelect.value[2].click=false,detailsIot.value=detailsData.value[transferNum.value].iot.hiteach.day):
     value =='month' ?
-    (buttonSelect.value[1].click=true,buttonSelect.value[0].click=false,buttonSelect.value[2].click=false,detailsIot.value=detailsData.value[0].iot.hiteach.month):
+    (buttonSelect.value[1].click=true,buttonSelect.value[0].click=false,buttonSelect.value[2].click=false,detailsIot.value=detailsData.value[transferNum.value].iot.hiteach.month):
     value =='year' ? 
-    (buttonSelect.value[2].click=true,buttonSelect.value[0].click=false,buttonSelect.value[1].click=false,detailsIot.value=detailsData.value[0].iot.hiteach.year):''
+    (buttonSelect.value[2].click=true,buttonSelect.value[0].click=false,buttonSelect.value[1].click=false,detailsIot.value=detailsData.value[transferNum.value].iot.hiteach.year):''
 
     console.log(detailsIot.value,'值')
 }
+//切换用户 需要执行的内容
+function cutUser(){
+    loading.value=true
+    console.log(detailsData,'数据组')
+    ies5datas.value=detailsData.value[transferNum.value].ies5
+    sokratesData.value=detailsData.value[transferNum.value].sokrates
+    pointsData.value=detailsData.value[transferNum.value]
+    powerList.value=[]
+    initdata()
+    init()
+    setTimeout(()=>{loading.value=false},800)
+    that.$forceUpdate()
+    // let nowNums=transferNum.value
+    // if(nowNums+1 === detailsData.value.length){
+    //     advancevalue.value.next={}
+    //     advancevalue.value.last=detailsData.value[nowNums-1]
+    // }else if(nowNums.value !==0 && nowNums.value+1 !== detailsData.value.length){
+    //     advancevalue.value.next=detailsData.value[nowNums+1]
+    //     advancevalue.value.last=detailsData.value[nowNums-1]
+    // }else if(nowNums.value ===0){
+    //     advancevalue.value.next=detailsData.value[nowNums+1]
+    // }
+}
+//下一个用户
+function nextUser(){
+    console.log(transferNum,'值')
+    transferNum.value=Number(transferNum.value)+1
+    if(transferNum.value === detailsData.value.length){}
+}
+//上一个用户
+function lastUser(){
+    if(transferNum.value !==0){
+        transferNum.value=Number(transferNum.value)-1
+        console.log(transferNum.value,'页数')
+        ies5datas.value=detailsData.value[transferNum.value].ies5
+        sokratesData.value=detailsData.value[transferNum.value].sokrates
+        pointsData.value=detailsData.value[transferNum.value]
+    }
+}
 onMounted(() => {
     initdata()
 })
 init()
+watch(()=>transferNum.value,(newnum)=>{
+    console.log(newnum,'变化的数字')
+    // nextTick(() => {
+        cutUser()
+    // })
+})
+// watch(() => props.detailsData, (newValue) => {
+//     //   propValue.value = newValue;
+//     let datas={detailsData:newValue}
+//     init(datas)
+//     console.log(datas,'有数据进来')
+//   });
 </script>
 <style>
 .userdetails{
@@ -1003,7 +1214,7 @@ init()
 }
 .login-echart{
     width:100%;
-    height:40vh;
+    height:54vh;
     display: flex;
     align-items: center;
 }
@@ -1067,6 +1278,7 @@ init()
 .rightsbox-item-expansion div{
     line-height: 18px;
     padding-left: 4px;
+    margin-bottom: 3px;
 }
 .subjoin-item{
     margin-top:5px;
@@ -1089,7 +1301,7 @@ init()
     color:#909399;
 }
 .subjoin{
-    height:20vh;
+    height:25vh;
     line-height: 20px;
     color:#73767a;
     overflow: hidden;
@@ -1164,7 +1376,7 @@ init()
 }
 .logintotal-box-list{
     display: flex;
-    flex-wrap: wrap;
+    flex-wrap: nowrap;
     overflow: hidden;
     overflow-x: auto;
 }
@@ -1178,6 +1390,124 @@ init()
     margin-bottom: 5px;
     color:#606266;
 }
+.not-coupons{
+    display: flex;
+    height:90%;
+    align-items: center;
+    justify-content: center;
+    font-size:22px;
+    font-weight: 700;
+    color: #73767a;
+    /* line-height: 160px; */
+}
+.power-notdata{
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    font-size:22px;
+    font-weight: 700;
+    color: #73767a;
+    height: 30vh;
+}
+.expire{
+    color: #b1b3b8;
+}
+.groupdata{
+    line-height: 16px;
+    text-align: right;
+    font-size:14px;
+    color:#909399;
+}
+.nowgroup-num,.totalgroup-num{
+    color:#409EFF;
+    margin:0px 3px;
+}
+
+.lastbtn {
+  width: 80px;
+  height: auto;
+  line-height: 20px;
+  position: absolute;
+  left: 0%;
+  top: 45%;
+  opacity: 0.5;
+  display: flex;
+  flex-wrap: wrap;
+  justify-content: center;
+  align-items: center;
+  border-radius: 5px;
+  font-size: 14px;
+  padding: 5px;
+}
+.nextbtn {
+  width: 80px;
+  height: auto;
+  line-height: 20px;
+  position: absolute;
+  right: 0%;
+  top: 43%;
+  opacity: 0.5;
+  display: flex;
+  flex-wrap: wrap;
+  justify-content: center;
+  align-items: center;
+  border-radius: 5px;
+  font-size: 14px;
+  padding: 5px;
+}
+.lastbtn:hover,
+.nextbtn:hover {
+  background-color: #dfe6e9;
+  opacity: 1;
+  box-shadow: rgba(6, 24, 44, 0.1) 0px 0px 0px 2px,
+    rgba(6, 24, 44, 0.1) 0px 4px 6px -1px,
+    rgba(255, 255, 255, 0.08) 0px 1px 0px inset;
+  cursor: pointer;
+}
+.lastbtn:hover .btn-ls-text,
+.nextbtn:hover .btn-ls-text {
+  opacity: 0.8;
+}
+.btn-ls {
+  width: 100%;
+}
+.btn-ls-text {
+  margin-top: 3px;
+  color: #303a5d;
+  opacity: 0;
+}
+.last-btns {
+  width: 40px;
+  height: 40px;
+  vertical-align: -0.5em;
+  fill: currentColor;
+}
+.btn-ls-text p {
+  margin-bottom: 5px;
+}
+.next-school {
+  font-size: 12px;
+  color: #303a5d;
+  font-weight: bold;
+}
+.next-title {
+  font-size: 8px;
+  color: #34495e;
+}
+.entirety{
+    position: relative;
+}
+.prodlist{
+    height:60vh;
+    overflow: hidden;
+    overflow-y: auto;
+}
+.not-datas{
+    font-size:16px;
+    font-weight: 700;
+    color: #73767a;
+    line-height: 40px;
+}
 </style>
 <style>
 .inquirebox-details .el-divider{
@@ -1192,4 +1522,7 @@ init()
 .login-total .el-overlay .el-dialog__header{
     padding:5px !important;
 }
+.recordbox-item .el-tag{
+    cursor: pointer;
+}
 </style>

+ 9 - 2
TEAMModelBI/ClientApp/src/view/userInquire/ies.vue

@@ -289,6 +289,10 @@
  onMounted(() => {
     initdatas()
 })
+watch(()=>props,(newvalue)=>{
+    console.log(newvalue,'有新值进入IES')
+    newvalue.iesdata ? (allschoolList.value=[],initdatas()):''
+},{deep:true})
  </script>
  <style scoped>
  .ies-content{
@@ -460,17 +464,20 @@
     padding: 1%;
     display: flex;
     flex-wrap: wrap;
+    height:64vh;
+    overflow: hidden;
+    overflow-y: auto;
  }
  .dialogschool-item{
-    width:25%;
+    width:30%;
     padding: 2% 1%;
     justify-content: center;
     align-items: center;
     border:1px solid #ccc;
     border-radius: 5px;
-    margin:0px 10px;
     position:relative;
     overflow: hidden;
+    margin:1%;
  }
  .dialogschool-item-top,.item-content-tile{
     text-align: center;

+ 54 - 7
TEAMModelBI/ClientApp/src/view/userInquire/index.vue

@@ -21,17 +21,17 @@
                 </template>
                 </el-input>
             </div>
-            <!-- <div class="recordbox" v-if="selecttypes==='precise'">
+            <div class="recordbox" v-if="selecttypes==='precise'">
                 <p>搜索记录:</p>
                 <div class="recordbox-item">
-                    <el-tag v-for="tag in tags" :key="tag.name" class="mx-1" closable :type="tag.type">
-                        {{ tag.name }}
+                    <el-tag v-for="tag in searchRecordsArr"  class="mx-1" closable type="''"  effect="light" @close="deleteLog(tag)" @click="searchvalue=tag">
+                        {{ tag }}
                     </el-tag>
                 </div>
             </div>
             <div class="recordbox" v-else="selecttypes ==='batch'">
                 <p>搜索结果:</p>
-            </div> -->
+            </div>
         </div>
     </div>
     <div class="inquirebox-details" v-else-if="pageShow ==='details'">
@@ -56,24 +56,71 @@ let searchvalue=ref('')
 let selecttypes = ref('precise')
 let searchResult=ref()
 let searchLoading=ref(false)
+const searchRecordsArr = ref(JSON.parse(localStorage.getItem('searchRecords')));
 const backClicks=()=>{pageShow.value='default'}
+console.log(searchRecordsArr.value,'搜索记录')
 function seachSole(datavalue) {
     if(!searchvalue.value){
         ElMessage.info('请输入手机号码/ 醍魔豆账号 进行搜索!')
         return
     }
-    let data = {'tmids':[searchvalue.value]}
+    //处理TW用户 ID可能是以0开头的情况。删除掉开头的0
+    if(searchvalue.value.startsWith('0')){
+        searchvalue.value =searchvalue.value.substring(1)
+    }
+    //处理多名用户查询
+    let userArr=''
+    if(searchvalue.value.includes(',') || searchvalue.value.includes(',')){
+        searchvalue.value=searchvalue.value.replace(/,/g, ',');
+        userArr = searchvalue.value.split(',');
+    }
+    if(userArr.length >5){
+            ElMessage.info('同时查询人员不能大于5,请调整查询范围')
+            return
+    }
+    //let testdata=['1524738018','1595321354']
+    let data = ''
+    //let data={'tmids':testdata}
+    searchvalue.value.includes(',') || searchvalue.value.includes(',') ? data={'tmids':userArr}: data = {'tmids':[searchvalue.value]}
     console.log(data)
     searchLoading.value=true
+    let setData={
+        value:searchvalue.value,
+        type:searchvalue.value.includes(',') || searchvalue.value.includes(',') ? 'multiple':'only',
+        time:Date.now()
+    }
     proxy.$api.getUserdatas(data).then((res) => { 
         console.log(res, 'user back')
-        res.length >0 ? (searchResult.value=res,searchLoading.value=false,pageShow.value='details'):(ElMessage.error('暂无搜索到相关人员,请检查信息搜索'),searchLoading.value=false)
+        res.length >0 ? 
+        (searchResult.value=res,searchLoading.value=false,pageShow.value='details'):
+        (ElMessage.error('暂无搜索到相关人员,请检查信息搜索'),searchLoading.value=false)
+        //搜索记录
+        if(res.length >0){saveSearchRecord(searchvalue.value)}
     }).catch((err) => {
         searchLoading.value=false
         ElMessage.error('API异常,查询失败')
     })
     // pageShow.value='details'
- }
+}
+// 保存搜索记录到localStorage(重复搜索的只记录一个)
+function saveSearchRecord(keyword) {
+  let searchRecords = localStorage.getItem('searchRecords');
+  !searchRecords ?searchRecords = []:searchRecords = JSON.parse(searchRecords);
+  if (!searchRecords.includes(keyword)) {
+    searchRecords.push(keyword);
+    searchRecordsArr.value.push(keyword)
+  }
+  localStorage.setItem('searchRecords', JSON.stringify(searchRecords));
+}
+function deleteLog(value){
+    console.log(value)
+    let parseSearchRecords=searchRecordsArr.value
+    console.log(parseSearchRecords,'数组内容')
+    let resultNum=parseSearchRecords.findIndex((item)=>{return item ===value})
+    console.log(resultNum,'数字')
+    resultNum !== -1 ? (searchRecordsArr.value.splice(resultNum,1)):''
+    localStorage.setItem('searchRecords', JSON.stringify(searchRecordsArr.value));
+}
 </script>
 <style scoped>
 .inquirebox{

+ 12 - 5
TEAMModelBI/ClientApp/src/view/userInquire/iot.vue

@@ -631,7 +631,8 @@
     // props.pattern.state ==='school' ? appearState.value='default': props.pattern.state ==='area' ? appearState.value='area':appearState.value='default'
     
     let propsbox=transfervalue? transfervalue:props
-    console.log(propsbox, '数据')
+    
+    console.log(propsbox,props,'数据1234')
     //学校基础信息
     // let { name, region, province, city, dist } = propsbox.detailsData.school
     // schoolData.value.name = appearState.value ==='default' ? name: appearState.value ==='area' ? propsbox.detailsData.name:''
@@ -717,13 +718,19 @@
   function backbtn () {
     $myemit('myback', 'default')
   }
+onMounted(() => {
   init()
-  watch(() => props.detailsData, (newValue) => {
+})
+  watch(() => props, (newValue) => {
+    console.log()
     //   propValue.value = newValue;
-    let datas={detailsData:newValue}
+    let datas={detailsData:newValue.detailsData}
     init(datas)
-    console.log(datas,'有数据进来')
-  });
+  },{deep:true});
+  watch(()=>props,(newdata)=>{
+    console.log(newdata,'9999999999999999')
+  })
+
   </script>
   <style  scoped>
   .details-analysis {

+ 12 - 3
TEAMModelBI/ClientApp/src/view/userInquire/socrates.vue

@@ -377,6 +377,8 @@ function initdatas(){
         presupposed.value.data.general_observation=user_channels.general_observation,
         presupposed.value.state=true)
         :presupposed.value.state=false
+    }else{
+        presupposed.value.state=false
     }
     //处理total数据
     primary.value[0].value=hiteach_data.total.t_data ? hiteach_data.total.t_data:0
@@ -412,22 +414,29 @@ function selectTime(values) {
         element.value === values ? element.click=true: element.click=false
     });
     if(values ==='week'){
+        console.log(hiteach_data.this_week.t_green,hiteach_data.this_month.t_green)
         proportiondata.value.title[0].text='占同月T绿灯比例'
-        proportiondata.value.title[1].text=Math.round((hiteach_data.this_week.t_green/hiteach_data.this_month.t_green).toFixed(2)*100)+'%'
+        proportiondata.value.title[1].text= hiteach_data.this_week.t_green !=0 ? Math.round((hiteach_data.this_week.t_green/hiteach_data.this_month.t_green).toFixed(2)*100)+'%':0+'%'
         proportiondata.value.series[0].data[0].value=Math.round((hiteach_data.this_week.t_green/hiteach_data.this_month.t_green).toFixed(2)*100)
         proportiondata.value.series[0].data[1].value=100-(Math.round((hiteach_data.this_week.t_green/hiteach_data.this_month.t_green).toFixed(2)*100))
     }else if(values ==='month'){
+        console.log(hiteach_data.this_month.t_green,hiteach_data.this_year.t_green)
         proportiondata.value.title[0].text='占同年T绿灯比例'
-        proportiondata.value.title[1].text=Math.round((hiteach_data.this_month.t_green/hiteach_data.this_year.t_green).toFixed(2)*100)+'%'
+        proportiondata.value.title[1].text=hiteach_data.this_month.t_green !=0 ? Math.round((hiteach_data.this_month.t_green/hiteach_data.this_year.t_green).toFixed(2)*100)+'%':0+'%'
         proportiondata.value.series[0].data[0].value=Math.round((hiteach_data.this_month.t_green/hiteach_data.this_year.t_green).toFixed(2)*100)
         proportiondata.value.series[0].data[1].value=100-(Math.round((hiteach_data.this_month.t_green/hiteach_data.this_year.t_green).toFixed(2)*100))
     }else if(values ==='year'){
+        console.log(hiteach_data.this_year.t_green,hiteach_data.total.t_green)
         proportiondata.value.title[0].text='占全部T绿灯比例'
-        proportiondata.value.title[1].text=Math.round((hiteach_data.this_year.t_green/hiteach_data.total.t_green).toFixed(2)*100)+'%'
+        proportiondata.value.title[1].text=hiteach_data.this_year.t_green && hiteach_data.total.t_green ? Math.round((hiteach_data.this_year.t_green/hiteach_data.total.t_green).toFixed(2)*100)+'%':0+'%'
         proportiondata.value.series[0].data[0].value=Math.round((hiteach_data.this_year.t_green/hiteach_data.total.t_green).toFixed(2)*100)
         proportiondata.value.series[0].data[1].value=100-(Math.round((hiteach_data.this_year.t_green/hiteach_data.total.t_green).toFixed(2)*100))
     }
 }
+watch(()=>props,(newvalue)=>{
+    console.log(newvalue,'有新值进入苏格拉底')
+    newvalue.sokratesdatas ? (initdatas(),zb.value = proportiondata.value):''
+},{deep:true})
  </script>
  <style scoped>
  .socrates-header,.socrates-auxiliary{

+ 7 - 2
TEAMModelBI/ClientApp/src/view/userInquire/ticket.vue

@@ -142,6 +142,10 @@ let gaindata = computed(() => {
  onMounted(() => {
     inidatas()
 })
+watch(()=>props,(newdata)=>{
+    console.log(newdata,'有新值进入票卷')
+    newdata.pointsandcoupons ? (ticketlist.value=[],inidatas()):''
+},{deep:true})
 </script>
 <style scoped>
 .ticket-header{
@@ -285,9 +289,10 @@ let gaindata = computed(() => {
     padding-top:25px;
 }
 .not-coupons{
-    font-size:16px;
+    font-size:18px;
     color: #73767a;
-    line-height: 120px;
+    line-height: 160px;
+    font-weight: 700;
 }
 /* .usebox{
     color:rgba(255,255,255,.9) !important;

+ 62 - 63
TEAMModelBI/Controllers/BINormal/BatchAreaController.cs

@@ -598,31 +598,27 @@ namespace TEAMModelBI.Controllers.BINormal
                 #endregion
 
                 //执行复制操作
-                BatchCopyFile batchCopyFile = new BatchCopyFile();
-                batchCopyFile.blobCntr = "teammodelos";
-                batchCopyFile.oldFileName = $"{oldStandard}";
-                batchCopyFile.newFileName = $"{standard}";
-                batchCopyFile.tmdid = $"{_tmdId}";
-                batchCopyFile.tmdIds = new List<string> { $"{ _tmdId}" };
-                batchCopyFile.codeKey = partitionCode;
-                batchCopyFile.tmdName = $"{_tmdName}";
-                var messageBatchCopyFile = new ServiceBusMessage(batchCopyFile.ToJsonString());
-                messageBatchCopyFile.ApplicationProperties.Add("name", "CopyStandardFile");
-                //var activeTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
-
-                try
-                {
-                    //await  _serviceBus.GetServiceBusClient().SendMessageAsync(activeTask, messageBatchCopyFile);
-                    await serBusClient.SendMessageAsync(activeTask, messageBatchCopyFile);
-                }
-                catch (Exception)
-                {
-                    return Ok(new { state = 201, msg = "能力点复制成功,复制能力点的文件失败," });
-                }
- 
-
-            
-              
+                //去除新建区,复制能力点文件
+                //BatchCopyFile batchCopyFile = new BatchCopyFile();
+                //batchCopyFile.blobCntr = "teammodelos";
+                //batchCopyFile.oldFileName = $"{oldStandard}";
+                //batchCopyFile.newFileName = $"{standard}";
+                //batchCopyFile.tmdid = $"{_tmdId}";
+                //batchCopyFile.tmdIds = new List<string> { $"{ _tmdId}" };
+                //batchCopyFile.codeKey = partitionCode;
+                //batchCopyFile.tmdName = $"{_tmdName}";
+                //var messageBatchCopyFile = new ServiceBusMessage(batchCopyFile.ToJsonString());
+
+                //messageBatchCopyFile.ApplicationProperties.Add("name", "CopyStandardFile");
+
+                //try
+                //{
+                //    await serBusClient.SendMessageAsync(activeTask, messageBatchCopyFile);
+                //}
+                //catch (Exception)
+                //{
+                //    return Ok(new { state = 201, msg = "能力点复制成功,复制能力点的文件失败," });
+                //}
                 //保存操作记录
                 //await _azureStorage.SaveBILog("area-add", $"{_tmdName}【{_tmdId}】已操作创区功能模块:{name},当前标准【{standard}】,复制的微能力点:{tempStandard}", _dingDing, httpContext: HttpContext);
                 await AzureStorageBlobExtensions.SaveBILog(blobClient, tableClient, "area-add", $"{_tmdName}【{_tmdId}】已操作创区功能模块:{name},当前标准【{standard}】,复制的微能力点:{tempStandard}", _dingDing, httpContext: HttpContext);
@@ -953,25 +949,27 @@ namespace TEAMModelBI.Controllers.BINormal
                 _coreAPIHttpService.PushNotify(new List<IdNameCode> { new IdNameCode { id = targetTeacher.id, name = targetTeacher.name, code = targetTeacher.lang } }, "copy-file_area", Constant.NotifyType_IES5_Management, new Dictionary<string, object> { { "tmdname", $"{_tmdName}" } }, _option.Location, _configuration, _dingDing, _environment.ContentRootPath);
 
                 //执行复制操作
-                BatchCopyFile batchCopyFile = new();
-                batchCopyFile.blobCntr = "teammodelos";
-                batchCopyFile.oldFileName = $"{_newStandard}";
-                batchCopyFile.newFileName = $"{_oldStandard}";
-                batchCopyFile.tmdid = $"{_tmdId}";
-                batchCopyFile.tmdIds = new List<string> { $"{ _tmdId}" };
-                batchCopyFile.codeKey = partitionCode;
-                batchCopyFile.tmdName = $"{_tmdName}";
-                var messageBatchCopyFile = new ServiceBusMessage(batchCopyFile.ToJsonString());
-                messageBatchCopyFile.ApplicationProperties.Add("name", "CopyStandardFile");  
-                try
-                {
-                    //await _serviceBus.GetServiceBusClient().SendMessageAsync(activeTask, messageBatchCopyFile);  //先执行删除操作,在执行复制  单一
-                    await serBusClient.SendMessageAsync(activeTask, messageBatchCopyFile);  //先执行删除操作,在执行复制
-                }
-                catch (Exception)
-                {
-                    return Ok(new { state = 201 ,msg = "能力点复制成功,复制能力点的文件失败," });
-                }
+
+                //去除新建区,复制能力点文件
+                //BatchCopyFile batchCopyFile = new();
+                //batchCopyFile.blobCntr = "teammodelos";
+                //batchCopyFile.oldFileName = $"{_newStandard}";
+                //batchCopyFile.newFileName = $"{_oldStandard}";
+                //batchCopyFile.tmdid = $"{_tmdId}";
+                //batchCopyFile.tmdIds = new List<string> { $"{ _tmdId}" };
+                //batchCopyFile.codeKey = partitionCode;
+                //batchCopyFile.tmdName = $"{_tmdName}";
+                //var messageBatchCopyFile = new ServiceBusMessage(batchCopyFile.ToJsonString());
+                //messageBatchCopyFile.ApplicationProperties.Add("name", "CopyStandardFile");  
+                //try
+                //{
+                     
+                //    await serBusClient.SendMessageAsync(activeTask, messageBatchCopyFile);  //先执行删除操作,在执行复制
+                //}
+                //catch (Exception)
+                //{
+                //    return Ok(new { state = 201 ,msg = "能力点复制成功,复制能力点的文件失败," });
+                //}
 
               
                 //保存操作记录
@@ -1287,25 +1285,26 @@ namespace TEAMModelBI.Controllers.BINormal
                         string partitionCode = "DelBeforeCopyAbility-mark";
 
                         //执行复制操作
-                        BatchCopyFile batchCopyFile = new();
-                        batchCopyFile.blobCntr = "teammodelos";
-                        batchCopyFile.oldFileName = $"{newstand.standard}";
-                        batchCopyFile.newFileName = $"{area.standard}";
-                        batchCopyFile.tmdid = $"{_tmdId}";
-                        batchCopyFile.tmdIds = new List<string> { $"{_tmdId}" };
-                        batchCopyFile.codeKey = partitionCode;
-                        batchCopyFile.tmdName = $"{_tmdName}";
-                        var messageBatchCopyFile = new ServiceBusMessage(batchCopyFile.ToJsonString());
-                        messageBatchCopyFile.ApplicationProperties.Add("name", "CopyStandardFile");
-                        try
-                        {
-                            //await _serviceBus.GetServiceBusClient().SendMessageAsync(activeTask, messageBatchCopyFile);  //先执行删除操作,在执行复制  单一
-                            await serBusClient.SendMessageAsync(activeTask, messageBatchCopyFile);  //先执行删除操作,在执行复制
-                        }
-                        catch (Exception)
-                        {
-                            return Ok(new { state = 201, msg = "能力点复制成功,复制能力点的文件失败," });
-                        }
+                        //去除新建区,复制能力点文件
+                        //BatchCopyFile batchCopyFile = new();
+                        //batchCopyFile.blobCntr = "teammodelos";
+                        //batchCopyFile.oldFileName = $"{newstand.standard}";
+                        //batchCopyFile.newFileName = $"{area.standard}";
+                        //batchCopyFile.tmdid = $"{_tmdId}";
+                        //batchCopyFile.tmdIds = new List<string> { $"{_tmdId}" };
+                        //batchCopyFile.codeKey = partitionCode;
+                        //batchCopyFile.tmdName = $"{_tmdName}";
+                        //var messageBatchCopyFile = new ServiceBusMessage(batchCopyFile.ToJsonString());
+                        //messageBatchCopyFile.ApplicationProperties.Add("name", "CopyStandardFile");
+                        //try
+                        //{
+                        //    //await _serviceBus.GetServiceBusClient().SendMessageAsync(activeTask, messageBatchCopyFile);  //先执行删除操作,在执行复制  单一
+                        //    await serBusClient.SendMessageAsync(activeTask, messageBatchCopyFile);  //先执行删除操作,在执行复制
+                        //}
+                        //catch (Exception)
+                        //{
+                        //    return Ok(new { state = 201, msg = "能力点复制成功,复制能力点的文件失败," });
+                        //}
                     }
 
                     StandardFile saveFile = new();

+ 20 - 21
TEAMModelBI/Controllers/RepairApi/InitialAreaController.cs

@@ -262,27 +262,26 @@ namespace TEAMModelBI.Controllers.RepairApi
                 }
 
                 //执行复制操作
-                BatchCopyFile batchCopyFile = new();
-                batchCopyFile.blobCntr = "teammodelos";
-                batchCopyFile.oldFileName = $"{area.standard}";
-                batchCopyFile.newFileName = $"{standard}";
-                batchCopyFile.tmdid = $"{_tmdId}";
-                batchCopyFile.tmdIds = new List<string> { $"{_tmdId}" };
-                batchCopyFile.codeKey = partitionCode;
-                batchCopyFile.tmdName = $"{_tmdName}";
-                var messageBatchCopyFile = new ServiceBusMessage(batchCopyFile.ToJsonString());
-                messageBatchCopyFile.ApplicationProperties.Add("name", "CopyStandardFile");
-                //var activeTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
-
-                try
-                {
-                    await _serviceBus.GetServiceBusClient().SendMessageAsync(activeTask, messageBatchCopyFile);
-                    await serBusClient.SendMessageAsync(activeTask, messageBatchCopyFile);
-                }
-                catch (Exception)
-                {
-                    return Ok(new { state = 201, msg = "能力点复制成功,复制能力点的文件失败," });
-                }
+                //BatchCopyFile batchCopyFile = new();
+                //batchCopyFile.blobCntr = "teammodelos";
+                //batchCopyFile.oldFileName = $"{area.standard}";
+                //batchCopyFile.newFileName = $"{standard}";
+                //batchCopyFile.tmdid = $"{_tmdId}";
+                //batchCopyFile.tmdIds = new List<string> { $"{_tmdId}" };
+                //batchCopyFile.codeKey = partitionCode;
+                //batchCopyFile.tmdName = $"{_tmdName}";
+                //去除新建区,复制能力点文件
+                //var messageBatchCopyFile = new ServiceBusMessage(batchCopyFile.ToJsonString());
+                //messageBatchCopyFile.ApplicationProperties.Add("name", "CopyStandardFile");
+                //try
+                //{
+                //    await _serviceBus.GetServiceBusClient().SendMessageAsync(activeTask, messageBatchCopyFile);
+                //    await serBusClient.SendMessageAsync(activeTask, messageBatchCopyFile);
+                //}
+                //catch (Exception)
+                //{
+                //    return Ok(new { state = 201, msg = "能力点复制成功,复制能力点的文件失败," });
+                //}
  
             }
 

+ 3 - 3
TEAMModelBI/TEAMModelBI.csproj

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

+ 5 - 2
TEAMModelOS.FunctionV4/CosmosDB/TriggerExam.cs

@@ -866,6 +866,8 @@ namespace TEAMModelOS.FunctionV4
             var papers = info.papers.GroupBy(c => c.subjectId).Select(x => new { 
                 subject =  x.Key,
                 blob = x.ToList().Select(z => z.blob).ToList() });
+            bool flag =  info.papers.Exists(c => c.subjectId != null);
+            //var subs = info.papers.Select(z => z.subjectId).Distinct().ToList();
             if (addTmdidsCls.IsNotEmpty())
             {
                 addTmdidsCls.ForEach(x =>
@@ -932,7 +934,7 @@ namespace TEAMModelOS.FunctionV4
                         creatorId = info.creatorId,
                         subjects = sub,
                         blob = null,
-                        paper = info.pk.Equals("Art") ? papers.Select(c => new {
+                        paper = flag ? papers.Select(c => new {
                             c.subject,
                             blob = c.blob[new Random().Next(c.blob.Count)]
                         }) : "",
@@ -1015,7 +1017,7 @@ namespace TEAMModelOS.FunctionV4
                         creatorId = info.creatorId,
                         subjects = sub,
                         blob = null,
-                        paper = info.pk.Equals("Art") ? papers.Select(c => new {
+                        paper = flag ? papers.Select(c => new {
                             c.subject,
                             blob = c.blob[new Random().Next(c.blob.Count)]
                         }) : "",
@@ -1675,6 +1677,7 @@ namespace TEAMModelOS.FunctionV4
                             items.type = itemInfos.Where(c => c.id.Equals(items.id)).FirstOrDefault().type;
                             items.pId = itemInfos.Where(c => c.id.Equals(items.id)).FirstOrDefault().pid;
                             items.knowledge = itemInfos.Where(c => c.id.Equals(items.id)).FirstOrDefault().knows;
+                            items.qamode = info.qamode;
                             error.its.Add(items);
                         }
                         errors.Add(error);

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

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

+ 29 - 0
TEAMModelOS.SDK/Extension/JwtAuthExtension.cs

@@ -254,6 +254,35 @@ namespace TEAMModelOS.SDK.Extension
                 return false;
             }
         }
+        /// <summary>
+        /// 刷新token,不验证过期时间
+        /// </summary>
+        /// <param name="token"></param>
+        /// <param name="salt"></param>
+        /// <returns></returns>
+        public static bool ValidateAuthTokenRefresh(string token, string salt)
+        {
+            try
+            {
+                var handler = new JwtSecurityTokenHandler();
+                var validationParameters = new TokenValidationParameters
+                {
+                    RequireExpirationTime = false,
+                    ValidateIssuer = false,
+                    ValidateAudience = false,
+                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(salt)),
+                    ValidateLifetime = true,
+                    ClockSkew = TimeSpan.Zero
+                };
+                ClaimsPrincipal principal = handler.ValidateToken(token, validationParameters, out SecurityToken securityToken);
+                return true;
+            }
+            catch (Exception)
+            {
+                //Trace.WriteLine(ex.Message);
+                return false;
+            }
+        }
 
         /// <summary>
         /// 第三方登录后的id_token

+ 21 - 3
TEAMModelOS.SDK/Models/Cosmos/Common/Activity.cs

@@ -314,9 +314,7 @@ namespace TEAMModelOS.SDK.Models
     }
     public class ContestSign
     {
-        /// <summary>
-        ///  "name",   "phone",   "period",   "subject",  "school", "contestType",  "job"
-        /// </summary>
+       
         public List<string> field { get; set; } = new List<string>();
         /// <summary>
         /// 报名类型,0个人,1团队
@@ -328,8 +326,25 @@ namespace TEAMModelOS.SDK.Models
         /// //报名人数限制
         /// </summary>
         public int limit { get; set; }
+
+        public List<ContestSignField> fields { get; set; }= new List<ContestSignField>();
     }
+    public class ContestSignField {
+        /// <summary>
+        ///  "name",   "phone",   "period",   "subject",  "school", "contestType",  "job"
+        /// </summary>
+        public string field { get; set; }
 
+        public string label { get; set; }
+        /// <summary>
+        /// text select radio checkbox  password  file  textarea
+        /// </summary>
+        public string type { get; set; }
+        /// <summary>
+        /// 单选,复选,下拉列表
+        /// </summary>
+        public List<string> item { get; set; }= new List<string> ();
+    }
     /// <summary>
     /// 在线培训模块的数据结构
     /// </summary>
@@ -490,8 +505,11 @@ namespace TEAMModelOS.SDK.Models
     }
     public class Expert { 
         public string id { get; set; }
+        public string iname { get; set; }
         public string name { get; set; }
         public string mobile { get; set; }
+        public string email { get; set; }
+        public string tmdid { get; set; }
         public string picture { get; set; }
         /// <summary>
         /// 0 未确认,1 已确认  确认状态

+ 1 - 0
TEAMModelOS.SDK/Models/Cosmos/Student/ErrorItems.cs

@@ -36,5 +36,6 @@ namespace TEAMModelOS.SDK.Models.Cosmos.Student
         public double proficiency { get; set; }
         //星号标记 后续扩展
         public double asteriskMark { get; set; }
+        public int qamode { get; set; } = 0;
     }
 }

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

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

+ 24 - 7
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperViewBox/PaperView.vue

@@ -216,6 +216,7 @@
                 canvas2: [],
                 allDom: [],
                 isPrint: false,
+                stusInfo: [],// 艺术评测接口返回的stus
             };
         },
         methods: {
@@ -319,6 +320,7 @@
                                 }
                             })
                         })
+                        this.stusInfo = res.stus
                         
                         if(subList.length) {
                             let ids = JSON.parse(decodeURIComponent(sessionStorage.getItem("ids")))
@@ -395,14 +397,29 @@
                                     cloudas: res.cloudas
                                 }
                                 this.getCorrectData(res)
-                                res.papers.forEach(item => {
-                                    if (item.scope) {
-                                        item.source = null
-                                        item.source = this.getItemTitle.source
-                                        item.qamode = this.getItemTitle.qamode
-                                        this.paperData.push(item)
+                                // 艺术评测试卷需先从stus -> paper 中获取blob, 再从res.papers中找出那一个试卷
+                                if(isArt) {
+                                    let blob = this.stusInfo.find(item => {
+                                        return item.paper[0].subject === res.subjects[0].id
+                                    })
+                                    if(blob) {
+                                        let paperArt = res.papers.find(papers => {
+                                            return papers.blob === blob.paper[0].blob
+                                        })
+                                        paperArt.source = this.getItemTitle.source || null
+                                        paperArt.qamode = this.getItemTitle.qamode
+                                        this.paperData.push(paperArt)
                                     }
-                                })
+                                } else {
+                                    res.papers.forEach(item => {
+                                        if (item.scope) {
+                                            item.source = null
+                                            item.source = this.getItemTitle.source
+                                            item.qamode = this.getItemTitle.qamode
+                                            this.paperData.push(item)
+                                        }
+                                    })
+                                }
                                 for (let i = 0; i < this.paperData.length; i++) {
                                     this.paperData[i].subject = res.subjects[i]
                                     this.paperData[i].allClass = res.claId

+ 28 - 21
TEAMModelOS/ClientApp/src/view/artexam/Create.vue

@@ -451,16 +451,17 @@ export default {
                 if (this.isArea) {
                   quoSetting.settings.forEach(setting => {
                     let infoId = this.$jsFn.uuid()
-                    console.error(s)
                     s.task.push({
                       type,
                       subject: setting.subject,
                       isOrder: setting.unorder,
                       infoId: infoId || setting.paper
                     })
-                    setting.paper.infoId = infoId
-                    setting.paper.scope = 'school'
-                    this.examInfoList.push(setting.paper)
+                    setting.paper.forEach(paper => {
+                      paper.infoId = infoId
+                      paper.scope = 'school'
+                    })
+                    this.examInfoList.push(...setting.paper)
                   })
                 } else {
                   let examRes = await this.toSaveExamInfo(
@@ -527,6 +528,7 @@ export default {
             schoolId: this.artInfo.schools.length ? this.artInfo.schools : undefined,
             ArtMusic: this.getZYData()
           })
+          console.error(this.examInfoList)
         } else {
           params.period = {
             id: this.curPeriod.id,
@@ -540,6 +542,7 @@ export default {
         }
         promise?.then(
           (res) => {
+            console.error(this.examInfoList)
             this.$Message.success(this.$t('ae.ae12'))
             this.published = true
             this.saveLoading = false
@@ -561,9 +564,16 @@ export default {
         let promises = []
         let resourcePaper = []
         for (const setting of baseKn.settings) {
-          let apiPapers = await this.getPaperInfo(setting.paper)
-          apiPapers.time = setting.time
-          resourcePaper.push(setting.paper)
+          let simplePapers = setting.paper
+          console.log(simplePapers);
+          let paperPromiseArr = [];
+          simplePapers.forEach((paper) => {
+            paperPromiseArr.push(this.getPaperInfo(paper));
+          });
+          let apiPapers = await Promise.all(paperPromiseArr);
+          // let apiPapers = await this.getPaperInfo(setting.paper)
+          apiPapers.forEach(o => o.time = setting.time)
+          resourcePaper.push(...setting.paper)
           let requestData = {
             id: this.$jsFn.uuid(),
             code: this.$store.state.userInfo.schoolCode,
@@ -583,7 +593,7 @@ export default {
                   setting.subject === "subject_music" ? this.$t('ae.ae10') : this.$t('ae.ae11')
               }
             ],
-            papers: [apiPapers],
+            papers: apiPapers,
             // examType: this.evaluationInfo.examType,
             year: new Date().getFullYear(),
             // range: this.mode,
@@ -634,21 +644,17 @@ export default {
             )
             reses.forEach((res, index) => {
               let targetFolder = "exam/" + res.exam.id + "/paper/"
-              //这里评测都是单科处理
-              schoolBlob
-                .copyFolder(
-                  targetFolder +
-                  res.exam.subjects[0].id +
-                  "/",
-                  resourcePaper[index].blob.substring(1),
-                  paperBlob
-                )
-                .then(
-                  (res) => { },
+              // 231107 调整为艺术评测单科多试卷场景
+              let papers = res.exam.papers;
+              papers.forEach((paper) => {
+                let curPaper = resourcePaper.find(i => i.id === paper.id)
+                schoolBlob.copyFolder(targetFolder + res.exam.subjects[0].id + "/" + paper.id + '/', curPaper.blob.substring(1), paperBlob).then(
+                  (res) => {},
                   (err) => {
-                    this.$Message.error(this.$t('ae.ae14'))
+                    this.$Message.error(this.$t("ae.ae14"));
                   }
-                )
+                );
+              });
             })
             r(reses)
           },
@@ -674,6 +680,7 @@ export default {
             apiPaper.code = fullPaper.code
             apiPaper.name = fullPaper.name
             apiPaper.blob = simplePaper.blob
+            apiPaper.subjectId = simplePaper.subjectBindId;
             apiPaper.scope = fullPaper.scope
             apiPaper.sheet = fullPaper.sheet //答题卡 //202108021讨论: 创建评测不需要传答题卡id,由更新答题卡id去做关联。
             apiPaper.multipleRule = fullPaper.multipleRule

+ 27 - 14
TEAMModelOS/ClientApp/src/view/artexam/ExamSetting.vue

@@ -3,11 +3,11 @@
     <!-- 评测试卷 -->
     <div class="attr-item">
       <span>{{$t('ae.ae16')}}</span>
-      <Tag v-if="subjectSetting.paper" color="blue">
-        {{ subjectSetting.paper.name }}
+      <Tag v-for="paper in subjectSetting.paper" color="blue">
+        {{ paper.name }}
       </Tag>
       <span class="choose-paper" @click="selectPaper()">
-        {{ subjectSetting.paper ? $t('ae.ae17') : $t('ae.ae18') }}
+        {{ subjectSetting.paper.length ? $t('ae.ae17') : $t('ae.ae18') }}
       </span>
     </div>
     <!-- 作答方式 -->
@@ -47,7 +47,7 @@
         </p>
         <div class="papaer-list-wrap">
           <vuescroll>
-            <div class="paper-item" v-for="(item,index) in paperListShow" :key="index">
+            <div :class="['paper-item', subjectSetting.paper.find(i => i.id === item.id) ? 'paper-item-active' : '']" v-for="(item,index) in paperListShow" :key="index">
               <div class="paper-item-name">
                 <span>{{(index + 1) + '.  ' + item.name}}</span>
               </div>
@@ -76,8 +76,9 @@
               <div v-else class="paper-item-tools">
                 <span @click.stop="choosePaper(index)">
                   <Icon custom="iconfont icon-choose" style="margin-right:5px;" />
-                  {{$t('learnActivity.manual.stPaper')}}
+                  {{ subjectSetting.paper.find(i => i.id === item.id) ? '取消选择' :  $t('learnActivity.manual.stPaper')}}
                 </span>
+                
                 <span @click.stop="previewTestPaper(index)" style="margin-left:20px;">
                   <Icon type="md-eye" style="margin-right:5px;" />
                   {{$t('learnActivity.manual.previewPaper')}}
@@ -115,7 +116,7 @@ export default {
     return {
       isArea: false,
       subjectSetting: {
-        paper: undefined,
+        paper: [],
         unorder: 0,
         startTime: 0,
         endTime: 0,
@@ -186,8 +187,16 @@ export default {
               content: this.$t('ae.ae43')
             })
           } else {
-            this.subjectSetting.paper = this.paperListShow[index]
-            this.sltPaperStatus = false
+            // this.subjectSetting.paper = this.paperListShow[index]
+            let findIndex = this.subjectSetting.paper.findIndex(i => i.id === this.paperListShow[index].id)
+            if(findIndex > -1){
+               this.subjectSetting.paper.splice(findIndex,1)
+               this.$Message.warning('取消选择')
+            }else{
+               this.subjectSetting.paper.push(this.paperListShow[index])
+               this.$Message.success('加入成功')
+            }
+            // this.sltPaperStatus = false
           }
         }
         sessionStorage.setItem('art_paper_resource', this.paperResource)
@@ -230,6 +239,7 @@ export default {
     subjectSetting: {
       deep: true,
       handler(n, o) {
+        console.error(this.subjectSetting)
         this.$emit('on-exam-change', {
           data: this.subjectSetting,
           subject: this.subject
@@ -266,24 +276,28 @@ export default {
   position: relative;
   // margin-left: 15px;
   margin-right: 15px;
-  margin-bottom: 5px;
+  margin-bottom: 15px;
   // background: #505050;
   align-items: start;
-  border-radius: 2px;
+  border-radius: 10px;
   position: relative;
 
+  &-active{
+    background: #e1eff6;
+  }
+
   &:hover {
     background: #e1eff6;
     // box-shadow: 0px 4px 5px #191919;
   }
 
   &-name {
-    font-size: 20px;
+    font-size: 18px;
     font-weight: bold;
   }
 
   &-tag {
-    font-size: 12px;
+    font-size: 14px;
     padding: 1px 10px;
     border-radius: 5px;
     color: #fff;
@@ -295,12 +309,11 @@ export default {
     margin-top: 15px;
 
     .info-item {
-      font-size: 12px;
+      font-size: 14px;
       padding: 0 10px;
       color: #757575;
 
       .info-bold {
-        font-weight: bold;
         color: #70b1e7;
       }
     }

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 658 - 696
TEAMModelOS/ClientApp/src/view/artexam/Mgt.vue


+ 129 - 25
TEAMModelOS/ClientApp/src/view/signupActivity/createActivity.vue

@@ -137,19 +137,15 @@
                                                     </span>
                                                 </FormItem>
                                                 <FormItem label="填报信息">
-                                                    <CheckboxGroup v-model="contestData.sign.field">
+                                                    <CheckboxGroup v-model="fields">
                                                         <Checkbox v-for="(item, index) in infoArr" :key="index" :label="item.value">
                                                             <span>
                                                                 {{ item.label }}
+                                                                <Icon type="md-create" size="18" color="orange" v-show="index > 4" @click.stop.native.prevent="changeFiled(2, item)" />
                                                                 <Icon type="md-trash" size="16" color="#6e6e6e" v-show="item.value === item.label" @click.stop.native.prevent="delField(index)" />
                                                             </span>
                                                         </Checkbox>
-                                                        <Icon type="md-add-circle" @click="addInfoType = true" v-show="!addInfoType" size="18" />
-                                                        <div v-show="addInfoType">
-                                                            <Input v-model="addInfo" placeholder="自定义填报的信息" style="width: 300px"></Input>
-                                                            <Icon type="md-checkmark-circle" size="18" style="margin: 0 10px;" @click="addInform()" />
-                                                            <Icon type="md-close-circle" size="18" @click="addInfoType = false" />
-                                                        </div>
+                                                        <Icon type="md-add-circle" @click="changeFiled(1)" size="18" />
                                                     </CheckboxGroup>
                                                 </FormItem>
                                                 <FormItem label="参赛方式">
@@ -357,6 +353,47 @@
                 </div>
             </template>
         </Drawer>
+        <Modal v-model="modalType" title="自定义填报信息" class="light-iview-form" @on-ok="addInform()">
+            <Form :label-width="100" :model="addInfoForm">
+                <FormItem label="信息名称">
+                    <Input v-model="addInfoForm.label" :disabled="addInfoType === 2" placeholder="自定义填报的信息" style="width: 300px"></Input>
+                </FormItem>
+                <FormItem label="报名时展示的填报格式">
+                    <RadioGroup v-model="addInfoForm.type">
+                        <Radio label="text">
+                            <span>文本</span>
+                        </Radio>
+                        <Radio label="select">
+                            <span>选择器</span>
+                        </Radio>
+                    </RadioGroup>
+                </FormItem>
+                <!-- <p v-show="addInfoForm.type === 'select'">请创建选项,无需选择,所有选项都会为老师展示</p> -->
+                <FormItem label="报名时可供选择的内容" v-show="addInfoForm.type === 'select'">
+                    <div>
+                        <Input v-model="addInfo" placeholder="请输入选项内容" style="width: 300px"></Input>
+                        <Icon type="md-add-circle" size="18" color="#1db40f" style="margin: 0 10px; cursor: pointer;" @click="changeFormValue('add')" />
+                        <!-- <Icon type="md-checkmark-circle" size="18" color="#1db40f" style="margin: 0 10px; cursor: pointer;" @click="changeFormValue('add')" /> -->
+                    </div>
+                    <span>报名时展示的内容:</span>
+                    <Select v-model="selectFileds" placeholder="仅作展示" style="width:300px" @on-select="selectFiledChange">
+                        <Option v-for="(item, index) in addInfoForm.item" :value="item" :key="index">
+                            {{ item }}
+                            <Icon type="md-trash" size="16" color="#9a9a9a" @click.stop.native.prevent="changeFormValue('delete', index)" />
+                        </Option>
+                    </Select>
+                    <!-- <RadioGroup v-model="animal">
+                        <Radio label="金斑蝶"></Radio>
+                        <Radio label="爪哇犀牛"></Radio>
+                        <Radio label="印度黑羚"></Radio>
+                    </RadioGroup> -->
+                    <!-- <span v-for="(item, index) in addInfoForm.item" :key="index" style="margin-right: 10px;">
+                        {{ item }}
+                        <Icon type="md-trash" size="16" color="#9a9a9a" @click="changeFormValue('delete', index)" />
+                    </span> -->
+                </FormItem>
+            </Form>
+        </Modal>
     </div>
 </template>
 
@@ -391,36 +428,52 @@ export default {
             current: 0,
             infoArr: [
                 {
-                    value: 'name',
+                    field: 'name',
                     label: '姓名',
+                    type: "text",
+                    item: []
                 },
                 {
-                    value: 'sex',
+                    field: 'sex',
                     label: '性别',
+                    type: "radio",
+                    item: []
                 },
                 {
-                    value: 'phone',
+                    field: 'phone',
                     label: '手机号码',
+                    type: "text",
+                    item: []
                 },
                 {
-                    value: 'email',
+                    field: 'email',
                     label: '电子邮箱',
+                    type: "text",
+                    item: []
                 },
                 {
-                    value: 'school',
+                    field: 'school',
                     label: '学校',
+                    type: "select",
+                    item: []
                 },
-                {
+                /* {
                     value: 'duties',
                     label: '职务',
-                },
+                    type: "text",
+                    item: []
+                }, */
                 {
-                    value: 'period',
+                    field: 'period',
                     label: '学段',
+                    type: "text",
+                    item: []
                 },
                 {
-                    value: 'subject',
+                    field: 'subject',
                     label: '学科',
+                    type: "text",
+                    item: []
                 },
             ],
             fileType: [
@@ -500,7 +553,7 @@ export default {
             contestData: {
                 modules: ['sign'],
                 sign: {
-                    field: [], //填报信息
+                    fields: [], //填报信息
                     stime: '',
                     etime: '',
                     limit: 0, //报名人数
@@ -525,6 +578,7 @@ export default {
                     etime: '',
                 }, */
             },
+            fields: [], //填报信息
             contestUpload: {
                 stime: '',
                 etime: '',
@@ -555,8 +609,16 @@ export default {
             showTeachers: [], //展示老师列表
             selTeachers: [], //选择的学校
             isUpload: false,
-            addInfoType: false,
+            modalType: false,
+            addInfoType: 0, //0: 不编辑  1:新增填报  2:编辑已有的
             addInfo: '', //自定义填报信息
+            addInfoForm: { //自定义信息类型
+                value: '',
+                label: '',
+                type: 'text',
+                item: [],
+            },
+            selectFileds: '',
             joinType: [
                 {
                     value: 0,
@@ -909,6 +971,8 @@ export default {
                 // 3. 若有新创建的评审规则,需先保存,保存大活动时由后端一起保存
                 this.saveActivity()
             } else {
+                this.createData.invitedSchools = []
+                this.contestData.sign.fields = []
                 this.showSchools.forEach(item => {
                     if(this.selSchools.includes(item.id)) {
                         this.createData.invitedSchools.push({
@@ -918,6 +982,12 @@ export default {
                         })
                     }
                 })
+                this.fields.forEach(item => {
+                    let infos = this.infoArr.find(info => {
+                        return info.field === item
+                    })
+                    if(infos) this.contestData.sign.fields.push(infos)
+                })
                 this.current += 1
             }
         },
@@ -1090,21 +1160,55 @@ export default {
             })
             this.tabName = this.createData.modules[data.length - 1]
         },
+        changeFiled(type, data) {
+            if(type === 2) {
+                this.addInfoForm = data
+            } else {
+                this.addInfoForm = {
+                    field: '',
+                    label: '',
+                    type: 'text',
+                    item: [],
+                }
+            }
+            this.addInfoType = type
+            this.modalType = true
+        },
         addInform() {
             let isHold =  this.infoArr.find(item => {
-                return item.label === this.addInfo
+                return item.label === this.addInfoForm.label
             })
-            if(isHold) {
+            if(isHold && this.addInfoType === 1) {
                 this.$Message.warning('该信息已存在!')
             } else {
-                this.infoArr.push({
-                    value: this.addInfo,
-                    label: this.addInfo,
-                })
-                this.addInfoType = false
+                if(this.addInfoType === 1) {
+                    this.addInfoForm.field = this.addInfoForm.label
+                    this.infoArr.push(this.addInfoForm)
+                } else {
+
+                }
+                this.modalType = false
+                this.addInfoType = 0
+                this.addInfo = ''
+                this.addInfoForm = {
+                    field: '',
+                    label: '',
+                    type: 'text',
+                    item: [],
+                }
+            }
+        },
+        changeFormValue(type, index) {
+            if(type === 'add' && this.addInfo) {
+                this.addInfoForm.item.push(this.addInfo)
                 this.addInfo = ''
+            } else if(type === 'delete') {
+                this.addInfoForm.item.splice(index, 1)
             }
         },
+        selectFiledChange(val) {
+            this.selectFileds = ''
+        },
         // 删除自定义填报信息
         delField(index) {
             this.infoArr.splice(index, 1)

+ 24 - 2
TEAMModelOS/ClientApp/src/view/signupActivity/infoGoing.vue

@@ -12,8 +12,8 @@
                     </span>
                     {{ actInfo.name }}
                 </p>
-                <div class="btn-box">
-                    <Button type="warning" size="small">删除</Button>
+                <div class="btn-box" v-show="isArea || actInfo.scope === 'school'">
+                    <Button type="warning" size="small" @click="delAct()">删除</Button>
                 </div>
                 <!-- <div class="btn-box">
                     <Steps :current="2" size="small">
@@ -655,6 +655,28 @@ export default {
                 }
             })
         },
+        delAct() {
+            this.$Modal.confirm({
+                title: '确定删除本次活动吗?',
+                // content: `确定删除本次活动吗?`,
+                onOk: () => {
+                    let params = {
+                        grant_type: 'delete',
+                        activityId: this.actInfo.id,
+                        owner: this.actInfo.owner,
+                        scope: this.actInfo.scope,
+                    }
+                    this.$api.areaActivity.manageAct(params).then(res => {
+                        if(res.code === 201) {
+                            this.$Message.success('删除成功')
+                            this.$router.go(-1)
+                        } else if(res.code === 200) {
+                            this.$Message.warning('删除失败')
+                        }
+                    })
+                }
+            })
+        },
         deleteApplica(data, index, type) {
             console.log(data, index);
             if(type === 'join') {

+ 23 - 0
TEAMModelOS/ClientApp/src/view/signupActivity/infoReleased.vue

@@ -16,6 +16,7 @@
                     <template v-if="!actInfo.needConfirmed">
                         <Button type="success" size="small" @click="publishNow()">立即发布</Button>
                         <Button type="primary" size="small">修改</Button>
+                        <Button type="warning" size="small" @click="delAct()">删除</Button>
                     </template>
                     <template v-else>
                         <Button type="success" size="small" @click="confirmedJoin(1)">加入</Button>
@@ -290,6 +291,28 @@ export default {
                 }
             })
         },
+        delAct() {
+            this.$Modal.confirm({
+                title: '确定删除本次活动吗?',
+                // content: `确定删除本次活动吗?`,
+                onOk: () => {
+                    let params = {
+                        grant_type: 'delete',
+                        activityId: this.actInfo.id,
+                        owner: this.actInfo.owner,
+                        scope: this.actInfo.scope,
+                    }
+                    this.$api.areaActivity.manageAct(params).then(res => {
+                        if(res.code === 201) {
+                            this.$Message.success('删除成功')
+                            this.$router.go(-1)
+                        } else if(res.code === 200) {
+                            this.$Message.warning('删除失败')
+                        }
+                    })
+                }
+            })
+        },
         confirmedJoin(type) {
             this.$Modal.confirm({
                 // title: '删除专家',

+ 0 - 1
TEAMModelOS/ClientApp/src/view/signupActivity/processActivity.vue

@@ -101,7 +101,6 @@ export default {
                         sasData.sas = this.$store.state.user.schoolProfile.blob_sas
                     } */
                     this.activityList = res.activities.map(item => {
-                        console.log(item.sas);
                         item.startTime = this.$tools.formatTime(item.stime, 'yyyy-MM-dd')
                         item.endTime = this.$tools.formatTime(item.etime, 'yyyy-MM-dd')
                         item.poster = !item.poster ? require('@/assets/image/no-poster-cn1.png') : `${item.poster}?${item.sas}`

+ 189 - 12
TEAMModelOS/Controllers/Common/ActivityController.cs

@@ -37,6 +37,8 @@ using Azure.Storage.Sas;
 using DocumentFormat.OpenXml.Bibliography;
 using System.Runtime.Intrinsics.X86;
 using Microsoft.IdentityModel.Tokens;
+using TEAMModelOS.SDK.Models.Dtos;
+using System.Net.Http;
 
 namespace TEAMModelOS.Controllers
 {
@@ -517,7 +519,7 @@ namespace TEAMModelOS.Controllers
                             if (response.Status==200)
                             {
                                 Activity activity = JsonDocument.Parse(response.Content).RootElement.ToObject<Activity>();
-                                if (_scope.GetString().Equals("school")  && _owner.Equals(school))
+                                if (_scope.GetString().Equals("school")  && _owner.GetString().Equals(school))
                                 {
                                     await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).DeleteItemStreamAsync(activity.id, new PartitionKey("Activity"));
                                     return Ok(new { code = 201, activity }) ; //删除成功
@@ -987,6 +989,174 @@ namespace TEAMModelOS.Controllers
                             }
                             return Ok(new { inviteTeachers });
                         }
+                    //导入评审专家
+                    case bool when $"{grant_type}".Equals("add-remove-experts", StringComparison.OrdinalIgnoreCase):
+                        {
+                            if (!request.TryGetProperty("activityId", out JsonElement _activityId)) return BadRequest();
+                            if (!request.TryGetProperty("experts", out JsonElement _experts) || !_experts.ValueKind.Equals(JsonValueKind.Array)) { return BadRequest(); }
+                            List<Expert> experts = _experts.ToObject<List<Expert>>();
+                            var tmdids = experts.Where(x => !string.IsNullOrWhiteSpace(x.tmdid)).Select(z => z.tmdid);
+                            var phones = experts.Where(x => !string.IsNullOrWhiteSpace(x.mobile)).Select(z => z.mobile);
+                            var emails = experts.Where(x => !string.IsNullOrWhiteSpace(x.email)).Select(z => z.email);
+                            List<string> keys = new List<string>();
+                            if (tmdids.Any())
+                            {
+                                keys.AddRange(tmdids);
+                            }
+                            if (phones.Any())
+                            {
+                                keys.AddRange(phones);
+                            }
+                            if (emails.Any())
+                            {
+                                keys.AddRange(emails);
+                            }
+                            ActivityExpert activityExpert = null;
+                            experts.ForEach(x => { x.status = 0;  x.iname = x.name; x.name = null; });
+                            List<CoreUser> coreUsers = new List<CoreUser>();
+                            if (keys.Any())
+                            {
+                                try
+                                {
+                                    var content = new StringContent(keys.ToJsonString(), Encoding.UTF8, "application/json");
+                                    string json = await _coreAPIHttpService.GetUserInfos(content);
+                                    if (!string.IsNullOrWhiteSpace(json))
+                                    {
+                                        coreUsers = json.ToObject<List<CoreUser>>();
+                                    }
+                                }
+                                catch (Exception ex)
+                                {
+                                    await _dingDing.SendBotMsg($"{_option.Location},导入名单时,查验key信息错误{ex.Message}\n{ex.StackTrace}\n\n{keys.ToJsonString()}", GroupNames.醍摩豆服務運維群組);
+                                }
+                            }
+                            if (coreUsers.IsNotEmpty())
+                            {
+                                foreach (var t in experts)
+                                {
+                                    if (!string.IsNullOrWhiteSpace(t.tmdid))
+                                    {
+                                        CoreUser coreUser = coreUsers.Find(x => x.id.Equals(t.tmdid));
+                                        if (coreUser != null)
+                                        {
+                                            t.id = coreUser.id;
+                                            t.name = coreUser.name;
+                                            t.picture = coreUser.picture;
+                                            t.tmdid = coreUser.id;
+                                            if (!string.IsNullOrWhiteSpace(coreUser.mobile))
+                                            {
+                                                t.mobile = coreUser.mobile;
+                                            }
+                                            if (!string.IsNullOrWhiteSpace(coreUser.mail))
+                                            {
+                                                t.email = coreUser.mail;
+                                            }
+                                        }
+                                    }
+                                    if (string.IsNullOrWhiteSpace(t.id))
+                                    {
+                                        if (!string.IsNullOrWhiteSpace(t.mobile))
+                                        {
+                                            CoreUser coreUser = coreUsers.Find(x => !string.IsNullOrWhiteSpace(x.mobile) && x.mobile.Equals(t.mobile));
+                                            if (coreUser != null)
+                                            {
+                                                t.id = coreUser.id;
+                                                t.name = coreUser.name;
+                                                t.picture = coreUser.picture;
+                                                t.tmdid = coreUser.id;
+                                                if (!string.IsNullOrWhiteSpace(coreUser.mobile))
+                                                {
+                                                    t.mobile = coreUser.mobile;
+                                                }
+                                                if (!string.IsNullOrWhiteSpace(coreUser.mail))
+                                                {
+                                                    t.email = coreUser.mail;
+                                                }
+                                            }
+                                        }
+                                    }
+                                    if (string.IsNullOrWhiteSpace(t.id))
+                                    {
+                                        if (!string.IsNullOrWhiteSpace(t.email))
+                                        {
+                                            CoreUser coreUser = coreUsers.Find(x => !string.IsNullOrWhiteSpace(x.mail) && x.mail.Equals(t.email));
+                                            if (coreUser != null)
+                                            {
+                                                t.id = coreUser.id;
+                                                t.name = coreUser.name;
+                                                t.picture = coreUser.picture;
+                                                t.tmdid = coreUser.id;
+                                                if (!string.IsNullOrWhiteSpace(coreUser.mobile))
+                                                {
+                                                    t.mobile = coreUser.mobile;
+                                                }
+                                                if (!string.IsNullOrWhiteSpace(coreUser.mail))
+                                                {
+                                                    t.email = coreUser.mail;
+                                                }
+                                            }
+                                        }
+                                    }
+
+                                }
+                                Azure.Response response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemStreamAsync($"{_activityId}", new PartitionKey("ActivityExpert"));
+                                if (response.Status == 200)
+                                {
+                                     activityExpert = JsonDocument.Parse(response.Content).RootElement.Deserialize<ActivityExpert>();
+                                    experts.ForEach(x =>
+                                    {
+                                        Expert tch = null;
+                                        if (string.IsNullOrWhiteSpace(x.id))
+                                        {
+                                            tch = activityExpert.experts.Find(t => !string.IsNullOrWhiteSpace(t.iname) && t.iname.Equals(x.iname));
+                                        }
+                                        else
+                                        {
+                                            tch = activityExpert.experts.Find(t => !string.IsNullOrWhiteSpace(x.id) && !string.IsNullOrWhiteSpace(t.id) && t.id.Equals(x.id));
+                                        }
+                                        if (tch != null)
+                                        {
+                                            tch.status = x.status;
+                                            tch.name = x.name;
+                                            tch.iname = x.iname;
+                                            tch.picture = x.picture;
+                                            tch.mobile = x.mobile;
+                                            tch.tmdid = x.tmdid;
+                                            tch.email = x.email;
+                                            tch.id = x.id;
+                                        }
+                                        else
+                                        {
+                                            activityExpert.experts.Add(new Expert
+                                            {
+                                                status = x.status,
+                                                name = x.name,
+                                                iname = x.iname,
+                                                picture = x.picture,
+                                                mobile = x.mobile,
+                                                tmdid = x.tmdid,
+                                                email = x.email,
+                                                id = x.id,
+                                                title = x.title,
+                                                subjects = x.subjects,
+                                            });
+                                        }
+                                    });
+                                    await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).UpsertItemAsync(activityExpert, new PartitionKey("ActivityExpert"));
+                                }
+                                else
+                                {
+                                      activityExpert = new ActivityExpert { id = $"{_activityId}", code = "ActivityExpert", pk = "ActivityExpert", experts = experts };
+                                    await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).UpsertItemAsync(activityExpert, new PartitionKey("ActivityExpert"));
+                                }
+                            }
+                            else {
+                                  activityExpert = new ActivityExpert { id = $"{_activityId}", code = "ActivityExpert", pk = "ActivityExpert", experts = experts };
+                                await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).UpsertItemAsync(activityExpert, new PartitionKey("ActivityExpert"));
+                            }
+                            return Ok(new { activityExpert});
+                        }
+
                 }
             } catch (Exception ex)
             {
@@ -1032,19 +1202,26 @@ namespace TEAMModelOS.Controllers
                     
                      }
             }
-            if (tmdid == null  && !string.IsNullOrWhiteSpace($"{_token}")) {
+            if (tmdid == null  && !string.IsNullOrWhiteSpace($"{_token}"))
+            {
                 var jwt = new JwtSecurityToken(_token.GetString());
-                tmdid = jwt.Payload.Sub;
-              
-                if (HttpContext.Request.Headers.TryGetValue("lang", out var _lang))
+                if (JwtAuthExtension.ValidateAuthTokenRefresh(_token.GetString(), _option.JwtSecretKey))
                 {
-                    head_lang = $"{_lang}";
+                    tmdid = jwt.Payload.Sub;
+
+                    if (HttpContext.Request.Headers.TryGetValue("lang", out var _lang))
+                    {
+                        head_lang = $"{_lang}";
+                    }
+                    jwt.Payload.TryGetValue("name", out name);
+                    jwt.Payload.TryGetValue("picture", out picture);
+                    jwt.Payload.TryGetValue("lang", out object _jwtlang);
+                    head_lang = !string.IsNullOrWhiteSpace($"{_jwtlang}") ? $"{_jwtlang}" : head_lang;
                 }
-                jwt.Payload.TryGetValue("name", out   name);
-                jwt.Payload.TryGetValue("picture", out   picture);
-                jwt.Payload.TryGetValue("lang", out object _jwtlang);
-                head_lang = !string.IsNullOrWhiteSpace($"{_jwtlang}") ? $"{_jwtlang}" : head_lang;
+                else { return Ok(new { code = 2, msg = "Token验证失败" }); }
+
             }
+            else { return Ok(new { code = 3, msg = "凭证验证失败" }); }
             teacherInfo = await TeacherService.TeacherInfoLite(_azureCosmos,  $"{name}", $"{picture}", tmdid, _azureStorage, _option, _azureRedis, ip, _httpTrigger, head_lang);
             string sql = $"select value c from c where c.route='{_route}'";
             var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).GetList<ActivityWebsite>(sql, "ActivityWebsite");
@@ -1066,7 +1243,7 @@ namespace TEAMModelOS.Controllers
             CoreUser coreUser = await _coreAPIHttpService.GetUserInfo(new Dictionary<string, string> { { "key", teacherInfo.teacher.id } }, _option.Location, _configuration);
             string sqlExpert = $"select value c from c join e in c.experts   where e.id='{teacherInfo.teacher.id}'";
             if (!string.IsNullOrWhiteSpace(coreUser.mobile)) {
-                sqlExpert=$"  or  e.mobile='{coreUser.mobile}' ";
+                sqlExpert=$" {sqlExpert } or  e.mobile='{coreUser.mobile}' ";
 
             }
             var resultActivityExpert = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).GetList<ActivityExpert>(sqlExpert, "ActivityExpert",pageSize:1);
@@ -1090,7 +1267,7 @@ namespace TEAMModelOS.Controllers
             // 產出所需要的 JWT securityToken 物件,並取得序列化後的 Token 結果(字串格式)
             var tokenHandler = new JwtSecurityTokenHandler();
             var serializeToken = tokenHandler.WriteToken(secToken);
-            return Ok(new { website, code =200,token =serializeToken, schools= teacherInfo.teacher.schools.Where(z=>z.status.Equals("join"))});
+            return Ok(new {  code =200,token =serializeToken, schools= teacherInfo.teacher.schools.Where(z=>z.status.Equals("join"))});
         }
 
 

+ 8 - 2
TEAMModelOS/Controllers/Common/ExamController.cs

@@ -268,8 +268,14 @@ namespace TEAMModelOS.Controllers
                         List<string> sheetIds = new List<string>();
                         foreach (PaperSimple simple in request.papers)
                         {
-                            simple.blob = $"/exam/{request.id}/paper/{request.subjects[n].id}";
-                            n++;
+                            if (!string.IsNullOrEmpty(simple.subjectId))
+                            {
+                                simple.blob = $"/exam/{request.id}/paper/{simple.subjectId}/{simple.id}";
+                            }
+                            else {
+                                simple.blob = $"/exam/{request.id}/paper/{request.subjects[n].id}";
+                                n++;
+                            }
                             simple.sheet = null;
                         }
                         exam = await client.GetContainer(Constant.TEAMModelOS, "Common").CreateItemAsync(request, new PartitionKey($"{request.code}"));

+ 4 - 4
TEAMModelOS/TEAMModelOS.csproj

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

+ 1 - 1
TEAMModelOS/appsettings.Development.json

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

+ 1 - 1
TEAMModelOS/appsettings.json

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