Ver código fonte

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

CrazyIter_Bin 1 ano atrás
pai
commit
b21a013c21

+ 2 - 2
TEAMModelBI/ClientApp/src/view/ddlogin.vue

@@ -10,8 +10,8 @@ const hosts = window.location.host === 'localhost:5001' ? 'localhost:5001' :
         window.location.host === 'bi.teammodel.net' ? 'bi.teammodel.net' :
             window.location.host === 'bi-rc.teammodel.net' ? 'bi-rc.teammodel.net' :
                 'bitest.teammodel.cn'
-    //const appsKey = window.location.host === 'localhost:5001' || window.location.host === 'bi.teammodel.cn' || window.location.host === 'bitest.teammodel.cn' ? 'dingrucgsnt8p13rfbgd' : 'dingupjxyj1guhh5p8dt'
-    const appsKey =  window.location.host === 'bi.teammodel.cn' || window.location.host === 'bitest.teammodel.cn' ? 'dingrucgsnt8p13rfbgd' : 'dingupjxyj1guhh5p8dt'
+    const appsKey = window.location.host === 'localhost:5001' || window.location.host === 'bi.teammodel.cn' || window.location.host === 'bitest.teammodel.cn' ? 'dingrucgsnt8p13rfbgd' : 'dingupjxyj1guhh5p8dt'
+    //const appsKey =  window.location.host === 'bi.teammodel.cn' || window.location.host === 'bitest.teammodel.cn' ? 'dingrucgsnt8p13rfbgd' : 'dingupjxyj1guhh5p8dt'
 console.log(appsKey, 'key的内容')
 import axios from 'axios'
 export default {

+ 83 - 12
TEAMModelBI/ClientApp/src/view/schoolmanage/schoolAnalyse.vue

@@ -215,10 +215,30 @@
       </div>
     </div>
     <div class="schoolList-all">
-      <div class="school-list-title">学校列表:</div>
+      <div class="school-list-title">学校列表:</div>    
       <div class="school-search">
+        <el-select  v-model="selectCity" placeholder="篩選城市" style="width: 240px;margin-bottom: 10px;display: flex;" @change="personnelSearch">
+         <el-option
+           v-for="item in schoolCitys"
+           :key="item.city"
+           :label="item.city"
+           :value="item.city"
+         />                 
+       </el-select>                             
         <el-input v-model="searchText.values" placeholder="搜索 学校名称/学校简码" class="input-with-select" size="small" clearable />
       </div>
+      <!-- <div >        
+        <el-select  v-model="selectCity" placeholder="篩選城市" style="width: 240px" @change="personnelSearch">
+         <el-option
+           v-for="item in schoolCitys"
+           :key="item.city"
+           :label="item.city"
+           :value="item.city"
+         />                 
+       </el-select>            
+      </div> -->
+      
+      
       <div class="school-tables" style="width: 100%; height: 60vh" v-loading="searchText.loading" element-loading-background="rgba(0, 0, 0, 0.5)">
         <!-- <el-table :data="schoolDefault" height="55vh" style="width: 100%" v-loading="searchText.loading" element-loading-background="rgba(0, 0, 0, 0.5)" empty-text="暂无数据">
           <el-table-column label="校徽" align="center">
@@ -373,7 +393,7 @@
     </div>
   </div>
 </template>
-<script>
+<script >
 import { ref, reactive, onMounted, getCurrentInstance, watch } from 'vue'
 import Bar from '@/components/echarts/commonBar.vue'
 import CommonLine from '@/components/echarts/commonLine.vue'
@@ -383,9 +403,12 @@ import Gradepie from '@/components/echarts/gradePie.vue'
 import ConventionPie from '@/components/echarts/conventionPie.vue'
 import { useRouter } from 'vue-router'
 import { useStore } from 'vuex'
-import { ElMessage, ElLoading } from 'element-plus'
+import { ElMessage, TableV2SortOrder, ElLoading, ElCheckbox,HeaderCellSlotProps,ElPopover,Column, RowClassNameGetter} from 'element-plus'
+import { Filter } from '@element-plus/icons'
+import { Search, CirclePlus } from '@element-plus/icons-vue'
 import jwt_decode from 'jwt-decode'
 import * as echarts from 'echarts'
+import { unique } from 'element-plus/es/utils'
 export default {
   components: {
     Bar,
@@ -396,6 +419,9 @@ export default {
     CommonBar
   },
   setup () {
+    const selectCity = ref('')
+    let schoolCitys = reactive([{city:'篩選城市'}])    
+    //let schoolDefault = ref([])
     let showState = ref('all')
     let router = useRouter()
     let { proxy } = getCurrentInstance()
@@ -445,7 +471,7 @@ export default {
         // key: "name",
         // dataKey: "name",//需要渲染当前列的数据字段,如{id:9527,name:'Mike'},则填name
         title: "校徽",
-        width: 400,
+        width: 300,
         fixed: false,
         align: 'center',
         cellRenderer: (data) => (
@@ -455,11 +481,19 @@ export default {
           </>
         )
       },
+      {
+        key: "city",
+        dataKey: "city",//需要渲染当前列的数据字段,如{id:9527,name:'Mike'},则填name
+        title: "城市",
+        width: 300,
+        fixed: false,
+        align: 'center',
+      },
       {
         key: "name",
         dataKey: "name",//需要渲染当前列的数据字段,如{id:9527,name:'Mike'},则填name
         title: "名称",
-        width: 400,
+        width: 300,
         fixed: false,
         align: 'center',
       },
@@ -483,12 +517,12 @@ export default {
         key: "schoolId",
         dataKey: "schoolId",//需要渲染当前列的数据字段,如{id:9527,name:'Mike'},则填id
         title: "学校简码",//显示在单元格表头的文本
-        width: 400,//当前列的宽度,必须设置
+        width: 300,//当前列的宽度,必须设置
         align: 'center',
       },
       {
         title: "",
-        width: 400,
+        width: 300,
         align: "center",
         // fixed: 'right',
         cellRenderer: (data) =>
@@ -1788,6 +1822,35 @@ export default {
           })
           allLoding.value.rankData = false
           schoolDefault.value = res.scInfos
+          
+          let cityarr = [];
+          res.scInfos.forEach((item) =>{
+            let citem = {
+              city:item.city
+            }
+            cityarr.push(citem);
+          })
+          
+           //cityarr = [...new Set(cityarr)];
+           cityarr = [...new Set(cityarr.map(item => item.city))];
+           
+          cityarr.forEach((item) => {
+            if (item !== "" && item !== null && item !== undefined) {
+              let citem = {
+                city: item
+              }
+              schoolCitys.push(citem)
+            }
+          })          
+
+          // //schoolCitys.value = cityarr;
+          // schoolCitys = [
+          //   {city:'111'},
+          //   {city:'222'},
+          //   {city:'333'},
+          // ]
+          
+
           searchText.original = res.scInfos
           searchText.loading = false
           serviceVersion(res.productGroup, res.scInfos)
@@ -1807,7 +1870,7 @@ export default {
       }).catch((error) => {
         ElMessage.error('数据获取API异常')
       })
-    }
+    }    
     function allAspects (val, state, behinddata) {
       console.log(val, state, behinddata)
       //let data = state === 'details' ? { schoolId: val } : { tmdId: val }
@@ -1969,8 +2032,7 @@ export default {
       // })
     }
     function detailsSchool (val) {
-      console.log(val);
-      // debugger;
+      console.log(val);      
       let schoolData = val
       schoolDeatilsInfo(schoolData.schoolId)
       showState.value = 'particular'
@@ -2359,6 +2421,13 @@ export default {
       let newArr = arr.filter((item) => {
         return item.name.includes(searchText.values) || item.id.includes(searchText.values)
       })
+      if (selectCity.value !== "" && selectCity.value !== "篩選城市") {
+        newArr = newArr.filter((item) => {
+          if (item.city !== null && item.city !== undefined && item.city !== "") {
+            return item.city.includes(selectCity.value)
+          }
+        })
+      }      
       schoolDefault.value = newArr
     }
     showInit()
@@ -2369,11 +2438,13 @@ export default {
     watch(() => searchText.values, (newvalues) => {
       if (newvalues.trim().length !== 0) {
         debounce(personnelSearch, 500)
-      } else {
+      } else {        
         schoolDefault.value = searchText.original
       }
     })
-    return {
+    return {            
+      schoolCitys,
+      selectCity,
       headerbasics,
       echartsData,
       imgdata,

+ 19 - 0
TEAMModelBI/ClientApp/src/view/userInquire/idIncrement.vue

@@ -70,6 +70,9 @@
                 <td>
                   歸屬城市數
                 </td>
+                <td>
+                  T課堂
+                </td>
                 <td></td>
               </tr>
               <tr v-for="items in statisticsData" :key="items.time" class="troverview">
@@ -88,6 +91,9 @@
                 <td>
                   {{ items.geoInSeat }}
                 </td>
+                <td>
+                  {{ items.tLesson }}
+                </td>
                 <td>
                   <el-button type="primary" @click="schgeoData(items)">詳細統計</el-button>
                 </td>
@@ -126,6 +132,10 @@
                 <div class="socrates-item-title">歸屬城市數</div>
                 <div class="socrates-item-value">{{ detailData.geoInSeat }}</div>
               </div>
+              <div class="socrates-item">
+                <div class="socrates-item-title">T課堂</div>
+                <div class="socrates-item-value">{{ detailData.tLesson }}</div>
+              </div>
 
             </div>
             <div class="data-tables" style="height: 400px;width: 100%;">
@@ -168,6 +178,10 @@
                 <div class="socrates-item-title">歸屬城市數</div>
                 <div class="socrates-item-value">{{ detailData.geoInSeat }}</div>
               </div>
+              <div class="socrates-item">
+                <div class="socrates-item-title">T課堂</div>
+                <div class="socrates-item-value">{{ detailData.tLesson }}</div>
+              </div>
 
             </div>
             <div class="data-tables" style="height: 400px;width: 100%;">
@@ -244,6 +258,7 @@
     alreadyInSeat: 0,
     schInSeat: 0,
     geoInSeat: 0,
+    tLesson:0
   })  
   let times=reactive({
     start:"",
@@ -469,6 +484,7 @@
             alreadyInSeat: 0,
             schInSeat: 0,
             geoInSeat: 0,
+            tLesson:0
           }
 
           res[i].sch.forEach(function (school, index2) {
@@ -481,6 +497,7 @@
           item.newInSeat = res[i].tmid.length;          
           item.schInSeat = res[i].sch.length;
           item.geoInSeat = res[i].geo.length;
+          item.tLesson = res[i].iot.tLesson;          
           statisticsData.push(item);
         }                
       }
@@ -599,6 +616,8 @@ function beforefilter () {
         detailData.geoInSeat = items.geoInSeat;
         detailData.alreadyInSeat = items.alreadyInSeat;
         detailData.schInSeat = items.schInSeat;
+        detailData.tLesson = items.tLesson;
+        
         schDetailData.splice(0, schDetailData.length);
         geoDetailData.splice(0, geoDetailData.length);   
         

Diferenças do arquivo suprimidas por serem muito extensas
+ 7 - 2
TEAMModelBI/Controllers/Census/SchoolController.cs


+ 12 - 2
TEAMModelBI/Models/RearEndMiddle.cs

@@ -27,7 +27,17 @@ namespace TEAMModelBI.Models
         public List<string> serial { get; set; }
         public List<string> service { get; set; }
         public List<string> hard { get; set; }
-
-
+        /// <summary>
+        /// 城市
+        /// </summary>
+        public string city { get; set; }
+        /// <summary>
+        /// 区/县/郡
+        /// </summary>
+        public string dist { get; set; }
+        /// <summary>
+        /// 區碼
+        /// </summary>
+        public string areaId { get; set; }     
     }
 }

+ 51 - 29
TEAMModelBI/appsettings.Development.json

@@ -1,4 +1,4 @@
-{ //BI國際正式站
+{
   "Logging": {
     "LogLevel": {
       "Default": "Debug",
@@ -8,41 +8,59 @@
   },
   "AllowedHosts": "*",
   "Option": {
-    "Location": "Global", //China-Test,China,Global-Dep,Global-Test,Global
+    "Location": "China-Dep", //China-Test,China,Global-Dep,Global-Test,Global
     "LocationNum": "1",
     "HostName": "localhost:5001",
     "AllowedHosts": [ "localhost", "*.teammodel.cn", "*.teammodel.net", "*.habookaclass.biz", "test" ],
-    "Issuer": "ies5.teammodel.net",
+    "Issuer": "www.teammodel.cn",
     "JwtSecretKey": "fXO6ko/qyXeYrkecPeKdgXnuLXf9vMEtnBC9OB3s+aA=",
     "Exp": 86400,
     "IdTokenSalt": "8263692E2213497BB55E74792B7900B4",
-    "HttpTrigger": "https://func.teammodel.net/api/",
-    "Audience": "8768b06f-c5c5-4b0c-abfb-d7ded354626d",
-    "Authority": "https://login.microsoftonline.com/73a2bcc5-fe99-4566-aa8a-07e7bb287df1/v2.0"
+    "HttpTrigger": "https://teammodelosfunction-test.chinacloudsites.cn/api/",
+	"Audience": "72643704-b2e7-4b26-b881-bd5865e7a7a5",
+    "Authority": "https://login.chinacloudapi.cn/4807e9cf-87b8-4174-aa5b-e76497d7392b/v2.0"
     //"HttpTrigger": "http://localhost:7071/api/"
   },
-  //国际站连接字符串
+  //大陆站连接字符串 现在是测试站
   "Azure": {
     "Storage": {
-      "ConnectionString": "DefaultEndpointsProtocol=https;AccountName=teammodel;AccountKey=KAa4hBoeKtw4/u1UNcBv5R4yacKCVFtirOjAbe7nvl2zpCxQfI+ImkBfxBoFCd3+N24DRLiXD4XQRqkedd6pIw==;EndpointSuffix=core.windows.net"
+      "ConnectionString": "DefaultEndpointsProtocol=https;AccountName=teammodeltest;AccountKey=O2W2vadCqexDxWO+px+QK7y1sHwsYj8f/WwKLdOdG5RwHgW/Dupz9dDUb4c1gi6ojzQaRpFUeAAmOu4N9E+37A==;EndpointSuffix=core.chinacloudapi.cn"
     },
     "LogStorage": {
-      "ConnectionString": "DefaultEndpointsProtocol=https;AccountName=teammodellog;AccountKey=u4g43MqRq/vzd6x5949wlgg35jk1YbmIbIA5tKjgtIADZnhlMGD8+E+hSCP56HEaUN7F2npslI6l+ASt7iYxyA==;EndpointSuffix=core.windows.net"
+      "ConnectionString": "DefaultEndpointsProtocol=https;AccountName=teammodellog;AccountKey=lxVDrgs+6rKtmASL3k1WrarrEd5Rk42wS1Mu5+sqQlPya1JLSlFDtnZUvMPeHHe7zlESfn/1NY7CZdGviy2UCw==;EndpointSuffix=core.chinacloudapi.cn"
     },
     "Cosmos": {
-      "ConnectionString": "AccountEndpoint=https://teammodel.documents.azure.com:443/;AccountKey=eMwcOmXbqLQZ8QjGxHYgo5OP8mhWxxeMT7dQdQ7jK1TTtAVwbalmnCGn7k7LZHX5nwLeCPD70RKKl8RZ0p73Jw==;"
+      "ConnectionString": "AccountEndpoint=https://cdhabookdep-free.documents.azure.cn:443/;AccountKey=JTUVk92Gjsx17L0xqxn0X4wX2thDPMKiw4daeTyV1HzPb6JmBeHdtFY1MF1jdctW1ofgzqkDMFOtcqS46by31A==;"
     },
     "Redis": {
-      "ConnectionString": "CoreRedisService.redis.cache.windows.net:6380,password=fPqgv7ZZ3xauupIpVPGjosV9TXZynwvpSgEWpd6LwWU=,ssl=True,abortConnect=False"
+      "ConnectionString": "52.130.252.100:6379,password=habook,ssl=false,abortConnect=False,writeBuffer=10240"
     },
     "ServiceBus": {
-      //"ConnectionString": "Endpoint=sb://coreiotservicebus.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=bJrX0jcuIvFkdcssUMUCrZcTXcuFUK3JTMToKpsU6+M=", //舊
-      "ConnectionString": "Endpoint=sb://teammodel.servicebus.windows.net/;SharedAccessKeyName=IES5;SharedAccessKey=WlI4pJc4P7Gls5HZMoYt46Cl+HGlUVzWV+ASbCjVLog=",
-      "ActiveTask": "active-task",
-      "ItemCondQueue": "itemcond"
+      "ConnectionString": "Endpoint=sb://teammodelos.servicebus.chinacloudapi.cn/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=Sy4h4EQ8zP+7w/lOLi1X3tGord/7ShFHimHs1vC50Dc=",
+      "ActiveTask": "dep-active-task",
+      "ItemCondQueue": "dep-itemcond"
     }
+
+    ////正式站
+    //"Storage": {
+    //  "ConnectionString": "DefaultEndpointsProtocol=https;AccountName=teammodeltest;AccountKey=O2W2vadCqexDxWO+px+QK7y1sHwsYj8f/WwKLdOdG5RwHgW/Dupz9dDUb4c1gi6ojzQaRpFUeAAmOu4N9E+37A==;EndpointSuffix=core.chinacloudapi.cn"
+    //},
+    //"LogStorage": {
+    //  "ConnectionString": "DefaultEndpointsProtocol=https;AccountName=teammodellog;AccountKey=lxVDrgs+6rKtmASL3k1WrarrEd5Rk42wS1Mu5+sqQlPya1JLSlFDtnZUvMPeHHe7zlESfn/1NY7CZdGviy2UCw==;EndpointSuffix=core.chinacloudapi.cn"
+    //},
+    //"Cosmos": {
+    //  "ConnectionString": "AccountEndpoint=https://teammodelos.documents.azure.cn:443/;AccountKey=clF73GwPECfP1lKZTCvs8gLMMyCZig1HODFbhDUsarsAURO7TcOjVz6ZFfPqr1HzYrfjCXpMuVD5TlEG5bFGGg==;"
+    //},
+    //"Redis": {
+    //  "ConnectionString": "52.130.252.100:6379,password=habook,ssl=false,abortConnect=False,writeBuffer=10240"
+    //},
+    //"ServiceBus": {
+    //  "ConnectionString": "Endpoint=sb://teammodelos.servicebus.chinacloudapi.cn/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=Sy4h4EQ8zP+7w/lOLi1X3tGord/7ShFHimHs1vC50Dc=",
+    //  "ActiveTask": "dep-active-task",
+    //  "ItemCondQueue": "dep-itemcond"
+    //}
   },
-  //国际站连接字符串  暂时是本地 不使用
+  //国际站连接字符串  暂时是本地
   "GlobalAzure": {
     "Storage": {
       "ConnectionString": "DefaultEndpointsProtocol=https;AccountName=teammodelstorage;AccountKey=Yq7D4dE6cFuer2d2UZIccTA/i0c3sJ/6ITc8tNOyW+K5f+/lWw9GCos3Mxhj47PyWQgDL8YbVD63B9XcGtrMxQ==;EndpointSuffix=core.chinacloudapi.cn" // 之前未删除连接字符
@@ -64,41 +82,45 @@
   },
   "HaBookAuth": {
     "CoreId": {
-      "userinfo": "https://api2.teammodel.net/Oauth2/GetUserInfos"
+      "userinfo": "https://api2.teammodel.cn/Oauth2/GetUserInfos"
     },
     "Account": "https://account.teammodel.cn",
-    "CoreAPI": "https://api2.teammodel.net",
-    "CoreBBAPI": "https://bb.teammodel.net",
+    "CoreAPI": "https://api2.teammodel.cn",
+    "CoreBBAPI": "https://bb.teammodel.cn",
     "CoreService": {
-      "clientID": "531fecd1-b1a5-469a-93ca-7984e1d392f2", //国际站IES5 ClientId
-      "clientSecret": "iI2cmTIX?fnXrwnffo84/:_X954=sw:.", //国际站IES5 秘钥
-      "deviceinfo": "https://api2.teammodel.net/oauth2/getdeviceinfos",
+      "clientID": "c7317f88-7cea-4e48-ac57-a16071f7b884", //大陆站IES5 ClientId
+      "clientSecret": "kguxh:V.PLmxBdaI@jnrTrDSth]A3346", //大陆站IES5 秘钥
+      //"clientID": "73266ca3-62b1-4304-b837-c672a8c88001",      //大陆站的ClientId
+      //"clientSecret": "E4Sr6[ezaT.b=3DYWoIATmqRDn4HlJb?",     //大陆站的密钥
+      //"clientID": "c01d78c2-a72e-416e-94d9-c8d3e4b8eb11",   //国际站的ClientId
+      //"clientSecret": "68-Bz:/5Xv:u6PVAFE@s3.=P2PCq5@ux",   //国际站的密钥
+      "deviceinfo": "https://api2.teammodel.cn/oauth2/getdeviceinfos",
       "sendnotification": "https://api2.teammodel.net/service/sendnotification",
       "getnotification": "https://api2.teammodel.net/service/getnotification",
       "delnotification": "https://api2.teammodel.net/service/delnotification"
     }
   },
   "DingDingAuth": {
-    "Agentld": "1800083745",
-    "appKey": "dingupjxyj1guhh5p8dt",
-    "appSecret": "ZL-RbizlPEv-Wa1F814vTpVK1SiRJfr9cQpDDNpGv9GW7sUupPZvQqOoX7uw8C9E",
+    "Agentld": "1290158212",
+    "appKey": "dingrucgsnt8p13rfbgd",
+    "appSecret": "Gyx_N57yZslhQOAhAPlvmCwOp_qTm1DScKbd5OoOE0URAW4eViYA2Sk_ZxKb-8WG",
     "getuserinfo_bycode": "https://oapi.dingtalk.com/sns/getuserinfo_bycode?accessKey=xxx&timestamp=xxx&signature=xxx"
   },
   "CustomParam": {
-    "SiteScope": "international", // 站点范围  continent 大路站  international 国际站
+    "SiteScope": "continent", // 站点范围  continent 大路站  international 国际站
     "proDeptId": 67690917
   },
   "CoreServiceV1": {
     "Cosmos": {
-      "ConnectionString": "AccountEndpoint=https://coredocumentdbjp.documents.azure.com:443/;AccountKey=aY6AjEYuPwRJEQRDX6bFN3Z87I7LwZ72dN1qON7j5E3VPpUEc2z0YDVzdCTUDvHzIEuoQosGu8e0AYCHUfcSnw==;" //CSV1國際正式站(唯讀)
+      "ConnectionString": "AccountEndpoint=https://corecosmosdbcn.documents.azure.cn:443/;AccountKey=WIFUWgnC6HiPb4yYba5iLR4ZghcA2fqrEvnX00YTA5B4sd7o89sxtbvgFDDUqT2VRkeWrWVTWZ8VbApQtwkJKQ==;" //CSV1大陸正式站(唯讀)
     }
   },
   "CoreServiceV2": {
     "Cosmos": {
-      "ConnectionString": "AccountEndpoint=https://corecosmosdb.documents.azure.com:443/;AccountKey=zHeQ83NYJoctAkyvGWtyCxiTc6sULZU3Rv73iH7l5os4vFbVakMFGuPvX0LiaYFR0oT08BdZ75WAGCKqttpojQ==;" //CSV2國際正式站(讀寫)
+      "ConnectionString": "AccountEndpoint=https://teammodelostest.documents.azure.cn:443/;AccountKey=ReGoiHuTbU4Q31YYq4NaiormE6Ci71piT7OrvTzAuhrlgt63ajdtDZmwOZKzcz6gnwR326mJp53InY7rohepQQ==;" //CSV2大陸測試站(讀寫)
     },
     "Storage": {
-      "ConnectionString": "DefaultEndpointsProtocol=https;AccountName=corestorageservice;AccountKey=Zs5OrsWZxIwWfejqNOKBDqAfYHRSN9kKIBcY6a6pbykmJeQw4RLzMx8U9Yg/a2ch8x+oAHJnVFjjPiprZRjMkg==;EndpointSuffix=core.windows.net" //CSV2國際正式
+      "ConnectionString": "DefaultEndpointsProtocol=https;AccountName=teammodeltest;AccountKey=O2W2vadCqexDxWO+px+QK7y1sHwsYj8f/WwKLdOdG5RwHgW/Dupz9dDUb4c1gi6ojzQaRpFUeAAmOu4N9E+37A==;EndpointSuffix=core.chinacloudapi.cn" //CSV2大陸測試
     },
     "CosmosCnRead": {
       "ConnectionString": "AccountEndpoint=https://corecosmosdb.documents.azure.cn:443/;AccountKey=12C5n8IvXFqsPARUb2YBOUWiU9PksohESlLHgH6cAVajxWBBJIJ6chJusgfrYhxCKgQgSHHxVgHsFPRakhvlPw==;" //CSV2大陸正式站(唯讀)

+ 8 - 0
TEAMModelOS.SDK/Models/Cosmos/BI/CurrencyModel.cs

@@ -182,6 +182,14 @@ namespace TEAMModelOS.SDK.Models.Cosmos.BI
         public ManyScActStats actStats { get; set; } = new ManyScActStats();
 
         public ScSRStats srStats { get; set; } = new ScSRStats();
+        /// <summary>
+        /// 城市
+        /// </summary>
+        public string city { get; set; }
+        /// <summary>
+        /// 区/县/郡
+        /// </summary>
+        public string dist { get; set; }
     }
 
     /// <summary>

+ 8 - 0
TEAMModelOS.SDK/Models/Cosmos/BI/StatsInfo.cs

@@ -141,6 +141,14 @@ namespace TEAMModelOS.SDK.Models.Cosmos.BI
         /// 研修统计
         /// </summary>
         public StudyStats study { get; set; } = new StudyStats();
+        /// <summary>
+        /// 城市
+        /// </summary>
+        public string city { get; set; }
+        /// <summary>
+        /// 区/县/郡
+        /// </summary>
+        public string dist { get; set; }
     }
 
     /// <summary>

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

@@ -364,10 +364,32 @@
 				return this.$api.login.getCode(idToken);
 			},
 			// 教师个人跳转赛课活动
-			toPrivActivity() {
-				let url = `${window.location.host === 'localhost:5001' ? 'http://localhost:8081' : 'https://contest-test.teammodel.cn'}/teammodel/home/homePage?token=${localStorage.getItem("auth_token")}`
+			async toPrivActivity() {
+				let areaId = sessionStorage.getItem("areaId") ? sessionStorage.getItem("areaId") : ''
+				let areaRoute = ''
+				if(areaId) {
+					areaRoute = await this.getAreaRoute(areaId)
+				}
+				let url = `${window.location.host === 'localhost:5001' ? 'http://localhost:8081' : 'https://contest-test.teammodel.cn'}/${areaRoute || 'teammodel'}/home/homePage?token=${localStorage.getItem("auth_token")}`
 				window.open(url, "", "noopener");
 			},
+			getAreaRoute(areaId) {
+				return new Promise((r, j) => {
+					let params = {
+						grant_type: 'list',
+						websiteId: areaId
+					}
+					this.$api.areaActivity.websiteManage(params).then(res => {
+						if(res.code === 200) {
+							r(res.websites[0]?.route)
+						} else {
+							j('')
+						}
+					}, err => {
+						j('')
+					})
+				})
+			},
 			//教师个人跳转苏格拉底
 			toPrivSokrate() {
 				this.getLoginCode()