|
@@ -1,4 +1,5 @@
|
|
|
using Azure.Cosmos;
|
|
|
+using DocumentFormat.OpenXml.Office2010.Excel;
|
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
using Microsoft.Azure.Cosmos.Table;
|
|
|
using Microsoft.Extensions.Configuration;
|
|
@@ -57,9 +58,51 @@ namespace TEAMModelBI.Controllers.BITmid
|
|
|
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;
|
|
|
+ int y = datetime.Year;
|
|
|
+ int m = datetime.Month;
|
|
|
+ int d = datetime.Day;
|
|
|
+ string dateFromStr = (jsonElement.TryGetProperty("dateFrom", out JsonElement dateFromJobj)) ? dateFromJobj.GetString() : string.Empty; //查詢日期:起始(string)[例]2023-03-05
|
|
|
+ string dateToStr = (jsonElement.TryGetProperty("dateTo", out JsonElement dateToJobj)) ? dateToJobj.GetString() : string.Empty; //查詢日期:結束(string)[例]2023-03-27
|
|
|
+ string dateUnit = (jsonElement.TryGetProperty("dateUnit", out JsonElement dateUnitJobj)) ? dateUnitJobj.GetString() : string.Empty;
|
|
|
+ string mode = (jsonElement.TryGetProperty("mode", out JsonElement modeJobj)) ? modeJobj.GetString() : "default";
|
|
|
+ if(mode.Equals("simple"))
|
|
|
+ {
|
|
|
+ if(string.IsNullOrWhiteSpace(dateFromStr) || string.IsNullOrWhiteSpace(dateToStr) || string.IsNullOrWhiteSpace(dateUnit))
|
|
|
+ {
|
|
|
+ return Ok(new { error = "1", message = "Simple mode needs dateFrom, dateTo, dateUnit to be params." });
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //起始終止日期換算
|
|
|
+ long dateTimeFromSec = 0;
|
|
|
+ long dateTimeToSec = 0;
|
|
|
+ if(!string.IsNullOrWhiteSpace(dateFromStr) && !string.IsNullOrWhiteSpace(dateToStr))
|
|
|
+ {
|
|
|
+ List<string> dateFromList = dateFromStr.Split('-').ToList();
|
|
|
+ int dateFromYear = Convert.ToInt32(dateFromList[0], 10);
|
|
|
+ int dateFromMonth = (dateUnit.Equals("day") || dateUnit.Equals("month")) ? Convert.ToInt32(dateFromList[1], 10) : 1;
|
|
|
+ int dateFromDay = (dateUnit.Equals("day")) ? Convert.ToInt32(dateFromList[2], 10) : 1;
|
|
|
+ DateTimeOffset dateTimeFrom = new DateTimeOffset(dateFromYear, dateFromMonth, dateFromDay, 0, 0, 0, TimeSpan.Zero);
|
|
|
+ dateTimeFromSec = dateTimeFrom.ToUnixTimeSeconds();
|
|
|
+ List<string> dateToList = dateToStr.Split('-').ToList();
|
|
|
+ int dateToYear = Convert.ToInt32(dateToList[0], 10);
|
|
|
+ int dateToMonth = (dateUnit.Equals("day") || dateUnit.Equals("month")) ? Convert.ToInt32(dateToList[1], 10) : 1;
|
|
|
+ int dateToDay = (dateUnit.Equals("day")) ? Convert.ToInt32(dateToList[2], 10) : 1;
|
|
|
+ DateTimeOffset dateTimeTo = new DateTimeOffset(dateToYear, dateToMonth, dateToDay, 23, 59, 59, TimeSpan.Zero);
|
|
|
+ dateTimeToSec = dateTimeTo.ToUnixTimeSeconds();
|
|
|
+ y = 0;
|
|
|
+ m = 0;
|
|
|
+ d = 0;
|
|
|
+ }
|
|
|
+ //取得項目列表
|
|
|
+ List<string> eventList = new List<string>();
|
|
|
+ if(mode.Equals("simple"))
|
|
|
+ {
|
|
|
+ eventList = new List<string>() { "iot" };
|
|
|
+ } else
|
|
|
+ {
|
|
|
+ eventList = new List<string>() { "coupons", "login", "prod", "points", "iot", "ies5", "benefits", "sokrates" };
|
|
|
+ }
|
|
|
|
|
|
//服務Client端
|
|
|
var cosmosClientIes5 = _azureCosmos.GetCosmosClient(); //CosmosDB IES5
|
|
@@ -69,9 +112,8 @@ namespace TEAMModelBI.Controllers.BITmid
|
|
|
var tablePointsClient = storageClientCsv2.GetTableReference("Points");
|
|
|
var redisClient = _azureRedis.GetRedisClient(4);
|
|
|
|
|
|
- //存放user資料
|
|
|
+ //取得TMID基本資料
|
|
|
Dictionary<string, TmidStics> tmidDic = new();
|
|
|
-
|
|
|
QueryDefinition query =
|
|
|
new QueryDefinition(@"SELECT c.id, c.name, c.picture, c.mobile, c.mail, c.lang, c.wechat, c.facebook, c.google, c.ding, c.apple, c.educloudtw, c.ts FROM c WHERE (ARRAY_CONTAINS(@key, c.id) OR ARRAY_CONTAINS(@key, c.mobile))")
|
|
|
.WithParameter("@key", tmids);
|
|
@@ -100,55 +142,54 @@ namespace TEAMModelBI.Controllers.BITmid
|
|
|
tmidStics.apple = (doc.TryGetProperty("apple", out JsonElement apple) && !string.IsNullOrWhiteSpace(apple.GetString())) ? true : false;
|
|
|
tmidStics.ts = (doc.TryGetProperty("ts", out JsonElement ts)) ? ts.GetInt64() : 0;
|
|
|
//票券
|
|
|
- var usersCoupons = tableCouponClient.Get<DynamicTableEntity>(id);
|
|
|
- foreach (var coupon in usersCoupons)
|
|
|
- {
|
|
|
- tmidStics.coupons.Add(
|
|
|
- new TmidCoupon()
|
|
|
- {
|
|
|
- code = coupon.RowKey,
|
|
|
- exchange = coupon.Properties["exchangeTime"].DateTimeOffsetValue.Value.ToUnixTimeSeconds(),
|
|
|
- });
|
|
|
- }
|
|
|
+ //var usersCoupons = tableCouponClient.Get<DynamicTableEntity>(id);
|
|
|
+ //foreach (var coupon in usersCoupons)
|
|
|
+ //{
|
|
|
+ // tmidStics.coupons.Add(
|
|
|
+ // new TmidCoupon()
|
|
|
+ // {
|
|
|
+ // code = coupon.RowKey,
|
|
|
+ // exchange = coupon.Properties["exchangeTime"].DateTimeOffsetValue.Value.ToUnixTimeSeconds(),
|
|
|
+ // });
|
|
|
+ //}
|
|
|
|
|
|
//登入各服務的時間
|
|
|
- var loginTime = await redisClient.HashGetAllAsync(id);
|
|
|
- foreach (var t in loginTime)
|
|
|
- {
|
|
|
- if (!t.Name.StartsWith("HiTeach") && !_dicClientIds.ContainsKey(t.Name)) continue;
|
|
|
- tmidStics.login.Add(
|
|
|
- new TmidLoginTime()
|
|
|
- {
|
|
|
- product = t.Name.StartsWith("HiTeach") ? t.Name.ToString().Split("-")[0] : _dicClientIds[t.Name],
|
|
|
- time = (long)t.Value
|
|
|
- });
|
|
|
- }
|
|
|
+ //var loginTime = await redisClient.HashGetAllAsync(id);
|
|
|
+ //foreach (var t in loginTime)
|
|
|
+ //{
|
|
|
+ // if (!t.Name.StartsWith("HiTeach") && !_dicClientIds.ContainsKey(t.Name)) continue;
|
|
|
+ // tmidStics.login.Add(
|
|
|
+ // new TmidLoginTime()
|
|
|
+ // {
|
|
|
+ // product = t.Name.StartsWith("HiTeach") ? t.Name.ToString().Split("-")[0] : _dicClientIds[t.Name],
|
|
|
+ // time = (long)t.Value
|
|
|
+ // });
|
|
|
+ //}
|
|
|
|
|
|
//積分
|
|
|
- var usersPoints = tablePointsClient.Get("Points", id);
|
|
|
- tmidStics.points.points = (usersPoints != null) ? usersPoints.Properties["Points"].Int32Value.Value : 0;
|
|
|
- tmidStics.points.level = (usersPoints != null) ? usersPoints.Properties["Level"].Int32Value.Value : 0;
|
|
|
- tmidStics.points.balance = (usersPoints != null) ? usersPoints.Properties["Balance"].Int32Value.Value : 0;
|
|
|
+ //var usersPoints = tablePointsClient.Get("Points", id);
|
|
|
+ //tmidStics.points.points = (usersPoints != null) ? usersPoints.Properties["Points"].Int32Value.Value : 0;
|
|
|
+ //tmidStics.points.level = (usersPoints != null) ? usersPoints.Properties["Level"].Int32Value.Value : 0;
|
|
|
+ //tmidStics.points.balance = (usersPoints != null) ? usersPoints.Properties["Balance"].Int32Value.Value : 0;
|
|
|
|
|
|
//個人服務授權
|
|
|
- tmidStics.prod = await getTMIDAuthService(cosmosClientCsv2, id, "", true);
|
|
|
+ //tmidStics.prod = await getTMIDAuthService(cosmosClientCsv2, id, "", true);
|
|
|
|
|
|
//IOT
|
|
|
- tmidStics.iot.hiteach.year = await getTMIDIotData(cosmosClientIes5, id, "HiTeach", "year", y, 0, 0, 0, 0);
|
|
|
- tmidStics.iot.hiteach.month = await getTMIDIotData(cosmosClientIes5, id, "HiTeach", "month", y, m, 0, 0, 0);
|
|
|
- tmidStics.iot.hiteach.day = await getTMIDIotData(cosmosClientIes5, id, "HiTeach", "day", y, m, d, 0, 0);
|
|
|
- tmidStics.iot.hiteachcc.year = await getTMIDIotData(cosmosClientIes5, id, "HiTeachCC", "year", y, 0, 0, 0, 0);
|
|
|
- tmidStics.iot.hiteachcc.month = await getTMIDIotData(cosmosClientIes5, id, "HiTeachCC", "month", y, m, 0, 0, 0);
|
|
|
- tmidStics.iot.hiteachcc.day = await getTMIDIotData(cosmosClientIes5, id, "HiTeachCC", "day", y, m, d, 0, 0);
|
|
|
+ //tmidStics.iot.hiteach.year = await getTMIDIotData(cosmosClientIes5, id, "HiTeach", "year", y, 0, 0, fromDate, toDate);
|
|
|
+ //tmidStics.iot.hiteach.month = await getTMIDIotData(cosmosClientIes5, id, "HiTeach", "month", y, m, 0, fromDate, toDate);
|
|
|
+ //tmidStics.iot.hiteach.day = await getTMIDIotData(cosmosClientIes5, id, "HiTeach", "day", y, m, d, fromDate, toDate);
|
|
|
+ //tmidStics.iot.hiteachcc.year = await getTMIDIotData(cosmosClientIes5, id, "HiTeachCC", "year", y, 0, 0, fromDate, toDate);
|
|
|
+ //tmidStics.iot.hiteachcc.month = await getTMIDIotData(cosmosClientIes5, id, "HiTeachCC", "month", y, m, 0, fromDate, toDate);
|
|
|
+ //tmidStics.iot.hiteachcc.day = await getTMIDIotData(cosmosClientIes5, id, "HiTeachCC", "day", y, m, d, fromDate, toDate);
|
|
|
|
|
|
tmidDic.Add(id, tmidStics);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- //ID進階資料
|
|
|
+ //取得TMID進階資料
|
|
|
query = new QueryDefinition(@"SELECT c.id, c.name, c.mobile, c.mail, c.country, c.province, c.city, c.schoolCode, c.schoolCodeW, c.unitType, c.unitName, c.jobTitle FROM c WHERE (ARRAY_CONTAINS(@key, c.id) OR ARRAY_CONTAINS(@key, c.mobile))")
|
|
|
- .WithParameter("@key", tmids);
|
|
|
+ .WithParameter("@key", tmids);
|
|
|
await foreach (var item in cosmosClientCsv2
|
|
|
.GetContainer("Core", "ID2")
|
|
|
.GetItemQueryStreamIterator(query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("base-ex") }))
|
|
@@ -174,186 +215,242 @@ namespace TEAMModelBI.Controllers.BITmid
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ if(tmidDic.Count.Equals(0)) return Ok(new List<object>());
|
|
|
|
|
|
+ //取得 票券、登入各服務的時間、取得積分、個人服務授權、IOT
|
|
|
+ foreach (KeyValuePair<string, TmidStics> dicItem in tmidDic)
|
|
|
+ {
|
|
|
+ string id = dicItem.Key;
|
|
|
+ TmidStics tmidStics = dicItem.Value;
|
|
|
+ //票券
|
|
|
+ if (eventList.Contains("coupons"))
|
|
|
+ {
|
|
|
+ var usersCoupons = tableCouponClient.Get<DynamicTableEntity>(id);
|
|
|
+ foreach (var coupon in usersCoupons)
|
|
|
+ {
|
|
|
+ tmidStics.coupons.Add(
|
|
|
+ new TmidCoupon()
|
|
|
+ {
|
|
|
+ code = coupon.RowKey,
|
|
|
+ exchange = coupon.Properties["exchangeTime"].DateTimeOffsetValue.Value.ToUnixTimeSeconds(),
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //取得登入各服務的時間
|
|
|
+ if (eventList.Contains("login"))
|
|
|
+ {
|
|
|
+ var loginTime = await redisClient.HashGetAllAsync(id);
|
|
|
+ foreach (var t in loginTime)
|
|
|
+ {
|
|
|
+ if (!t.Name.StartsWith("HiTeach") && !_dicClientIds.ContainsKey(t.Name)) continue;
|
|
|
+ tmidStics.login.Add(
|
|
|
+ new TmidLoginTime()
|
|
|
+ {
|
|
|
+ product = t.Name.StartsWith("HiTeach") ? t.Name.ToString().Split("-")[0] : _dicClientIds[t.Name],
|
|
|
+ time = (long)t.Value
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //積分
|
|
|
+ if (eventList.Contains("points"))
|
|
|
+ {
|
|
|
+ var usersPoints = tablePointsClient.Get("Points", id);
|
|
|
+ tmidStics.points.points = (usersPoints != null) ? usersPoints.Properties["Points"].Int32Value.Value : 0;
|
|
|
+ tmidStics.points.level = (usersPoints != null) ? usersPoints.Properties["Level"].Int32Value.Value : 0;
|
|
|
+ tmidStics.points.balance = (usersPoints != null) ? usersPoints.Properties["Balance"].Int32Value.Value : 0;
|
|
|
+ }
|
|
|
+ //個人服務授權
|
|
|
+ if (eventList.Contains("prod"))
|
|
|
+ {
|
|
|
+ tmidStics.prod = await getTMIDAuthService(cosmosClientCsv2, id, "", true);
|
|
|
+ }
|
|
|
+ //IOT
|
|
|
+ if (eventList.Contains("iot"))
|
|
|
+ {
|
|
|
+ tmidStics.iot.hiteach.year = await getTMIDIotData(cosmosClientIes5, id, "HiTeach", "year", y, 0, 0, dateTimeFromSec, dateTimeToSec);
|
|
|
+ tmidStics.iot.hiteach.month = await getTMIDIotData(cosmosClientIes5, id, "HiTeach", "month", y, m, 0, dateTimeFromSec, dateTimeToSec);
|
|
|
+ tmidStics.iot.hiteach.day = await getTMIDIotData(cosmosClientIes5, id, "HiTeach", "day", y, m, d, dateTimeFromSec, dateTimeToSec);
|
|
|
+ tmidStics.iot.hiteachcc.year = await getTMIDIotData(cosmosClientIes5, id, "HiTeachCC", "year", y, 0, 0, dateTimeFromSec, dateTimeToSec);
|
|
|
+ tmidStics.iot.hiteachcc.month = await getTMIDIotData(cosmosClientIes5, id, "HiTeachCC", "month", y, m, 0, dateTimeFromSec, dateTimeToSec);
|
|
|
+ tmidStics.iot.hiteachcc.day = await getTMIDIotData(cosmosClientIes5, id, "HiTeachCC", "day", y, m, d, dateTimeFromSec, dateTimeToSec);
|
|
|
+ }
|
|
|
+ }
|
|
|
//IES5
|
|
|
- query = new QueryDefinition(@"SELECT c.id, c.defaultSchool, c.schools FROM c WHERE ARRAY_CONTAINS(@key, c.id)")
|
|
|
- .WithParameter("@key", tmids);
|
|
|
- await foreach (var item in cosmosClientIes5
|
|
|
- .GetContainer(Constant.TEAMModelOS, "Teacher")
|
|
|
- .GetItemQueryStreamIterator(query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
|
|
|
+ if (eventList.Contains("ies5"))
|
|
|
{
|
|
|
- using var json = await JsonDocument.ParseAsync(item.ContentStream);
|
|
|
- if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
|
|
|
+ query = new QueryDefinition(@"SELECT c.id, c.defaultSchool, c.schools FROM c WHERE ARRAY_CONTAINS(@key, c.id)")
|
|
|
+ .WithParameter("@key", tmidDic.Keys.ToList());
|
|
|
+ await foreach (var item in cosmosClientIes5
|
|
|
+ .GetContainer(Constant.TEAMModelOS, "Teacher")
|
|
|
+ .GetItemQueryStreamIterator(query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
|
|
|
{
|
|
|
- foreach (var doc in json.RootElement.GetProperty("Documents").EnumerateArray())
|
|
|
+ using var json = await JsonDocument.ParseAsync(item.ContentStream);
|
|
|
+ if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
|
|
|
{
|
|
|
- string id = doc.GetProperty("id").GetString();
|
|
|
- //TmidStics tmidStics = (tmidDic.ContainsKey(id)) ? tmidDic[id] : new() { id = id, ies5 = new TmidSticsIes5() { schools = new List<object>() } };
|
|
|
- TmidStics tmidStics;
|
|
|
- if (tmidDic.ContainsKey(id))
|
|
|
+ foreach (var doc in json.RootElement.GetProperty("Documents").EnumerateArray())
|
|
|
{
|
|
|
- tmidStics = tmidDic[id];
|
|
|
- } else
|
|
|
- {
|
|
|
- tmidStics = new TmidStics();
|
|
|
- tmidStics.id = id;
|
|
|
- }
|
|
|
-
|
|
|
- //IES5學校資訊
|
|
|
- string defaultschool = (doc.TryGetProperty("defaultSchool", out JsonElement _defaultSchool)) ? _defaultSchool.ToString() : string.Empty; //預設學校
|
|
|
- List<string> schoolIds = new List<string>();
|
|
|
- if (doc.TryGetProperty("schools", out JsonElement schoolsJobj))
|
|
|
- {
|
|
|
- foreach (var obj in schoolsJobj.EnumerateArray())
|
|
|
+ string id = doc.GetProperty("id").GetString();
|
|
|
+ TmidStics tmidStics = tmidDic[id];
|
|
|
+ //IES5學校資訊
|
|
|
+ string defaultschool = (doc.TryGetProperty("defaultSchool", out JsonElement _defaultSchool)) ? _defaultSchool.ToString() : string.Empty; //預設學校
|
|
|
+ List<string> schoolIds = new List<string>();
|
|
|
+ if (doc.TryGetProperty("schools", out JsonElement schoolsJobj))
|
|
|
{
|
|
|
- string schoolCodeNow = $"{obj.GetProperty("schoolId")}";
|
|
|
- string status = $"{obj.GetProperty("status")}";
|
|
|
- if(status.Equals("join"))
|
|
|
+ foreach (var obj in schoolsJobj.EnumerateArray())
|
|
|
{
|
|
|
- schoolIds.Add(schoolCodeNow); //放入學校ID列,一次取
|
|
|
+ string schoolCodeNow = $"{obj.GetProperty("schoolId")}";
|
|
|
+ string status = $"{obj.GetProperty("status")}";
|
|
|
+ if (status.Equals("join"))
|
|
|
+ {
|
|
|
+ schoolIds.Add(schoolCodeNow); //放入學校ID列,一次取
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
- if (schoolIds.Count > 0)
|
|
|
- {
|
|
|
- QueryDefinition querysc = new QueryDefinition(@"SELECT c.id, c.name, c.region, c.province, c.city, c.dist, c.size, c.period FROM c WHERE ARRAY_CONTAINS(@key, c.id)")
|
|
|
- .WithParameter("@key", schoolIds);
|
|
|
- await foreach (var itemsc in cosmosClientIes5
|
|
|
- .GetContainer(Constant.TEAMModelOS, "School")
|
|
|
- .GetItemQueryStreamIterator(querysc, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
|
|
|
+ if (schoolIds.Count > 0)
|
|
|
{
|
|
|
- using var jsonsc = await JsonDocument.ParseAsync(itemsc.ContentStream);
|
|
|
- if (jsonsc.RootElement.TryGetProperty("_count", out JsonElement countsc) && countsc.GetUInt16() > 0)
|
|
|
+ QueryDefinition querysc = new QueryDefinition(@"SELECT c.id, c.name, c.region, c.province, c.city, c.dist, c.size, c.period FROM c WHERE ARRAY_CONTAINS(@key, c.id)")
|
|
|
+ .WithParameter("@key", schoolIds);
|
|
|
+ await foreach (var itemsc in cosmosClientIes5
|
|
|
+ .GetContainer(Constant.TEAMModelOS, "School")
|
|
|
+ .GetItemQueryStreamIterator(querysc, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
|
|
|
{
|
|
|
- foreach (var school in jsonsc.RootElement.GetProperty("Documents").EnumerateArray())
|
|
|
+ using var jsonsc = await JsonDocument.ParseAsync(itemsc.ContentStream);
|
|
|
+ if (jsonsc.RootElement.TryGetProperty("_count", out JsonElement countsc) && countsc.GetUInt16() > 0)
|
|
|
{
|
|
|
- string schoolCodeNow = school.GetProperty("id").GetString();
|
|
|
- //當前學年 ※若有多學段,取第一個學段來取得學年資訊吧
|
|
|
- Period period = school.GetProperty("period").Deserialize<List<Period>>().First();
|
|
|
- var info = SchoolService.GetSemester(period, 0, DateTime.Now.ToString());
|
|
|
- int studyYear = info.studyYear;
|
|
|
- //學校Blob使用狀況
|
|
|
- (long usedSize, long teach, long total, long surplus, Dictionary<string, double?> catalog) schoolUsedBlob = await BlobService.GetSurplusSpace(schoolCodeNow, "school", _option.Location, _azureCosmos, _azureRedis, _azureStorage, _dingDing, _httpTrigger);
|
|
|
- //老師在此學校的課程數 ※只取當前學年
|
|
|
- int courseCnt = 0;
|
|
|
- var queryCrs = $"SELECT VALUE COUNT(1) FROM ( SELECT DISTINCT VALUE(c.id) FROM c JOIN schedules IN c.schedules WHERE schedules.teacherId = '{id}' AND c.year = {studyYear} )";
|
|
|
- await foreach (int itemCrs in cosmosClientIes5.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<int>(queryText: queryCrs, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"CourseTask-{schoolCodeNow}") }))
|
|
|
+ foreach (var school in jsonsc.RootElement.GetProperty("Documents").EnumerateArray())
|
|
|
{
|
|
|
- courseCnt = itemCrs;
|
|
|
+ string schoolCodeNow = school.GetProperty("id").GetString();
|
|
|
+ //當前學年 ※若有多學段,取第一個學段來取得學年資訊吧
|
|
|
+ Period period = school.GetProperty("period").Deserialize<List<Period>>().First();
|
|
|
+ var info = SchoolService.GetSemester(period, 0, DateTime.Now.ToString());
|
|
|
+ int studyYear = info.studyYear;
|
|
|
+ //學校Blob使用狀況
|
|
|
+ (long usedSize, long teach, long total, long surplus, Dictionary<string, double?> catalog) schoolUsedBlob = await BlobService.GetSurplusSpace(schoolCodeNow, "school", _option.Location, _azureCosmos, _azureRedis, _azureStorage, _dingDing, _httpTrigger);
|
|
|
+ //老師在此學校的課程數 ※只取當前學年
|
|
|
+ int courseCnt = 0;
|
|
|
+ var queryCrs = $"SELECT VALUE COUNT(1) FROM ( SELECT DISTINCT VALUE(c.id) FROM c JOIN schedules IN c.schedules WHERE schedules.teacherId = '{id}' AND c.year = {studyYear} )";
|
|
|
+ await foreach (int itemCrs in cosmosClientIes5.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<int>(queryText: queryCrs, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"CourseTask-{schoolCodeNow}") }))
|
|
|
+ {
|
|
|
+ courseCnt = itemCrs;
|
|
|
+ }
|
|
|
+ //IES5學校資料製作
|
|
|
+ TmidSticsIes5School schoolobj = new TmidSticsIes5School();
|
|
|
+ long ssize = (school.TryGetProperty("size", out JsonElement ssizeJson)) ? ssizeJson.GetInt32() : 0;
|
|
|
+ long sused = schoolUsedBlob.usedSize + schoolUsedBlob.teach * 1073741824;
|
|
|
+ long stotal = ssize * 1073741824;
|
|
|
+ object schzize = new
|
|
|
+ {
|
|
|
+ used = sused,
|
|
|
+ total = stotal,
|
|
|
+ avaliable = stotal - sused,
|
|
|
+ };
|
|
|
+ schoolobj.schoolId = schoolCodeNow;
|
|
|
+ schoolobj.name = school.GetProperty("name").GetString();
|
|
|
+ schoolobj.region = school.GetProperty("region").GetString();
|
|
|
+ schoolobj.province = school.GetProperty("province").GetString();
|
|
|
+ schoolobj.city = school.GetProperty("city").GetString();
|
|
|
+ schoolobj.dist = school.GetProperty("dist").GetString();
|
|
|
+ schoolobj.size = schzize;
|
|
|
+ schoolobj.courseCnt = courseCnt;
|
|
|
+ schoolobj.defaultSchool = (!string.IsNullOrWhiteSpace(defaultschool) && defaultschool.Equals(schoolCodeNow)) ? true : false;
|
|
|
+
|
|
|
+ tmidStics.ies5.schools.Add(schoolobj);
|
|
|
}
|
|
|
- //IES5學校資料製作
|
|
|
- TmidSticsIes5School schoolobj = new TmidSticsIes5School();
|
|
|
- long ssize = (school.TryGetProperty("size", out JsonElement ssizeJson)) ? ssizeJson.GetInt32() : 0;
|
|
|
- long sused = schoolUsedBlob.usedSize + schoolUsedBlob.teach * 1073741824;
|
|
|
- long stotal = ssize * 1073741824;
|
|
|
- object schzize = new
|
|
|
- {
|
|
|
- used = sused,
|
|
|
- total = stotal,
|
|
|
- avaliable = stotal - sused,
|
|
|
- };
|
|
|
- schoolobj.schoolId = schoolCodeNow;
|
|
|
- schoolobj.name = school.GetProperty("name").GetString();
|
|
|
- schoolobj.region = school.GetProperty("region").GetString();
|
|
|
- schoolobj.province = school.GetProperty("province").GetString();
|
|
|
- schoolobj.city = school.GetProperty("city").GetString();
|
|
|
- schoolobj.dist = school.GetProperty("dist").GetString();
|
|
|
- schoolobj.size = schzize;
|
|
|
- schoolobj.courseCnt = courseCnt;
|
|
|
- schoolobj.defaultSchool = (!string.IsNullOrWhiteSpace(defaultschool) && defaultschool.Equals(schoolCodeNow)) ? true : false;
|
|
|
-
|
|
|
- tmidStics.ies5.schools.Add(schoolobj);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- //IES5個人空間
|
|
|
- var (usedSize, teach, total, surplus, catalog) = await BlobService.GetSurplusSpace(id, "private", _option.Location, _azureCosmos, _azureRedis, _azureStorage, _dingDing, _httpTrigger);
|
|
|
- tmidStics.ies5.usedSize = usedSize;
|
|
|
- tmidStics.ies5.teachSize = teach * 1073741824;
|
|
|
- tmidStics.ies5.totalSize = total * 1073741824;
|
|
|
- tmidStics.ies5.surplusSize = surplus;
|
|
|
- //IES5個人資源數
|
|
|
- tmidStics.ies5.resCount = 0; //教材數
|
|
|
- tmidStics.ies5.itemCount = 0; //題目數
|
|
|
- tmidStics.ies5.paperCount = 0; //試卷數
|
|
|
- ///IES5個人題目數
|
|
|
- await foreach (int itemC in cosmosClientIes5.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<int>(queryText: $"SELECT VALUE COUNT(1) FROM c WHERE c.pid = null", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Item-{id}") }))
|
|
|
- {
|
|
|
- tmidStics.ies5.itemCount = itemC;
|
|
|
- }
|
|
|
- ///IES5個人試卷數
|
|
|
- await foreach (int paperC in cosmosClientIes5.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<int>(queryText: $"SELECT VALUE COUNT(1) FROM c WHERE c.scope = 'private'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{id}") }))
|
|
|
- {
|
|
|
- tmidStics.ies5.paperCount = paperC;
|
|
|
- }
|
|
|
- ///IES5個人教材數
|
|
|
- List<BlobService.BlobCount> blogCountList = await BlobService.BloblogCount(cosmosClientIes5, "private", id, "", "");
|
|
|
- foreach (BlobService.BlobCount blobCountRow in blogCountList)
|
|
|
- {
|
|
|
- switch (blobCountRow.type)
|
|
|
+ //IES5個人空間
|
|
|
+ var (usedSize, teach, total, surplus, catalog) = await BlobService.GetSurplusSpace(id, "private", _option.Location, _azureCosmos, _azureRedis, _azureStorage, _dingDing, _httpTrigger);
|
|
|
+ tmidStics.ies5.usedSize = usedSize;
|
|
|
+ tmidStics.ies5.teachSize = teach * 1073741824;
|
|
|
+ tmidStics.ies5.totalSize = total * 1073741824;
|
|
|
+ tmidStics.ies5.surplusSize = surplus;
|
|
|
+ //IES5個人資源數
|
|
|
+ tmidStics.ies5.resCount = 0; //教材數
|
|
|
+ tmidStics.ies5.itemCount = 0; //題目數
|
|
|
+ tmidStics.ies5.paperCount = 0; //試卷數
|
|
|
+ ///IES5個人題目數
|
|
|
+ await foreach (int itemC in cosmosClientIes5.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<int>(queryText: $"SELECT VALUE COUNT(1) FROM c WHERE c.pid = null", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Item-{id}") }))
|
|
|
{
|
|
|
- case "doc":
|
|
|
- case "image":
|
|
|
- case "res":
|
|
|
- case "video":
|
|
|
- case "audio":
|
|
|
- case "other":
|
|
|
- tmidStics.ies5.resCount += blobCountRow.count;
|
|
|
- break;
|
|
|
+ tmidStics.ies5.itemCount = itemC;
|
|
|
}
|
|
|
+ ///IES5個人試卷數
|
|
|
+ await foreach (int paperC in cosmosClientIes5.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<int>(queryText: $"SELECT VALUE COUNT(1) FROM c WHERE c.scope = 'private'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{id}") }))
|
|
|
+ {
|
|
|
+ tmidStics.ies5.paperCount = paperC;
|
|
|
+ }
|
|
|
+ ///IES5個人教材數
|
|
|
+ List<BlobService.BlobCount> blogCountList = await BlobService.BloblogCount(cosmosClientIes5, "private", id, "", "");
|
|
|
+ foreach (BlobService.BlobCount blobCountRow in blogCountList)
|
|
|
+ {
|
|
|
+ switch (blobCountRow.type)
|
|
|
+ {
|
|
|
+ case "doc":
|
|
|
+ case "image":
|
|
|
+ case "res":
|
|
|
+ case "video":
|
|
|
+ case "audio":
|
|
|
+ case "other":
|
|
|
+ tmidStics.ies5.resCount += blobCountRow.count;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!tmidDic.ContainsKey(id)) tmidDic.Add(id, tmidStics);
|
|
|
}
|
|
|
- if(!tmidDic.ContainsKey(id)) tmidDic.Add(id, tmidStics);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
//個人權益
|
|
|
- query = new QueryDefinition(@"SELECT * FROM c WHERE (ARRAY_CONTAINS(@key, c.id))")
|
|
|
- .WithParameter("@key", tmidDic.Keys.ToList());
|
|
|
- await foreach (var item in cosmosClientCsv2
|
|
|
- .GetContainer("Core", "ID2")
|
|
|
- .GetItemQueryStreamIterator(query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("benefits") }))
|
|
|
+ if (eventList.Contains("benefits"))
|
|
|
{
|
|
|
- using var json = await JsonDocument.ParseAsync(item.ContentStream);
|
|
|
- if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
|
|
|
+ query = new QueryDefinition(@"SELECT * FROM c WHERE (ARRAY_CONTAINS(@key, c.id))")
|
|
|
+ .WithParameter("@key", tmidDic.Keys.ToList());
|
|
|
+ await foreach (var item in cosmosClientCsv2
|
|
|
+ .GetContainer("Core", "ID2")
|
|
|
+ .GetItemQueryStreamIterator(query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("benefits") }))
|
|
|
{
|
|
|
- foreach (var doc in json.RootElement.GetProperty("Documents").EnumerateArray())
|
|
|
+ using var json = await JsonDocument.ParseAsync(item.ContentStream);
|
|
|
+ if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
|
|
|
{
|
|
|
- string id = doc.GetProperty("id").GetString();
|
|
|
- if (doc.TryGetProperty("hiteach", out var elementHiteachData))
|
|
|
- {
|
|
|
- tmidDic[id].benefits.hiteach = elementHiteachData.ToObject<List<object>>();
|
|
|
- }
|
|
|
- if (doc.TryGetProperty("hiteachcc", out var elementHiteachCCData))
|
|
|
+ foreach (var doc in json.RootElement.GetProperty("Documents").EnumerateArray())
|
|
|
{
|
|
|
- tmidDic[id].benefits.hiteachcc = elementHiteachCCData.ToObject<List<object>>();
|
|
|
+ string id = doc.GetProperty("id").GetString();
|
|
|
+ if (doc.TryGetProperty("hiteach", out var elementHiteachData))
|
|
|
+ {
|
|
|
+ tmidDic[id].benefits.hiteach = elementHiteachData.ToObject<List<object>>();
|
|
|
+ }
|
|
|
+ if (doc.TryGetProperty("hiteachcc", out var elementHiteachCCData))
|
|
|
+ {
|
|
|
+ tmidDic[id].benefits.hiteachcc = elementHiteachCCData.ToObject<List<object>>();
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
//蘇格拉底資料
|
|
|
- query = new QueryDefinition(@"SELECT * FROM c WHERE (ARRAY_CONTAINS(@key, c.id))")
|
|
|
- .WithParameter("@key", tmidDic.Keys.ToList());
|
|
|
- await foreach (var item in cosmosClientCsv2
|
|
|
- .GetContainer("Core", "ID2")
|
|
|
- .GetItemQueryStreamIterator(query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("sokrates") }))
|
|
|
+ if (eventList.Contains("sokrates"))
|
|
|
{
|
|
|
- using var json = await JsonDocument.ParseAsync(item.ContentStream);
|
|
|
- if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
|
|
|
+ query = new QueryDefinition(@"SELECT * FROM c WHERE (ARRAY_CONTAINS(@key, c.id))")
|
|
|
+ .WithParameter("@key", tmidDic.Keys.ToList());
|
|
|
+ await foreach (var item in cosmosClientCsv2
|
|
|
+ .GetContainer("Core", "ID2")
|
|
|
+ .GetItemQueryStreamIterator(query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("sokrates") }))
|
|
|
{
|
|
|
- foreach (var doc in json.RootElement.GetProperty("Documents").EnumerateArray())
|
|
|
+ using var json = await JsonDocument.ParseAsync(item.ContentStream);
|
|
|
+ if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
|
|
|
{
|
|
|
- string id = doc.GetProperty("id").GetString();
|
|
|
- if (doc.TryGetProperty("hiteach_data", out var elementHiteachData))
|
|
|
+ foreach (var doc in json.RootElement.GetProperty("Documents").EnumerateArray())
|
|
|
{
|
|
|
- tmidDic[id].sokrates.hiteach_data = elementHiteachData.ToObject<object>();
|
|
|
- }
|
|
|
- if (doc.TryGetProperty("user_channels", out var elementUserChannels))
|
|
|
- {
|
|
|
- tmidDic[id].sokrates.user_channels = elementUserChannels.ToObject<object>();
|
|
|
+ string id = doc.GetProperty("id").GetString();
|
|
|
+ if (doc.TryGetProperty("hiteach_data", out var elementHiteachData))
|
|
|
+ {
|
|
|
+ tmidDic[id].sokrates.hiteach_data = elementHiteachData.ToObject<object>();
|
|
|
+ }
|
|
|
+ if (doc.TryGetProperty("user_channels", out var elementUserChannels))
|
|
|
+ {
|
|
|
+ tmidDic[id].sokrates.user_channels = elementUserChannels.ToObject<object>();
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|