using Azure;
using Azure.Cosmos;
using Azure.Messaging.ServiceBus;
using HTEXLib.COMM.Helpers;
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
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;
namespace TEAMModelOS.SDK
{
public class StudentService
{
///
///
///
///
///
///
public static async Task> GeStudentData(AzureCosmosFactory _azureCosmos, string schoolId, IEnumerable students)
{
List studentDatas = new List();
if (students.Any())
{
string queryText = $"SELECT c.id, c.code ,c.classId FROM c WHERE c.id IN ({string.Join(",", students.Select(o => $"'{o}'"))})";
await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryIterator(queryText: queryText, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base-{schoolId}") }))
{
studentDatas.Add(item);
}
}
return studentDatas;
}
///
///
///
/// 学校编码
/// 前端要修改的学生
/// 操作
/// 变更前的学生
///
public static async Task> CheckStudent(AzureServiceBusFactory _serviceBus, IConfiguration _configuration, AzureCosmosFactory _azureCosmos, string schoolId, List students, List prestudents)
{
List aftstudents = await StudentService.GeStudentData(_azureCosmos, schoolId, students?.Select(x => x.id));
Dictionary dictChange = new Dictionary();
if (prestudents.Count >= aftstudents.Count)
{
foreach (var pstu in prestudents)
{
var afstu = aftstudents.Find(x => x.id.Equals(pstu.id));
if (afstu != null)
{
if (string.IsNullOrEmpty(pstu.classId) && !string.IsNullOrEmpty(afstu.classId))
{
//则是加入的学生
if (dictChange.ContainsKey(afstu.classId))
{
dictChange[afstu.classId].stujoin.Add(
new Member
{
id = afstu.id,
code = $"{schoolId }",
type = 2
});
}
else
{
GroupChange change = new GroupChange
{
scope = "school",
school = schoolId,
type = "student",
originCode = schoolId,
listid = afstu.classId,
stujoin = new List
{
new Member
{
id= afstu.id,
code= $"{schoolId}",
type =2
}
}
};
dictChange.Add(afstu.classId, change);
}
}
else if (!string.IsNullOrEmpty(pstu.classId) && string.IsNullOrEmpty(afstu.classId))
{
//则该学生是解除了班级状态
if (dictChange.ContainsKey(pstu.classId))
{
dictChange[pstu.classId].stuleave.Add(
new Member
{
id = pstu.id,
code = $"{schoolId }",
type = 2
});
}
else
{
GroupChange change = new GroupChange
{
scope = "school",
school = schoolId,
type = "student",
originCode = schoolId,
listid = pstu.classId,
stuleave = new List
{
new Member
{
id= pstu.id,
code= $"{schoolId}",
type=2
}
}
};
dictChange.Add(pstu.classId, change);
}
}
else if (!string.IsNullOrEmpty(pstu.classId) && !string.IsNullOrEmpty(afstu.classId))
{
//id不同则有异动
if (!pstu.classId.Equals(afstu.classId))
{
//则是加入的学生
if (dictChange.ContainsKey(afstu.classId))
{
dictChange[afstu.classId].stujoin.Add(
new Member
{
id = afstu.id,
code = $"{schoolId }",
type = 2
});
}
else
{
GroupChange change = new GroupChange
{
scope = "school",
school = schoolId,
type = "student",
originCode = schoolId,
listid = afstu.classId,
stujoin = new List
{
new Member
{
id= afstu.id,
code= $"{schoolId}",
type = 2
}
}
};
dictChange.Add(afstu.classId, change);
}//则该学生是解除了班级状态
if (dictChange.ContainsKey(pstu.classId))
{
dictChange[pstu.classId].stuleave.Add(
new Member
{
id = pstu.id,
code = $"{schoolId }",
type = 2
});
}
else
{
GroupChange change = new GroupChange
{
scope = "school",
school = schoolId,
type = "student",
originCode = schoolId,
listid = pstu.classId,
stuleave = new List
{
new Member
{
id= pstu.id,
code= $"{schoolId}",
type= 2
}
}
};
dictChange.Add(pstu.classId, change);
}
}
else
{
//相同则不管
}
}
else
{
//变更前后都没绑定班级则不管。
}
}
else
{
if (!string.IsNullOrEmpty(pstu.classId))
{
//则该学生是被删除的学生
if (dictChange.ContainsKey(pstu.classId))
{
dictChange[pstu.classId].stuleave.Add(
new Member
{
id = pstu.id,
code = $"Base-{schoolId }",
type = 2
});
}
else
{
GroupChange change = new GroupChange
{
scope = "school",
school = schoolId,
type = "student",
originCode = schoolId,
listid = pstu.classId,
stuleave = new List
{
new Member
{
id= pstu.id,
code= $"{schoolId}",
type = 2
}
}
};
dictChange.Add(pstu.classId, change);
}
}
}
}
}
else
{
foreach (var afstu in aftstudents)
{
var pstu = prestudents.Find(x => x.id.Equals(afstu.id));
if (pstu != null)
{
if (string.IsNullOrEmpty(pstu.classId) && !string.IsNullOrEmpty(afstu.classId))
{
//则是加入的学生
if (dictChange.ContainsKey(afstu.classId))
{
dictChange[afstu.classId].stujoin.Add(
new Member
{
id = afstu.id,
code = $"{schoolId }",
type = 2
});
}
else
{
GroupChange change = new GroupChange
{
scope = "school",
school = schoolId,
type = "student",
originCode = schoolId,
listid = afstu.classId,
stujoin = new List
{
new Member
{
id= afstu.id,
code= $"Base-{schoolId}",
type = 2
}
}
};
dictChange.Add(afstu.classId, change);
}
}
else if (!string.IsNullOrEmpty(pstu.classId) && string.IsNullOrEmpty(afstu.classId))
{
//则该学生是解除了班级状态
if (dictChange.ContainsKey(pstu.classId))
{
dictChange[pstu.classId].stuleave.Add(
new Member
{
id = pstu.id,
code = $"{schoolId }",
type = 2
});
}
else
{
GroupChange change = new GroupChange
{
scope = "school",
school = schoolId,
type = "student",
originCode = schoolId,
listid = pstu.classId,
stuleave = new List
{
new Member
{
id= pstu.id,
code= $"{schoolId}",
type= 2
}
}
};
dictChange.Add(pstu.classId, change);
}
}
else if (!string.IsNullOrEmpty(pstu.classId) && !string.IsNullOrEmpty(afstu.classId))
{
//id不同则有异动
if (!pstu.classId.Equals(afstu.classId))
{
//则是加入的学生
if (dictChange.ContainsKey(afstu.classId))
{
dictChange[afstu.classId].stujoin.Add(
new Member
{
id = afstu.id,
code = $"{schoolId }",
type = 2
});
}
else
{
GroupChange change = new GroupChange
{
scope = "school",
school = schoolId,
type = "student",
originCode = schoolId,
listid = afstu.classId,
stujoin = new List
{
new Member
{
id= afstu.id,
code= $"{schoolId}",
type = 2
}
}
};
dictChange.Add(afstu.classId, change);
}//则该学生是解除了班级状态
if (dictChange.ContainsKey(pstu.classId))
{
dictChange[pstu.classId].stuleave.Add(
new Member
{
id = pstu.id,
code = $"{schoolId }",
type = 2
});
}
else
{
GroupChange change = new GroupChange
{
scope = "school",
school = schoolId,
type = "student",
originCode = schoolId,
listid = pstu.classId,
stuleave = new List
{
new Member
{
id= pstu.id,
code= $"{schoolId}",
type=2
}
}
};
dictChange.Add(pstu.classId, change);
}
}
else
{
//相同则不管
}
}
else
{
//变更前后都没绑定班级则不管。
}
}
else
{
if (!string.IsNullOrEmpty(afstu.classId))
{
//代表学生是新增的
if (dictChange.ContainsKey(afstu.classId))
{
dictChange[afstu.classId].stujoin.Add(
new Member
{
id = afstu.id,
code = $"{schoolId }",
type = 2
});
}
else
{
GroupChange change = new GroupChange
{
scope = "school",
school = schoolId,
type = "student",
originCode = schoolId,
listid = afstu.classId,
stujoin = new List
{
new Member
{
id= afstu.id,
code= $"{schoolId}",
type = 2
}
}
};
dictChange.Add(afstu.classId, change);
}
}
}
}
}
foreach (var changed in dictChange.Keys)
{
var change = dictChange[changed];
if (change.stujoin.Count != 0 || change.stuleave.Count != 0)
{
var messageChange = new ServiceBusMessage(change.ToJsonString());
messageChange.ApplicationProperties.Add("name", "GroupChange");
var ActiveTask = _configuration.GetValue("Azure:ServiceBus:ActiveTask");
await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageChange);
}
}
return dictChange;
}
public record StudentInfo
{
public string studentId { get; set; }
public string picture { get; set; }
public string name { get; set; }
public string mobile { get; set; }
public string mail { get; set; }
///
/// f女性 m男性 n 保密
///
public string gender { get; set; }
}
///
/// 整理前端匯入的學生資訊
///
///
///
///
private static (Dictionary studs,
Dictionary classInfo,
Dictionary> classStudNo,
List errorYear,
List duplId) doSortImpStuds(string schoolId, JsonElement.ArrayEnumerator students)
{
//批量匯入 檢查輸入數據 確認座號 確認教室(創建教室) 確認學生存不存在或是要不要更新
//存放輸入的學生資訊 key:stud id value:學生詳細資料
Dictionary dicStuds =
new Dictionary();
//存放教室資訊用 key:classNo value:className
Dictionary dicClassInfo = new Dictionary();
//存放欲加入該間教室的學生座號清單 key:classNo value:no list
Dictionary> dicClassStudNo = new Dictionary>();
//存放輸入id重複
List duplId = new List();
List errorYear = new List();
while (students.MoveNext())
{
//string id = null, no = null, name = null, year = null, pw = null, classNo = null, className = null;
JsonElement student = students.Current;
//ClassNo內的座號
//欲加入的教室
//查學生
//該間教室的座號與目前欲更新的是否有重複 有些可能是同教室換座號 反正都要將學生讀出來
//舊學生完整資料+新學生資料
//進行輸入資料的整理
if (student.TryGetProperty("id", out var tmpId))
{
string id = tmpId.GetString();
//如果id欄位是空的,則跳過該筆資料
if (string.IsNullOrWhiteSpace(id)) continue;
//輸入的id不應有重複
if (dicStuds.ContainsKey(id))
{
//如果id重複,則將之從整理清單內清除
duplId.Add(id);
dicStuds.Remove(id);
}
(string name, string no, int year, string salt, string pw, string classNo, string className, string periodId, int classYear) studentInfo = (null, null, 0, null, null, null, null, null, 0);
if (student.TryGetProperty("name", out var tmpName) && !string.IsNullOrWhiteSpace(tmpName.GetString())) studentInfo.name = tmpName.GetString();
//入學學年為必須,故若是無給值則將之紀錄並跳過該筆資料
if (student.TryGetProperty("year", out var tmpYear) && !string.IsNullOrWhiteSpace(Convert.ToString(tmpYear))) studentInfo.year = tmpYear.GetInt32();
else
{
errorYear.Add(id);
continue;
}
//Password,若沒給則使用學號當密碼
studentInfo.salt = Utils.CreatSaltString(8);
studentInfo.pw = student.TryGetProperty("pw", out var tmpPw) && !string.IsNullOrWhiteSpace(tmpPw.GetString())
? Utils.HashedPassword(tmpPw.GetString(), studentInfo.salt)
: Utils.HashedPassword(id, studentInfo.salt);
if (student.TryGetProperty("periodId", out var tmpPeriodId) && !string.IsNullOrWhiteSpace(tmpPeriodId.GetString())) studentInfo.periodId = tmpPeriodId.GetString();
// if (student.TryGetProperty("gradeIndex", out var tmpGradeIndex)) studentInfo.gradeIndex = tmpGradeIndex.GetInt32();
if (student.TryGetProperty("classNo", out var tmpClassNo) && !string.IsNullOrWhiteSpace(tmpClassNo.GetString()))
{
studentInfo.classNo = tmpClassNo.GetString();
//在新建帳號上,應要給classNo才能設定no,但是若只是已存在的帳號要進行座號更新呢? 為避免使用者出錯,故已存在的帳號也應當給classNo。
if (student.TryGetProperty("no", out var tmpNo) && !string.IsNullOrWhiteSpace(tmpNo.GetString()))
{
studentInfo.no = tmpNo.GetString();
//這邊先將該間教室欲使用到的no整理出來
if (dicClassStudNo.ContainsKey(tmpClassNo.GetString())) dicClassStudNo[tmpClassNo.GetString()].Add((id, tmpNo.GetString()));
else dicClassStudNo.Add(tmpClassNo.GetString(), new List<(string id, string no)>() { (id, tmpNo.GetString()) });
}
//有給classNo才會紀錄className,classNo屬於實體教室門牌號,全校理當只會有一個。
int year = 0;
if (student.TryGetProperty("classYear", out var tmpClassYear) && tmpClassYear.TryGetInt32(out int syear))
{
year = syear;
studentInfo.classYear = syear;
}
if (student.TryGetProperty("className", out var tmpClassName) && !string.IsNullOrWhiteSpace(tmpClassName.GetString()))
{
studentInfo.className = tmpClassName.GetString();
if (!dicClassInfo.ContainsKey($"{studentInfo.periodId}_{year}_{tmpClassNo.GetString()}"))
{ dicClassInfo.Add($"{studentInfo.periodId}_{year}_{tmpClassNo.GetString()}", (tmpClassName.GetString(), studentInfo.periodId, year, tmpClassNo.GetString())); }
}
}
//將最後結果加到字典內
dicStuds.Add(id, studentInfo);
}
}
return (dicStuds, dicClassInfo, dicClassStudNo, errorYear, duplId);
}
///
/// 更新或是新增學生
///
///
///
///
public static async Task<(List