using Azure;
using Azure.Cosmos;
using Azure.Messaging.ServiceBus;
using HTEXLib.COMM.Helpers;
using Microsoft.Extensions.Configuration;
using OpenXmlPowerTools;
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;
using TEAMModelOS.SDK.Models.Service;
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 guardians,string gender)> studs,
Dictionary classInfo,
Dictionary> classStudNo,
List errorYear,
List duplId) doSortImpStuds(string schoolId, JsonElement.ArrayEnumerator students)
{
//批量匯入 檢查輸入數據 確認座號 確認教室(創建教室) 確認學生存不存在或是要不要更新
//存放輸入的學生資訊 key:stud id value:學生詳細資料
Dictionary guardians,string gender) > dicStuds =
new Dictionary guardians,string gender)>();
//存放教室資訊用 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,
string guardian, string gName, string gPhone, string imei, List guardians, string gender) studentInfo =
(null, null, 0, null, null, null, null, null, 0, null, null, null, null, null,null) ;
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())); }
}
}
///导入的时候
if (student.TryGetProperty("guardian", out var guardian) && !string.IsNullOrWhiteSpace($"{guardian}")) {
studentInfo.guardian =$"{guardian}";
student.TryGetProperty("gName", out var gName);
student.TryGetProperty("gPhone", out var gPhone);
studentInfo.gName = $"{gName}";
studentInfo.gPhone = $"{gPhone}";
}
//更新的时候
if (student.TryGetProperty("guardians", out var _guardians) && _guardians.ValueKind.Equals(JsonValueKind.Array)) {
List guardians = _guardians.Deserialize>();
studentInfo.guardians = guardians;
}
if (student.TryGetProperty("imei", out var tmpImei) && !string.IsNullOrWhiteSpace($"{tmpImei}")) studentInfo.imei = tmpImei.GetString();
if (student.TryGetProperty("gender", out var tmpgender) && !string.IsNullOrWhiteSpace($"{tmpgender}")) studentInfo.gender = tmpgender.GetString();
//將最後結果加到字典內
dicStuds.Add(id, studentInfo);
}
}
return (dicStuds, dicClassInfo, dicClassStudNo, errorYear, duplId);
}
///
/// 更新或是新增學生
///
///
///
///
public static async Task<(List