瀏覽代碼

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

zhouj1203@hotmail.com 1 年之前
父節點
當前提交
0fd8456151

+ 28 - 16
TEAMModelBI/Controllers/BINormal/BatchAreaController.cs

@@ -109,7 +109,7 @@ namespace TEAMModelBI.Controllers.BINormal
                 //    table = _azureStorage.GetCloudTableClient(BIConst.Global).GetTableReference("IESLogin");
                 //}
 
-                StringBuilder areaSql = new($"select c.id,c.code,c.pk,c.name,c.provCode,c.provName,c.cityCode,c.cityName,c.standard,c.standardName,c.institution,c.updateTime,c.quoteId from c");
+                StringBuilder areaSql = new($"select c.id,c.code,c.pk,c.shortCode,c.name,c.provCode,c.provName,c.cityCode,c.cityName,c.standard,c.standardName,c.institution,c.updateTime,c.quoteId,c.sokShortCode from c");
                 if (!string.IsNullOrEmpty($"{id}") && string.IsNullOrEmpty($"{name}"))
                     areaSql.Append($" where c.id='{id}'");
 
@@ -208,6 +208,7 @@ namespace TEAMModelBI.Controllers.BINormal
             try
             {
                 if (!jsonElement.TryGetProperty("name", out JsonElement name)) return BadRequest();
+                string shortCode = (jsonElement.TryGetProperty("shortCode", out JsonElement _shortCode)) ? _shortCode.GetString() : string.Empty;
                 jsonElement.TryGetProperty("provCode", out JsonElement provCode);
                 jsonElement.TryGetProperty("provName", out JsonElement provName);
                 jsonElement.TryGetProperty("cityCode", out JsonElement cityCode);
@@ -241,29 +242,38 @@ namespace TEAMModelBI.Controllers.BINormal
                 }
 
                 var activeTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");//秘钥地址
-                //分开部署,就不需要,一站多用时,取消注释
-                //if ($"{site}".Equals(BIConst.Global))
-                //{
-                //    cosmosClient = _azureCosmos.GetCosmosClient(name: BIConst.Global);
-                //    tableClient = _azureStorage.GetCloudTableClient(BIConst.Global);
-                //    blobClient = _azureStorage.GetBlobContainerClient(containerName: "0-public", name: BIConst.Global);
-                //}
 
                 var table = tableClient.GetTableReference("IESLogin");
-
-                //查询新的是否存在
-                await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Normal").GetItemQueryIterator<Area>(queryText: $"select value(c) from c where c.standard='{standard}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base-Area") }))
+                string queryText = $"SELECT value(c) from c ";
+                queryText += $"WHERE c.standard='{standard}'";
+                queryText += $" OR c.name='{name}'";
+                if(!string.IsNullOrWhiteSpace(shortCode)) queryText += $" OR c.shortCode='{shortCode}'";
+                await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Normal").GetItemQueryIterator<Area>(queryText: $"{queryText}", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base-Area") }))
                 {
+                    //查询新的是否存在
                     if (item.standard.Equals($"{standard}"))
                         return Ok(new { state = 1, message = "新创区的standard已存在请检查" });
+                    //查询新的区级名称是否存在
+                    if (item.name.Equals($"{name}"))
+                        return Ok(new { state = 1, message = "区级名称相同,请检测区级名称!" });
+                    //查询學區簡碼是否存在
+                    if (item.shortCode.Equals($"{shortCode}"))
+                        return Ok(new { state = 1, message = "此学区简码已存在请检查" });
                 }
 
+                //查询新的是否存在
+                //await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Normal").GetItemQueryIterator<Area>(queryText: $"select value(c) from c where c.standard='{standard}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base-Area") }))
+                //{
+                //    if (item.standard.Equals($"{standard}"))
+                //        return Ok(new { state = 1, message = "新创区的standard已存在请检查" });
+                //}
+
                 //查询新的区级名称是否存在
-                await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Normal").GetItemQueryIterator<Area>(queryText: $"select value(c) from c where c.name='{name}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base-Area") }))
-                {
-                    if (item.name.Equals($"{standard}"))
-                        return Ok(new { state = 1, message = "区级名称相同,请检测区级名称!" });
-                }
+                //await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Normal").GetItemQueryIterator<Area>(queryText: $"select value(c) from c where c.name='{name}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base-Area") }))
+                //{
+                //    if (item.name.Equals($"{name}"))
+                //        return Ok(new { state = 1, message = "区级名称相同,请检测区级名称!" });
+                //}
 
                 //区级的ID
                 string areaId = Guid.NewGuid().ToString();
@@ -271,6 +281,7 @@ namespace TEAMModelBI.Controllers.BINormal
                 {
                     id = areaId,
                     code = $"Base-Area",
+                    shortCode = shortCode,
                     name = $"{name}",
                     provCode = $"{provCode}",
                     provName = $"{provName}",
@@ -1288,6 +1299,7 @@ namespace TEAMModelBI.Controllers.BINormal
             public string id { get; set; }
             public string code { get; set; }
             public string pk { get; set; }
+            public string shortCode { get; set; }
             public string name { get; set; }
             public string provCode { get; set; }
             public string provName { get; set; }

+ 68 - 2
TEAMModelBI/Controllers/BITmid/TmidController.cs

@@ -6,6 +6,7 @@ using Microsoft.Extensions.Options;
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Reflection;
 using System.Text.Json;
 using System.Threading.Tasks;
 using TEAMModelOS.Models;
@@ -55,6 +56,10 @@ namespace TEAMModelBI.Controllers.BITmid
                 if (!jsonElement.TryGetProperty("tmids", out JsonElement tmidsJobj)) return BadRequest();//TMID(array)
                 var tmids = tmidsJobj.Deserialize<List<string>>();
                 if (tmids.Count is 0) return BadRequest();
+                var datetime = DateTimeOffset.UtcNow.AddDays(-1);
+                var y = datetime.Year;
+                var m = datetime.Month;
+                var d = datetime.Day;
 
                 //服務Client端
                 var cosmosClientIes5 = _azureCosmos.GetCosmosClient(); //CosmosDB IES5
@@ -121,7 +126,10 @@ namespace TEAMModelBI.Controllers.BITmid
                             //個人服務授權
                             tmidStics.prod = await getTMIDAuthService(cosmosClientCsv2, id, "", true);
 
-                            
+                            //IOT
+                            TmidAnalysisCal hiteachYear = await getTMIDIotData(cosmosClientIes5, id, "HiTeach", "year", y, 0, 0, 0, 0);
+                            TmidAnalysisCal hiteachMonth = await getTMIDIotData(cosmosClientIes5, id, "HiTeach", "month", y, m, 0, 0, 0);
+                            TmidAnalysisCal hiteachDay = await getTMIDIotData(cosmosClientIes5, id, "HiTeach", "day", y, m, d, 0, 0);
 
                             tmidDic.Add(id, tmidStics);
                         }
@@ -449,6 +457,48 @@ namespace TEAMModelBI.Controllers.BITmid
             return data;
         }
 
+        public async Task<TmidAnalysisCal> getTMIDIotData(CosmosClient cosmosClientIes5, string tmid, string toolType, string dateUnit, int year, int month, int day, long from, long to)
+        {
+            TmidAnalysisCal result = new TmidAnalysisCal();
+            List<string> calPropList = new List<string>() { "lessonRecord", "useIES", "useIES5Resource", "useWebIrs", "useDeviceIrs", "useHaboard", "useHita", "lessonLengMin", "lessonLeng0", "stuShow", "stuLessonLengMin", "tGreen", "lTypeCoop", "lTypeIact", "lTypeMis", "lTypeTst", "lTypeDif", "lTypeNone", "lessonCnt928", "lessonCntId", "lessonCntDevice", "lessonCntIdDevice", "mission", "missionFin", "item", "interact", "sendSok" }; //要計算的ProdAnalysis欄位列表
+            string strQuery = $"SELECT * FROM c WHERE c.tmid = '{tmid}' AND c.toolType = '{toolType}'";
+            var qryOption = new QueryRequestOptions() { PartitionKey = new PartitionKey("TmidAnalysis") };
+            if (!string.IsNullOrWhiteSpace(dateUnit)) strQuery += $" AND c.dateUnit = '{dateUnit}'";
+            if (year > 0) strQuery += $" AND c.year = {year}";
+            if (month > 0) strQuery += $" AND c.month = {month}";
+            if (day > 0) strQuery += $" AND c.day = {day}";
+
+            await foreach (TmidAnalysisCosmos tmidAnalysis in cosmosClientIes5.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<TmidAnalysisCosmos>(strQuery, null, qryOption))
+            {
+                //一般項
+                result.tmid = tmidAnalysis.tmid;
+                result.dateUnit = tmidAnalysis.dateUnit;
+                if (result.from.Equals(0) || tmidAnalysis.dateTime <= result.from) result.from = tmidAnalysis.dateTime;
+                if (result.to.Equals(0) || tmidAnalysis.dateTime >= result.to) result.to = tmidAnalysis.dateTime;
+                //統計項
+                foreach (PropertyInfo propertyInfo in tmidAnalysis.GetType().GetProperties()) //累加項目
+                {
+                    if (calPropList.Contains(propertyInfo.Name))
+                    {
+                        var propType = propertyInfo.PropertyType;
+                        var valNow = propertyInfo.GetValue(result);
+                        var valTodo = tmidAnalysis.GetType().GetProperty(propertyInfo.Name).GetValue(tmidAnalysis);
+                        if (propType.Equals(typeof(long))) propertyInfo.SetValue(result, Convert.ToInt64(valNow.ToString(), 10) + Convert.ToInt64(valTodo.ToString(), 10));
+                        else propertyInfo.SetValue(result, Convert.ToInt32(valNow.ToString(), 10) + Convert.ToInt32(valTodo.ToString(), 10));
+                    }
+                }
+                result.deviceList = result.deviceList.Union(tmidAnalysis.deviceList).ToList();
+                result.deviceCnt = result.deviceList.Count;
+                result.deviceNoAuthList = result.deviceNoAuthList.Union(tmidAnalysis.deviceNoAuthList).ToList();
+                result.deviceNoAuth = result.deviceNoAuthList.Count;
+                result.deviceAuthList = result.deviceAuthList.Union(tmidAnalysis.deviceAuthList).ToList();
+                result.deviceAuth = result.deviceAuthList.Count;
+                result.tmidList = result.tmidList.Union(tmidAnalysis.tmidList).ToList();
+                result.tmidCnt = result.tmidList.Count;
+            }
+            return result;
+        }
+
         //Model
 
         //TMID統計 基本資訊
@@ -612,6 +662,22 @@ namespace TEAMModelBI.Controllers.BITmid
             { "044482b5-d024-4f23-9b55-906884243405", "IRS" },
             { "5e27b7e3-b36c-4ce9-b838-e94fd0cea080", "IRS" }
         };
+
+        //TMID IOT date
+        public class tmidIotDate
+        {
+            public string dateUnit { get; set; } //[string]日期單位:年月日 year, month, day
+            public int year { get; set; } //[Int]年
+            public int month { get; set; } //[Int]月
+            public int day { get; set; } //[Int]日
+            public long from { get; set; } //[long]UTC timestamp 起始日
+            public long to { get; set; } //[long]UTC timestamp 終止日
+        }
+        public class TmidAnalysisCal : TmidAnalysisCosmos
+        {
+            public long from { get; set; } //[long]UTC timestamp 起始日
+            public long to { get; set; } //[long]UTC timestamp 終止日
+        }
     }
-    
+
 }

+ 4 - 1
TEAMModelOS.SDK/Models/Cosmos/Normal/Area.cs

@@ -11,6 +11,10 @@ namespace TEAMModelOS.SDK.Models
             pk = "Area";
         }
         /// <summary>
+        /// 簡碼
+        /// </summary>
+        public string shortCode { get; set; }
+        /// <summary>
         /// 区域级名称
         /// </summary>
         public string name { get; set; }
@@ -43,7 +47,6 @@ namespace TEAMModelOS.SDK.Models
         /// </summary>
         public string institution { get; set; }
         public long updateTime { get; set; }
-
         /// <summary>
         /// 引用id
         /// </summary>

+ 1 - 1
TEAMModelOS.SDK/Models/Service/BI/BIProdAnalysis.cs

@@ -718,7 +718,7 @@ namespace TEAMModelOS.SDK.Models.Service.BI
                         if (!string.IsNullOrWhiteSpace(tmid) && !string.IsNullOrWhiteSpace(deviceId) && !string.IsNullOrWhiteSpace(toolType))
                         {
                             bool addFlg = false;
-                            TmidAnalysis tmidAnalysisRow = TmidAnalysisList.Where(s => s.tmid.Equals(tmid)).FirstOrDefault();
+                            TmidAnalysis tmidAnalysisRow = TmidAnalysisList.Where(s => s.tmid.Equals(tmid) && s.toolType.Equals(toolType)).FirstOrDefault();
                             //無此tmid數據=>創建
                             if (tmidAnalysisRow == null)
                             {

+ 1 - 0
TEAMModelOS/ClientApp/src/api/http.js

@@ -17,6 +17,7 @@ const NO_ACCESS_API = [
     '/common/study/sign-in',
     'third/sso/opt-tmdid-bind',
     '/sc/bind',
+    '/business/bind',
     '/lepei/bind',
     '/core/get-short-url',
     '/core/get-long-url',

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

@@ -149,6 +149,11 @@ export const routes = [{
     path: '/lepei-sso',
     component: () => import('@/view/sso/LepeiSSO.vue')
 },
+    // 联盟-单点登录
+    {
+        path: '/tmdid-sso',
+        component: () => import('@/view/sso/TmdSSO.vue')
+    },
 //单点登录-学生端
 {
     path: '/student',

+ 1 - 1
TEAMModelOS/ClientApp/src/view/coursemgt/NewCusMgt.vue

@@ -96,7 +96,7 @@
 						<p class="bottom">
 							<Tag color="blue">{{ course.subject.name }}</Tag>
 							<Tag color="green">{{ curPeriod.grades[course.grade] }}</Tag>
-							<Tag color="orange">{{ $t("jyzx.offline.creator") }}-{{ course.creatorName }}</Tag>
+							<!-- <Tag color="orange">{{ $t("jyzx.offline.creator") }}-{{ course.creatorName }}</Tag> -->
 						</p>
 					</div>
 				</div>

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

@@ -473,8 +473,9 @@ export default {
         if (item.hasManager) {
           this.onJoinSchool(item)
         } else {
-          this.applyManagerModal = true
-          this.curApplySchName = item.name
+          // this.applyManagerModal = true
+          // this.curApplySchName = item.name
+          this.applyJoin()
         }
         this.searchSchoolIndex = null
         this.$refs.schoolSelect.setQuery(' ')

+ 168 - 0
TEAMModelOS/ClientApp/src/view/sso/TmdSSO.vue

@@ -0,0 +1,168 @@
+<template>
+  <div class="sso-container">
+    <img class="tmd-logo" src="/favicon.ico" alt="">
+    <p class="title">醍摩豆单点登录</p>
+  </div>
+</template>
+<script>
+import MD5 from 'js-md5'
+import jwtDecode from 'jwt-decode'
+import { User } from '@/service/User'
+export default {
+  data() {
+    return {
+      cancelToBand: false,
+      routerData: {},
+      iesLoginRes: {}
+    }
+  },
+  created() {
+    this.routerData = this.$route.query
+    if (this.routerData.status) {
+      let status = this.routerData.status
+      switch (status) {
+        case '1':
+          // 参数错误
+          this.$Message.error({
+            content: '跳转参数错误,验证失败',
+            duration: 2
+          })
+          break
+        case '200':
+          //已绑定省平台,直接登录
+          // 验证返回参数
+          if (this.routerData.id_token && this.routerData.access_token && this.routerData.expires_in && this.routerData.token_type) {
+            this.loginProcess({
+              id_token: this.routerData.id_token,
+              access_token: this.routerData.access_token,
+              expires_in: this.routerData.expires_in,
+              token_type: this.routerData.token_type
+            })
+          } else {
+            this.$Message.error({
+              content: '登录参数错误,登录失败',
+              duration: 2
+            })
+          }
+          break
+        case '4':
+          // 账号未绑定,需要登录绑定
+          this.$Modal.confirm({
+            title: '实名认定',
+            content: `是否前往手机实名认证页面?`,
+            okText: '是',
+            cancelText: '否',
+            onOk: () => {
+              if (this.routerData.param && this.routerData.type && this.routerData.bindurl) {
+                this.toLoginBanding()
+              } else {
+                this.$Message.error({
+                  content: '账号绑定参数错误',
+                  duration: 2
+                })
+              }
+            },
+            onCancel: () => {
+              this.cancelToBand = true
+            }
+          })
+          break
+        case '5':
+          // 提供的培训 ID(343609) 和教师 ID(766092)与省平台不匹配或不存在,请联系相关人员
+          let ps = decodeURIComponent(this.routerData.param)
+          let p = JSON.parse(ps || '{}')
+          this.$Modal.warning({
+            title: '信息异常',
+            content: `提供的培训 ID(${p.Pxid}) 和教师 ID(${p.tid})与省平台不匹配或不存在,请联系相关人员!`
+          })
+          break
+        default:
+          break
+      }
+    } else {
+      this.$Message.error({
+        content: '跳转参数错误,验证失败',
+        duration: 2
+      })
+    }
+  },
+  methods: {
+    clearData() {
+      let login_schoolCode = localStorage.getItem('login_schoolCode')
+      let srvAdr = localStorage.getItem('srvAdr')
+      localStorage.clear()
+      localStorage.setItem('srvAdr', srvAdr)
+      if (login_schoolCode) localStorage.setItem('login_schoolCode', login_schoolCode)
+    },
+    toLoginBanding() {
+      let queryData = this._.cloneDeep(this.$route.query)
+      queryData.loginType = 'trainsso'
+      //根据站点判断跳转路由
+      this.$router.push({
+        path: '/lepeiBandphone',
+        query: queryData
+      })
+    },
+    bandingID(idToken) {
+      this.$api.train.thirdSSO(this.routerData.bindurl, {
+        type: this.routerData.type,
+        param: this.routerData.param,
+        id_token: idToken
+      }).then(
+        res => {
+          //绑定成功
+          if (res && res.status == 200) {
+            this.$Message.success("绑定成功")
+            this.loginProcess(this.iesLoginRes)
+          } else {
+            this.$Message.error("绑定失败")
+          }
+        },
+        err => {
+
+        }
+      )
+    },
+    loginProcess(idRes) { // 登入用function
+      this.clearData() //这里暂定解决登录失败的问题
+      sessionStorage.setItem('identity', 'teacher')
+      /* 进行教师登录 */
+      this.$loginTools.teacherLogin(idRes).then(info => {
+        // 前往区级平台
+        if (info.toArea) {
+          localStorage.setItem('platform', 'area')
+          this.$router.push({ path: '/area' })
+        } else {
+          // 前往校级平台 判断是否有记录的目标地址 如果没有则按照站点来进行对应跳转固定页面
+          let targetPath = localStorage.getItem('target_path')
+          let defaultPath = '/home'
+          let homePath = targetPath ? (targetPath.includes('home/') ? targetPath : defaultPath) : defaultPath
+          localStorage.setItem('platform', 'school')
+          localStorage.setItem('target_path', '')
+          this.$router.push({ path: homePath })
+        }
+      })
+    },
+  },
+
+}
+</script>
+<style scoped lang="less">
+.sso-container {
+  display: flex;
+  flex-direction: row;
+  justify-content: center;
+  align-items: center;
+  width: 100%;
+  height: 100%;
+  background-image: url("../../assets/image/bak_light.jpg");
+  .title {
+    color: #f0f0f0;
+    margin-left: 30px;
+    font-size: 28px;
+  }
+  .tmd-logo {
+    width: 40px;
+  }
+}
+</style>

+ 0 - 11
TEAMModelOS/ClientApp/src/view/user/LepeiBindPhone.vue

@@ -175,17 +175,6 @@ export default {
           } else {
             this.$Message.error(this.$t('login.phoneerr'))
           }
-          // 新账号会返回登录信息
-          // else if (res.id_token) {
-          //     // data = {
-          //     //     id_token: res.id_token,
-          //     //     loginData: res
-          //     // }
-          //     data = {
-          //         phone: this.accFormat
-          //     }
-          // }
-          // this.bandingID(data)
         },
         err => {
           this.$Message.error(this.$t('login.phoneerr'))