using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using TEAMModelOS.SDK.DI;
using Azure.Cosmos;
using System.Text.Json;
using System.Collections.Generic;
using TEAMModelOS.SDK.Models;
using TEAMModelOS.SDK.Extension;
using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
using TEAMModelOS.SDK.Models.Cosmos;
using TEAMModelOS.SDK.Models.Cosmos.Common;
namespace TEAMModelFunction
{
public class ActivityHttpTrigger
{
private readonly AzureCosmosFactory _azureCosmos;
private readonly DingDing _dingDing;
private readonly AzureStorageFactory _azureStorage;
private readonly AzureRedisFactory _azureRedis;
public ActivityHttpTrigger(AzureCosmosFactory azureCosmos, DingDing dingDing, AzureStorageFactory azureStorage
, AzureRedisFactory azureRedis)
{
_azureCosmos = azureCosmos;
_dingDing = dingDing;
_azureStorage = azureStorage;
_azureRedis = azureRedis;
}
///
/// 修复已存在的课程且未初始化学生课程列表的业务。
///
///
///
///
[FunctionName("fix-stu-course")]
public async Task StuCourse([HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequest req, ILogger log)
{
log.LogInformation("fix-stu-course...");
string originCode = await new StreamReader(req.Body).ReadToEndAsync();
List courses = new List();
var client = _azureCosmos.GetCosmosClient();
var query = $"select * from c ";
await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryIterator(queryText: query,
requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Course-{originCode}") }))
{
courses.Add(item);
}
await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryIterator(queryText: query,
requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Course-{originCode}") }))
{
courses.Add(item);
}
//2.获取课程的id 并尝试添加或移除对应的学生课程记录StuCourse。
foreach (var course in courses)
{
if (course.schedule.IsNotEmpty())
{
foreach (var sc in course.schedule)
{
if (!string.IsNullOrEmpty(sc.stulist))
{
(List tmdids, List studentss) = await TriggerStuActivity.GetStuList(client, _dingDing, new List() { sc.stulist }, course.school);
foreach (var addStu in studentss)
{
var stuCourse = new StuCourse
{
id = course.id,
scode = course.code,
name = course.name,
code = $"StuCourse-{course.school}-{addStu.id}",
scope = course.scope,
school = course.school,
creatorId = course.creatorId,
pk = "StuCourse"
};
await client.GetContainer("TEAMModelOS", "Student").UpsertItemAsync(stuCourse, new PartitionKey(stuCourse.code));
}
foreach (var addTmd in tmdids)
{
var tmdCourse = new StuCourse
{
id = course.id,
scode = course.code,
name = course.name,
code = $"StuCourse-{addTmd}",
scope = course.scope,
//school = courseChange.school,
creatorId = course.creatorId,
pk = "StuCourse"
};
await client.GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync(tmdCourse, new PartitionKey(tmdCourse.code));
}
}
}
}
}
return new OkObjectResult(new { });
}
///
/// 设置评测未初始化学生列表的
///
///
///
///
[FunctionName("fix-exam-activity")]
public async Task ExamActivity([HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequest req,ILogger log)
{
log.LogInformation("fix-exam-activity...");
string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
List datas = JsonConvert.DeserializeObject>(requestBody);
var client = _azureCosmos.GetCosmosClient();
var query = $"select * from c ";
foreach (string data in datas) {
List exams = new List();
await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(
queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Exam-{data}") }))
{
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())
{
exams.Add(obj.ToObject());
}
}
}
log.LogInformation($"{exams.ToJsonString()}");
foreach (var info in exams)
{
if (!info.classes.IsNotEmpty())
{
continue;
}
List sub = new List();
foreach (ExamSubject subject in info.subjects)
{
sub.Add(subject.id);
}
(List tmdids, List studentss) = await TriggerStuActivity.GetStuList(client, _dingDing, info.classes, info.school);
List stuActivities = new List();
List tmdActivities = new List();
if (tmdids.IsNotEmpty())
{
tmdids.ForEach(x => {
tmdActivities.Add(new StuActivity
{
pk = "Activity",
id = info.id,
code = $"Activity-{x}",
type = "exam",
name = info.name,
startTime = info.startTime,
endTime = info.endTime,
scode = info.code,
scope = info.scope,
school = info.school,
creatorId = info.creatorId,
subjects = sub,
blob = null,
owner = info.owner
});
});
}
if (studentss.IsNotEmpty())
{
studentss.ForEach(x => {
stuActivities.Add(new StuActivity
{
pk = "Activity",
id = info.id,
code = $"Activity-{info.school}-{x.id}",
type = "exam",
name = info.name,
startTime = info.startTime,
endTime = info.endTime,
scode = info.code,
scope = info.scope,
school = info.school,
creatorId = info.creatorId,
subjects = sub,
blob=null,
owner = info.owner
});
});
}
await TriggerStuActivity.SaveStuActivity(client, _dingDing, stuActivities, tmdActivities);
}
}
return new OkObjectResult(new { });
}
///
/// 设置投票未初始化学生列表的业务
///
///
///
///
[FunctionName("fix-vote-activity")]
public async Task VoteActivity(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
log.LogInformation("fix-vote-activity...");
string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
List datas = JsonConvert.DeserializeObject>(requestBody);
var client = _azureCosmos.GetCosmosClient();
var query = $"select * from c ";
foreach (string data in datas)
{
List votes = new List();
await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(
queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Vote-{data}") }))
{
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())
{
votes.Add(obj.ToObject());
}
}
}
log.LogInformation($"{votes.ToJsonString()}");
foreach (var info in votes)
{
if (!info.classes.IsNotEmpty())
{
continue;
}
(List tmdids, List studentss) = await TriggerStuActivity.GetStuList(client, _dingDing, info.classes, info.school);
List stuActivities = new List();
List tmdActivities = new List();
if (tmdids.IsNotEmpty())
{
tmdids.ForEach(x => {
tmdActivities.Add(new StuActivity
{
pk = "Activity",
id = info.id,
code = $"Activity-{x}",
type = "vote",
name = info.name,
startTime = info.startTime,
endTime = info.endTime,
scode = info.code,
scope = info.scope,
school = info.school,
creatorId = info.creatorId,
subjects = new List() { "" },
blob = null,
owner = info.owner
});
});
}
if (studentss.IsNotEmpty())
{
studentss.ForEach(x => {
stuActivities.Add(new StuActivity
{
pk = "Activity",
id = info.id,
code = $"Activity-{info.school}-{x.id}",
type = "vote",
name = info.name,
startTime = info.startTime,
endTime = info.endTime,
scode = info.code,
scope = info.scope,
school = info.school,
creatorId = info.creatorId,
subjects = new List() { "" },
blob = null,
owner = info.owner
});
});
}
await TriggerStuActivity.SaveStuActivity(client, _dingDing, stuActivities, tmdActivities);
}
}
return new OkObjectResult(new { });
}
///
/// 设置问卷调查未初始化学生列表的业务
///
///
///
///
[FunctionName("fix-survey-activity")]
public async Task SurveyActivity(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
log.LogInformation("fix-survey-activity...");
string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
List datas = JsonConvert.DeserializeObject>(requestBody);
var client = _azureCosmos.GetCosmosClient();
var query = $"select * from c ";
foreach (string data in datas)
{
List surveys = new List();
await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(
queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Survey-{data}") }))
{
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())
{
surveys.Add(obj.ToObject());
}
}
}
log.LogInformation($"{surveys.ToJsonString()}");
foreach (var info in surveys)
{
if (!info.classes.IsNotEmpty())
{
continue;
}
(List tmdids, List studentss) = await TriggerStuActivity.GetStuList(client, _dingDing, info.classes, info.school);
List stuActivities = new List();
List tmdActivities = new List();
if (tmdids.IsNotEmpty())
{
tmdids.ForEach(x => {
tmdActivities.Add(new StuActivity
{
pk = "Activity",
id = info.id,
code = $"Activity-{x}",
type = "survey",
name = info.name,
startTime = info.startTime,
endTime = info.endTime,
scode = info.code,
scope = info.scope,
school = info.school,
creatorId = info.creatorId,
subjects = new List() { "" },
blob = info.blob,
owner=info.owner
});
});
}
if (studentss.IsNotEmpty())
{
studentss.ForEach(x => {
stuActivities.Add(new StuActivity
{
pk = "Activity",
id = info.id,
code = $"Activity-{info.school}-{x.id}",
type = "survey",
name = info.name,
startTime = info.startTime,
endTime = info.endTime,
scode = info.code,
scope = info.scope,
school = info.school,
creatorId = info.creatorId,
subjects = new List() { "" },
blob=info.blob,
owner = info.owner
});
});
}
await TriggerStuActivity.SaveStuActivity(client, _dingDing, stuActivities, tmdActivities);
}
}
return new OkObjectResult(new { });
}
///
/// 设置问卷调查未初始化学生列表的业务
///
///
///
///
[FunctionName("refresh-stu-activity")]
public async Task RefreshStuActivity(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
string id = "";
string code = "";
var client = _azureCosmos.GetCosmosClient();
// var query = $"SELECT distinct c.owner, c.id,c.code, c.classes,c.subjects,c.progress,c.scope,c.startTime,c.school,c.creatorId,c.name,c.pk ,c.endTime FROM c join A1 in c.classes where c.pk='{type}' and A1 in('{stuListChange.listid}') ";
MQActivity activity = null;
try {
activity= await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync(id, new Azure.Cosmos.PartitionKey($"{code}"));
} catch (Exception ex) {
}
if (activity != null) {
(List tmdids, List students) =await TriggerStuActivity.GetStuList(client,_dingDing, activity.classes, activity.school);
if (tmdids.IsNotEmpty()) {
foreach (string tmdid in tmdids)
{
var stucourse = new StuActivity
{
id = activity.id,
scode = activity.code,
name = activity.name,
code = $"Activity-{tmdid}",
scope = activity.scope,
school = activity.school,
creatorId = activity.creatorId,
pk = "Activity",
type = activity.pk,
subjects = activity.pk.ToLower().Equals("exam") ? activity.subjects : new List() { "" },
startTime = activity.startTime,
endTime = activity.endTime,
blob = activity.blob,
owner = activity.owner
};
await client.GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code));
}
}
if (students.IsNotEmpty()) {
foreach (Students student in students)
{
var stucourse = new StuActivity
{
id = activity.id,
scode = activity.code,
name = activity.name,
code = $"Activity-{activity.school}-{student.id}",
scope = activity.scope,
school = activity.school,
creatorId = activity.creatorId,
pk = "Activity",
type = activity.pk,
subjects = activity.pk.Equals("exam") ? activity.subjects : new List() { "" },
startTime = activity.startTime,
endTime = activity.endTime,
blob = activity.blob,
owner = activity.owner
};
await client.GetContainer("TEAMModelOS", "Student").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code));
}
}
}
return null;
}
}
}