123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307 |
- using Azure.Cosmos;
- using Azure.Storage.Blobs.Models;
- using Microsoft.AspNetCore.Authorization;
- using Microsoft.AspNetCore.Http;
- using Microsoft.AspNetCore.Mvc;
- using Microsoft.Extensions.Configuration;
- using Microsoft.Extensions.Options;
- 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;
- using System.Net.Http;
- using System.Text;
- using System.Text.Json;
- using System.Threading.Tasks;
- using TEAMModelOS.Models;
- using TEAMModelOS.SDK.DI;
- using TEAMModelOS.SDK.Extension;
- using TEAMModelOS.SDK.Models;
- using TEAMModelOS.SDK.Services;
- using static TEAMModelOS.SDK.Services.BlobService;
- namespace TEAMModelOS.Controllers
- {
- /// <summary>
- ///
- ///
- /*
- AClassONE
- ee6a461a-3b40-4f70-8842-cf275d1e15ee
- px-njcS.jL1P7g0-kW:EAkO2Ve7[9k1x
- 8124850f-03d8-4949-9355-ed0d0709189e
- l2aR-bk2LfCGt7OjSwRi:qZqfXXhL4:=
- */
- /// </summary>
- [Route("aclassone")]
- [ApiController]
- public class AClassONEController : ControllerBase
- {
- private readonly IHttpClientFactory _httpClient;
- 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;
- public AClassONEController(
- AzureStorageFactory azureStorage,
- AzureRedisFactory azureRedis,
- AzureCosmosFactory azureCosmos,
- DingDing dingDing,
- SnowflakeId snowflakeId,
- IOptionsSnapshot<Option> option, IHttpClientFactory httpClient, IConfiguration configuration)
- {
- _azureStorage = azureStorage;
- _azureRedis = azureRedis;
- _azureCosmos = azureCosmos;
- _dingDing = dingDing;
- _snowflakeId = snowflakeId;
- _option = option?.Value;
- _httpClient = httpClient;
- _configuration = configuration;
- }
- /// <summary>
- /// js_code获取小程序用户信息
- /// </summary>
- /// <param name="json"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- [HttpPost("get-miniapp-userinfo")]
- //[Authorize(Roles = "AClassONE")]
- public async Task<IActionResult> GetMiniAPPOpenid(JsonElement json)
- {
- // string Content = await responseMessage.Content.ReadAsStringAsync();
- var location = _option.Location;
- var clientID = _configuration.GetValue<string>("HaBookAuth:AClassONE:clientID");
- var clientSecret = _configuration.GetValue<string>("HaBookAuth:AClassONE:clientSecret");
- var wxappid = _configuration.GetValue<string>("HaBookAuth:WXMiniAPP:appid");
- var wxsecret = _configuration.GetValue<string>("HaBookAuth:WXMiniAPP:secret");
- if (location.Contains("China"))
- {
- location = "China";
- }
- else if (location.Contains("Global"))
- {
- location = "Global";
- }
- var token = await CoreTokenExtensions.CreateAccessToken(clientID, clientSecret, location);
- //return Ok(new { token = new { token.TokenType,token.AccessToken } });
- if (!json.TryGetProperty("js_code", out JsonElement js_code)) return BadRequest("js_code is null");
- string url = $"https://api.weixin.qq.com/sns/jscode2session?appid={wxappid}&secret={wxsecret}&js_code={js_code}&grant_type=authorization_code";
- HttpResponseMessage responseMessage = await _httpClient.CreateClient().GetAsync(url);
- if (responseMessage.StatusCode == HttpStatusCode.OK)
- {
- JsonDocument document = JsonDocument.Parse(responseMessage.Content.ReadAsStream());
- return Ok(new { miniappData = document, token = new { token.TokenType, token.AccessToken } });
- }
- else
- {
- string Content = await responseMessage.Content?.ReadAsStringAsync();
- return BadRequest(Content);
- }
- }
- /// <summary>
- /// 根据家长手机号获取监护学生的信息
- /// </summary>
- /// <param name="json"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- [HttpPost("get-students-phone")]
- #if !DEBUG
- [Authorize(Roles = "AClassONE")]
- #endif
- public async Task<IActionResult> GetStudentsByPhone(JsonElement json)
- {
- try
- {
- if (!json.TryGetProperty("mobile", out JsonElement _mobile)) return BadRequest("mobile is null");
- json.TryGetProperty("name", out JsonElement _name);
- json.TryGetProperty("picture", out JsonElement _picture);
- json.TryGetProperty("query", out JsonElement _query);
- string sql = $"select value c from c where c.mobile='{_mobile}'";
- List<Guardian> guardians = new List<Guardian>();
- await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Student).
- GetItemQueryIterator<Guardian>(queryText: sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey("Base-Guardian") }))
- {
- guardians.Add(item);
- }
- //没有找到监护人信息时,尝试跨分区搜索,但是不建议。
- if (!guardians.Any() || _query.ValueKind.Equals(JsonValueKind.True))
- {
- List<Student> students = new List<Student>();
- string stuSql = $"select distinct value c from c join g in c.guardians where g.mobile='{_mobile}'";
- await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Student).
- GetItemQueryIterator<Student>(queryText: stuSql, requestOptions: new QueryRequestOptions { }))
- {
- students.Add(item);
- }
- if (students.Any())
- {
- string guardianName = "";
- string mobile = $"{_mobile}";
- List<GuardianStudent> guardianStudents = new List<GuardianStudent>();
- students.ForEach(x =>
- {
- var studentGuardian = x.guardians.Find(x => !string.IsNullOrWhiteSpace(x.mobile) && x.mobile.Equals(mobile));
- if (studentGuardian != null)
- {
- guardianName = studentGuardian.name;
- guardianStudents.Add(new GuardianStudent { type = 2, id = x.id, code = x.schoolId, name = x.name, picture = x.picture });
- }
- });
- if (guardians.Any())
- {
- guardians.First().students.AddRange(guardianStudents);
- }
- else
- {
- Guardian guardian = new Guardian() { id = Guid.NewGuid().ToString(), name = guardianName, mobile = mobile, students = guardianStudents, code = "Base-Guardian", pk = "Guardian" };
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Student).CreateItemAsync(guardian, new PartitionKey("Base-Guardian"));
- guardians.Add(guardian);
- }
- }
- }
- if (guardians.Any())
- {
- var students = guardians.SelectMany(x => x.students).DistinctBy(x => $"{x.type}-{x.id}{x.code}");
- var first = guardians.First();
- first.students = students.ToList();
- if (guardians.Count > 1)
- {
- //合并,并移除多余的绑定的手机号。
- guardians.Remove(first);
- if (guardians.Any() && !guardians.Select(x => x.id).Contains(first.id))
- {
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Student).DeleteItemsStreamAsync(guardians.Select(x => x.id).ToList(), "Base-Guardian");
- }
- }
- first.nickname = !string.IsNullOrWhiteSpace($"{_name}") ? $"{_name}" : first.name;
- first.picture = !string.IsNullOrWhiteSpace($"{_picture}") ? $"{_picture}" : first.picture;
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Student).ReplaceItemAsync(first, first.id, new PartitionKey(first.code));
- var schoolcodes = first.students.Where(s => !string.IsNullOrWhiteSpace(s.code)).Select(x => x.code);
- List<School> idSchools = new List<School>();
- if (schoolcodes.Any())
- {
- string sqlschool = $"select c.id,c.name,c.picture,c.period from c where c.id in ({string.Join(",", schoolcodes.Select(s => $"'{s}'"))})";
- await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).
- GetItemQueryIterator<School>(queryText: sqlschool, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey("Base") }))
- {
- idSchools.Add(item);
- }
- }
- var stus = first.students.GroupBy(x => x.code).Select(x => new { x.Key, list = x.ToList() });
- List<Student> studentes = new List<Student>();
- List<Class> classes = new List<Class>();
- foreach (var stu in stus)
- {
- HashSet<string> classIds = new HashSet<string>();
- string sqlStudent = $"select c.name ,c.periodId ,c.id ,c.schoolId, c.picture, c.classId, c.gender, c.year from c where c.id in ({string.Join(",", stu.list.Select(s => $"'{s.id}'"))})";
- await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Student).
- GetItemQueryIterator<Student>(queryText: sqlStudent, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"Base-{stu.Key}") }))
- {
- studentes.Add(item);
- classIds.Add(item.classId);
- }
- string sqlClassIds = $" select c.name ,c.periodId ,c.id ,c.school, c.teacher,c.year from c where c.id in ({string.Join(",", classIds.Select(s => $"'{s}'"))})";
- await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).
- GetItemQueryIterator<Class>(queryText: sqlClassIds, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"Class-{stu.Key}") }))
- {
- classes.Add(item);
- }
- }
- List<dynamic> stuData = new List<dynamic>();
- first.students.ForEach(x =>
- {
- var stu = studentes.Find(s => s.id.Equals(x.id) && s.schoolId.Equals(x.code));
- var school = idSchools.Find(s => s.id.Equals(x.code));
- string periodName = "";
- if (school != null && stu != null && !string.IsNullOrWhiteSpace(stu.periodId))
- {
- var period = school.period.Find(p => p != null && p.id.Equals(stu.periodId));
- periodName = period?.name;
- }
- string className = "";
- string teacherTmdid = "";
- string teacherName = "";
- int? classYear = 0;
- if (stu != null && !string.IsNullOrWhiteSpace(stu.classId))
- {
- var clazz = classes.Find(p => p != null && p.id.Equals(stu.classId));
- className = clazz?.name;
- teacherTmdid = clazz?.teacher?.id;
- teacherName = clazz?.teacher?.name;
- classYear = clazz?.year;
- }
- stuData.Add(new
- {
- x.id,
- schoolId = x.code,
- stu.name,
- stu.periodId,
- stu.picture,
- stu.classId,
- stu.gender,
- x.type,
- x.relation,
- stuYear = stu.year,
- schoolName = school.name,
- schoolPicture = school.picture,
- periodName,
- className,
- teacherTmdid,
- teacherName,
- classYear
- });
- });
- return Ok(new { guardian = new { first.id, first.name, first.picture, first.nickname, first.mobile, students = stuData } });
- }
- else
- {
- return Ok(new { error = 1, msg = "暂未找到学生信息" });
- }
- }
- catch (Exception ex)
- {
- return BadRequest("500错误");
- }
- }
- /// <summary>
- /// 查询考试信息
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- //[Authorize(Roles = "AClassONE")]
- [HttpPost("find-activity")]
- public async Task<IActionResult> FindExam(JsonElement request)
- {
- try
- {
- //var client = _azureCosmos.GetCosmosClient();
- var (id, name, pic, school) = HttpContext.GetAuthTokenInfo();
- (List<StuActivity> datas, string continuationToken) = await ActivityStudentService.FindActivity(request, id, school, _azureCosmos, _azureRedis);
- return Ok(new { datas, continuationToken });
- }
- catch (Exception e)
- {
- await _dingDing.SendBotMsg($"OS,{_option.Location},exam/find-activity()\n{e.Message}\n{e.StackTrace}", GroupNames.醍摩豆服務運維群組);
- return BadRequest("500错误");
- }
- }
- }
- }
|