|
@@ -19,6 +19,10 @@ using HTEXLib.COMM.Helpers;
|
|
using System.Globalization;
|
|
using System.Globalization;
|
|
using TEAMModelOS.SDK;
|
|
using TEAMModelOS.SDK;
|
|
using Microsoft.AspNetCore.Authorization;
|
|
using Microsoft.AspNetCore.Authorization;
|
|
|
|
+using StackExchange.Redis;
|
|
|
|
+using Azure.Storage.Blobs.Models;
|
|
|
|
+using Microsoft.Azure.Amqp.Sasl;
|
|
|
|
+using DocumentFormat.OpenXml.Drawing.Charts;
|
|
|
|
|
|
namespace TEAMModelOS.Controllers.Both
|
|
namespace TEAMModelOS.Controllers.Both
|
|
{
|
|
{
|
|
@@ -34,9 +38,10 @@ namespace TEAMModelOS.Controllers.Both
|
|
private readonly Option _option;
|
|
private readonly Option _option;
|
|
private readonly AzureServiceBusFactory _serviceBus;
|
|
private readonly AzureServiceBusFactory _serviceBus;
|
|
private readonly AzureStorageFactory _azureStorage;
|
|
private readonly AzureStorageFactory _azureStorage;
|
|
|
|
+ private readonly AzureRedisFactory _azureRedis;
|
|
private static List<string> weekDays = new List<string> { "MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN" };
|
|
private static List<string> weekDays = new List<string> { "MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN" };
|
|
public IConfiguration _configuration { get; set; }
|
|
public IConfiguration _configuration { get; set; }
|
|
- public CourseBaseController(AzureCosmosFactory azureCosmos, DingDing dingDing, IOptionsSnapshot<Option> option, AzureServiceBusFactory serviceBus, AzureStorageFactory azureStorage, IConfiguration configuration)
|
|
|
|
|
|
+ public CourseBaseController(AzureRedisFactory azureRedis,AzureCosmosFactory azureCosmos, DingDing dingDing, IOptionsSnapshot<Option> option, AzureServiceBusFactory serviceBus, AzureStorageFactory azureStorage, IConfiguration configuration)
|
|
{
|
|
{
|
|
_azureCosmos = azureCosmos;
|
|
_azureCosmos = azureCosmos;
|
|
_dingDing = dingDing;
|
|
_dingDing = dingDing;
|
|
@@ -44,6 +49,7 @@ namespace TEAMModelOS.Controllers.Both
|
|
_serviceBus = serviceBus;
|
|
_serviceBus = serviceBus;
|
|
_configuration = configuration;
|
|
_configuration = configuration;
|
|
_azureStorage = azureStorage;
|
|
_azureStorage = azureStorage;
|
|
|
|
+ _azureRedis = azureRedis;
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// <summary>
|
|
/// 更新保存课程
|
|
/// 更新保存课程
|
|
@@ -66,7 +72,47 @@ namespace TEAMModelOS.Controllers.Both
|
|
var client = _azureCosmos.GetCosmosClient();
|
|
var client = _azureCosmos.GetCosmosClient();
|
|
switch (true)
|
|
switch (true)
|
|
{
|
|
{
|
|
- case bool when $"{grant_type}".Equals("insert", StringComparison.OrdinalIgnoreCase) || $"{grant_type}".Equals("update", StringComparison.OrdinalIgnoreCase):
|
|
|
|
|
|
+ case bool when $"{grant_type}".Equals("list", StringComparison.OrdinalIgnoreCase):
|
|
|
|
+ {
|
|
|
|
+ if ( !request.TryGetProperty("scope", out JsonElement _scope) || !request.TryGetProperty("code", out JsonElement _code))
|
|
|
|
+ {
|
|
|
|
+ return BadRequest();
|
|
|
|
+ }
|
|
|
|
+ string tbname = $"{_scope}".Equals("school", StringComparison.OrdinalIgnoreCase)?Constant.School:Constant.Teacher;
|
|
|
|
+ string code = $"CourseBase-{_code}";
|
|
|
|
+ string baseSql = $"select value c from c ";
|
|
|
|
+ List<CourseBase> courseBases = new List<CourseBase>();
|
|
|
|
+ await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, tbname)
|
|
|
|
+ .GetItemQueryIterator<CourseBase>(queryText: baseSql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey(code) }))
|
|
|
|
+ {
|
|
|
|
+ courseBases.Add(item);
|
|
|
|
+ }
|
|
|
|
+ return Ok(new { courseBases });
|
|
|
|
+ }
|
|
|
|
+ case bool when $"{grant_type}".Equals("delete", StringComparison.OrdinalIgnoreCase):
|
|
|
|
+ {
|
|
|
|
+ if (!request.TryGetProperty("id", out JsonElement _id) || !request.TryGetProperty("scope", out JsonElement _scope) || !request.TryGetProperty("code", out JsonElement _code))
|
|
|
|
+ {
|
|
|
|
+ return BadRequest();
|
|
|
|
+ }
|
|
|
|
+ string tbname = $"{_scope}".Equals("school", StringComparison.OrdinalIgnoreCase) ? Constant.School : Constant.Teacher;
|
|
|
|
+ Azure.Response response= await client.GetContainer(Constant.TEAMModelOS, tbname).DeleteItemStreamAsync(_id.ToString(), new PartitionKey($"CourseBase-{_code}"));
|
|
|
|
+ //需要联动删除排课
|
|
|
|
+ string taskCode = $"CourseTask-{_code}-{_id}";
|
|
|
|
+ string taskSql = $"select value c from c ";
|
|
|
|
+ List<CourseTask> courseTasks = new List<CourseTask>();
|
|
|
|
+ await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, tbname)
|
|
|
|
+ .GetItemQueryIterator<CourseTask>(queryText: taskSql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey(taskCode) }))
|
|
|
|
+ {
|
|
|
|
+ courseTasks.Add(item);
|
|
|
|
+ }
|
|
|
|
+ if (courseTasks.Count > 0)
|
|
|
|
+ {
|
|
|
|
+ await client.GetContainer(Constant.TEAMModelOS, tbname).DeleteItemsStreamAsync(courseTasks.Select(x=>x.id).ToList(), taskCode);
|
|
|
|
+ }
|
|
|
|
+ return Ok(new {code= response .Status});
|
|
|
|
+ }
|
|
|
|
+ case bool when $"{grant_type}".Equals("upsert", StringComparison.OrdinalIgnoreCase) :
|
|
{
|
|
{
|
|
if (!request.TryGetProperty("course", out JsonElement _course))
|
|
if (!request.TryGetProperty("course", out JsonElement _course))
|
|
{
|
|
{
|
|
@@ -78,32 +124,71 @@ namespace TEAMModelOS.Controllers.Both
|
|
{
|
|
{
|
|
courseBase.id = Guid.NewGuid().ToString();
|
|
courseBase.id = Guid.NewGuid().ToString();
|
|
}
|
|
}
|
|
- string tbname = "";
|
|
|
|
|
|
+ string tbname = $"{courseBase.scope}".Equals("school", StringComparison.OrdinalIgnoreCase) ? Constant.School : Constant.Teacher;
|
|
if (courseBase.scope.Equals("school", StringComparison.OrdinalIgnoreCase))
|
|
if (courseBase.scope.Equals("school", StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
{
|
|
- tbname = Constant.School;
|
|
|
|
courseBase.school = school;
|
|
courseBase.school = school;
|
|
courseBase.creatorId = id;
|
|
courseBase.creatorId = id;
|
|
courseBase.code = $"CourseBase-{school}";
|
|
courseBase.code = $"CourseBase-{school}";
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
- tbname = Constant.Teacher;
|
|
|
|
courseBase.creatorId = id;
|
|
courseBase.creatorId = id;
|
|
courseBase.code = $"CourseBase-{id}";
|
|
courseBase.code = $"CourseBase-{id}";
|
|
}
|
|
}
|
|
- var response = await client.GetContainer(Constant.TEAMModelOS, tbname).ReadItemStreamAsync(courseBase.id, new PartitionKey(courseBase.code));
|
|
|
|
- if (response.Status == 200)
|
|
|
|
|
|
+ await client.GetContainer(Constant.TEAMModelOS, tbname).UpsertItemAsync(courseBase, new PartitionKey(courseBase.code));
|
|
|
|
+ return Ok(new { course = courseBase });
|
|
|
|
+ }
|
|
|
|
+ case bool when $"{grant_type}".Equals("read-task", StringComparison.OrdinalIgnoreCase):
|
|
|
|
+ {
|
|
|
|
+ if (!request.TryGetProperty("scope", out JsonElement _scope))
|
|
{
|
|
{
|
|
- await client.GetContainer(Constant.TEAMModelOS, tbname).ReplaceItemAsync(courseBase, courseBase.id, new PartitionKey(courseBase.code));
|
|
|
|
|
|
+ return BadRequest();
|
|
|
|
+ }
|
|
|
|
+ string tbname = $"{_scope}".Equals("school", StringComparison.OrdinalIgnoreCase) ? Constant.School : Constant.Teacher;
|
|
|
|
+ if (_scope.ToString().Equals("school", StringComparison.OrdinalIgnoreCase))
|
|
|
|
+ {
|
|
|
|
+
|
|
|
|
+ if (!request.TryGetProperty("periodId", out JsonElement _periodId)) return BadRequest();
|
|
|
|
+ if (!request.TryGetProperty("courseId", out JsonElement _courseId)) return BadRequest();
|
|
|
|
+ int studyYear = -1;
|
|
|
|
+ string semesterId = string.Empty;
|
|
|
|
+ if (!request.TryGetProperty("year", out JsonElement _year) || !request.TryGetProperty("semesterId", out JsonElement _semesterId))
|
|
|
|
+ {
|
|
|
|
+ //如果没传,则以当前时间获取学年和学期信息
|
|
|
|
+ School schoolBase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(school, new PartitionKey("Base"));
|
|
|
|
+ var period = schoolBase.period.Find(x => x.id.Equals($"{_periodId}"));
|
|
|
|
+ (Semester currSemester, int studyYear, DateTimeOffset date, DateTimeOffset nextSemester) info = SchoolService.GetSemester(period);
|
|
|
|
+ semesterId = info.currSemester.id;
|
|
|
|
+ studyYear = info.studyYear;
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ studyYear = _year.GetInt32();
|
|
|
|
+ semesterId=_semesterId.GetString();
|
|
|
|
+ }
|
|
|
|
+ string taskCode = $"CourseTask-{school}-{_courseId}";
|
|
|
|
+ string taskId = $"{studyYear}-{semesterId}";
|
|
|
|
+ Azure.Response response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, tbname).ReadItemStreamAsync(taskId, new PartitionKey(taskCode));
|
|
|
|
+ if (response.Status == 200) {
|
|
|
|
+ CourseTask courseTask=JsonDocument.Parse(response.Content).RootElement.ToObject<CourseTask>();
|
|
|
|
+ }
|
|
|
|
+ return Ok(new { studyYear, semesterId, });
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
- await client.GetContainer(Constant.TEAMModelOS, tbname).CreateItemAsync(courseBase, new PartitionKey(courseBase.code));
|
|
|
|
|
|
+
|
|
}
|
|
}
|
|
- return Ok(new { course = courseBase });
|
|
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ case bool when $"{grant_type}".Equals("insert-task", StringComparison.OrdinalIgnoreCase) :
|
|
|
|
+ {
|
|
|
|
+ if ( !request.TryGetProperty("scope", out JsonElement _scope))
|
|
|
|
+ {
|
|
|
|
+ return BadRequest();
|
|
|
|
+ }
|
|
|
|
+ string tbname = $"{_scope}".Equals("school", StringComparison.OrdinalIgnoreCase) ? Constant.School : Constant.Teacher;
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
-
|
|
|
|
//按照模板导入进行数据转换并且进行检查
|
|
//按照模板导入进行数据转换并且进行检查
|
|
case bool when ($"{grant_type}".Equals("import-check") && $"{scope}".Equals("school", StringComparison.OrdinalIgnoreCase)):
|
|
case bool when ($"{grant_type}".Equals("import-check") && $"{scope}".Equals("school", StringComparison.OrdinalIgnoreCase)):
|
|
{
|
|
{
|
|
@@ -489,129 +574,32 @@ namespace TEAMModelOS.Controllers.Both
|
|
}
|
|
}
|
|
checkedCount++;
|
|
checkedCount++;
|
|
}
|
|
}
|
|
- return Ok(new { courseCheckedImports = courseTasks , checkedCount, invalidCount= courseInvalidImports.Count, courseInvalidImports });
|
|
|
|
|
|
+ //生成检查结果token,有效期5分钟
|
|
|
|
+ string checkToken=$"CourseTask:CheckToken:{scope}:{school}:{Guid.NewGuid()}" ;
|
|
|
|
+ await _azureRedis.GetRedisClient(8).StringSetAsync(checkToken, courseTasks.ToJsonString(),expiry:new TimeSpan(0,5,0));
|
|
|
|
+ return Ok(new { courseCheckedImports = courseTasks , checkedCount, invalidCount= courseInvalidImports.Count, courseInvalidImports, checkToken });
|
|
}
|
|
}
|
|
- case bool when $"{grant_type}".Equals("import", StringComparison.OrdinalIgnoreCase) && $"{scope}".Equals("school", StringComparison.OrdinalIgnoreCase):
|
|
|
|
|
|
+ case bool when $"{grant_type}".Equals("import-task", StringComparison.OrdinalIgnoreCase) && $"{scope}".Equals("school", StringComparison.OrdinalIgnoreCase):
|
|
{
|
|
{
|
|
- if (!request.TryGetProperty("courseBaseImports", out JsonElement _courseBaseImports)) return BadRequest();
|
|
|
|
- List<CourseBaseImport> courseBaseImports = _courseBaseImports.ToObject<List<CourseBaseImport>>();
|
|
|
|
- foreach (var courseBaseImport in courseBaseImports)
|
|
|
|
|
|
+ request.TryGetProperty("checkToken", out JsonElement _checkToken);
|
|
|
|
+ if (!string.IsNullOrWhiteSpace($"{_checkToken}") && $"{_checkToken}".StartsWith($"CourseTask:CheckToken:{scope}:{school}:"))
|
|
{
|
|
{
|
|
- string courseId = "";
|
|
|
|
- courseBaseImport.courseBase.pk = "CourseBase";
|
|
|
|
- courseBaseImport.courseBase.scope = "school";
|
|
|
|
- courseBaseImport.courseBase.school = school;
|
|
|
|
- courseBaseImport.courseBase.creatorId = id;
|
|
|
|
- courseBaseImport.courseBase.code = $"CourseBase-{school}";
|
|
|
|
- StringBuilder sql = new StringBuilder(" select top 1 value c from c ");
|
|
|
|
- if (!string.IsNullOrWhiteSpace(courseBaseImport.courseBase.name)
|
|
|
|
- && !string.IsNullOrWhiteSpace(courseBaseImport.courseBase?.period?.id)
|
|
|
|
- && !string.IsNullOrWhiteSpace(courseBaseImport.courseBase?.subject?.id))
|
|
|
|
|
|
+ RedisValue value = await _azureRedis.GetRedisClient(8).StringGetAsync($"{_checkToken}");
|
|
|
|
+ List<CourseTask> courseTasks = value.ToString().ToObject<List<CourseTask>>();
|
|
|
|
+ if (courseTasks.IsNotEmpty())
|
|
{
|
|
{
|
|
- sql.Append($" where c.name ='{courseBaseImport.courseBase.name}' and c.period.id='{courseBaseImport.courseBase.period.id}' and c.subject.id='{courseBaseImport.courseBase.subject.id}' ");
|
|
|
|
- if (!string.IsNullOrWhiteSpace(courseBaseImport.courseBase?.major?.id))
|
|
|
|
|
|
+ foreach (var task in courseTasks)
|
|
{
|
|
{
|
|
- sql.Append($" and c.major.id='{courseBaseImport.courseBase.major.id}'");
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- CourseBase courseBaseDb = null;
|
|
|
|
- await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School)
|
|
|
|
- .GetItemQueryIterator<CourseBase>(queryText: sql.ToString(), requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey(courseBaseImport.courseBase.code) }))
|
|
|
|
- {
|
|
|
|
- courseBaseDb = item;
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- if (courseBaseDb != null)
|
|
|
|
- {
|
|
|
|
- if (!string.IsNullOrWhiteSpace(courseBaseImport.courseBase?.desc)) {
|
|
|
|
- courseBaseDb.desc=courseBaseImport.courseBase.desc;
|
|
|
|
- }
|
|
|
|
- if (!string.IsNullOrWhiteSpace(courseBaseImport.courseBase?.color))
|
|
|
|
- {
|
|
|
|
- courseBaseDb.color = courseBaseImport.courseBase.color;
|
|
|
|
- }
|
|
|
|
- if (!string.IsNullOrWhiteSpace(courseBaseImport.courseBase?.no))
|
|
|
|
- {
|
|
|
|
- courseBaseDb.no = courseBaseImport.courseBase.no;
|
|
|
|
- }
|
|
|
|
- if (courseBaseImport.courseBase?.gradeId != -1) {
|
|
|
|
- courseBaseDb.gradeId = courseBaseImport.courseBase.gradeId;
|
|
|
|
- }
|
|
|
|
- courseId = courseBaseDb.id;
|
|
|
|
- courseBaseDb = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReplaceItemAsync(courseBaseDb, courseBaseDb.id, new PartitionKey(courseBaseDb.code));
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- courseBaseImport.courseBase.id= Guid.NewGuid().ToString();
|
|
|
|
- courseId = courseBaseImport.courseBase.id;
|
|
|
|
- courseBaseDb = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).CreateItemAsync(courseBaseImport.courseBase, new PartitionKey(courseBaseImport.courseBase.code));
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- if (courseBaseImport.courseTasks.IsNotEmpty()) {
|
|
|
|
- foreach (var task in courseBaseImport.courseTasks) {
|
|
|
|
- if (!string.IsNullOrWhiteSpace(task.semesterId) && task.year > 2010)
|
|
|
|
- {
|
|
|
|
- string taskId = $"{task.year}-{task.semesterId}";
|
|
|
|
- string code = $"CourseTask-{school}-{courseId}";
|
|
|
|
- Azure.Response response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemStreamAsync(taskId, new PartitionKey(code));
|
|
|
|
- CourseTask courseTask = null;
|
|
|
|
- if (response.Status == 200)
|
|
|
|
- {
|
|
|
|
- var doc = JsonDocument.Parse(response.Content);
|
|
|
|
- courseTask = doc.RootElement.Deserialize<CourseTask>();
|
|
|
|
- courseTask.courseId = courseId;
|
|
|
|
- if (courseTask.schedules.IsNotEmpty())
|
|
|
|
- {
|
|
|
|
- if (task.schedules.IsNotEmpty()) {
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
- courseTask.schedules = task.schedules.IsNotEmpty() ? task.schedules : new List<ScheduleTask>() ;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- courseTask = new CourseTask
|
|
|
|
- {
|
|
|
|
- id = taskId,
|
|
|
|
- code = code,
|
|
|
|
- expire = -1,
|
|
|
|
- weekCount = -1,
|
|
|
|
- timeCount = -1,
|
|
|
|
- semesterId = task.semesterId,
|
|
|
|
- year = task.year,
|
|
|
|
- courseId = courseId,
|
|
|
|
- ttl = -1,
|
|
|
|
- pk = "CourseTask",
|
|
|
|
- schedules = task.schedules.IsNotEmpty() ? task.schedules : new List<ScheduleTask>()
|
|
|
|
- };
|
|
|
|
- }
|
|
|
|
- //到期时间正常访问
|
|
|
|
- if (task.expire == -1 || courseTask.expire > 1259510400000)
|
|
|
|
- {
|
|
|
|
- courseTask.expire = task.expire;
|
|
|
|
- }
|
|
|
|
- if (task.weekCount > 0)
|
|
|
|
- {
|
|
|
|
- courseTask.weekCount = task.weekCount;
|
|
|
|
- }
|
|
|
|
- if (task.timeCount > 0)
|
|
|
|
- {
|
|
|
|
- courseTask.timeCount = task.timeCount;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
- return Ok(new {code =1,msg="学期或学年设置错误!" });
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
|
|
+ await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).UpsertItemAsync(task, new PartitionKey(task.code));
|
|
}
|
|
}
|
|
|
|
+ return Ok(new { code=200 });
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- break;
|
|
|
|
|
|
+ return BadRequest();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- } catch (Exception ex) {
|
|
|
|
|
|
+ } catch (Exception ex) {
|
|
|
|
+ await _dingDing.SendBotMsg($"{_option.Location},课程处理异常,{ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
|
|
}
|
|
}
|
|
return Ok();
|
|
return Ok();
|
|
}
|
|
}
|