using Azure.Cosmos;
using DocumentFormat.OpenXml.Bibliography;
using HTEXLib.COMM.Helpers;
using Microsoft.AspNetCore.Hosting;
using Microsoft.International.Converters.PinYinConverter;
using Microsoft.International.Converters.TraditionalChineseToSimplifiedConverter;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using TEAMModelOS.Models;
using TEAMModelOS.SDK.DI;
using TEAMModelOS.SDK.Extension;
using TEAMModelOS.SDK.Models;
namespace TEAMModelOS.SDK
{
public class SchoolService
{
///
/// 根据年级获取入学
///
///
///
public static (List> gradeYear, HashSet years) GetYears(School school, string periodId, IEnumerable grades, long time = 0) {
var date = DateTimeOffset.UtcNow;
//2001-09-09 09:46:40
if (time > 1000000000000)
{
date = DateTimeOffset.FromUnixTimeMilliseconds(time);
}
//年级算法
var period = school.period.Find(x => x.id.Equals(periodId));
int Day = date.Day;
int Month = date.Month;
int Year = date.Year;
int start = int.Parse($"{Year}0901");
var se = period.semesters.Find(x => x.start == 1);
if (se == null)
{
se = period.semesters.First();
}
string sm = "09";
string sd = "01";
if (se != null)
{
sm = se.month >= 10 ? $"{se.month}" : $"0{se.month}";
sd = se.day >= 10 ? $"{se.day}" : $"0{se.day}";
start = int.Parse($"{Year}{sm}{sd}");
}
int curr = int.Parse(date.ToString("yyyyMMdd"));
//新学年开学时间大于当前时间,计算年级需要减1 20220901-20220408 > 0 则当前20220408是2021年入学的,
//当前时间大于新学年开学时间,计算年级则不需要 20220901-20221203 < 1 则当前20221203是2022年入学的,
//20230901-20230101 > 0 则当前20230101是2022年入学的,
int dis = start - curr;
List years= new List();
List> gradeYear = new List>();
foreach (int grade in grades) {
int year = 0;
if (dis > 0)
{
year = Year - grade -1;
}
else {
year= Year - grade ;
}
years.Add(year);
gradeYear.Add(new KeyValuePair(grade,year ));
}
return (gradeYear,years.ToHashSet());
}
///
/// 根据年份获取年级,只返回time 或当前时间以前入学的学生年级。
///
///
///
public static (List> yearGrade,HashSet grades) GetGrades(School school,string periodId , IEnumerable years,long time =0) {
var date = DateTimeOffset.UtcNow;
//2001-09-09 09:46:40
if (time > 1000000000000) {
date = DateTimeOffset.FromUnixTimeMilliseconds(time);
}
//年级算法
var period = school.period.Find(x => x.id.Equals(periodId));
int? Count = period?.grades?.Count;
List> yearGrades = new List>();
if (Count.HasValue)
{
int Day = date.Day;
int Month = date.Month;
int Year = date.Year;
int start = int.Parse($"{Year}0901");
var se = period.semesters.Find(x => x.start == 1);
if (se == null)
{
se = period.semesters.First();
}
string sm = "09";
string sd = "01";
if (se != null)
{
sm = se.month >= 10 ? $"{se.month}" : $"0{se.month}";
sd = se.day >= 10 ? $"{se.day}" : $"0{se.day}";
start = int.Parse($"{Year}{sm}{sd}");
}
int curr = int.Parse(date.ToString("yyyyMMdd"));
//新学年开学时间大于当前时间,计算年级需要减1 20220901-20220408 > 0 则当前20220408是2021年入学的,
//当前时间大于新学年开学时间,计算年级则不需要 20220901-20221203 < 1 则当前20221203是2022年入学的,
//20230901-20230101 > 0 则当前20230101是2022年入学的,
int dis = start - curr;
foreach (int year in years)
{
if (int.Parse($"{year}{sm}{sd}") < curr) {
int grade;
if (dis > 0)
{
grade = Math.Abs((Year - year - 1)) % Count.Value;
}
else
{
grade = Math.Abs((Year - year)) % Count.Value;
}
yearGrades.Add(new KeyValuePair(year, $"{grade}"));
}
}
}
return (yearGrades, yearGrades.Select(z=>z.Value).ToHashSet());
}
///
/// 处理学期排序
///
///
///
public static List SortSemester(List semesterList)
{
int Year = DateTimeOffset.UtcNow.Year;
List> pairs = new List>();
semesterList.ForEach(se => {
string sm = se.month >= 10 ? $"{se.month}" : $"0{se.month}";
string sd = se.day >= 10 ? $"{se.day}" : $"0{se.day}";
int order = int.Parse($"{Year}{sm}{sd}");
pairs.Add(new KeyValuePair(order, se));
});
var orderPairs = pairs.OrderBy(z => z.Key);
semesterList = orderPairs.Select(z => z.Value).ToList();
int startIndex = semesterList.FindIndex(z => z.start == 1);
if (startIndex == -1)
{
//未设置学期的情况默认9月份开始的。
startIndex = semesterList.FindIndex(z => z.month == 9);
//如果还未找到,就以排序结果为准
if (startIndex == -1)
{
startIndex = 0;
}
}
if (startIndex > 0)
{
List before = semesterList.Take(startIndex).ToList();
List after = semesterList.Skip(startIndex).ToList();
semesterList = new List();
semesterList.AddRange(after);
semesterList.AddRange(before);
return semesterList;
}
else
{
return semesterList;
}
}
public static async Task<(List school_classes, List graduate_classes)> DoGraduateClasses(HttpTrigger _httpTrigger, AzureCosmosFactory _azureCosmos, List periodIds, School school_base, Option _option,DingDing _dingDing, int waite = 0) {
List school_classes = new List();
List graduate_classes = new List();
try
{
var client = _azureCosmos.GetCosmosClient();
//取得班级
int nowYear = DateTimeOffset.UtcNow.Year;
int nowMonth = DateTimeOffset.UtcNow.Month;
int nowDay = DateTimeOffset.UtcNow.Day;
//因为修改年级,而导致取消的
List cancel_graduate_classes = new List();
string sql = $"SELECT value c FROM c where (c.graduate = 0 or IS_DEFINED(c.graduate) = false) ";
if (periodIds.IsNotEmpty())
{
sql = $"SELECT value c FROM c where c.periodId in ({string.Join(",", periodIds.Select(x => $"'{x}'"))}) ";
}
await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator
//(queryText: $"SELECT value c FROM c where (c.graduate = 0 or IS_DEFINED(c.graduate) = false)",
(queryText: sql,
requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{school_base.id}") }))
{
bool isgraduate = false;
if (!string.IsNullOrWhiteSpace(item.periodId))
{
var period = school_base.period.Find(x => x.id.Equals(item.periodId));
if (period != null)
{
var gradeCount = period.grades.Count();
//2022-2016=6(待判断月份日期是否是毕业) 2022-2017=5(未毕业)
if (nowYear - item.year > gradeCount)
{
isgraduate = true;
}
else if (nowYear - item.year == gradeCount)
{
var semester = period.semesters.Find(x => x.start == 1);
if (semester != null)
{
if (nowMonth > semester.month)
{
isgraduate = true;
}
else if (nowMonth == semester.month)
{
if (nowDay >= semester.day)
{
isgraduate = true;
}
else
{
}
}
else { isgraduate = false; }
}
}
else
{
isgraduate = false;
}
}
}
if (isgraduate)
{
graduate_classes.Add(item);
}
else
{
if (item.graduate == 1)
{
item.graduate = 0;
cancel_graduate_classes.Add(item);
}
school_classes.Add(item);
}
}
if (graduate_classes.Any() || cancel_graduate_classes.Any())
{
if (waite == 0)
{
_ = _httpTrigger.RequestHttpTrigger(new { graduate_classes = graduate_classes, cancel_graduate_classes = cancel_graduate_classes, schoolId = $"{school_base.id}" }, _option.Location, "graduate-change");
}
else
{
await _httpTrigger.RequestHttpTrigger(new { graduate_classes = graduate_classes, cancel_graduate_classes = cancel_graduate_classes, schoolId = $"{school_base.id}" }, _option.Location, "graduate-change");
}
}
} catch (Exception ex) {
await _dingDing.SendBotMsg($"{_option.Location},{ex.Message}\n{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
}
return (school_classes,graduate_classes);
}
public static async Task