|
@@ -1,9 +1,12 @@
|
|
|
using Azure.Cosmos;
|
|
|
using Azure.Storage.Blobs.Models;
|
|
|
+using Azure.Storage.Sas;
|
|
|
using DocumentFormat.OpenXml.Drawing.Charts;
|
|
|
using DocumentFormat.OpenXml.Office2010.Excel;
|
|
|
using DocumentFormat.OpenXml.Office2021.DocumentTasks;
|
|
|
+using DocumentFormat.OpenXml.Presentation;
|
|
|
using DocumentFormat.OpenXml.Spreadsheet;
|
|
|
+using DocumentFormat.OpenXml.Wordprocessing;
|
|
|
using HTEXLib.COMM.Helpers;
|
|
|
using Microsoft.AspNetCore.Authorization;
|
|
|
using Microsoft.AspNetCore.Http;
|
|
@@ -25,6 +28,8 @@ using System.Text;
|
|
|
using System.Text.Json;
|
|
|
using System.Threading.Tasks;
|
|
|
using TEAMModelOS.Controllers.Analysis;
|
|
|
+using TEAMModelOS.Controllers.Both;
|
|
|
+using TEAMModelOS.Filter;
|
|
|
using TEAMModelOS.Models;
|
|
|
using TEAMModelOS.SDK;
|
|
|
using TEAMModelOS.SDK.DI;
|
|
@@ -32,8 +37,13 @@ using TEAMModelOS.SDK.Extension;
|
|
|
using TEAMModelOS.SDK.Models;
|
|
|
using TEAMModelOS.SDK.Models.Cosmos.Common;
|
|
|
using TEAMModelOS.SDK.Models.Cosmos.Student;
|
|
|
+using TEAMModelOS.SDK.Models.Service;
|
|
|
using TEAMModelOS.SDK.Services;
|
|
|
+using TEAMModelOS.Services;
|
|
|
using static TEAMModelOS.SDK.Services.BlobService;
|
|
|
+using CourseDto = TEAMModelOS.Controllers.Both.CourseDto;
|
|
|
+using Period = TEAMModelOS.SDK.Models.Period;
|
|
|
+
|
|
|
namespace TEAMModelOS.Controllers
|
|
|
{
|
|
|
|
|
@@ -61,13 +71,16 @@ namespace TEAMModelOS.Controllers
|
|
|
private readonly Option _option;
|
|
|
private readonly SnowflakeId _snowflakeId;
|
|
|
private readonly IConfiguration _configuration;
|
|
|
+ private readonly CoreAPIHttpService _coreAPIHttpService;
|
|
|
+ private readonly HttpTrigger _httpTrigger;
|
|
|
+ private readonly IPSearcher _searcher;
|
|
|
public AClassONEController(
|
|
|
AzureStorageFactory azureStorage,
|
|
|
AzureRedisFactory azureRedis,
|
|
|
AzureCosmosFactory azureCosmos,
|
|
|
DingDing dingDing,
|
|
|
SnowflakeId snowflakeId,
|
|
|
- IOptionsSnapshot<Option> option, IHttpClientFactory httpClient, IConfiguration configuration)
|
|
|
+ IOptionsSnapshot<Option> option, IHttpClientFactory httpClient, IConfiguration configuration, CoreAPIHttpService coreAPIHttpService, IPSearcher searcher, HttpTrigger httpTrigger)
|
|
|
{
|
|
|
_azureStorage = azureStorage;
|
|
|
_azureRedis = azureRedis;
|
|
@@ -77,6 +90,9 @@ namespace TEAMModelOS.Controllers
|
|
|
_option = option?.Value;
|
|
|
_httpClient = httpClient;
|
|
|
_configuration = configuration;
|
|
|
+ _coreAPIHttpService=coreAPIHttpService;
|
|
|
+ _searcher=searcher;
|
|
|
+ _httpTrigger=httpTrigger;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -119,21 +135,527 @@ namespace TEAMModelOS.Controllers
|
|
|
return BadRequest(Content);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
/// <summary>
|
|
|
- /// 根据家长手机号获取监护学生的信息
|
|
|
+ /// 获取教师信息
|
|
|
/// </summary>
|
|
|
/// <param name="json"></param>
|
|
|
/// <returns></returns>
|
|
|
[ProducesDefaultResponseType]
|
|
|
- [HttpPost("get-students-by-mobile")]
|
|
|
+ [HttpPost("get-teacher-info")]
|
|
|
#if !DEBUG
|
|
|
[Authorize(Roles = "AClassONE")]
|
|
|
#endif
|
|
|
- public async Task<IActionResult> GetStudentsByPhone(JsonElement json) {
|
|
|
+ public async Task<IActionResult> GetTeacherInfo(JsonElement json)
|
|
|
+ {
|
|
|
+ string head_lang = "";
|
|
|
+
|
|
|
+ if (HttpContext.Request.Headers.TryGetValue("lang", out var _lang))
|
|
|
+ {
|
|
|
+ head_lang = $"{_lang}";
|
|
|
+ }
|
|
|
+ if (!json.TryGetProperty("code", out JsonElement _code)) return BadRequest("code is null");
|
|
|
+ var phoneInfo = await GetWeChatPhoneNumber(_code.ToString());
|
|
|
+ if (phoneInfo.code==200)
|
|
|
+ {
|
|
|
+ string _mobile = phoneInfo.phone.phoneNumber;
|
|
|
+ var coreUser = await _coreAPIHttpService.GetUserInfo(new Dictionary<string, string> { { "key", $"{_mobile}" } }, _option.Location, _configuration);
|
|
|
+ if (coreUser != null && coreUser.id != null)
|
|
|
+ {
|
|
|
+ (string ip, string region) = await LoginService.LoginIp(HttpContext, _searcher);
|
|
|
+ Teacher teacher = null;
|
|
|
+ TeacherInfo teacherInfo = await TeacherService.TeacherInfo(_azureCosmos, teacher, $"{coreUser.name}", $"{coreUser.picture}", coreUser.id, _azureStorage, _option, _azureRedis, ip, _httpTrigger, $"{_lang}");
|
|
|
+ return Ok(new
|
|
|
+ {
|
|
|
+ teacherInfo.auth_token,
|
|
|
+ teacherInfo.blob_uri,
|
|
|
+ teacherInfo.blob_sas,
|
|
|
+ teacherInfo.schools,
|
|
|
+ teacherInfo.defaultschool,
|
|
|
+ });
|
|
|
+ }
|
|
|
+ else return Ok(new { state = 404, msg = "未找到关联账号" });
|
|
|
+ }
|
|
|
return Ok();
|
|
|
}
|
|
|
+ /// <summary>
|
|
|
+ /// 获取学校信息
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="json"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [ProducesDefaultResponseType]
|
|
|
+ [HttpPost("get-school-info")]
|
|
|
+#if !DEBUG
|
|
|
+ [Authorize(Roles = "AClassONE")]
|
|
|
+#endif
|
|
|
+ [AuthToken(Roles = "teacher")]
|
|
|
+ public async Task<IActionResult> GetSchoolInfo(JsonElement json) {
|
|
|
+ (string tmdid, _, _, string school) = HttpContext.GetAuthTokenInfo();
|
|
|
+ if (!json.TryGetProperty("school_code", out JsonElement _school_code)) return BadRequest();
|
|
|
+ string school_code = $"{_school_code}";
|
|
|
+ List<string> roles = new List<string>();
|
|
|
+ List<string> permissions = new List<string>();
|
|
|
+ var client = _azureCosmos.GetCosmosClient();
|
|
|
+ int size = 0;
|
|
|
+ Teacher teacher = await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemAsync<Teacher>(tmdid, new PartitionKey("Base"));
|
|
|
+ List<AreaDto> areas = new List<AreaDto>();
|
|
|
+ HashSet<string> areaIds = new HashSet<string>();
|
|
|
+ if (teacher.areas.IsNotEmpty())
|
|
|
+ {
|
|
|
+ teacher.areas.ForEach(x => {
|
|
|
+ areaIds.Add(x.areaId);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ if (teacher.schools.IsNotEmpty())
|
|
|
+ {
|
|
|
+ teacher.schools.ForEach(x => {
|
|
|
+ if (!string.IsNullOrEmpty(x.areaId))
|
|
|
+ {
|
|
|
+ areaIds.Add(x.areaId);
|
|
|
+ }
|
|
|
|
|
|
+ });
|
|
|
+ }
|
|
|
+ List<Area> areasDbs = new List<Area>();
|
|
|
+ List<AreaSetting> areaSettings = new List<AreaSetting>();
|
|
|
+ if (areaIds.Count > 0)
|
|
|
+ {
|
|
|
+ string queryText = $"select value(c) from c where c.id in ({string.Join(",", areaIds.Select(x => $"'{x}'"))})";
|
|
|
+ await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Normal").GetItemQueryIterator<Area>(queryText: queryText, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base-Area") }))
|
|
|
+ {
|
|
|
+ areasDbs.Add(item);
|
|
|
+ }
|
|
|
+ await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Normal").GetItemQueryIterator<AreaSetting>(queryText: queryText, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("AreaSetting") }))
|
|
|
+ {
|
|
|
+ areaSettings.Add(item);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (teacher.areas.IsNotEmpty())
|
|
|
+ {
|
|
|
+ foreach (var areat in teacher.areas)
|
|
|
+ {
|
|
|
+
|
|
|
+ Area area = areasDbs.Find(x => x.id.Equals(areat.areaId));
|
|
|
+ AreaSetting setting = null;
|
|
|
+ if (area != null)
|
|
|
+ {
|
|
|
+ setting = areaSettings.Find(x => x.id.Equals(areat.areaId));
|
|
|
+ }
|
|
|
+
|
|
|
+ int access = 0;
|
|
|
+ if (setting != null && !string.IsNullOrWhiteSpace(setting.accessConfig))
|
|
|
+ {
|
|
|
+ access = 1;
|
|
|
+ }
|
|
|
+ //if (setting != null)
|
|
|
+ //{
|
|
|
+ // setting.accessConfig = null;
|
|
|
+ //}
|
|
|
+ areas.Add(new AreaDto { shortCode=area?.shortCode, areaId = area?.id, name = area?.name, standard = area?.standard, standardName = area?.standardName, setting = setting, access = access });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (school_code.Equals(teacher.defaultSchool) && teacher.schools.IsNotEmpty() && !teacher.schools.Select(x => x.schoolId).Contains(school_code))
|
|
|
+ {
|
|
|
+ school_code = teacher.schools[0].schoolId;
|
|
|
+ teacher.defaultSchool = school_code;
|
|
|
+ teacher = await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<Teacher>(teacher, tmdid, new PartitionKey("Base"));
|
|
|
+ }
|
|
|
+ var response = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(tmdid, new PartitionKey($"Teacher-{school_code}"));
|
|
|
+ string defaultPeriodId = "";
|
|
|
+ if (response.Status == 200)
|
|
|
+ {
|
|
|
+ using var jsonData = await JsonDocument.ParseAsync(response.ContentStream);
|
|
|
+ if (jsonData.RootElement.TryGetProperty("size", out JsonElement _size) && _size.ValueKind == JsonValueKind.Number)
|
|
|
+ {
|
|
|
+ size = _size.GetInt32();
|
|
|
+ }
|
|
|
+ if (jsonData.RootElement.TryGetProperty("periodId", out JsonElement _periodId))
|
|
|
+ {
|
|
|
+ defaultPeriodId =$"{_periodId}";
|
|
|
+ }
|
|
|
+ if (jsonData.RootElement.TryGetProperty("roles", out JsonElement _roles) && _roles.ValueKind != JsonValueKind.Null)
|
|
|
+ {
|
|
|
+ foreach (var obj in _roles.EnumerateArray())
|
|
|
+ {
|
|
|
+ roles.Add(obj.GetString());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (jsonData.RootElement.TryGetProperty("permissions", out JsonElement _permissions) && _permissions.ValueKind != JsonValueKind.Null)
|
|
|
+ {
|
|
|
+ foreach (var obj in _permissions.EnumerateArray())
|
|
|
+ {
|
|
|
+ permissions.Add(obj.GetString());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ var scteacher = jsonData.RootElement.ToObject<SchoolTeacher>();
|
|
|
+ if (!$"{teacher.name}".Equals($"{scteacher?.name}") || !$"{teacher.picture}".Equals($"{scteacher?.picture}"))
|
|
|
+ {
|
|
|
+ scteacher.name=teacher.name;
|
|
|
+ scteacher.picture=teacher.picture;
|
|
|
+ await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<SchoolTeacher>(scteacher, scteacher.id, new PartitionKey(scteacher.code));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (roles.Count == 0)
|
|
|
+ {
|
|
|
+ //助理,管家
|
|
|
+ //roles.Add("assist");
|
|
|
+ roles.Add("teacher");
|
|
|
+ }
|
|
|
+ School school_base = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>($"{school_code}", new PartitionKey("Base"));
|
|
|
+ string currAreaId = "";
|
|
|
+ dynamic currArea = new ExpandoObject();
|
|
|
+ if (!string.IsNullOrEmpty(school_base.areaId))
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ Area area = areasDbs.Find(x => x.id.Equals(school_base.areaId));
|
|
|
+ AreaSetting setting = null;
|
|
|
+ if (area != null)
|
|
|
+ {
|
|
|
+ //setting =await client.GetContainer(Constant.TEAMModelOS, "Normal").ReadItemAsync<AreaSetting>(school_base.areaId, new PartitionKey("AreaSetting"));
|
|
|
+ setting = areaSettings.Find(x => x.id.Equals(school_base.areaId));
|
|
|
+ }
|
|
|
+
|
|
|
+ int access = 0;
|
|
|
+ AccessConfig accessConfig = null;
|
|
|
+ if (setting != null && !string.IsNullOrWhiteSpace(setting.accessConfig))
|
|
|
+ {
|
|
|
+ access = 1;
|
|
|
+ accessConfig = setting.accessConfig.ToObject<AccessConfig>();
|
|
|
+ }
|
|
|
+ //if (setting!=null&& !string.IsNullOrEmpty(setting.accessConfig)) {
|
|
|
+ // setting.accessConfig = null;
|
|
|
+ //}
|
|
|
+ currArea = new
|
|
|
+ {
|
|
|
+ shortCode = area?.shortCode,
|
|
|
+ areaId = area?.id,
|
|
|
+ name = area?.name,
|
|
|
+ standard = area?.standard,
|
|
|
+ standardName = area?.standardName,
|
|
|
+ setting = setting,
|
|
|
+ access = access,
|
|
|
+ //submitType=accessConfig?.submitType,
|
|
|
+ homeworkType = accessConfig != null && accessConfig.homeworkType.IsNotEmpty() ? accessConfig.homeworkType : new List<string> { "pdf" },
|
|
|
+ };
|
|
|
+ currAreaId = area?.id;
|
|
|
+ }
|
|
|
+ catch (CosmosException)
|
|
|
+ {
|
|
|
+ //数据库捞不到数据
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (areas.Count > 0)
|
|
|
+ {
|
|
|
+ roles.Add("area");
|
|
|
+ }
|
|
|
+ areas.ForEach(x => { { if (x.setting != null) { x.setting.accessConfig = x.setting.accessConfig; } } });
|
|
|
+
|
|
|
+ var auth_token = JwtAuthExtension.CreateAuthToken(_option.HostName,teacher. id, teacher.name, teacher.picture, _option.JwtSecretKey, Website: "IES", scope: Constant.ScopeTeacher, schoolID: school_code.ToString(), areaId: currAreaId, standard: school_base.standard, roles: roles.ToArray(), permissions: permissions.ToArray(), expire: 1);
|
|
|
+ string school_code_blob = school_code.ToLower();
|
|
|
+ var container = _azureStorage.GetBlobContainerClient(school_code_blob);
|
|
|
+ await container.CreateIfNotExistsAsync(PublicAccessType.None); //嘗試創建School容器,如存在則不做任何事,保障容器一定存在
|
|
|
+ var (blob_uri, blob_sas) = (roles.Contains("admin") || permissions.Contains("schoolAc-upd")) ? _azureStorage.GetBlobContainerSAS(school_code_blob, BlobContainerSasPermissions.Write | BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List | BlobContainerSasPermissions.Delete) : _azureStorage.GetBlobContainerSAS(school_code_blob, BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List | BlobContainerSasPermissions.Write);
|
|
|
+
|
|
|
+ return Ok(new {
|
|
|
+ auth_token,
|
|
|
+ blob_uri,
|
|
|
+ blob_sas,
|
|
|
+ school_base,
|
|
|
+ areas,
|
|
|
+ currArea,
|
|
|
+ });
|
|
|
+ }
|
|
|
+ /// <summary>
|
|
|
+ /// 获取教师的教学信息
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="json"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [ProducesDefaultResponseType]
|
|
|
+ [HttpPost("get-teach-info")]
|
|
|
+#if !DEBUG
|
|
|
+ [Authorize(Roles = "AClassONE")]
|
|
|
+#endif
|
|
|
+ [AuthToken(Roles = "teacher")]
|
|
|
+ public async Task<IActionResult> GetTeachInfo(JsonElement json) {
|
|
|
+ (string tmdid, _, _, string school) = HttpContext.GetAuthTokenInfo();
|
|
|
+ List<KeyValuePair<string, CourseTask>> schoolTeacherTask = new List<KeyValuePair<string, CourseTask>>();
|
|
|
+ List<KeyValuePair<string, CourseTask>> schoolAssistantTask = new List<KeyValuePair<string, CourseTask>>();
|
|
|
+
|
|
|
+ List<KeyValuePair<string, CourseTask>> privateTeacherTask = new List<KeyValuePair<string, CourseTask>>();
|
|
|
+ List<KeyValuePair<string, CourseTask>> privateAssistantTask = new List<KeyValuePair<string, CourseTask>>();
|
|
|
+ List<Both.CourseDto> schoolCourses = new List<CourseDto>();
|
|
|
+ List<CourseDto> teahcerCourses = new List<CourseDto>();
|
|
|
+ List<string> groupIds = new List<string>();
|
|
|
+ HashSet<string> hashGroupIds = new HashSet<string>();
|
|
|
+ List<Class> classes = new List<Class>();
|
|
|
+ Period periodSchool = null;
|
|
|
+ if (!string.IsNullOrWhiteSpace(school)) {
|
|
|
+ //班主任
|
|
|
+ string sqlClassTeacher = $"select value c from c where c.teacher.id='{tmdid}'";
|
|
|
+ var resultClass = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<Class>(sqlClassTeacher, $"Class-{school}");
|
|
|
+ if (resultClass.list.IsNotEmpty())
|
|
|
+ {
|
|
|
+ classes.AddRange(resultClass.list);
|
|
|
+ hashGroupIds = new HashSet<string>(resultClass.list.Select(z=>z.id));
|
|
|
+ }
|
|
|
+ //执教
|
|
|
+ //协同
|
|
|
+ //管理员
|
|
|
+ string sql = $"SELECT distinct value c FROM c join b in c.schedules where c.pk='CourseTask' and (ARRAY_CONTAINS(b.assistants,'{tmdid}')or b.teacherId ='{tmdid}' )";
|
|
|
+
|
|
|
+ School schoolBase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(school, new PartitionKey("Base"));
|
|
|
+ JsonElement year = default, semesterId = default, _periodId = default;
|
|
|
+ int _year = -1;
|
|
|
+ string _semesterId=string.Empty;
|
|
|
+ if (!json.TryGetProperty("periodId", out _periodId)) return BadRequest();
|
|
|
+ if (json.TryGetProperty("year", out year))
|
|
|
+ {
|
|
|
+ _year= int.Parse($"{_year}");
|
|
|
+ }
|
|
|
+ if (json.TryGetProperty("semesterId", out semesterId))
|
|
|
+ {
|
|
|
+ _semesterId=$"{semesterId}";
|
|
|
+ }
|
|
|
+
|
|
|
+ var period = schoolBase.period.Find(x => x.id.Equals($"{_periodId}"));
|
|
|
+ periodSchool=period;
|
|
|
+ if (_year==-1 || string.IsNullOrWhiteSpace(_semesterId))
|
|
|
+ {
|
|
|
+
|
|
|
+ var semesterInfo = SchoolService.GetSemester(period, DateTimeOffset.UtcNow.ToUnixTimeMilliseconds());
|
|
|
+ if (_year==-1) {
|
|
|
+ _year=semesterInfo.studyYear;
|
|
|
+ }
|
|
|
+ if (string.IsNullOrWhiteSpace(_semesterId)) {
|
|
|
+ _semesterId=semesterInfo.currSemester.id;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //string date = SchoolService.GetOpensByStudyYearAndSemester(period.semesters, int.Parse($"{_year}"), $"{_semesterId}");
|
|
|
+ sql = $"{sql} and c.year={_year} and c.semesterId='{_semesterId}'";
|
|
|
+ HashSet<string> courseIds = new HashSet<string>();
|
|
|
+ var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<CourseTask>(sql, $"CourseTask-{school}");
|
|
|
+ if (resultSchool.list.IsNotEmpty())
|
|
|
+ {
|
|
|
+ resultSchool.list.ForEach(x => {
|
|
|
+ var schedulesTeacher = x.schedules.Where(z => !string.IsNullOrWhiteSpace(z.teacherId) && z.teacherId.Equals(tmdid));
|
|
|
+ if (schedulesTeacher.Any())
|
|
|
+ {
|
|
|
+ courseIds.Add(x.courseId);
|
|
|
+ CourseTask courseTask = x.ToJsonString().ToObject<CourseTask>();
|
|
|
+ courseTask.schedules=schedulesTeacher.ToList();
|
|
|
+ schoolTeacherTask.Add(new KeyValuePair<string, CourseTask>(x.courseId, courseTask));
|
|
|
+
|
|
|
+ //groupIds.AddRange(schedulesTeacher.Where(z => !string.IsNullOrWhiteSpace(z.groupId)).Select(x => x.groupId));
|
|
|
+ var gpids= schedulesTeacher.Where(z => !string.IsNullOrWhiteSpace(z.groupId)).Select(x => x.groupId);
|
|
|
+ if (gpids!=null && gpids.Count()>0)
|
|
|
+ {
|
|
|
+ foreach (var gp in gpids) {
|
|
|
+ hashGroupIds.Add(gp);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ var schedulesAssistant = x.schedules.Where(z => z.assistants.Contains(tmdid));
|
|
|
+ if (schedulesAssistant.Any())
|
|
|
+ {
|
|
|
+ courseIds.Add(x.courseId);
|
|
|
+ CourseTask courseTask = x.ToJsonString().ToObject<CourseTask>();
|
|
|
+ courseTask.schedules=schedulesAssistant.ToList();
|
|
|
+ schoolAssistantTask.Add(new KeyValuePair<string, CourseTask>(x.courseId, courseTask));
|
|
|
+ //groupIds.AddRange(schedulesAssistant.Where(z => !string.IsNullOrWhiteSpace(z.groupId)).Select(x => x.groupId));
|
|
|
+ var gpids = schedulesAssistant.Where(z => !string.IsNullOrWhiteSpace(z.groupId)).Select(x => x.groupId);
|
|
|
+ if (gpids!=null && gpids.Count()>0)
|
|
|
+ {
|
|
|
+ foreach (var gp in gpids)
|
|
|
+ {
|
|
|
+ hashGroupIds.Add(gp);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ if (courseIds.Any())
|
|
|
+ {
|
|
|
+ string sqlCourse = $"select value c from c where c.id in ({string.Join(",", courseIds.Select(b => $"'{b}'"))})";
|
|
|
+ var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<CourseBase>(sqlCourse, $"CourseBase-{school}");
|
|
|
+ if (result.list.IsNotEmpty())
|
|
|
+ {
|
|
|
+ foreach (var item in result.list)
|
|
|
+ {
|
|
|
+ List<CourseTaskDto> courseTaskDtos = new List<CourseTaskDto>();
|
|
|
+ var teacher = schoolTeacherTask.Where(x => x.Key.Equals(item.id)).Select(z => new CourseTaskDto { courseTask=z.Value, type="teacher" });
|
|
|
+ if (teacher.Any())
|
|
|
+ {
|
|
|
+ courseTaskDtos.AddRange(teacher.ToList());
|
|
|
+ }
|
|
|
+ var assistant = schoolAssistantTask.Where(x => x.Key.Equals(item.id)).Select(z => new CourseTaskDto { courseTask=z.Value, type="assistant" });
|
|
|
+ if (assistant.Any())
|
|
|
+ {
|
|
|
+ courseTaskDtos.AddRange(assistant.ToList());
|
|
|
+ }
|
|
|
+ schoolCourses.Add(new Both.CourseDto { courseBase=item, courseTasks=courseTaskDtos });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //个人
|
|
|
+ {
|
|
|
+ HashSet<string> courseIds = new HashSet<string>();
|
|
|
+ string sqlCoursePrivate = $"select value c.id from c where c.creatorId='{tmdid}'";
|
|
|
+ var resultCourseBasePrivate = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<string>(sqlCoursePrivate, $"CourseBase");
|
|
|
+ if (resultCourseBasePrivate.list.IsNotEmpty())
|
|
|
+ {
|
|
|
+ courseIds=new HashSet<string>(resultCourseBasePrivate.list);
|
|
|
+ }
|
|
|
+ string sqlprivate = $"SELECT distinct value c FROM c join b in c.schedules where c.pk='CourseTask' and (ARRAY_CONTAINS(b.assistants,'{tmdid}')or b.teacherId ='{tmdid}' )";
|
|
|
+ var resultTeacher = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<CourseTask>(sqlprivate, $"CourseTask");
|
|
|
+ if (resultTeacher.list.IsNotEmpty())
|
|
|
+ {
|
|
|
+
|
|
|
+ resultTeacher.list.ForEach(x => {
|
|
|
+ var schedulesTeacher = x.schedules.Where(z => !string.IsNullOrWhiteSpace(z.teacherId) && z.teacherId.Equals(tmdid));
|
|
|
+ if (schedulesTeacher.Any())
|
|
|
+ {
|
|
|
+ courseIds.Add(x.courseId);
|
|
|
+ CourseTask courseTask = x.ToJsonString().ToObject<CourseTask>();
|
|
|
+ courseTask.schedules=schedulesTeacher.ToList();
|
|
|
+ privateTeacherTask.Add(new KeyValuePair<string, CourseTask>(x.courseId, courseTask));
|
|
|
+ groupIds.AddRange(schedulesTeacher.Where(z => !string.IsNullOrWhiteSpace(z.groupId)).Select(x => x.groupId));
|
|
|
+ var gpids = schedulesTeacher.Where(z => !string.IsNullOrWhiteSpace(z.groupId));
|
|
|
+ if (gpids!=null && gpids.Count()>0)
|
|
|
+ {
|
|
|
+ foreach (var gp in gpids)
|
|
|
+ {
|
|
|
+ if (!string.IsNullOrWhiteSpace(gp.school))
|
|
|
+ {
|
|
|
+ if (!string.IsNullOrWhiteSpace(school) && gp.school.Equals(school))
|
|
|
+ {
|
|
|
+ hashGroupIds.Add(gp.groupId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ hashGroupIds.Add(gp.groupId);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ var schedulesAssistant = x.schedules.Where(z => z.assistants.Contains(tmdid));
|
|
|
+ if (schedulesAssistant.Any())
|
|
|
+ {
|
|
|
+ courseIds.Add(x.courseId);
|
|
|
+ CourseTask courseTask = x.ToJsonString().ToObject<CourseTask>();
|
|
|
+ courseTask.schedules=schedulesAssistant.ToList();
|
|
|
+ privateAssistantTask.Add(new KeyValuePair<string, CourseTask>(x.courseId, courseTask));
|
|
|
+ groupIds.AddRange(schedulesAssistant.Where(z => !string.IsNullOrWhiteSpace(z.groupId)).Select(x => x.groupId));
|
|
|
+ var gpids = schedulesAssistant.Where(z => !string.IsNullOrWhiteSpace(z.groupId));
|
|
|
+ if (gpids!=null && gpids.Count()>0)
|
|
|
+ {
|
|
|
+ foreach (var gp in gpids)
|
|
|
+ {
|
|
|
+ if (!string.IsNullOrWhiteSpace(gp.school))
|
|
|
+ {
|
|
|
+ if (!string.IsNullOrWhiteSpace(school) && gp.school.Equals(school)) {
|
|
|
+ hashGroupIds.Add(gp.groupId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ hashGroupIds.Add(gp.groupId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ }
|
|
|
+ if (courseIds.Any())
|
|
|
+ {
|
|
|
+ string sqlCourse = $"select distinct value c from c where c.code='CourseBase' and ( c.creatorId='{tmdid}' or c.id in ({string.Join(",", courseIds.Select(b => $"'{b}'"))}))";
|
|
|
+ var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<CourseBase>(sqlCourse, $"CourseBase");
|
|
|
+ if (result.list.IsNotEmpty())
|
|
|
+ {
|
|
|
+ foreach (var item in result.list)
|
|
|
+
|
|
|
+ {
|
|
|
+ List<CourseTaskDto> courseTaskDtos = new List<CourseTaskDto>();
|
|
|
+ var teacher = privateTeacherTask.Where(x => x.Key.Equals(item.id)).Select(z => new CourseTaskDto { courseTask=z.Value, type="teacher" });
|
|
|
+ if (teacher.Any())
|
|
|
+ {
|
|
|
+ courseTaskDtos.AddRange(teacher.ToList());
|
|
|
+ }
|
|
|
+ var assistant = privateAssistantTask.Where(x => x.Key.Equals(item.id)).Select(z => new CourseTaskDto { courseTask=z.Value, type="assistant" });
|
|
|
+ if (assistant.Any())
|
|
|
+ {
|
|
|
+ courseTaskDtos.AddRange(assistant.ToList());
|
|
|
+ }
|
|
|
+ teahcerCourses.Add(new CourseDto { courseBase=item, courseTasks=courseTaskDtos });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ var groupInfo = await GroupListService.GetMemberByListids(_coreAPIHttpService, _azureCosmos.GetCosmosClient(), _dingDing, hashGroupIds.ToList(), school);
|
|
|
+ var groupIdsRel = groupIds.GroupBy(z => z).Select(z => new { groupId = z.Key, count = z.ToList().Count() });
|
|
|
+ List<dynamic> groupLists= new List<dynamic>();
|
|
|
+ foreach (var item in teahcerCourses)
|
|
|
+ {
|
|
|
+
|
|
|
+ foreach (var z in item.courseTasks) {
|
|
|
+ var groups = z.courseTask.schedules.Select(z => z.groupId);
|
|
|
+ if (groups!=null) {
|
|
|
+ var groupList = groupInfo.groups.Where(z => groups.Contains(z.id));
|
|
|
+ if (groupList!=null)
|
|
|
+ {
|
|
|
+ foreach (var gp in groupList) {
|
|
|
+ string subjectId = null;
|
|
|
+ string subjectName = null;
|
|
|
+ string subjectBindId = null;
|
|
|
+ groupLists.Add(new { role = z.type,scope= "private", groupList= gp, subjectId, subjectName , subjectBindId });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ foreach (var item in schoolCourses)
|
|
|
+ {
|
|
|
+ string subjectBindId = null;
|
|
|
+ if (!string.IsNullOrWhiteSpace(school) && periodSchool!=null && item.courseBase.scope.Equals("school") && !string.IsNullOrWhiteSpace(item.courseBase?.subject?.id))
|
|
|
+ {
|
|
|
+ subjectBindId=periodSchool.subjects.Find(z => z.id.Equals(item.courseBase.subject.id))?.bindId;
|
|
|
+ }
|
|
|
+ foreach (var z in item.courseTasks)
|
|
|
+ {
|
|
|
+ var groups = z.courseTask.schedules.Select(z => z.groupId);
|
|
|
+ if (groups!=null)
|
|
|
+ {
|
|
|
+ var groupList = groupInfo.groups.Where(z => groups.Contains(z.id));
|
|
|
+ if (groupList!=null)
|
|
|
+ {
|
|
|
+ foreach (var gp in groupList)
|
|
|
+ {
|
|
|
+
|
|
|
+ groupLists.Add(new { role = z.type, scope = "school", groupList = gp, subjectId = item.courseBase?.subject?.id, subjectName = item.courseBase?.subject?.name, subjectBindId });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ foreach (var item in classes) {
|
|
|
+ var groupList = groupInfo.groups.Where(z => item.id.Equals(z.id));
|
|
|
+ if (groupList!=null)
|
|
|
+ {
|
|
|
+ foreach (var gp in groupList)
|
|
|
+ {
|
|
|
+
|
|
|
+ groupLists.Add(new { role = "charge", scope = "school", groupList = gp });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return Ok(new { teahcerCourses, schoolCourses, groupIdsRel, groupLists });
|
|
|
+ }
|
|
|
/// <summary>
|
|
|
/// 根据家长手机号获取监护学生的信息
|
|
|
/// </summary>
|
|
@@ -367,51 +889,6 @@ namespace TEAMModelOS.Controllers
|
|
|
arts = result.list;
|
|
|
token = result.continuationToken;
|
|
|
}
|
|
|
- //await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(queryText: stringBuilder.ToString(), continuationToken: token, requestOptions: new QueryRequestOptions() { MaxItemCount = topcout, PartitionKey = new PartitionKey($"Art-{code}") }))
|
|
|
- //{
|
|
|
-
|
|
|
- // 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())
|
|
|
- // {
|
|
|
- // arts.Add(obj.ToObject<ArtEvaluation>());
|
|
|
- // }
|
|
|
- // }
|
|
|
- // if (iscontinuation)
|
|
|
- // {
|
|
|
- // continuationToken = item.GetContinuationToken();
|
|
|
- // break;
|
|
|
- // }
|
|
|
- //}
|
|
|
- // arts = arts.Where((x, i) => arts.FindIndex(z => z.id == x.id) == i).ToList();
|
|
|
- //List<(string artId, double count)> attachments = new();
|
|
|
- /* foreach (ArtEvaluation art in arts) {
|
|
|
- List<StudentArtResult> artResults = new();
|
|
|
- string stu = string.Format("{0}{1}{2}", code.GetString(), "-", stuId.GetString());
|
|
|
- string sql = $"select value(c) from c where c.artId = '{art.id}' and c.id = '{stu}' and c.pk = 'ArtResult'";
|
|
|
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryStreamIterator(
|
|
|
- queryText: sql))
|
|
|
- {
|
|
|
- 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())
|
|
|
- {
|
|
|
- artResults.Add(obj.ToObject<StudentArtResult>());
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- if (artResults.Count > 0)
|
|
|
- {
|
|
|
- var attCount = artResults[0].results.Where(z => z.files != null).SelectMany(c => c.files).ToList().Count;
|
|
|
- attachments.Add((art.id, attCount));
|
|
|
- }
|
|
|
- else {
|
|
|
- attachments.Add((art.id, 0));
|
|
|
- }
|
|
|
-
|
|
|
- }*/
|
|
|
List<string> artIds = new();
|
|
|
artIds = arts.Select(c => c.id).ToList();
|
|
|
List<ArtAttachment> artAttachments = new();
|
|
@@ -442,7 +919,7 @@ namespace TEAMModelOS.Controllers
|
|
|
c.period,
|
|
|
c.periodType,
|
|
|
c.zymusicstds,c.code,
|
|
|
- count = artAttachments.Where(z => z.artId.Equals(c.id)).SelectMany(k => k.files).ToList().Count
|
|
|
+ count = artAttachments.Where(z => z.artId.Equals(c.id)).ToList().Count
|
|
|
|
|
|
});
|
|
|
return Ok(new { arts = newArts ,token});
|
|
@@ -451,7 +928,95 @@ namespace TEAMModelOS.Controllers
|
|
|
return BadRequest("500错误");
|
|
|
}
|
|
|
}
|
|
|
+ /// <summary>
|
|
|
+ /// 获取当前老师所在范围的活动列表
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="json"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [ProducesDefaultResponseType]
|
|
|
+ [HttpPost("find-teacher-activity")]
|
|
|
+#if !DEBUG
|
|
|
+ [Authorize(Roles = "AClassONE")]
|
|
|
+#endif
|
|
|
+ public async Task<IActionResult> getTeacherActivity(JsonElement request)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ if (!request.TryGetProperty("studentId", out JsonElement teacId)) return BadRequest();
|
|
|
+ if (!request.TryGetProperty("classIds", out JsonElement classIds)) return BadRequest();
|
|
|
+ if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();//学校编码
|
|
|
+ List<string> cIds = classIds.ToObject<List<string>>();
|
|
|
+ var client = _azureCosmos.GetCosmosClient();
|
|
|
+ StringBuilder stringBuilder = new($"select value(c) from c where (c.status<>404 or IS_DEFINED(c.status) = false )");
|
|
|
+ string continuationToken = string.Empty;
|
|
|
+ string token = default;
|
|
|
+ stringBuilder.Append("order by c.createTime desc");
|
|
|
+ //是否需要进行分页查询,默认不分页
|
|
|
+ if (request.TryGetProperty("token", out JsonElement token_1))
|
|
|
+ {
|
|
|
+ token = token_1.GetString();
|
|
|
+ };
|
|
|
+ //默认不指定返回大小
|
|
|
+ int? topcout = null;
|
|
|
+ if (request.TryGetProperty("count", out JsonElement jcount))
|
|
|
+ {
|
|
|
+ if (!jcount.ValueKind.Equals(JsonValueKind.Undefined) && !jcount.ValueKind.Equals(JsonValueKind.Null) && jcount.TryGetInt32(out int data))
|
|
|
+ {
|
|
|
+ topcout = data;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ List<ArtEvaluation> arts = new();
|
|
|
+ var result = await client.GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<ArtEvaluation>(stringBuilder.ToString(), $"Art-{code}", token, 5);
|
|
|
+ if (result.list.IsNotEmpty())
|
|
|
+ {
|
|
|
+ arts = result.list;
|
|
|
+ token = result.continuationToken;
|
|
|
+ }
|
|
|
+ arts = arts.Where(c => c.classes.Intersect(cIds).Any()).Where((x, i) => arts.FindIndex(z => z.id == x.id) == i).ToList();
|
|
|
+ List<string> artIds = new();
|
|
|
+ artIds = arts.Select(c => c.id).ToList();
|
|
|
+ List<ArtAttachment> artAttachments = new();
|
|
|
+ string sqlTask = $"select value(c) from c where c.studentId = '{teacId}' and c.artId in ({string.Join(",", artIds.Select(s => $"'{s}'"))})";
|
|
|
+ await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Student).
|
|
|
+ GetItemQueryIterator<ArtAttachment>(queryText: sqlTask, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"ArtAttachment-{code}") }))
|
|
|
+ {
|
|
|
+ artAttachments.Add(item);
|
|
|
+ }
|
|
|
+ var newArts = arts.Select(c => new {
|
|
|
|
|
|
+ c.id,
|
|
|
+ c.name,
|
|
|
+ c.school,
|
|
|
+ c.createTime,
|
|
|
+ c.type,
|
|
|
+ c.classes,
|
|
|
+ c.progress,
|
|
|
+ c.scope,
|
|
|
+ c.areaId,
|
|
|
+ c.pId,
|
|
|
+ c.topic,
|
|
|
+ c.startTime,
|
|
|
+ c.endTime,
|
|
|
+ c.uploadSTime,
|
|
|
+ c.uploadETime,
|
|
|
+ c.publish,
|
|
|
+ c.subjects,
|
|
|
+ c.period,
|
|
|
+ c.periodType,
|
|
|
+ c.zymusicstds,
|
|
|
+ c.code,
|
|
|
+ count = artAttachments.Where(z => z.artId.Equals(c.id)).ToList().Count
|
|
|
+
|
|
|
+ });
|
|
|
+ return Ok(new { arts = newArts, token });
|
|
|
+ }
|
|
|
+ catch (Exception e)
|
|
|
+ {
|
|
|
+ await _dingDing.SendBotMsg($"OS,{_option.Location},art/find-children-activity()\n{e.Message}\n{e.StackTrace}\n", GroupNames.醍摩豆服務運維群組);
|
|
|
+ return BadRequest("500错误");
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
[ProducesDefaultResponseType]
|
|
|
[HttpPost("find-summary-activity")]
|
|
@@ -554,6 +1119,18 @@ namespace TEAMModelOS.Controllers
|
|
|
var client = _azureCosmos.GetCosmosClient();
|
|
|
if (!element.TryGetProperty("id", out JsonElement id)) return BadRequest();
|
|
|
if (!element.TryGetProperty("code", out JsonElement code)) return BadRequest();
|
|
|
+ ArtAttachment attachment = new();
|
|
|
+ var res = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemStreamAsync(id.ToString(), new PartitionKey($"ArtAttachment-{code}"));
|
|
|
+ if (res.Status == 200)
|
|
|
+ {
|
|
|
+ using var json = await JsonDocument.ParseAsync(res.ContentStream);
|
|
|
+ attachment = json.ToObject<ArtAttachment>();
|
|
|
+
|
|
|
+ }
|
|
|
+ List<Attachment> atts = attachment.files;
|
|
|
+ foreach (Attachment att in atts) {
|
|
|
+ await _azureStorage.GetBlobServiceClient().DeleteBlobs(_dingDing, code.GetString(), new List<string> { $"{att.blob}" });
|
|
|
+ }
|
|
|
await client.GetContainer("TEAMModelOS", "Student").DeleteItemStreamAsync(id.GetString(), new PartitionKey($"ArtAttachment-{code}"));
|
|
|
return Ok();
|
|
|
}
|