|
@@ -2068,6 +2068,151 @@ namespace TEAMModelOS.Controllers
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ [ProducesDefaultResponseType]
|
|
|
|
+ [HttpPost("get-school-iot")]
|
|
|
|
+ [Authorize(Roles = "IES")]
|
|
|
|
+ [AuthToken(Roles = "admin")]
|
|
|
|
+ public async Task<IActionResult> getSchoolIotData(JsonElement request)
|
|
|
|
+ {
|
|
|
|
+ try
|
|
|
|
+ {
|
|
|
|
+ if (!request.TryGetProperty("schoolId", out JsonElement _schoolId)) return BadRequest();
|
|
|
|
+ if (!request.TryGetProperty("periodId", out JsonElement _periodId)) return BadRequest();
|
|
|
|
+ var sdate = (request.TryGetProperty("sdate", out JsonElement _sdate)) ? TimeHelper.GetDateTime(_sdate.GetString(), "yyyy-MM-dd") : (0, 0, 0, 0, 0);
|
|
|
|
+ var edate = (request.TryGetProperty("edate", out JsonElement _edate)) ? TimeHelper.GetDateTime(_edate.GetString(), "yyyy-MM-dd") : (0, 0, 0, 0, 0);
|
|
|
|
+ //取得學校基本資訊
|
|
|
|
+ School schoolBase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>($"{_schoolId}", new PartitionKey("Base"));
|
|
|
|
+ if(string.IsNullOrWhiteSpace(schoolBase.id)) return BadRequest();
|
|
|
|
+ string schName = schoolBase.name;
|
|
|
|
+ string schRegion = schoolBase.region;
|
|
|
|
+ string schProvince = schoolBase.province;
|
|
|
|
+ string schCity = schoolBase.city;
|
|
|
|
+ string schDist = schoolBase.dist;
|
|
|
|
+ string schAreaId = schoolBase.areaId;
|
|
|
|
+ string schType = schoolBase.code;
|
|
|
|
+ var period = schoolBase.period.Find(x => x.id.Equals($"{_periodId}"));
|
|
|
|
+ if(period == null) return BadRequest();
|
|
|
|
+ (Semester currSemester, int studyYear, DateTimeOffset date, DateTimeOffset nextSemester) info = SchoolService.GetSemester(period);
|
|
|
|
+ string semesterId = info.currSemester.id;
|
|
|
|
+ var datetime = DateTimeOffset.UtcNow;
|
|
|
|
+ int studyYear = info.studyYear;
|
|
|
|
+ int dateFromYear = (!sdate.Item1.Equals(0)) ? sdate.Item1 : studyYear;
|
|
|
|
+ int dateFromMonth = (!sdate.Item2.Equals(0)) ? sdate.Item2 : info.currSemester.month;
|
|
|
|
+ int dateFromDay = (!sdate.Item3.Equals(0)) ? sdate.Item3 : info.currSemester.day;
|
|
|
|
+ int dateToYear = (!edate.Item1.Equals(0)) ? edate.Item1 : datetime.Year;
|
|
|
|
+ int dateToMonth = (!edate.Item2.Equals(0)) ? edate.Item2 : datetime.Month;
|
|
|
|
+ int dateToDay = (!edate.Item3.Equals(0)) ? edate.Item3 : datetime.Day;
|
|
|
|
+ //教室數(今年)
|
|
|
|
+ int classCnt = 0;
|
|
|
|
+ string sql = $"SELECT VALUE COUNT(c.id) FROM c WHERE c.year = {studyYear}";
|
|
|
|
+ await foreach (int items in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetItemQueryIterator<int>(queryText: sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"Class-{_schoolId}") }))
|
|
|
|
+ {
|
|
|
|
+ classCnt = items;
|
|
|
|
+ }
|
|
|
|
+ //教師數
|
|
|
|
+ int teacherCnt = 0;
|
|
|
|
+ sql = $"SELECT VALUE COUNT(c.id) FROM c";
|
|
|
|
+ await foreach (int items in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetItemQueryIterator<int>(queryText: sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"Teacher-{_schoolId}") }))
|
|
|
|
+ {
|
|
|
|
+ teacherCnt = items;
|
|
|
|
+ }
|
|
|
|
+ //學生數(今年)
|
|
|
|
+ int studentCnt = 0;
|
|
|
|
+ sql = $"SELECT VALUE COUNT(c.id) FROM c WHERE c.year = {studyYear}";
|
|
|
|
+ await foreach (int items in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Student).GetItemQueryIterator<int>(queryText: sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"Base-{_schoolId}") }))
|
|
|
|
+ {
|
|
|
|
+ studentCnt = items;
|
|
|
|
+ }
|
|
|
|
+ //HiTeach硬體授權數
|
|
|
|
+ int deviceAuthCnt = 0;
|
|
|
|
+ //List<string> serialPermitList = getSerialPermitProdcodeList();
|
|
|
|
+ List<string> serialPermitList = new List<string>() { "J223IZ6M", "3222C6D2", "J223IZAM", "J2236ZCX", "3222DNG2", "3222IAVN", "BYJ6LZ6Z" };
|
|
|
|
+ string serialPermitJsonStr = JsonConvert.SerializeObject(serialPermitList);
|
|
|
|
+ string serialQueryText = $"SELECT VALUE SUM(c.deviceMax) FROM c WHERE c.dataType = 'serial' AND ARRAY_CONTAINS({serialPermitJsonStr}, c.prodCode) AND c.expireStatus = 'A'";
|
|
|
|
+ await foreach (int items in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetItemQueryIterator<int>(queryText: serialQueryText, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Product-{_schoolId}") }))
|
|
|
|
+ {
|
|
|
|
+ deviceAuthCnt = items;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //取得產品分析資訊
|
|
|
|
+ int stuShow = 0; ///學生人次
|
|
|
|
+ long stuLessonLengMin = 0; ///學生參與總時間數(分)
|
|
|
|
+ int lessonRecord = 0; ///課堂數
|
|
|
|
+ long lessonLengMin = 0; ///課堂時間數(分)
|
|
|
|
+ int mission = 0; ///課中統計-任務數
|
|
|
|
+ int missionFin = 0; ///課中統計-作品數
|
|
|
|
+ int item = 0; ///課中統計-題目數
|
|
|
|
+ int interact = 0; ///課中統計-互動次數
|
|
|
|
+ int lTypeCoop = 0; ///學習型態: 合作
|
|
|
|
+ int lTypeIact = 0; ///學習型態: 互動
|
|
|
|
+ int lTypeMis = 0; ///學習型態: 任務
|
|
|
|
+ int lTypeTst = 0; ///學習型態: 測驗
|
|
|
|
+ int lTypeDif = 0; ///學習型態: 差異化
|
|
|
|
+ List<string> htcDevList = new List<string>(); ///設備統計-HiTeach Device list
|
|
|
|
+ List<string> htaDevList = new List<string>(); ///設備統計-HiTA Device list
|
|
|
|
+ List<string> htccDevList = new List<string>(); ///設備統計-HiTeachCC Device list
|
|
|
|
+ DateTimeOffset dateTimeFrom = new DateTimeOffset(dateFromYear, dateFromMonth, dateFromDay, 0, 0, 0, TimeSpan.Zero);
|
|
|
|
+ DateTimeOffset dateTimeTo = new DateTimeOffset(dateToYear, dateToMonth, dateToDay, 23, 59, 59, TimeSpan.Zero);
|
|
|
|
+ long dateTimeFromSec = dateTimeFrom.ToUnixTimeSeconds();
|
|
|
|
+ long dateTimeToSec = dateTimeTo.ToUnixTimeSeconds();
|
|
|
|
+ List<ProdAnalysisApiResult> iotData = new List<ProdAnalysisApiResult>();
|
|
|
|
+ sql = $"SELECT * FROM c WHERE c.schoolId = '{_schoolId}' AND c.dateUnit = 'day' AND c.dateTime >= {dateTimeFromSec} AND c.dateTime <= {dateTimeToSec}";
|
|
|
|
+ await foreach (var items in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetItemQueryStreamIterator(queryText: sql, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"ProdAnalysis") }))
|
|
|
|
+ {
|
|
|
|
+ var json = await JsonDocument.ParseAsync(items.ContentStream);
|
|
|
|
+ foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
|
|
|
|
+ {
|
|
|
|
+ ProdAnalysisApiResult data = obj.ToObject<ProdAnalysisApiResult>();
|
|
|
|
+ data.school.name = schName;
|
|
|
|
+ data.school.region = schRegion;
|
|
|
|
+ data.school.province = schProvince;
|
|
|
|
+ data.school.city = schCity;
|
|
|
|
+ data.school.dist = schDist;
|
|
|
|
+ data.school.areaId = schAreaId;
|
|
|
|
+ data.school.type = schType;
|
|
|
|
+ iotData.Add(data);
|
|
|
|
+ stuShow += data.stuShow;
|
|
|
|
+ stuLessonLengMin += data.stuLessonLengMin;
|
|
|
|
+ lessonRecord += data.lessonRecord;
|
|
|
|
+ lessonLengMin += data.stuLessonLengMin;
|
|
|
|
+ mission += data.mission;
|
|
|
|
+ missionFin += data.missionFin;
|
|
|
|
+ item += data.item;
|
|
|
|
+ interact += data.interact;
|
|
|
|
+ if (data.toolType.Equals("HiTeach")) htcDevList = htcDevList.Union(data.deviceList).ToList();
|
|
|
|
+ if (data.toolType.Equals("HiTA")) htaDevList = htaDevList.Union(data.deviceList).ToList();
|
|
|
|
+ if (data.toolType.Equals("HiTeachCC")) htccDevList = htccDevList.Union(data.deviceList).ToList();
|
|
|
|
+ lTypeCoop += data.lTypeCoop;
|
|
|
|
+ lTypeIact += data.lTypeIact;
|
|
|
|
+ lTypeMis += data.lTypeMis;
|
|
|
|
+ lTypeTst += data.lTypeTst;
|
|
|
|
+ lTypeDif += data.lTypeDif;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ int htcDevCnt = htcDevList.Count; ///設備統計-HiTeach上線數
|
|
|
|
+ int htcDevTotalCnt = 0; ///設備統計-HiTeach總設備數
|
|
|
|
+ sql = $"SELECT VALUE COUNT(1) FROM (SELECT DISTINCT x FROM c JOIN x IN c.deviceList WHERE c.schoolId = '{_schoolId}' AND c.dateUnit = 'day' AND c.toolType = 'HiTeach')";
|
|
|
|
+ await foreach (int items in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetItemQueryIterator<int>(queryText: sql, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"ProdAnalysis") }))
|
|
|
|
+ {
|
|
|
|
+ htcDevTotalCnt = items;
|
|
|
|
+ }
|
|
|
|
+ int htaDevCnt = htaDevList.Count; ///設備統計-HiTA上線數
|
|
|
|
+ int htaDevTotalCnt = 0; ///設備統計-HiTA總設備數
|
|
|
|
+ sql = $"SELECT VALUE COUNT(1) FROM (SELECT DISTINCT x FROM c JOIN x IN c.deviceList WHERE c.schoolId = '{_schoolId}' AND c.dateUnit = 'day' AND c.toolType = 'HiTA')";
|
|
|
|
+ await foreach (int items in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetItemQueryIterator<int>(queryText: sql, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"ProdAnalysis") }))
|
|
|
|
+ {
|
|
|
|
+ htaDevTotalCnt = items;
|
|
|
|
+ }
|
|
|
|
+ int htccDevCnt = htccDevList.Count; ///設備統計-HiTeachCC上線數
|
|
|
|
+
|
|
|
|
+ return Ok(new { sdate=$"{dateFromYear}-{dateFromMonth}-{dateFromDay}", edate=$"{dateToYear}-{dateToMonth}-{dateToDay}", classCnt, teacherCnt, studentCnt, deviceAuthCnt, stuShow, stuLessonLengMin, lessonRecord, lessonLengMin, mission, missionFin, item, interact, htcDevCnt, htcDevTotalCnt, htaDevCnt, htaDevTotalCnt, htccDevCnt, lTypeCoop, lTypeIact, lTypeMis, lTypeTst, lTypeDif, iotData });
|
|
|
|
+ }
|
|
|
|
+ catch (Exception ex)
|
|
|
|
+ {
|
|
|
|
+ await _dingDing.SendBotMsg($"OS,{_option.Location},school/init/get-school-iot\n{ex.Message}\n{ex.StackTrace}\n{request.ToJsonString()}", GroupNames.醍摩豆服務運維群組);
|
|
|
|
+ return BadRequest();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
//取得序號產品准許使用產品代碼列表
|
|
//取得序號產品准許使用產品代碼列表
|
|
public static List<string> getSerialPermitProdcodeList()
|
|
public static List<string> getSerialPermitProdcodeList()
|
|
{
|
|
{
|