123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861 |
- using Azure;
- using Azure.Cosmos;
- using HTEXLib.COMM.Helpers;
- using Microsoft.AspNetCore.Http;
- using Microsoft.Azure.Cosmos.Table;
- using Microsoft.Azure.Functions.Worker.Http;
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Net;
- using System.Net.Http;
- using System.Text;
- using System.Text.Json;
- using System.Threading.Tasks;
- using TEAMModelOS.Filter;
- using TEAMModelOS.SDK;
- using TEAMModelOS.SDK.DI;
- using TEAMModelOS.SDK.Extension;
- using TEAMModelOS.SDK.Models;
- using TEAMModelOS.SDK.Models.Table;
- using TEAMModelOS.SDK.Helper.Common.ReflectorExtensions;
- using TEAMModelOS.SDK.Context.Constant;
- using TEAMModelOS.SDK.Models.Dtos;
- namespace TEAMModelOS.Controllers
- {
- public class OpenApiService
- {
-
- private static List<string> weekDays = new List<string> { "MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN" };
- /// <summary>
- /// 第三方获取学校列表
- /// [ApiToken(Auth = "1000", Name = "合作商获取可访问的学校列表", RWN = "R", Limit = false)]
- /// </summary>
- /// <param name="_azureStorage"></param>
- /// <param name="_dingDing"></param>
- /// <param name="bizId"></param>
- /// <returns></returns>
- public static async Task<ResponseData<List<OSchool>>> GetSchools(AzureStorageFactory _azureStorage, DingDing _dingDing, string bizId)
- {
- try
- {
- ResponseData<List<OSchool>> ResponseData = new();
- List<OSchool> schools = new();
- var table = _azureStorage.GetCloudTableClient().GetTableReference("IESOpenApi");
- List<BusinessSchool> bizSchools = await table.FindListByDict<BusinessSchool>(new Dictionary<string, object> { { "PartitionKey", $"BusinessSchool" }, { "bizid", bizId } });
- if (bizSchools != null && bizSchools.Count > 0)
- {
- ResponseData.code = RespondCode.Ok;
- ResponseData.msg = "成功";
- ResponseData.data = bizSchools.Select(x => new OSchool { id = x.school, name = x.name, picture = x.picture }).ToList();
- }
- else
- {
- ResponseData.code = RespondCode.NotFound;
- ResponseData.msg = "未找到你关联的学校";
- }
- return ResponseData;
- }
- catch (Exception ex)
- {
- await _dingDing.SendBotMsg($"OpenApi,{Environment.GetEnvironmentVariable("Option:Location")} OpenApiService/GetSchools() 参数:bizId:{bizId} \n {ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
- return new ResponseData<List<OSchool>>() { code = RespondCode.Error, msg = "服务器错误" };
- }
- }
- /// <summary>
- /// 学校基本信息
- /// //[ApiToken(Auth = "1001", Name = "学校基本信息", RWN = "R", Limit = false)]
- /// </summary>
- /// <param name="_azureCosmos"></param>
- /// <param name="_dingDing"></param>
- /// <param name="bizId"></param>
- /// <param name="schoolId"></param>
- /// <returns></returns>
- public static async Task<ResponseData<dynamic>> GetSchoolInfo(AzureCosmosFactory _azureCosmos, DingDing _dingDing, string bizId, string schoolId)
- {
- try
- {
- ResponseData<dynamic> resDate = new();
- School data = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>(schoolId, new PartitionKey("Base"));
- List<dynamic> period = new();
- data.period.ForEach(x => { period.Add(new { x.subjects, x.grades, x.name, x.id, x.campusId, x.semesters }); });
- if (data != null)
- {
- resDate.code = RespondCode.Ok;
- resDate.msg = "成功";
- resDate.data = new { data.id, data.name, data.areaId, data.type, data.region, data.province, data.city, data.dist, data.campuses, period };
- }
- else
- {
- resDate.code = RespondCode.NotFound;
- resDate.msg = "未找到学校信息";
- }
- return resDate;
- }
- catch (Exception ex)
- {
- await _dingDing.SendBotMsg($"OpenApi,{Environment.GetEnvironmentVariable("Option:Location")} OpenApiService/GetSchoolInfo() 参数:bizId:{bizId},school:{schoolId} \n {ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
- return new ResponseData<dynamic>() { code = RespondCode.Error, msg = "服务器错误" };
- }
- }
- /// <summary>
- /// 名单列表信息 获取学校的行政班,教学班,教研组,研修名单
- /// [ApiToken(Auth = "1201", Name = "名单列表信息", RWN = "R", Limit = false)]
- /// </summary>
- /// <param name="_azureCosmos"></param>
- /// <param name="_dingDing"></param>
- /// <param name="bizId"></param>
- /// <param name="school"></param>
- /// <param name="json"></param>
- /// <returns></returns>
- public static async Task<ResponseData<List<OGroupList>>> GetGroupList(AzureCosmosFactory _azureCosmos,DingDing _dingDing,string bizId, string school, JsonElement json)
- {
- try
- {
- ResponseData<List<OGroupList>> resDate = new();
- List<OGroupList> groupLists = new();
- var client = _azureCosmos.GetCosmosClient();
- json.TryGetProperty("periodId", out JsonElement periodId);
- List<GroupListGrp> tempGroupLists = new();
- //包含,学校的行政班,教学班
- json.TryGetProperty("type", out JsonElement _type);
- List<string> types = null;
- if (_type.ValueKind.Equals(JsonValueKind.Array))
- {
- types = _type.ToObject<List<string>>();
- }
- else if (_type.ValueKind.Equals(JsonValueKind.String))
- {
- types = new List<string> { $"{types}" };
- }
- if (types.IsEmpty() || types.Contains("class"))
- {
- StringBuilder classsql = new StringBuilder($"SELECT c.id,c.name,c.periodId ,c.year FROM c ");
- if (!string.IsNullOrEmpty($"{periodId}"))
- {
- classsql.Append($" where c.periodId='{periodId}' ");
- }
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<ClassInfo>(queryText: classsql.ToString(),
- requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{school}") }))
- {
- HashSet<string> groupNames = new HashSet<string>();
- string gpsql = $"SELECT distinct c.groupId,c.groupName FROM c where c.classId='{item.id}'and c.groupName <>null";
- await foreach (var gp in client.GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryIterator<Student>(queryText: gpsql,
- requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base-{school}") }))
- {
- groupNames.Add(gp.groupName);
- }
- ///行政班(学生搜寻classId动态返回)class
- GroupListGrp group = new GroupListGrp
- {
- id = item.id,
- code = $"GroupList-{school}",
- name = item.name,
- periodId = item.periodId,
- scope = "school",
- school = $"{school}",
- type = "class",
- year = item.year,
- groupName = groupNames
- };
- tempGroupLists.Add(group);
- }
- }
- if (types.IsEmpty() || types.Contains("teach"))
- {
- //教学班
- StringBuilder teachsql = new StringBuilder($" SELECT distinct value(c) FROM c where c.type='teach'");
- if (!string.IsNullOrEmpty($"{periodId}"))
- {
- teachsql.Append($" and c.periodId='{periodId}'");
- }
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").
- GetItemQueryIterator<GroupList>(queryText: teachsql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"GroupList-{school}") }))
- {
- HashSet<string> groupName = item.members.Where(x => !string.IsNullOrEmpty(x.groupName)).Select(y => y.groupName).ToHashSet();
- tempGroupLists.Add(new GroupListGrp(item, groupName));
- }
- }
- if (types.IsEmpty() || types.Contains("research"))
- {
- //教研组
- StringBuilder researchsql = new StringBuilder($"SELECT distinct value(c) FROM c where c.type='research'");
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").
- GetItemQueryIterator<GroupList>(queryText: researchsql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"GroupList-{school}") }))
- {
- HashSet<string> groupName = item.members.Where(x => !string.IsNullOrEmpty(x.groupName)).Select(y => y.groupName).ToHashSet();
- tempGroupLists.Add(new GroupListGrp(item, groupName));
- }
- }
- if (types.IsEmpty() || types.Contains("yxtrain"))
- {
- //研修名单
- StringBuilder yxtrainsql = new StringBuilder($"SELECT distinct value(c) FROM c where c.type='yxtrain'");
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").
- GetItemQueryIterator<GroupList>(queryText: yxtrainsql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"GroupList-{school}") }))
- {
- HashSet<string> groupName = item.members.Where(x => !string.IsNullOrEmpty(x.groupName)).Select(y => y.groupName).ToHashSet();
- tempGroupLists.Add(new GroupListGrp(item, groupName));
- }
- }
- groupLists = tempGroupLists.Select(x => new OGroupList { id = x.id, name = x.name, type = x.type, periodId = x.periodId, school = x.school, scope = x.scope, year = x.year }).ToList();
- if (groupLists.Count > 0)
- {
- resDate.code = RespondCode.Ok;
- resDate.msg = "成功";
- resDate.data = groupLists;
- }
- else
- {
- resDate.code = RespondCode.NotFound;
- resDate.msg = "未找到学校信息";
- }
- return resDate;
- }
- catch (Exception ex)
- {
- await _dingDing.SendBotMsg($"OpenApi,{Environment.GetEnvironmentVariable("Option:Location")} OpenApiService/GetGroupList() 参数:bizId:{bizId},school:{school},json:{json.ToJsonString()} \n {ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
- return new ResponseData<List<OGroupList>>() { code = RespondCode.Error, msg = "服务器错误" };
- }
- }
- /// <summary>
- /// 名单成员信息,学生成员信息,包含(学生,成员)基本信息,分组等信息
- /// [ApiToken(Auth = "1202", Name = "名单成员信息", RWN = "R", Limit = false)]
- /// </summary>
- /// <param name="_azureCosmos"></param>
- /// <param name="_coreAPIHttpService"></param>
- /// <param name="_dingDing"></param>
- /// <param name="bizId"></param>
- /// <param name="school"></param>
- /// <param name="json"></param>
- /// <returns></returns>
- public static async Task<ResponseData<dynamic>> GetGroupMembers(AzureCosmosFactory _azureCosmos, CoreAPIHttpService _coreAPIHttpService, DingDing _dingDing, string bizId, string school, JsonElement json)
- {
- try
- {
- List<OGgroup> groups = new();
- var client = _azureCosmos.GetCosmosClient();
- if (!json.TryGetProperty("ids", out JsonElement ids)) return new ResponseData<dynamic>() { code = RespondCode.NotFound, msg = "参数错误" };
- List<string> listids = ids.ToObject<List<string>>();
- (List<RMember> members, List<RGroupList> tGroups) = await GroupListService.GetStutmdidListids(_coreAPIHttpService, client, _dingDing, listids, $"{school}");
- groups = tGroups.Select(x => new OGgroup { name = x.name, no = x.no, periodId = x.periodId, school = x.school, type = x.type, year = x.year, tcount = x.tcount, scount = x.scount, leader = x.leader, members = x.members, id = x.id }).ToList();
- return new ResponseData<dynamic>() { code = RespondCode.Ok, msg = "成功", data = new { groups, members } };
- }
- catch (Exception ex)
- {
- await _dingDing.SendBotMsg($"OpenApi,{Environment.GetEnvironmentVariable("Option:Location")} OpenApiService/GetGroupMembers() 参数:bizId:{bizId},school:{school},json:{json.ToJsonString()} \n {ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
- return new ResponseData<dynamic>() { code = RespondCode.Error, msg = "服务器错误" };
-
- }
- }
- /// <summary>
- /// 获取课程列表信息
- /// [ApiToken(Auth = "1301", Name = "获取课程列表信息", RWN = "R", Limit = false)]
- /// </summary>
- /// <param name="_azureCosmos"></param>
- /// <param name="_dingDing"></param>
- /// <param name="bizId"></param>
- /// <param name="school"></param>
- /// <param name="json"></param>
- /// <returns></returns>
- public static async Task<ResponseData<dynamic>> GetCourseList(AzureCosmosFactory _azureCosmos, DingDing _dingDing,string bizId ,string school, JsonElement json)
- {
- try
- {
- var client = _azureCosmos.GetCosmosClient();
- json.TryGetProperty("periodId", out JsonElement periodId);
- json.TryGetProperty("subjectId", out JsonElement subjectId);
- StringBuilder sql = new StringBuilder($"SELECT c.id,c.name,c.subject,c.period,c.scope,c.no,c.school FROM c where 1=1 ");
- if (!string.IsNullOrWhiteSpace($"{periodId}"))
- {
- sql.Append($" and c.period.id='{periodId}'");
- }
- if (!string.IsNullOrWhiteSpace($"{subjectId}"))
- {
- sql.Append($" and c.subject.id='{subjectId}'");
- }
- List<dynamic> courses = new List<dynamic>();
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<dynamic>(queryText: sql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{school}") }))
- {
- courses.Add(item);
- }
- return new ResponseData<dynamic>() { code = RespondCode.Ok, msg = "成功", data = courses };
- }
- catch (Exception ex)
- {
- await _dingDing.SendBotMsg($"OpenApi,{Environment.GetEnvironmentVariable("Option:Location")} OpenApiService/GetCourseList() 参数:bizId:{bizId},school:{school},json:{json.ToJsonString()} \n {ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
- return new ResponseData<dynamic>() { code = RespondCode.Error, msg = "服务器错误" };
- }
- }
- /// <summary>
- /// 课程详细信息
- /// [ApiToken(Auth = "1302", Name = "课程详细信息", RWN = "R", Limit = false)]
- /// </summary>
- /// <param name="_azureCosmos"></param>
- /// <param name="_dingDing"></param>
- /// <param name="bizId"></param>
- /// <param name="school"></param>
- /// <param name="json"></param>
- /// <returns></returns>
- public static async Task<ResponseData<dynamic>> GetCourseInfo(AzureCosmosFactory _azureCosmos, DingDing _dingDing, string bizId, string school, JsonElement json)
- {
- try
- {
- json.TryGetProperty("courseId", out JsonElement courseId);
- Response response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{courseId}", new PartitionKey($"Course-{school}"));
- if (response.Status == 200)
- {
- JsonDocument document = JsonDocument.Parse(response.Content);
- Course course = document.RootElement.Deserialize<Course>();
- return new ResponseData<dynamic>() { code = RespondCode.Ok, msg = "成功", data = new { course.name, course.id, course.subject, course.period, course.scope, course.school, course.no, course.desc, course.schedule } };
- }
- else
- return new ResponseData<dynamic>() { code = RespondCode.NotFound, msg = "未找到相关课程" };
- }
- catch (Exception ex)
- {
- await _dingDing.SendBotMsg($"OpenApi,{Environment.GetEnvironmentVariable("Option:Location")} OpenApiService/GetCourseInfo() 参数:bizId:{bizId},school:{school},json:{json.ToJsonString()} \n {ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
- return new ResponseData<dynamic>() { code = RespondCode.Error, msg = "服务器错误" };
- }
- }
- /// <summary>
- /// 获取指定学段作息
- /// [ApiToken(Auth = "1303", Name = "获取指定学段作息", RWN = "R", Limit = false)]
- /// </summary>
- /// <param name="_azureCosmos"></param>
- /// <param name="_dingDing"></param>
- /// <param name="bizId"></param>
- /// <param name="school"></param>
- /// <param name="json"></param>
- /// <returns></returns>
- public static async Task<ResponseData<dynamic>> GetPaperExamCondition(AzureCosmosFactory _azureCosmos, DingDing _dingDing, string bizId, string school, JsonElement json)
- {
- try
- {
- json.TryGetProperty("periodId", out JsonElement _periodId);
- School data = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>(school, new PartitionKey("Base"));
- var period = data.period.Find(x => x.id.Equals($"{_periodId}"));
- if (period != null)
- {
- return new ResponseData<dynamic>() { code = RespondCode.Ok, msg = "成功", data = new { period.subjects, period.timetable, period.grades, period.majors, weekDays } };
- }
- else
- return new ResponseData<dynamic>() { code = RespondCode.NotFound, msg = "未找到相关课程" };
- }
- catch (Exception ex)
- {
- await _dingDing.SendBotMsg($"OpenApi,{Environment.GetEnvironmentVariable("Option:Location")} OpenApiService/GetPaperExamCondition() 参数:bizId:{bizId},school:{school},json:{json.ToJsonString()} \n {ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
- return new ResponseData<dynamic>() { code = RespondCode.Error, msg = "服务器错误" };
- }
- }
- /// <summary>
- /// 物理教室列表
- /// [ApiToken(Auth = "1401", Name = "物理教室列表", RWN = "R", Limit = false)]
- /// </summary>
- /// <param name="_azureCosmos"></param>
- /// <param name="_dingDing"></param>
- /// <param name="bizId"></param>
- /// <param name="school"></param>
- /// <param name="json"></param>
- /// <returns></returns>
- public static async Task<ResponseData<List<ORoom>>> GetRoomList(AzureCosmosFactory _azureCosmos, DingDing _dingDing, string bizId, string school,JsonElement json)
- {
- try
- {
- var client = _azureCosmos.GetCosmosClient();
- List<ORoom> dtRooms = new();
- StringBuilder sql = new StringBuilder($"select value(c) from c where 1=1 ");
- json.TryGetProperty("openType", out JsonElement openType);
- json.TryGetProperty("no", out JsonElement no);
- if (!string.IsNullOrWhiteSpace($"{openType}"))
- {
- sql.Append($" and c.openType='{openType}'");
- }
- if (!string.IsNullOrWhiteSpace($"{no}"))
- {
- sql.Append($" and c.no='{no}'");
- }
- List<Room> rooms = new List<Room>();
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<Room>(queryText: sql.ToString(),
- requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Room-{school}") }))
- {
- rooms.Add(item);
- }
- dtRooms = rooms.Select(s => new ORoom { id = s.id, name = s.name, x = s.x, y = s.y, openType = s.openType, style = s.style, area = s.area, address = s.address, school = school }).ToList();
- if (dtRooms.Count > 0)
- return new ResponseData<List<ORoom>>() { code = RespondCode.Ok, data = dtRooms };
- else
- return new ResponseData<List<ORoom>>() { code = RespondCode.NotFound, msg = "未找到该学校的物理教室" };
- }
- catch (Exception ex)
- {
- await _dingDing.SendBotMsg($"OpenApi,{Environment.GetEnvironmentVariable("Option:Location")} OpenApiService/GetRoomList() 参数:bizId:{bizId},school:{school},json:{json.ToJsonString()} \n {ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
- return new ResponseData<List<ORoom>>() { code = RespondCode.Error, msg = "服务器错误" };
- }
- }
- /// <summary>
- /// 物理教室详细
- /// [ApiToken(Auth = "1402", Name = "物理教室详细", RWN = "R", Limit = false)]
- /// </summary>
- /// <param name="_azureCosmos"></param>
- /// <param name="_dingDing"></param>
- /// <param name="bizId"></param>
- /// <param name="school"></param>
- /// <param name="json"></param>
- /// <returns></returns>
- public static async Task<ResponseData<dynamic>> GetRoomInfo(AzureCosmosFactory _azureCosmos, DingDing _dingDing, string bizId, string school, JsonElement json)
- {
- try
- {
- var client = _azureCosmos.GetCosmosClient();
- if (!json.TryGetProperty("roomId", out JsonElement roomId)) return new ResponseData<dynamic>() { code = RespondCode.ParamsError, msg = "参数错误" };
- Response response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{roomId}", new PartitionKey($"Room-{school}"));
- if (response.Status == 200)
- {
- JsonDocument document = JsonDocument.Parse(response.Content);
- Room tRoom = document.RootElement.Deserialize<Room>();
- return new ResponseData<dynamic>() { code = RespondCode.Ok, msg = "成功",data = new { tRoom.id, tRoom.name, tRoom.x, tRoom.y, tRoom.openType, tRoom.style, tRoom.area, tRoom.address, school } };
- }
- else
- return new ResponseData<dynamic>() { code = RespondCode.NotFound, msg = "未找到物理教室详情" };
- }
- catch (Exception ex)
- {
- await _dingDing.SendBotMsg($"OpenApi,{Environment.GetEnvironmentVariable("Option:Location")} OpenApiService/GetRoomInfo() 参数:bizId:{bizId},school:{school},json:{json.ToJsonString()} \n {ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
- return new ResponseData<dynamic>() { code = RespondCode.Error, msg = "服务器错误" };
- }
- }
- /// <summary>
- /// 教师列表信息
- /// [ApiToken(Auth = "1501", Name = "教师列表信息", RWN = "R", Limit = false)]
- /// </summary>
- /// <param name="_azureCosmos"></param>
- /// <param name="_coreAPIHttpService"></param>
- /// <param name="_dingDing"></param>
- /// <param name="bizId"></param>
- /// <param name="school"></param>
- /// <param name="json"></param>
- /// <returns></returns>
- public static async Task<ResponseData<dynamic>> GetTeacherList(AzureCosmosFactory _azureCosmos, CoreAPIHttpService _coreAPIHttpService, DingDing _dingDing, string bizId, string school, JsonElement json)
- {
- try
- {
- var client = _azureCosmos.GetCosmosClient();
- json.TryGetProperty("searchKey", out JsonElement _searchKey);
- List<CoreUser> coreUsers = new();
- IEnumerable<string> unexist = null;
- if (_searchKey.ValueKind.Equals(JsonValueKind.Array))
- {
- List<string> searchKey = _searchKey.ToObject<List<string>>();
- var keys = searchKey.Where(x => !string.IsNullOrWhiteSpace(x));
- var content = new StringContent(keys.ToJsonString(), Encoding.UTF8, "application/json");
- string ujson = await _coreAPIHttpService.GetUserInfos(content);
- if (!string.IsNullOrWhiteSpace(ujson))
- {
- coreUsers = ujson.ToObject<List<CoreUser>>();
- }
- if (coreUsers.Any())
- unexist = searchKey.Except(coreUsers.Select(x => x.searchKey));
- else
- return new ResponseData<dynamic>() { code = RespondCode.NotFound, msg = "没有找到对应的教师信息", data = { null, null, unexist } };
- }
- List<SchoolTeacher> teachers = new();
- string insql = "";
- if (coreUsers.Any())
- {
- insql = $" c.id in ({string.Join(",", coreUsers.Select(x => $"'{x.id}'"))}) ";
- }
- string sql = $"select c.id,c.name ,c.picture,c.job ,c.subjectIds,c.roles from c where {insql}";
- await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<SchoolTeacher>
- (queryText: sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"Teacher-{school}") }))
- {
- teachers.Add(item);
- }
- var teacherIds = coreUsers.Select(x => x.id).Except(teachers.Select(x => x.id));
- List<CoreUser> unjoined = coreUsers.FindAll(x => teacherIds.Contains(x.id));
- List<dynamic> tchs = new List<dynamic>();
- teachers.Select(x => new { x.id, x.name, x.picture, x.job, x.subjectIds, x.roles }).ToList().ForEach(x =>
- {
- var coreUser = coreUsers.Find(c => c.id.Equals(x.id));
- if (coreUser != null)
- {
- tchs.Add(new { x.id, coreUser.name, coreUser.picture, x.job, x.subjectIds, x.roles, coreUser.searchKey, school });
- }
- });
- return new ResponseData<dynamic>() { code = RespondCode.Ok, msg = "成功", data = new { tchs, unjoined = unjoined.Select(x => new OCoreUer { id = x.id, name = x.name, picture = x.picture, searchKey = x.searchKey }).ToList(), unexist } };
- }
- catch (Exception ex)
- {
- await _dingDing.SendBotMsg($"OpenApi,{Environment.GetEnvironmentVariable("Option:Location")} OpenApiService/GetTeacherList() 参数:bizId:{bizId},school:{school},json:{json.ToJsonString()} \n {ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
- return new ResponseData<dynamic>() { code = RespondCode.Error, msg = "服务器错误" };
- }
- }
- /// <summary>
- /// 教师执教的班级和课程
- /// [ApiToken(Auth = "1502", Name = "教师详细信息", RWN = "R", Limit = false)]
- /// </summary>
- /// <param name="_azureCosmos"></param>
- /// <param name="_dingDing"></param>
- /// <param name="bizId"></param>
- /// <param name="school"></param>
- /// <param name="json"></param>
- /// <returns></returns>
- public static async Task<ResponseData<dynamic>> GetTeacherTeach(AzureCosmosFactory _azureCosmos, DingDing _dingDing, string bizId, string school, JsonElement json) {
- try {
- if (!json.TryGetProperty("tmdid", out JsonElement _tmdid)) {
- json.TryGetProperty("period", out JsonElement _period);
- List<OCourse> courses = new List<OCourse>();
- var query = $"SELECT distinct c.code,c.id,c.no,c.name,c.period,c.subject,c.scope ,c['desc'] ,c.creatorId , c.year ,s as schedule FROM c join s in c.schedule where s.teacherId='{_tmdid}' ";
- if (!string.IsNullOrWhiteSpace($"{_period}"))
- {
- query = $"{query} and c.period.id ='{_period}'";
- }
- await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<OCourse>(queryText: query,
- requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{school}") }))
- {
- courses.Add(item);
- }
- var group = courses.GroupBy(x => x.id).Select(g => new { key = g.Key, list=g.ToList() });
- List<Course> coursesR = new List<Course>();
- group.ToList().ForEach(x => {
- var first = x.list.First();
- coursesR.Add(new Course
- {
- id = x.key,
- name = first.name,
- code = first.code,
- no = first.no,
- period = first.period,
- subject = first.subject,
- desc = first.desc,
- creatorId = first.creatorId,
- year = first.year,
- schedule = x.list.Select(x => x.schedule).ToList()
- }); ;
- });
- }
- return null;
- } catch (Exception ex) {
- await _dingDing.SendBotMsg($"OpenApi,{Environment.GetEnvironmentVariable("Option:Location")} OpenApiService/GetTeacherTeach() 参数:bizId:{bizId},school:{school},json:{json.ToJsonString()} \n {ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
- return new ResponseData<dynamic>() { code = RespondCode.Error, msg = "服务器错误" };
- }
- }
- /// <summary>
- /// 教师详细信息
- /// [ApiToken(Auth = "1502", Name = "教师详细信息", RWN = "R", Limit = false)]
- /// </summary>
- /// <param name="_azureCosmos"></param>
- /// <param name="_dingDing"></param>
- /// <param name="bizId"></param>
- /// <param name="school"></param>
- /// <param name="json"></param>
- /// <returns></returns>
- public static async Task<ResponseData<dynamic>> GetTeacherInfo(AzureCosmosFactory _azureCosmos, DingDing _dingDing, string bizId, string school, JsonElement json)
- {
- try
- {
- var client = _azureCosmos.GetCosmosClient();
- json.TryGetProperty("tmdid", out JsonElement _tmdid);
- Response responseSchoolTch = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School")
- .ReadItemStreamAsync($"{_tmdid}", new PartitionKey($"Teacher-{school}"));
- Response responseTch = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher")
- .ReadItemStreamAsync($"{_tmdid}", new PartitionKey($"Base"));
- Teacher teacher = null;
- if (responseTch.Status == 200)
- {
- teacher = JsonDocument.Parse(responseTch.Content).RootElement.Deserialize<Teacher>();
- }
- else
- return new ResponseData<dynamic> { code = RespondCode.NotFound, msg = "账号未创建!" };
- if (responseSchoolTch.Status == 200 && teacher != null)
- {
- SchoolTeacher schoolTeacher = JsonDocument.Parse(responseSchoolTch.Content).RootElement.Deserialize<SchoolTeacher>();
- return new ResponseData<dynamic> { code = RespondCode.Ok, msg = "成功", data = new { teacher.id, teacher.name, teacher.picture, schoolTeacher.job, schoolTeacher.status, schoolTeacher.roles, schoolTeacher.subjectIds, school = teacher.schools?.Find(x => x.schoolId.Equals(school)) } };
- }
- else
- return new ResponseData<dynamic> { code = RespondCode.NotFound, msg = "教师未就职该学校!" };
- }
- catch (Exception ex)
- {
- await _dingDing.SendBotMsg($"OpenApi,{Environment.GetEnvironmentVariable("Option:Location")} OpenApiService/GetTeacherInfo() 参数:bizId:{bizId},school:{school},json:{json.ToJsonString()} \n {ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
- return new ResponseData<dynamic>() { code = RespondCode.Error, msg = "服务器错误" };
- }
- }
- /// <summary>
- /// 教师批量导入,并加入学校。可以导入学科,但需要填写学段id
- /// [ApiToken(Auth = "1503", Name = "教师批量导入", RWN = "R", Limit = false)]
- /// </summary>
- /// <param name="_azureCosmos"></param>
- /// <param name="_coreAPIHttpService"></param>
- /// <param name="_dingDing"></param>
- /// <param name="bizId"></param>
- /// <param name="school"></param>
- /// <param name="json"></param>
- /// <returns></returns>
- public static async Task<ResponseData<List<OTeachers>>> GetTeacherInfo(AzureCosmosFactory _azureCosmos, CoreAPIHttpService _coreAPIHttpService, DingDing _dingDing, string bizId, string school, ImportTechDto json)
- {
- try
- {
- //如果需要同时导入学科,则需要填写学段
- List<ImportTech> impTeachers = json.teachers;
- List<string> searchKey = impTeachers.Select(x => x.id).ToList();
- string ujson = null;
- var keys = searchKey.Where(x => !string.IsNullOrWhiteSpace(x));
- if (keys.Any())
- {
- var content = new StringContent(keys.ToJsonString(), Encoding.UTF8, "application/json");
- ujson = await _coreAPIHttpService.GetUserInfos(content);
- }
- List<CoreUser> coreUsers = new List<CoreUser>();
- if (!string.IsNullOrWhiteSpace(ujson))
- {
- coreUsers = ujson.ToObject<List<CoreUser>>();
- }
- IEnumerable<string> unexist = new List<string>();
- if (coreUsers.Any())
- {
- unexist = searchKey.Except(coreUsers.Select(x => x.id));
- }
- else
- {
- return new ResponseData<List<OTeachers>>() { code = RespondCode.NotFound, msg = "没有找到对应的教师信息" };
- }
- var exist = coreUsers.Select(x => x.id);
- //注册了账号的教师
- impTeachers = impTeachers.Where(x => exist.Contains(x.id)).ToList();
- List<Teacher> teachersList = new List<Teacher>();
- List<SchoolTeacher> schoolTeachers = new List<SchoolTeacher>();
- string sql = $"select value(c) from c where c.id in ({string.Join(",", impTeachers.Select(x => $"'{x.id}'"))})";
- await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher)
- .GetItemQueryIterator<Teacher>(queryText: sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey("Base") }))
- {
- teachersList.Add(item);
- }
- await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School)
- .GetItemQueryIterator<SchoolTeacher>(queryText: sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"Teacher-{school}") }))
- {
- schoolTeachers.Add(item);
- }
- long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
- School data = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>(school, new PartitionKey("Base"));
- //学校学科发生变化。
- List<SchoolTeacher> schoolTeachersAdd = new List<SchoolTeacher>();
- bool baseChange = false;
- foreach (var item in impTeachers)
- {
- var teacher = teachersList.Find(x => x.id.Equals(item.id));
- var coreUser = coreUsers.Find(x => x.id.Equals(item.id));
- if (teacher != null)
- {
- var sch = teacher.schools?.Find(x => x.schoolId.Equals(school));
- if (sch == null)
- {
- if (teacher.schools.IsNotEmpty())
- {
- teacher.schools.Add(new Teacher.TeacherSchool { schoolId = school, name = data.name, status = "invite", time = now, picture = data.picture, areaId = data.areaId });
- }
- else
- {
- teacher.defaultSchool = school;
- teacher.size = teacher.size + 1;
- teacher.schools = new List<Teacher.TeacherSchool> { new Teacher.TeacherSchool { schoolId = school, name = data.name, status = "invite", time = now, picture = data.picture, areaId = data.areaId } };
- }
- }
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReplaceItemAsync(teacher, teacher.id, new PartitionKey("Base"));
- }
- else
- {
- teacher = new Teacher
- {
- createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
- id = coreUser.id,
- name = coreUser.name,
- picture = coreUser.picture,
- defaultSchool = school,
- size = 2,
- code = "Base",
- pk = "Base",
- schools = new List<Teacher.TeacherSchool> { new Teacher.TeacherSchool { schoolId = school, name = data.name, status = "invite", time = now, picture = data.picture, areaId = data.areaId } }
- };
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).CreateItemAsync(teacher, new PartitionKey("Base"));
- }
- var schoolTeacher = schoolTeachers.Find(x => x.id.Equals(item.id));
- //处理导入的学科
- List<string> subjectIds = new List<string>();
- if (item.subjects.IsNotEmpty() && !string.IsNullOrWhiteSpace(item.periodId))
- {
- item.subjects.ForEach(s =>
- {
- //同名学科
- var subject = data.period.Find(x => x.id.Equals(item.periodId))?.subjects?.Find(x => x.id.Equals(s.id));
- if (subject == null)
- {
- subject = data.period.Find(x => x.id.Equals(item.periodId))?.subjects?.Find(x => x.name.Equals(s.name));
- }
- else
- {
- subjectIds.Add(subject.id);
- }
- if (subject == null)
- {
- var period = data.period.Find(x => x.id.Equals(item.periodId));
- if (period != null)
- {
- period.subjects.Add(new Subject { id = s.id, name = s.name, type = 2 });
- subjectIds.Add(s.id);
- baseChange = true;
- }
- }
- });
- }
- if (schoolTeacher == null)
- {
- schoolTeacher = new SchoolTeacher
- {
- id = item.id,
- name = coreUser.name,
- picture = coreUser.picture,
- job = item.job,
- subjectIds = subjectIds,
- roles = new List<string> { "teacher" },
- permissions = new List<string> { "content-read", "exercise-read", "knowledge-read", "syllabus-read" },
- status = "invite",
- code = $"Teacher-{school}",
- pk = "Teacher",
- createTime = now,
- };
- schoolTeachersAdd.Add(schoolTeacher);
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).CreateItemAsync(schoolTeacher, new PartitionKey(schoolTeacher.code));
- }
- else
- {
- if (subjectIds.IsNotEmpty())
- {
- subjectIds.ForEach(x =>
- {
- if (!schoolTeacher.subjectIds.Contains(x))
- {
- schoolTeacher.subjectIds.Add(x);
- }
- });
- }
- schoolTeacher.job = string.IsNullOrWhiteSpace(item.job) ? schoolTeacher.job : item.job;
- schoolTeachersAdd.Add(schoolTeacher);
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReplaceItemAsync(schoolTeacher, schoolTeacher.id, new PartitionKey(schoolTeacher.code));
- }
- }
- if (baseChange)
- {
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReplaceItemAsync(data, data.id, new PartitionKey("Base"));
- }
- return new ResponseData<List<OTeachers>>() { code = RespondCode.Ok, msg = "成功", data = schoolTeachersAdd.Select(x => new OTeachers { id = x.id, name = x.name, picture = x.picture, job = x.job, subjectIds = x.subjectIds, roles = x.roles, school = school }).ToList() };
- //return schoolTeachersAdd.Select(x => new OTeachers { id = x.id, name = x.name, picture = x.picture, job = x.job, subjectIds = x.subjectIds, roles = x.roles, school = school }).ToList();
- }
- catch (Exception ex)
- {
- await _dingDing.SendBotMsg($"OpenApi,{Environment.GetEnvironmentVariable("Option:Location")} OpenApiService/GetTeacherInfo() 参数:bizId:{bizId},school:{school},json:{json} \n {ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
- return new ResponseData<List<OTeachers>>() { code = RespondCode.Error, msg = "服务器错误" };
- }
- }
- public static void GenApiTableRecord(AzureStorageFactory azureStorage)
- {
- //在开发模式时,自检 [ApiToken(Auth = "1")] 有重复的接口 https://teammodelos.table.core.chinacloudapi.cn/IESOpenApi
- (List<OpenApi> openApis, List<ApiTokenAttribute> attributes) = ReflectorExtensions.GetOpenApi(new string[] { "TEAMModelOS" });
- openApis.GroupBy(x => $"{x.PartitionKey}{x.RowKey}").ToList().ForEach(x =>
- {
- if (x.Count() > 1)
- {
- throw new Exception($"接口Auth重复定义{x.ToList()}");
- }
- });
- var table = azureStorage.GetCloudTableClient().GetTableReference("IESOpenApi");
- openApis = openApis.OrderBy(x => x.RowKey).ToList();
- string tbqurey = $"PartitionKey {QueryComparisons.Equal} 'IES5-API' and RowKey {QueryComparisons.GreaterThanOrEqual} '{openApis.First().RowKey}' and RowKey {QueryComparisons.LessThanOrEqual} '{openApis.Last().RowKey}' ";
- var apiResult = table.ExecuteQuerySegmented(new TableQuery<OpenApi>().Where(tbqurey), null);
- List<OpenApi> apis = apiResult.Results;
- //数据库历史数据处理
- apis.ForEach(x => {
- var api = openApis.Find(z => z.RowKey.Equals(x.RowKey));
- if (api != null)
- {
- x.auth = api.auth;
- x.name = api.name;
- x.type = api.type;
- x.url = api.url;
- x.method = api.method;
- }
- });
- openApis.RemoveAll(x => apis.Select(z => z.RowKey).Contains(x.RowKey));
- openApis.AddRange(apis);
- _ = table.SaveOrUpdateAll<OpenApi>(openApis);
- (List<WebHook> webHooks, List<ApiTokenAttribute> _attributes) = ReflectorExtensions.GetWebHook(new string[] { "TEAMModelOS.SDK" });
- webHooks.GroupBy(x => $"{x.PartitionKey}{x.RowKey}").ToList().ForEach(x =>
- {
- if (x.Count() > 1)
- {
- throw new Exception($"接口Auth重复定义{x.ToList()}");
- }
- });
- webHooks = webHooks.OrderBy(x => x.RowKey).ToList();
- tbqurey = $"PartitionKey {QueryComparisons.Equal} 'IES5-WEBHOOK' and RowKey {QueryComparisons.GreaterThanOrEqual} '{webHooks.First().RowKey}' and RowKey {QueryComparisons.LessThanOrEqual} '{webHooks.Last().RowKey}' ";
- var hookResult = table.ExecuteQuerySegmented(new TableQuery<WebHook>().Where(tbqurey), null);
- List<WebHook> hooks = hookResult.Results;
- //数据库历史数据处理
- hooks.ForEach(x => {
- var api = webHooks.Find(z => z.RowKey.Equals(x.RowKey));
- if (api != null)
- {
- x.auth = api.auth;
- x.name = api.name;
- x.type = api.type;
- x.url = api.url;
- x.method = api.method;
- x.notice = api.notice;
- }
- });
- webHooks.RemoveAll(x => hooks.Select(z => z.RowKey).Contains(x.RowKey));
- webHooks.AddRange(hooks);
- _ = table.SaveOrUpdateAll<WebHook>(webHooks);
- }
- }
- }
|