using Azure.Cosmos;
using Azure.Storage.Blobs.Models;
using HTEXLib.COMM.Helpers;
using Microsoft.Azure.Cosmos.Table;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using OpenXmlPowerTools;
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.IO;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using TEAMModelOS.SDK;
using TEAMModelOS.SDK.DI;
using TEAMModelOS.SDK.Extension;
using TEAMModelOS.SDK.Models;
using TEAMModelOS.SDK.Models.Cosmos.Teacher;
using TEAMModelOS.SDK.Models.Table;
using static TEAMModelOS.SDK.Models.Teacher;
namespace TEAMModelOS.FunctionV4.HttpTrigger
{
public class IESHttpTrigger
{
private readonly AzureCosmosFactory _azureCosmos;
private readonly DingDing _dingDing;
private readonly AzureStorageFactory _azureStorage;
private readonly AzureRedisFactory _azureRedis;
public IESHttpTrigger(AzureCosmosFactory azureCosmos, DingDing dingDing, AzureStorageFactory azureStorage
, AzureRedisFactory azureRedis)
{
_azureCosmos = azureCosmos;
_dingDing = dingDing;
_azureStorage = azureStorage;
_azureRedis = azureRedis;
}
///
///
///
///
///
[Function("system-info-function")]
public async Task SystemInfo([HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequestData req)
{
var response = req.CreateResponse(HttpStatusCode.OK);
Type attr = this.GetType();
string currentDirectory = Path.GetDirectoryName(attr.Assembly.Location);
Assembly assembly = Assembly.LoadFrom($"{currentDirectory}\\TEAMModelOS.FunctionV4.dll");
var description = assembly.GetCustomAttribute().Description;
//var v1 = Assembly.GetEntryAssembly().GetName().Version;
//var v2 = Assembly.GetEntryAssembly().GetCustomAttribute().Version;
// var description = Assembly.GetEntryAssembly().GetCustomAttribute().Description;
var version = Assembly.GetEntryAssembly().GetCustomAttribute().Version;
long nowtime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
//Console.WriteLine($"Assembly.GetEntryAssembly().GetName().Version: " +
// $"{Assembly.GetEntryAssembly().GetName().Version}");5.2107.12.1
//Console.WriteLine($"Assembly.GetEntryAssembly().GetCustomAttribute().Version:" +
// $"{Assembly.GetEntryAssembly().GetCustomAttribute().Version}");5.2107.12.1
//Console.WriteLine($"Assembly.GetEntryAssembly().GetCustomAttribute().InformationalVersion:" +
// $"{Assembly.GetEntryAssembly().GetCustomAttribute().InformationalVersion}");5.2107.12
await response.WriteAsJsonAsync(new { version, description, nowtime });
return response;
}
///
/// 区级艺术评价变更,异步同步已开启数据同步的学校。
///
///
///
///
[Function("area-artsetting-change")]
public async Task AreaArtSettingChange([HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequestData req) {
var response = req.CreateResponse(HttpStatusCode.OK);
string data = await new StreamReader(req.Body).ReadToEndAsync();
var json = JsonDocument.Parse(data).RootElement;
json.TryGetProperty("areaId", out JsonElement _areaId);
string schoolSQL = $"select c.id ,c.name ,c.period from c where c.areaId='{_areaId}'";
List schools = new List();
await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School)
.GetItemQueryIterator(queryText: schoolSQL, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"Base") }))
{
schools.Add(item);
}
ArtSetting artSetting= await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemAsync($"{_areaId}", new PartitionKey());
foreach (var school in schools) {
var periods = school.period.Where(p => !string.IsNullOrWhiteSpace(p.type));
foreach (var period in periods)
{
var dimension = artSetting.dimensions.FindAll(x => x.type.Contains(period.type));
var bindIds = period.subjects.Where(s => !string.IsNullOrWhiteSpace(s.bindId)).Select(x => x.bindId);
//该学段未同步学科的。
var unBindIds = dimension.Where(z => !string.IsNullOrWhiteSpace(z.subjectBind)).Select(x => x.subjectBind).ToHashSet().Except(bindIds);
if (unBindIds.Any())
{
//尝试寻找同名学科且没有设置bindId的
foreach (var unBindId in unBindIds)
{
var subjects = artSetting.dimensions.FindAll(d => !string.IsNullOrWhiteSpace(d.subjectBind) && !string.IsNullOrWhiteSpace(d.subject) && d.subjectBind.Equals(unBindId))?.Select(m => m.subject);
if (subjects != null)
{
foreach (var subject in subjects)
{
//获取同名学科,且没绑定的
var sub = period.subjects.FindAll(sub => sub.name.Equals(subject) && string.IsNullOrWhiteSpace(sub.bindId));
if (sub.IsNotEmpty())
{
sub[0].bindId = unBindId;
}
else
{
period.subjects.Add(new Subject { id = Guid.NewGuid().ToString(), name = subject, bindId = unBindId, type = 1 });
}
break;
}
}
}
}
var period_subjects = period.subjects.Where(s => !string.IsNullOrWhiteSpace(s.bindId));
foreach (var subject in period_subjects)
{
var dim= dimension.Where(x => x.subjectBind.Equals(subject.bindId));
if (dim.Any()) {
Knowledge old = null;
string sql = $"select value(c) from c where c.periodId = '{period.id}'";
string pk = $"Knowledge-{school.id}-{subject.id}";
await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").
GetItemQueryIterator(queryText: sql, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey(pk) }))
{
old = item;
break;
}
//同步知识块。
if (old != null)
{
}
else {
}
}
}
}
}
return response;
}
///
/// 行政班,学生毕业状态变更。
///
///
///
///
[Function("graduate-change")]
public async Task GraduateChange([HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequestData req) {
var response = req.CreateResponse(HttpStatusCode.OK);
dynamic jsondata =new ExpandoObject() ;
try {
string data = await new StreamReader(req.Body).ReadToEndAsync();
var json = JsonDocument.Parse(data).RootElement;
jsondata = json;
await _dingDing.SendBotMsg( "毕业状态变更:"+json.ToJsonString(), GroupNames.成都开发測試群組);
string schoolId = null;
if (json.TryGetProperty("schoolId", out JsonElement _schoolId))
{
schoolId = $"{_schoolId}";
}
if (string.IsNullOrEmpty(schoolId))
{
return response;
}
//计算毕业的
if (json.TryGetProperty("graduate_classes", out JsonElement _graduate_classes))
{
List graduate_classes = _graduate_classes.ToObject>();
if (graduate_classes.IsNotEmpty())
{
var ids = graduate_classes.Where(x => !string.IsNullOrWhiteSpace(x.id)).Select(x => $"'{x.id}'");
List students = new List();
string sql = $"select value c from c where (c.graduate = 0 or IS_DEFINED(c.graduate) = false) and c.classId in ({string.Join(",", ids)})";
await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Student)
.GetItemQueryIterator(queryText: sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"Base-{schoolId}") }))
{
item.graduate = 1;
students.Add(item);
}
foreach (var item in students)
{
item.graduate = 1;
await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Student).ReplaceItemAsync(item, item.id, new PartitionKey($"Base-{schoolId}"));
}
foreach (var item in graduate_classes)
{
item.graduate = 1;
await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReplaceItemAsync(item, item.id, new PartitionKey($"Class-{schoolId}"));
}
}
}
//未毕业的
if (json.TryGetProperty("cancel_graduate_classes", out JsonElement _cancel_graduate_classes))
{
List cancel_graduate_classes = _cancel_graduate_classes.ToObject>();
if (cancel_graduate_classes.IsNotEmpty())
{
var ids = cancel_graduate_classes.Where(x => !string.IsNullOrWhiteSpace(x.id)).Select(x => $"'{x.id}'");
List students = new List();
string sql = $"select value c from c where c.graduate =1 and c.classId in ({string.Join(",", ids)})";
await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Student)
.GetItemQueryIterator(queryText: sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"Base-{schoolId}") }))
{
item.graduate = 0;
students.Add(item);
}
foreach (var item in students)
{
item.graduate = 0;
await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Student).ReplaceItemAsync(item, item.id, new PartitionKey($"Base-{schoolId}"));
}
foreach (var item in cancel_graduate_classes)
{
item.graduate = 0;
await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReplaceItemAsync(item, item.id, new PartitionKey($"Class-{schoolId}"));
}
}
}
} catch (Exception ex) {
await _dingDing.SendBotMsg($"graduate-change,{ex.Message}\n{ex.StackTrace}\n{jsondata.ToJsonString()}",GroupNames.醍摩豆服務運維群組);
}
return response;
}
///
/// 数据推送接口
///
///
///
///
[Function("lesson-tag-change")]
public async Task LessonTagChange([HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequestData req) {
var response = req.CreateResponse(HttpStatusCode.OK);
string data = await new StreamReader(req.Body).ReadToEndAsync();
var json = JsonDocument.Parse(data).RootElement;
List old_new = null;
string school = null;
if (json.TryGetProperty("school", out JsonElement _school))
{
school = _school.GetString();
}
if (json.TryGetProperty("old_new", out JsonElement _old_new))
{
old_new = _old_new.ToObject>();
}
if (old_new.IsNotEmpty() && !string.IsNullOrWhiteSpace(school))
{
foreach (var on in old_new)
{
List lessonRecords = new List();
string sql = $"select value(c) from c where array_contains(c.category,'{on._old}') ";
await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator
(queryText: sql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LessonRecord-{_school}") }))
{
lessonRecords.Add(item);
}
lessonRecords.ForEach(item =>
{
//修改标签
if (!string.IsNullOrWhiteSpace(on._new))
{
for (int i = 0; i < item.category.Count; i++)
{
if (item.category[i].Equals(on._old))
{
item.category[i] = on._new;
}
}
}
else
{
//表示删除标签
item.category.RemoveAll(x => x.Equals(on._old));
}
});
foreach (var item in lessonRecords)
{
await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync(item, item.id, new PartitionKey(item.code));
}
}
}
await response.WriteAsJsonAsync(new { data = json });
return response;
}
///
/// 数据推送接口
///
///
///
///
[Function("knowledge-change")]
public async Task KnowledgeChange([HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequestData req)
{
var response = req.CreateResponse(HttpStatusCode.OK);
string data = await new StreamReader(req.Body).ReadToEndAsync();
var json = JsonDocument.Parse(data).RootElement;
List old_new = null;
string school = null;
if (json.TryGetProperty("school", out JsonElement _school))
{
school = _school.GetString();
}
if (json.TryGetProperty("old_new", out JsonElement _old_new))
{
old_new = _old_new.ToObject>();
}
if (old_new.IsNotEmpty() && !string.IsNullOrWhiteSpace(school))
{
foreach (var on in old_new)
{
List items = new List();
string sql = $"select value(c) from c where array_contains(c.knowledge,'{on._old}') ";
await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator
(queryText: sql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Item-{_school}") }))
{
items.Add(item);
}
items.ForEach(item =>
{
//修改知识点
if (!string.IsNullOrEmpty(on._new))
{
for (int i = 0; i < item.knowledge.Count; i++)
{
if (item.knowledge[i].Equals(on._old))
{
item.knowledge[i] = on._new;
}
}
}
else
{
//表示删除知识点
item.knowledge.RemoveAll(x => x.Equals(on._old));
}
});
foreach (var item in items)
{
ItemBlob itemBlob = null;
try
{
BlobDownloadInfo blobDownloadResult = await _azureStorage.GetBlobContainerClient($"{school}").GetBlobClient($"/item/{item.id}/{item.id}.json").DownloadAsync();
if (blobDownloadResult != null)
{
var blob = JsonDocument.Parse(blobDownloadResult.Content);
itemBlob = blob.RootElement.ToObject();
itemBlob.exercise.knowledge = item.knowledge;
await _azureStorage.GetBlobContainerClient($"{school}").UploadFileByContainer(itemBlob.ToJsonString(), "item", $"{item.id}/{item.id}.json", true);
}
}
catch (Exception ex)
{
itemBlob = null;
}
await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync(item, item.id, new PartitionKey(item.code));
}
}
}
await response.WriteAsJsonAsync(new { data = json });
return response;
}
///
/// 在线人数记录
///
///
///
[Function("online-record")]
public async Task OnlineRecord([HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequestData req)
{
var response = req.CreateResponse(HttpStatusCode.OK);
string data = await new StreamReader(req.Body).ReadToEndAsync();
var json = JsonDocument.Parse(data).RootElement;
try
{
string school = null;
string scope = null;
string id = null;
string ip = null;
int expire = 1;
if (json.TryGetProperty("school", out JsonElement _school))
school = _school.GetString();
if (json.TryGetProperty("scope", out JsonElement _scope))
scope = _scope.GetString();
if (json.TryGetProperty("id", out JsonElement _id))
id = _id.GetString();
if (json.TryGetProperty("ip", out JsonElement _ip))
ip = _ip.GetString();
if (json.TryGetProperty("expire", out JsonElement _expire))
expire = _expire.GetInt32();
var table = _azureStorage.GetCloudTableClient().GetTableReference("IESLogin");
var cosmosClient = _azureCosmos.GetCosmosClient();
DateTimeOffset dateTime = DateTimeOffset.UtcNow;
var dateHour = dateTime.ToString("yyyyMMddHH"); //获取当天的小时
var dateDay = dateTime.ToString("yyyyMMdd"); //获取当天的日期
var dateMonth = dateTime.ToString("yyyyMM");//获取当月的日期
var currentHour = dateTime.Hour; //当前小时
var currentDay = dateTime.Day; //当前天
long Expire = dateTime.AddHours(expire).ToUnixTimeMilliseconds(); //token到期时间
long now = dateTime.ToUnixTimeMilliseconds(); //当前时间戳
DateTime hour = DateTime.UtcNow.AddHours(25); //25小时到期
DateTime month = DateTime.UtcNow.AddDays(32); //一个月到期
var delTbHour = dateTime.AddHours(-168).ToString("yyyyMMddHH"); //168小时前
var delTbDay = dateTime.AddDays(-180).ToString("yyyyMMdd"); //180天前
switch (scope)
{
case "teacher":
try
{
Teacher teacher = await cosmosClient.GetContainer("TEAMModelOS", "Teacher").ReadItemAsync(id, new PartitionKey("Base"));
teacher.loginInfos = new List() { new LoginInfo { expire = Expire, ip = ip, time = now } };
await cosmosClient.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync(teacher, teacher.id, new PartitionKey("Base"));
}
catch { }
break;
case "student":
try
{
Student student = await cosmosClient.GetContainer("TEAMModelOS", Constant.Student).ReadItemAsync(id, new PartitionKey($"Base-{school}"));
student.loginInfos = new List() { new LoginInfo { expire = Expire, ip = ip, time = now } };
await cosmosClient.GetContainer("TEAMModelOS", Constant.Student).ReplaceItemAsync(student, student.id, new PartitionKey($"Base-{school}"));
}
catch { }
break;
case "tmduser":
try
{
TmdUser tmdUser = await cosmosClient.GetContainer("TEAMModelOS", Constant.Student).ReadItemAsync(id, new PartitionKey("Base"));
tmdUser.loginInfos = new List() { new LoginInfo { expire = Expire, ip = ip, time = now } };
await cosmosClient.GetContainer("TEAMModelOS", Constant.Student).ReplaceItemAsync(tmdUser, tmdUser.id, new PartitionKey("Base"));
}
catch { }
break;
}
//天
SortedSetEntry[] dayCnt = null;
//月
SortedSetEntry[] monthCnt = null;
try
{
await _azureRedis.GetRedisClient(8).SortedSetIncrementAsync($"Login:IES:{scope}:{dateDay}", $"{currentHour}", 1);//一天24小时 小时为单位
await _azureRedis.GetRedisClient(8).SortedSetIncrementAsync($"Login:IES:{scope}:{dateMonth}", $"{currentDay}", 1); //一天的累计 天为单位
var resDay = await _azureRedis.GetRedisClient(8).KeyTimeToLiveAsync($"Login:IES:{scope}:{dateDay}");
if (resDay == null)
await _azureRedis.GetRedisClient(8).KeyExpireAsync($"Login:IES:{scope}:{dateDay}", hour); //设置到期时间
var rspMonth = await _azureRedis.GetRedisClient(8).KeyTimeToLiveAsync($"Login:IES:{scope}:{dateMonth}");
if (rspMonth == null)
await _azureRedis.GetRedisClient(8).KeyExpireAsync($"Login:IES:{scope}:{dateMonth}", month); //设置到期时间
//保存当前小时统计
dayCnt = _azureRedis.GetRedisClient(8).SortedSetRangeByScoreWithScores($"Login:IES:{scope}:{dateDay}");
//保存当前的统计数据
monthCnt = _azureRedis.GetRedisClient(8).SortedSetRangeByScoreWithScores($"Login:IES:{scope}:{dateMonth}");
}
catch { }
if (dayCnt != null && dayCnt.Length > 0)
{
List hourLogins = new();
foreach (var dCnt in dayCnt)
{
if (((int)dCnt.Element) == currentHour)
{
var tphourLogins = await table.QueryWhereString($"PartitionKey eq 'HourLogin' and RowKey eq '{dateHour}'");
if (tphourLogins.Count > 0)
{
foreach (var hourLogin in tphourLogins)
{
if (scope.Equals("teacher"))
hourLogin.Teacher = (int)dCnt.Score;
else if (scope.Equals("student"))
hourLogin.Student = (int)dCnt.Score;
else
hourLogin.TmdUser = (int)dCnt.Score;
hourLogins.Add(hourLogin);
}
}
else
{
HourLogin hourLogin = new() { PartitionKey = $"HourLogin", RowKey = dateHour, Hour = currentHour };
if (scope.Equals("teacher"))
{
hourLogin.Teacher = 1;
hourLogin.Student = 0;
hourLogin.TmdUser = 0;
}
else if (scope.Equals("student"))
{
hourLogin.Teacher = 0;
hourLogin.Student = 1;
hourLogin.TmdUser = 0;
}
else
{
hourLogin.Teacher = 0;
hourLogin.Student = 0;
hourLogin.TmdUser = 1;
}
hourLogins.Add(hourLogin);
}
}
}
await table.SaveOrUpdateAll(hourLogins); //保存和更新保存当前小时登录次数
}
if (monthCnt != null && monthCnt.Length > 0)
{
List dayLogins = new();
foreach (var mCnt in monthCnt)
{
if (((int)mCnt.Element) == currentDay)
{
//保存当天的峰值
var tbDays = await table.QueryWhereString($"PartitionKey eq 'DayLogin' and RowKey eq '{dateDay}'");
if (tbDays.Count > 0)
{
foreach (var dayLogin in tbDays)
{
if (scope.Equals("teacher"))
dayLogin.Teacher = (int)mCnt.Score;
else if (scope.Equals("student"))
dayLogin.Student = (int)mCnt.Score;
else
dayLogin.TmdUser = (int)mCnt.Score;
dayLogins.Add(dayLogin);
}
}
else
{
//保存当月每天的峰值
DayLogin dayLogin = new() { PartitionKey = $"DayLogin", RowKey = dateDay, Day = currentDay };
if (scope.Equals("teacher"))
{
dayLogin.Teacher = 1;
dayLogin.Student = 0;
dayLogin.TmdUser = 0;
}
else if (scope.Equals("student"))
{
dayLogin.Teacher = 0;
dayLogin.Student = 1;
dayLogin.TmdUser = 0;
}
else
{
dayLogin.Teacher = 0;
dayLogin.Student = 0;
dayLogin.TmdUser = 1;
}
dayLogins.Add(dayLogin);
}
}
}
await table.SaveOrUpdateAll(dayLogins);// 保存当月每天在线数据
}
string tbHourSql = $"PartitionKey eq 'HourLogin' and RowKey le '{delTbHour}'";
string tbDaySql = $"PartitionKey eq 'DayLogin' and RowKey le '{delTbDay}'";
try
{
await table.DeleteStringWhere(rowKey: tbHourSql); //删除168小时前的数据
await table.DeleteStringWhere(rowKey: tbDaySql); //删除180天前的数据
}
catch { }
if (!string.IsNullOrWhiteSpace(school))
{
//天
SortedSetEntry[] scDayCnt = null;
//月
SortedSetEntry[] scMonthCnt = null;
try
{
await _azureRedis.GetRedisClient(8).SortedSetIncrementAsync($"Login:School:{school}:{scope}:{dateDay}", $"{currentHour}", 1);//当天当前小时在线人加1
await _azureRedis.GetRedisClient(8).SortedSetIncrementAsync($"Login:School:{school}:{scope}:{dateMonth}", $"{currentDay}", 1); //当天的在线加1
var reScDay = await _azureRedis.GetRedisClient(8).KeyTimeToLiveAsync($"Login:School:{school}:{scope}:{dateDay}");
if (reScDay == null)
await _azureRedis.GetRedisClient(8).KeyExpireAsync($"Login:School:{school}:{scope}:{dateDay}", hour); //设置到期时间
var reScMonth = await _azureRedis.GetRedisClient(8).KeyTimeToLiveAsync($"Login:School:{school}:{scope}:{dateMonth}");
if (reScMonth == null)
await _azureRedis.GetRedisClient(8).KeyExpireAsync($"Login:School:{school}:{scope}:{dateMonth}", month); //设置到期时间
//保存学校当天每小时的
scDayCnt = _azureRedis.GetRedisClient(8).SortedSetRangeByScoreWithScores($"Login:School:{school}:{scope}:{dateDay}");
//学校天峰值
scMonthCnt = _azureRedis.GetRedisClient(8).SortedSetRangeByScoreWithScores($"Login:School:{school}:{scope}:{dateMonth}");
}
catch { }
if (scDayCnt != null && scDayCnt.Length > 0)
{
List hourLoginSchools = new();
foreach (var scDCnt in scDayCnt)
{
if (((int)scDCnt.Element) == currentHour)
{
var tmpHour = await table.QueryWhereString($"PartitionKey eq 'HourLogin-{school}' and RowKey eq '{dateHour}'");
if (tmpHour.Count > 0)
{
foreach (var hLoginSc in tmpHour)
{
if (scope.Equals("teacher"))
hLoginSc.Teacher = (int)scDCnt.Score;
else if (scope.Equals("student"))
hLoginSc.Student = (int)scDCnt.Score;
else
hLoginSc.TmdUser = (int)scDCnt.Score;
hourLoginSchools.Add(hLoginSc);
}
}
else
{
//学校小时峰值
HourLoginSchool hourLoginSc = new() { PartitionKey = $"HourLogin-{school}", RowKey = dateHour, Hour = currentHour, School = school };
if (scope.Equals("teacher"))
{
hourLoginSc.Teacher = 1;
hourLoginSc.Student = 0;
hourLoginSc.TmdUser = 0;
}
else if (scope.Equals("student"))
{
hourLoginSc.Teacher = 0;
hourLoginSc.Student = 1;
hourLoginSc.TmdUser = 0;
}
else
{
hourLoginSc.Teacher = 0;
hourLoginSc.Student = 0;
hourLoginSc.TmdUser = 1;
}
hourLoginSchools.Add(hourLoginSc);
}
}
}
await table.SaveOrUpdateAll(hourLoginSchools);
}
if (scMonthCnt != null && scMonthCnt.Length > 0)
{
List DayLoginSchools = new();
foreach (var scMCnt in scMonthCnt)
{
if (((int)scMCnt.Element) == currentDay)
{
var tempDays = await table.QueryWhereString($"PartitionKey eq 'DayLogin-{school}' and RowKey eq '{dateDay}'");
if (tempDays.Count > 0)
{
foreach (var dLoginSc in tempDays)
{
if (scope.Equals("teacher"))
dLoginSc.Teacher = (int)scMCnt.Score;
else if (scope.Equals("student"))
dLoginSc.Student = (int)scMCnt.Score;
else
dLoginSc.TmdUser = (int)scMCnt.Score;
DayLoginSchools.Add(dLoginSc);
}
}
else
{
//学校天峰值
DayLoginSchool dayLoginSc = new() { PartitionKey = $"DayLogin-{school}", RowKey = dateDay, Day = currentDay, School = school };
if (scope.Equals("teacher"))
{
dayLoginSc.Teacher = 1;
dayLoginSc.Student = 0;
dayLoginSc.TmdUser = 0;
}
else if (scope.Equals("student"))
{
dayLoginSc.Teacher = 0;
dayLoginSc.Student = 1;
dayLoginSc.TmdUser = 0;
}
else
{
dayLoginSc.Teacher = 0;
dayLoginSc.Student = 0;
dayLoginSc.TmdUser = 1;
}
DayLoginSchools.Add(dayLoginSc);
}
}
}
await table.SaveOrUpdateAll(DayLoginSchools);//保存学校当月在线数据
}
string tbScHourSql = $"PartitionKey eq 'HourLogin-{school}' and RowKey le '{delTbHour}'";
List scHourLog = await table.QueryWhereString(tbScHourSql);
if (scHourLog.Count > 0)
try
{
//await table.DeleteStringWhere(tbScHourSql); //删除学校168小时前的数据
await table.DeleteAll(scHourLog);
}
catch { }
string tbScDaySql = $"PartitionKey eq 'DayLogin-{school}' and RowKey le '{delTbDay}'";
List scDayLog = await table.QueryWhereString(tbScDaySql);
if (scDayLog.Count > 0)
try
{
//await table.DeleteStringWhere(tbScDaySql); //删除学校180天前的数据
await table.DeleteAll(scDayLog);
}
catch { }
}
await response.WriteAsJsonAsync(new { data = json });
return response;
}
catch (Exception ex)
{
await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-online-record 人数记录异常{ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
await response.WriteAsJsonAsync(new { data = json });
return response;
}
}
}
}