123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686 |
- using Azure.Core;
- using Azure.Cosmos;
- using Azure.Storage.Blobs.Models;
- using DocumentFormat.OpenXml.Office2010.Excel;
- using DocumentFormat.OpenXml.Spreadsheet;
- using DocumentFormat.OpenXml.Wordprocessing;
- using HTEXLib.COMM.Helpers;
- using Microsoft.AspNetCore.Authorization;
- using Microsoft.AspNetCore.DataProtection;
- using Microsoft.AspNetCore.Hosting;
- using Microsoft.AspNetCore.Http;
- using Microsoft.AspNetCore.Mvc;
- using Microsoft.Azure.Amqp.Framing;
- using Microsoft.Extensions.Configuration;
- using Microsoft.Extensions.Hosting;
- using Microsoft.Extensions.Options;
- using Microsoft.OData.UriParser;
- using Newtonsoft.Json.Linq;
- using OfficeOpenXml.FormulaParsing.LexicalAnalysis;
- using StackExchange.Redis;
- using System;
- using System.Collections.Generic;
- using System.ComponentModel.DataAnnotations;
- using System.Dynamic;
- using System.IdentityModel.Tokens.Jwt;
- using System.Linq;
- using System.Net.Http;
- using System.Text.Json;
- using System.Threading.Tasks;
- using TEAMModelOS.Filter;
- using TEAMModelOS.Models;
- using TEAMModelOS.SDK;
- using TEAMModelOS.SDK.DI;
- using TEAMModelOS.SDK.Extension;
- using TEAMModelOS.SDK.Models;
- using TEAMModelOS.SDK.Models.Dtos;
- using TEAMModelOS.SDK.Models.Service;
- using TEAMModelOS.SDK.Services;
- using TEAMModelOS.Services;
- using Top.Api;
- using static TEAMModelOS.SDK.Services.BlobService;
- namespace TEAMModelOS.Controllers.Client
- {
- [Route("hita")]
- [ApiController]
- public class HiTAControlller : ControllerBase
- {
- private readonly AzureStorageFactory _azureStorage;
- private readonly AzureRedisFactory _azureRedis;
- private readonly AzureCosmosFactory _azureCosmos;
- private readonly DingDing _dingDing;
- private readonly Option _option;
- private readonly SnowflakeId _snowflakeId;
- private readonly IConfiguration _configuration;
- private readonly IPSearcher _searcher;
- private readonly HttpTrigger _httpTrigger;
- private readonly CoreAPIHttpService _coreAPIHttpService;
- private readonly IWebHostEnvironment _environment;
- public readonly IHttpClientFactory _httpClientFactory;
- public HiTAControlller(IWebHostEnvironment environment,
- CoreAPIHttpService coreAPIHttpService,
- AzureStorageFactory azureStorage,
- AzureRedisFactory azureRedis,
- AzureCosmosFactory azureCosmos,
- DingDing dingDing,
- SnowflakeId snowflakeId,
- IOptionsSnapshot<Option> option, IConfiguration configuration, IPSearcher searcher, HttpTrigger httpTrigger, IHttpClientFactory httpClientFactory)
- {
- _azureStorage = azureStorage;
- _azureRedis = azureRedis;
- _azureCosmos = azureCosmos;
- _dingDing = dingDing;
- _snowflakeId = snowflakeId;
- _option = option?.Value;
- _configuration = configuration;
- _searcher = searcher;
- _httpTrigger = httpTrigger;
- _coreAPIHttpService = coreAPIHttpService;
- _environment = environment; _httpClientFactory = httpClientFactory;
- }
- public class HiTAJoinSchool
- {
- public string type { get; set; }
- //[Required(ErrorMessage = "{0} 必须填写")]
- public string id { get; set; }
- //[Required(ErrorMessage = "{0} 必须填写")]
- public string name { get; set; }
- //[Required(ErrorMessage = "{0} 必须填写")]
- public string pic { get; set; }
- public string school { get; set; }
- public long ts { get; set; }
- public string id_token { get; set; }
- public string code { get; set; }
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="json"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- [HttpPost("school-join")]
- //[Authorize(Roles = "HiTA")]
- public async Task<IActionResult> SchoolJoin(HiTAJoinSchool join)
- {
- try
- {
- Dictionary<string, object> dict = new Dictionary<string, object>();
- Dictionary<string, object> qure = new Dictionary<string, object>();
- foreach (var a in HttpContext.Request.Query)
- {
- qure.Add(a.Key, a.Value);
- }
- foreach (var a in HttpContext.Request.Headers)
- {
- dict.Add(a.Key, a.Value);
- }
- //await _dingDing.SendBotMsg(join.ToJsonString()+ dict.ToJsonString(), GroupNames.成都开发測試群組);
-
- if (!string.IsNullOrWhiteSpace(join.id_token) && !string.IsNullOrWhiteSpace(join.school) && join.school.Contains("login:"))
- {
- var jwt = new JwtSecurityToken(join.id_token);
- //await _dingDing.SendBotMsg(join.ToJsonString(), GroupNames.成都开发測試群組);
- var id = jwt.Payload.Sub;
- await _azureRedis.GetRedisClient(8).StringSetAsync($"HiTA:Login:{join.school.Replace("login:", "")}", id, expiry: new TimeSpan(0, 0, 10));
- return Ok(new { name = ",关闭弹窗以获取登录信息", school = "tmd" });
- }
- if (!string.IsNullOrWhiteSpace(join.id_token) && !string.IsNullOrWhiteSpace(join.school))
- {
- var jwt = new JwtSecurityToken(join.id_token);
- //await _dingDing.SendBotMsg(join.ToJsonString(), GroupNames.成都开发測試群組);
- var id = jwt.Payload.Sub;
- string school = join.school;
- //權限token
- jwt.Payload.TryGetValue("name", out object name);
- //jwt.Payload.TryGetValue("picture", out object picture);
- long ts = join.ts;
- (int code, string msg, object data) res = await SchoolService.JoinScool(school, id, $"{name}", "", ts, _azureCosmos, _azureStorage, _coreAPIHttpService, _dingDing, _option, _configuration, _environment);
- if (res.data != null)
- {
- return Ok(res.data);
- }
- else
- {
- return Ok(new { error = res.code, res.msg });
- }
- }
- else
- {
- return Ok(new { error = 400, msg = "参数错误" });
- }
- }
- catch (Exception ex)
- {
- await _dingDing.SendBotMsg($"{ex.Message},{ex.StackTrace}", GroupNames.成都开发測試群組);
- return Ok(new { error = 400, msg = "参数错误" });
- }
- }
- [ProducesDefaultResponseType]
- [HttpGet("get-school-knowledge")]
- public async Task<IActionResult> GetSchoolKnowledge([FromQuery] HiTAJoinSchool join)
- {
- string sql = $"select value c from c where c.subjectId='{join.id}' and c.periodId='{join.code}' ";
- var reslut= await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<Knowledge>(sql, $"Knowledge-{join.school}-{join.id}");
- if (reslut.list.IsNotEmpty()) {
- return Ok(new { code = 200, points= reslut.list.First().points, blocks = reslut.list.First().blocks});
- }
- return Ok(new { code=1});
- }
- [ProducesDefaultResponseType]
- [HttpPost("refresh-access-token")]
- [AuthToken(Roles = "teacher,admin")]
- public async Task<IActionResult> RefreshAccessToken(JsonElement json) {
- if (!json.TryGetProperty("refresh-token", out JsonElement _refreshtoken))
- {
- return Ok(new { code = 1, msg = "刷新失败!" });
- }
- try {
- var refreshtoken = $"{_refreshtoken}".Replace("Bearer ", "");
- var clientID = _configuration.GetValue<string>("HaBookAuth:CoreService:clientID");
- var clientSecret = _configuration.GetValue<string>("HaBookAuth:CoreService:clientSecret");
- var authorizationJwt = new JwtSecurityToken(refreshtoken);
- if (authorizationJwt.Payload.Azp.Equals(clientID))
- {
- //检查旧的Token验证是否通过
- JwtSecurityToken securityToken = await CoreTokenExtensions.Validate(refreshtoken, _option.Location.Replace("-Dep", "").Replace("-Test", ""), $"{authorizationJwt.Payload["tid"]}", _configuration);
- if (securityToken!=null)
- {
- //重新生成新的
- var token = await CoreTokenExtensions.CreateAccessToken(clientID, clientSecret, _option.Location.Replace("-Dep", "").Replace("-Test", ""));
- return Ok(new { code = 200, access_token = token.AccessToken, token_type = token.TokenType, expires_in = token.ExpiresOn });
- }
- }
- }
- catch (Exception ex) { return Ok(new { code = 1, msg = "刷新失败!" }); }
- return Ok(new { code = 1, msg = "刷新失败!" });
- }
- [ProducesDefaultResponseType]
- [HttpGet("get-school-data")]
- public async Task<IActionResult> GetSchoolData([FromQuery] HiTAJoinSchool join)
- {
- IList<IdCodeNameCount> periodSubjects = new List<IdCodeNameCount>();
- School school= await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(join.school, new PartitionKey("Base"));
- foreach(var period in school.period)
- {
- foreach (var subject in period.subjects) {
- string name = subject.name;
- if (school.period.Count>1) {
- name=$"{period.name} {subject.name}";
- }
- string key = $"Knowledge:Count:{school.id}-{subject.id}";
- int pcount = 0;
- var value= _azureRedis.GetRedisClient(8).HashGet(key,period.id) ;
- if (value!=default && !value.IsNullOrEmpty) {
- var json = value.ToString().ToObject<JsonElement>();
-
- if (json.TryGetProperty("pcount", out JsonElement _pcount) && int.TryParse($"{_pcount}",out pcount)) {
-
- }
- }
- periodSubjects.Add(new IdCodeNameCount {
- periodId=period.id,
- periodName=period.name,
- periodType =period.periodType,
- subjectId=subject.id,
- subjectName=subject.name,
- name=name,
- count = pcount
- });
- }
- }
- var id_token = new JwtSecurityToken($"{join.id_token}");
- var auth_token = string.Empty;
- var response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(id_token.Payload.Sub, new PartitionKey($"Teacher-{join.school}"));
- if (response.Status == 200) {
- id_token.Payload.TryGetValue("name", out object name);
- id_token.Payload.TryGetValue("picture", out object picture);
- SchoolTeacher schoolTeacher = JsonDocument.Parse(response.ContentStream).RootElement.ToObject<SchoolTeacher>();
- auth_token = JwtAuthExtension.CreateAuthToken(_option.HostName, id_token.Payload.Sub, $"{name}",$"{picture}", _option.JwtSecretKey, Website: "IES", scope: Constant.ScopeTeacher, schoolID: join.school, areaId: school.areaId, standard: school.standard, roles: schoolTeacher.roles.ToArray(), permissions:schoolTeacher.permissions.ToArray(), expire: 1);
- }
- await SystemService.RecordAccumulateData(_azureRedis, _dingDing, new SDK.Models.Dtos.Accumulate { client="hita", count=1, id=school.id, key="teacher_login", name=school.name, scope="school", target=school.id });
- return Ok(new { periodSubjects,auth_token });
- }
-
- [ProducesDefaultResponseType]
- [HttpGet("check-login")]
- public async Task<IActionResult> CheckLogin([FromQuery] HiTAJoinSchool join)
- {
- var data = await _azureRedis.GetRedisClient(8).StringGetAsync($"HiTA:Login:{join.code}");
- if (data.HasValue)
- {
- var id = data.ToString();
- var location = _option.Location;
- var clientID = _configuration.GetValue<string>("HaBookAuth:CoreService:clientID");
- TmdidImplicit implicit_token = await _coreAPIHttpService.Implicit(new Dictionary<string, string>()
- {
- { "grant_type", "implicit" },
- { "client_id",clientID },
- { "account",id },
- { "nonce",Guid.NewGuid().ToString()}
- }, location, _configuration);
- IEnumerable<dynamic> schools= new List<dynamic>();
- var response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReadItemStreamAsync(id, new PartitionKey("Base"));
- if (response.Status==200) {
- Teacher teacher= JsonDocument.Parse(response.Content).RootElement.ToObject<Teacher>();
- schools= teacher.schools.Where(x=>x.status.Equals("join")).Select(x => new { id = x.schoolId, name = x.name });
- }
- object name = null, picture = null;
- var jwt = new JwtSecurityToken(implicit_token.id_token);
- jwt.Payload.TryGetValue("name", out name);
- jwt.Payload.TryGetValue("picture", out picture);
- jwt.Payload.TryGetValue("lang", out object _jwtlang);
- (string ip, string region) = await LoginService.LoginIp(HttpContext, _searcher);
- TeacherInfo teacherInfo= await TeacherService.TeacherInfoLite(_azureCosmos, $"{name}", $"{picture}", $"{jwt.Payload.Sub}", _azureStorage, _option, _azureRedis, "", _httpTrigger, $"{_jwtlang}");
- string x_auth_token = string.Empty;
- if (teacherInfo!=null) {
- x_auth_token= teacherInfo.auth_token;
- }
- return Ok(new { implicit_token ,schools, x_auth_token });
- }
- return Ok();
- }
- /// <summary>
- /// 扫码加入学校 //已被school-join 替代
- /// </summary>
- /// <param name="json"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- [HttpGet("join-school")]
- //[Authorize(Roles = "HiTA")]
- public async Task<IActionResult> ScanCodeJoinSchool([FromQuery] HiTAJoinSchool join)
- {
- Dictionary<string, object> dict = new Dictionary<string, object>();
- Dictionary<string, object> qure = new Dictionary<string, object>();
- foreach (var a in HttpContext.Request.Query)
- {
- qure.Add(a.Key, a.Value);
- }
- foreach (var a in HttpContext.Request.Headers)
- {
- dict.Add(a.Key, a.Value);
- }
- if (!string.IsNullOrWhiteSpace(join.type)&& join.type.Equals("login") && !string.IsNullOrWhiteSpace(join.code))
- {
- string idd = string.Empty;
- if (!string.IsNullOrWhiteSpace(join.id))
- {
- idd=join.id;
- }
- else {
- var jwt = new JwtSecurityToken(join.id_token);
- //await _dingDing.SendBotMsg(join.ToJsonString(), GroupNames.成都开发測試群組);
- idd = jwt.Payload.Sub;
- }
- await _azureRedis.GetRedisClient(8).StringSetAsync($"HiTA:Login:{join.code}", idd,expiry: new TimeSpan(0,0,30));
- return Ok(new { name= ",关闭弹窗以获取登录信息" ,school="tmd"});
- }
- await _dingDing.SendBotMsg(join.ToJsonString()+ dict.ToJsonString(), GroupNames.成都开发測試群組);
- string school = join.school;
- string id = join.id;
- string name = join.name;
- string picture = join.pic;
- long ts = join.ts;
- (int code ,string msg ,object data )res= await SchoolService. JoinScool(school, id, name, picture, ts,_azureCosmos,_azureStorage,_coreAPIHttpService,_dingDing,_option,_configuration,_environment);
- if (res.data != null)
- {
- return Ok(res.data);
- }
- else {
- return Ok(new { res.code,res.msg});
- }
- //return Ok(new { schoolTeacher.roles, schoolTeacher.status, school = $"{school}", schoolInfo.name, schoolInfo.picture });
- }
- //[Authorize(Roles = "HiTA")]
- [ProducesResponseType(StatusCodes.Status200OK)]
- [ProducesResponseType(StatusCodes.Status400BadRequest)]
- [ProducesDefaultResponseType]
- [HttpPost("get-teacher-info")]
- public async Task<IActionResult> GetTeacherInfo()
- {
- try
- {
- string id_token = HttpContext.GetXAuth("IdToken");
- (string ip, string region) = await LoginService.LoginIp(HttpContext, _searcher);
- if (string.IsNullOrEmpty(id_token)) return BadRequest();
- var jwt = new JwtSecurityToken(id_token);
- if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.OrdinalIgnoreCase)) return BadRequest();
- var id = jwt.Payload.Sub;
- var clientc = _azureCosmos.GetCosmosClient();
- var clientr = _azureRedis.GetRedisClient(8);
- var response = await clientc.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemStreamAsync(id, new PartitionKey("Base"));
- if (response.Status == 200)
- {
- var jsonsc = await JsonDocument.ParseAsync(response.ContentStream);
- //學校資訊
- List<dynamic> schools = new List<dynamic>();
- if (jsonsc.RootElement.TryGetProperty("schools", out JsonElement value))
- {
- foreach (var obj in value.EnumerateArray())
- {
- string schoolCodeNow = $"{obj.GetProperty("schoolId")}";
- var clientss = _azureStorage.GetBlobContainerClient(schoolCodeNow);
- //Blob使用狀況
- //UsedBlob schoolUsedBlob = await BlobService.GetBlobUsed(clientc, clientss, clientr, "school", schoolCodeNow);
- (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);
- //管理者名單
- List<Dictionary<string, string>> adminList = new List<Dictionary<string, string>>();
- string querySchool = $"SELECT c.id, c.name FROM c WHERE ARRAY_CONTAINS(c.roles, 'admin', true)";
- await foreach (var item in clientc.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(querySchool, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Teacher-{schoolCodeNow}") }))
- {
- using var json = await JsonDocument.ParseAsync(item.ContentStream);
- if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
- {
- foreach (var objadmin in json.RootElement.GetProperty("Documents").EnumerateArray())
- {
- Dictionary<string, string> adminRow = new Dictionary<string, string>();
- adminRow.Add("id", objadmin.GetProperty("id").GetString());
- adminRow.Add("name", objadmin.GetProperty("name").GetString());
- adminList.Add(adminRow);
- }
- }
- }
- //老師在此學校的課程
- List<dynamic> coursesch = new List<dynamic>();
- var query = $"SELECT c.id, c.name, c.no FROM c JOIN schedule IN c.schedule WHERE schedule.teacherId = '{id}'";
- await foreach (var item in clientc.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{schoolCodeNow}") }))
- {
- var jsoncs = await JsonDocument.ParseAsync(item.ContentStream);
- if (jsoncs.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
- {
- foreach (var obj2 in jsoncs.RootElement.GetProperty("Documents").EnumerateArray())
- {
- dynamic courseExtobj = new ExpandoObject();
- courseExtobj.id = obj2.GetProperty("id");
- courseExtobj.name = obj2.GetProperty("name");
- courseExtobj.no = obj2.GetProperty("no");
- coursesch.Add(courseExtobj);
- }
- }
- }
-
-
- //學校資料生成
- dynamic schoolExtobj = new ExpandoObject();
- var schoolJson = await clientc.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{obj.GetProperty("schoolId")}", new PartitionKey("Base"));
- var school = await JsonDocument.ParseAsync(schoolJson.ContentStream);
- try
- {
- schoolExtobj.schoolId = obj.GetProperty("schoolId");
- schoolExtobj.name = school.RootElement.GetProperty("name");
- schoolExtobj.region = school.RootElement.GetProperty("region");
- schoolExtobj.province = school.RootElement.GetProperty("province");
- schoolExtobj.city = school.RootElement.GetProperty("city");
- schoolExtobj.status = obj.GetProperty("status");
- schoolExtobj.picture = school.RootElement.GetProperty("picture");
- schoolExtobj.size = new ExpandoObject();
- schoolExtobj.size.used = schoolUsedBlob.usedSize + schoolUsedBlob.teach * 1073741824;
- long ssize = (school.RootElement.TryGetProperty("size", out JsonElement ssizeJson)) ? ssizeJson.GetInt32() : 0;
- schoolExtobj.size.total = ssize * 1073741824;
- schoolExtobj.size.avaliable = schoolExtobj.size.total - schoolExtobj.size.used;
- schoolExtobj.admin = adminList;
- schoolExtobj.courses = coursesch;
- schools.Add(schoolExtobj);
- }
- catch (Exception)
- {
- await _dingDing.SendBotMsg($"IES5,{_option.Location},HiTA/Debug()\nJson:{schoolJson}\n schoolExtobj:{schoolExtobj}", GroupNames.醍摩豆服務運維群組);
- }
- }
- }
- //預設學校
- string defaultschool = null;
- if (jsonsc.RootElement.TryGetProperty("defaultSchool", out JsonElement defaultSchoolJson) && !defaultSchoolJson.ValueKind.Equals(JsonValueKind.Null))
- {
- defaultschool = defaultSchoolJson.GetString();
- }
- //老師個人課程
- List<dynamic> courses = new List<dynamic>();
- await foreach (var item in clientc.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryStreamIterator(queryText: $"SELECT c.id, c.name, c.no FROM c ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{id}") }))
- {
- var jsontcs = await JsonDocument.ParseAsync(item.ContentStream);
- if (jsontcs.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
- {
- foreach (var obj in jsontcs.RootElement.GetProperty("Documents").EnumerateArray())
- {
- dynamic courseExtobj = new ExpandoObject();
- courseExtobj.id = obj.GetProperty("id");
- courseExtobj.name = obj.GetProperty("name");
- courseExtobj.no = obj.GetProperty("no");
- courses.Add(courseExtobj);
- }
- }
- }
- //老師個人空間 ※老師可用的空間 = (Teacher)Base.size + (School)各校的Teacher-{schoolCode}
- dynamic size = new ExpandoObject();
- size.resource = 0;
- size.records = 0;
- size.used = 0;
- size.total = 0;
- var clientst = _azureStorage.GetBlobContainerClient(id);
- ////個人可用空間
- if (jsonsc.RootElement.TryGetProperty("size", out JsonElement teaSizeTotalJson) && teaSizeTotalJson.ValueKind.Equals(JsonValueKind.Number))
- {
- size.total += teaSizeTotalJson.GetInt32();
- }
- ////學校分派給老師的空間
- int GsizeFromSchool = 0;
- string querySizeFromSchool = $"SELECT sum(c.size) as size FROM c WHERE CONTAINS(c.code, 'Teacher-') AND c.id = '{id}'";
- await foreach (var item in clientc.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(querySizeFromSchool, requestOptions: new QueryRequestOptions() { }))
- {
- var json = await JsonDocument.ParseAsync(item.ContentStream);
- foreach (var elmt in json.RootElement.GetProperty("Documents").EnumerateArray())
- {
- if (elmt.TryGetProperty("size", out JsonElement sizeJson) && sizeJson.ValueKind.Equals(JsonValueKind.Number))
- {
- GsizeFromSchool = sizeJson.GetInt32();
- break;
- }
- }
- }
- size.total += GsizeFromSchool;
- size.total = Convert.ToInt64(size.total) * 1073741824;
- ////個人空間使用狀況
- (long usedSize, long teach, long total, long surplus, Dictionary<string, double?> catalog) teacherUsedBlob = await BlobService.GetSurplusSpace(id, "private", _option.Location, _azureCosmos, _azureRedis, _azureStorage, _dingDing,_httpTrigger);
- // UsedBlob teacherUsedBlob = await BlobService.GetBlobUsed(clientc, clientst, clientr, "private", id);
- size.used = teacherUsedBlob.usedSize;
- foreach (KeyValuePair<string, double?> blobCatalog in teacherUsedBlob.catalog)
- {
- if (blobCatalog.Key.Equals("records"))
- {
- size.records = blobCatalog.Value;
- }
- else
- {
- size.resource += blobCatalog.Value;
- }
- }
- //資源數
- int resCount = 0; //教材數
- int itemCount = 0; //題目數
- int paperCount = 0; //試卷數
- //取得老師題目數
- await foreach (var itemC in clientc.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryStreamIterator(queryText: $"SELECT COUNT(1) AS count FROM c WHERE c.pid = null", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Item-{id}") }))
- {
- using var json = await JsonDocument.ParseAsync(itemC.ContentStream);
- if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
- {
- foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
- {
- itemCount += obj.GetProperty("count").GetInt32();
- }
- }
- }
- //取得老師試卷數
- await foreach (var paperC in clientc.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryStreamIterator(queryText: $"SELECT COUNT(1) AS count FROM c WHERE c.scope = 'private'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{id}") }))
- {
- using var json = await JsonDocument.ParseAsync(paperC.ContentStream);
- if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
- {
- foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
- {
- paperCount += obj.GetProperty("count").GetInt32();
- }
- }
- }
- List<BlobCount> blogCountList = await BloblogCount(clientc, "private", id, "", "");
- foreach (BlobCount blobCountRow in blogCountList)
- {
- switch (blobCountRow.type)
- {
- case "doc":
- case "image":
- case "res":
- case "video":
- case "audio":
- case "other":
- resCount += blobCountRow.count;
- break;
- }
- }
- //進行中的活動數
- int activityCount = 0;
- List<string> examIdList = new List<string>();
- await foreach (var actitem in clientc.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryStreamIterator(queryText: $"SELECT COUNT(1) AS count FROM c where (c.status<>404 or IS_DEFINED(c.status) = false ) and c.progress = 'going'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Exam-{id}") }))
- {
- using var json = await JsonDocument.ParseAsync(actitem.ContentStream);
- if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
- {
- foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
- {
- activityCount += obj.GetProperty("count").GetInt32();
- }
- }
- }
- await foreach (var actitem in clientc.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryStreamIterator(queryText: $"SELECT COUNT(1) AS count FROM c where (c.status<>404 or IS_DEFINED(c.status) = false ) and c.progress = 'going'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Homework-{id}") }))
- {
- using var json = await JsonDocument.ParseAsync(actitem.ContentStream);
- if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
- {
- foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
- {
- activityCount += obj.GetProperty("count").GetInt32();
- }
- }
- }
- //await foreach (var actitem in clientc.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryStreamIterator(queryText: $"SELECT COUNT(1) AS count FROM c WHERE c.progress = 'going'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Vote-{id}") }))
- //{
- // using var json = await JsonDocument.ParseAsync(actitem.ContentStream);
- // if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
- // {
- // foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
- // {
- // activityCount += obj.GetProperty("count").GetInt32();
- // }
- // }
- //}
- //await foreach (var actitem in clientc.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryStreamIterator(queryText: $"SELECT COUNT(1) AS count FROM c WHERE c.progress = 'going'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Survey-{id}") }))
- //{
- // using var json = await JsonDocument.ParseAsync(actitem.ContentStream);
- // if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
- // {
- // foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
- // {
- // activityCount += obj.GetProperty("count").GetInt32();
- // }
- // }
- //}
- //用户在线记录
- try
- {
- _ = _httpTrigger.RequestHttpTrigger(new { school = defaultschool, scope = $"{Constant.ScopeTeacher}", id = $"{id}", ip = $"{ip}", expire = 1 }, _option.Location, "online-record");
- }
- catch { }
- await SystemService.RecordAccumulateData(_azureRedis, _dingDing, new SDK.Models.Dtos.Accumulate { client="hita", count=1, id="ies", key="tmd_login", name="醍摩豆账号登录", scope="ies", target="ies" });
- return Ok(new { schools, defaultschool, courses, size, resCount, itemCount, paperCount, activityCount });
- }
- else //無此老師
- {
- return BadRequest();
- }
- }
- catch (Exception ex)
- {
- await _dingDing.SendBotMsg($"IES5,{_option.Location},HiTA/GetTeachInfo()\n{ex.Message}\n{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
- return BadRequest();
- }
- }
- //[Authorize(Roles = "HiTA")]
- [ProducesResponseType(StatusCodes.Status200OK)]
- [ProducesResponseType(StatusCodes.Status400BadRequest)]
- [ProducesDefaultResponseType]
- [HttpPost("get-school-list")]
- public async Task<IActionResult> GetSchoolListByRegion(JsonElement request)
- {
- try
- {
- //參數取得
- if (!request.TryGetProperty("regionName", out JsonElement regionNameJson)) return BadRequest();
- if (!request.TryGetProperty("provinceName", out JsonElement provinceNameJson)) return BadRequest();
- if (!request.TryGetProperty("cityName", out JsonElement cityNameJson)) return BadRequest();
- if (string.IsNullOrWhiteSpace(Convert.ToString(regionNameJson))) return BadRequest();
- string regionName = Convert.ToString(regionNameJson);
- string provinceName = (provinceNameJson.ValueKind.Equals(JsonValueKind.Null)) ? null : Convert.ToString(provinceNameJson);
- string cityName = (cityNameJson.ValueKind.Equals(JsonValueKind.Null)) ? null : Convert.ToString(cityNameJson);
- regionName = regionName.Replace("地區", "").Replace("地区", "");
- if (!string.IsNullOrWhiteSpace(provinceName)) provinceName = provinceName.Replace("省", "");
- if (!string.IsNullOrWhiteSpace(cityName)) cityName = cityName.Replace("市", "");
- //省 市
- //取得學校資訊
- List<SchoolSimple> schoolList = new List<SchoolSimple>();
- var clientc = _azureCosmos.GetCosmosClient();
- string querySchoolSelect = $"SELECT c.id, c.name FROM c";
- string querySchoolWhere1 = $"CONTAINS(c.region, '{regionName}')"; //依據地理資料(國省市)
- querySchoolWhere1 += (provinceName != null) ? $" AND CONTAINS(c.province, '{provinceName}')" : $" AND IS_NULL(c.province)";
- querySchoolWhere1 += (cityName != null) ? $" AND CONTAINS(c.city, '{cityName}')" : $" AND IS_NULL(c.city)";
- string querySchoolWhere2 = "IS_NULL(c.region)"; //無任何地理資料
- string querySchoolWhere = $" WHERE ({querySchoolWhere1}) OR ({querySchoolWhere2})";
- string querySchool = $"{querySchoolSelect}{querySchoolWhere}";
- await foreach (var item in clientc.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(querySchool, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base") }))
- {
- using var json = await JsonDocument.ParseAsync(item.ContentStream);
- if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
- {
- foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
- {
- SchoolSimple sch = new SchoolSimple();
- sch.id = Convert.ToString(obj.GetProperty("id"));
- sch.name = Convert.ToString(obj.GetProperty("name"));
- schoolList.Add(sch);
- }
- }
- }
- return Ok(schoolList);
- }
- catch (Exception ex)
- {
- await _dingDing.SendBotMsg($"IES5,{_option.Location},HiTA/GetSchoolListByRegion()\n{ex.Message}\n{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
- return BadRequest();
- }
- }
- private class SchoolSimple
- {
- public string id { get; set; }
- public string name { get; set; }
- }
- }
- }
|