using _2021_backend.Models; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.Rendering; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Text.Json; using System.IO; namespace _2021_backend.Pages.Sessions { public class IndexModel : PageModel { public readonly _2021_backend.Data.BackendContext Context; public IndexModel(_2021_backend.Data.BackendContext context) { Context = context; } public List LoadedSessions { get; set; } public SelectList DayList { get; set; } [BindProperty(SupportsGet = true)] public string Room { get; set; } [BindProperty] public string Errmsg { get;set; } [BindProperty] public string savename { get; set; } [BindProperty(SupportsGet = true)] public bool onlyShowUnFull { get; set; } [BindProperty(SupportsGet = true)] public DateTime Day { get; set; } [BindProperty] public int TargetIndex { get; set; } public SelectList Files { get; set; } public IActionResult Construct(string errmsg) { Errmsg = errmsg; var q = from s in Context.Sessions select s; if (Day != DateTime.MinValue) { q = from t in q where t.Day == Day select t; } if (Room == "200" || Room == "204") { q = from t in q where t.Place == Room select t; } if (onlyShowUnFull) { q = from t in q where t.Capacity != t.Students.Count select t; } LoadedSessions = q.ToList(); LoadedSessions.Sort((Session a, Session b) => { var x = a.Day.Date.Add(a.BeginTime.TimeOfDay).CompareTo(DateTime.Now); var y = b.Day.Date.Add(b.BeginTime.TimeOfDay).CompareTo(DateTime.Now); if (x != y) return y - x; else { var z = a.Day.Date.Add(a.BeginTime.TimeOfDay).CompareTo(b.Day.Date.Add(b.BeginTime.TimeOfDay)); if (z != 0) return z; else { if (a.BeginTime < b.BeginTime) return -1; else if (a.BeginTime > b.BeginTime) return 1; else if (a.Place == "200") return -1; else if (a.Place == "204") return 1; return 0; } } }); var l = from it in LoadedSessions select it.Day; DayList = new SelectList(l.Distinct()); if (!Directory.Exists("./saves")) Directory.CreateDirectory("./saves"); Files = new SelectList(Directory.GetFiles("./saves").ToList()); //Console.WriteLine(Files); return Page(); } public async Task OnGetAsync(string errmsg) { return Construct(errmsg); } public async Task OnGetResetAsync(int id) { if(Context.Sessions.Any(it => it.Id == id)) { var s = Context.Sessions.Find(id); foreach(var st in s.Students) { var e = Context.Students.Find(st); e.Status = status.需调整时间; e.InterviewTime = 0; } s.Students.Clear(); } Context.SaveChanges(); return Construct(""); } public async Task OnPost() { return Construct(""); } //public async Task OnPostLoadAsync() //{ // return Construct(""); //} //public async Task OnPostSaveAsync() //{ // return Construct(""); //} public async Task OnPostArrangeAsync() { if (Utils.Arranger.Arrange(Context)) return Construct(""); else return Construct("排班失败,无法满足条件"); } public async Task OnPostClearAllAsync() { foreach(var s in Context.Students) { s.InterviewTime = 0; s.Status = status.需调整时间; s.Timelist.Clear(); } Context.SaveChanges(); foreach(var s in Context.Sessions) { Context.Sessions.Remove(s); } Context.SaveChanges(); return Construct(""); } public async Task OnPostResetAllAsync() { var stus = Context.Students.ToList(); foreach (var s in stus) { if(s.Status == status.已选时间) { s.InterviewTime = 0; s.Timelist.RemoveAll(it => !Context.Sessions.Any(k => k.Id == it)); s.Timelist.Sort((int a, int b) => { var x = Context.Sessions.Find(a); var y = Context.Sessions.Find(b); var k1 = x.Day.CompareTo(y.Day); var k2 = x.BeginTime.CompareTo(y.BeginTime); return k1 != 0 ? k1 : k2; }); } } Context.SaveChanges(); foreach (var s in Context.Sessions) { s.Students.Clear(); } Context.SaveChanges(); return Construct(""); } public async Task OnPostSaveAsync() { var lst = Context.Sessions.ToList(); var str = JsonSerializer.Serialize(lst); Console.WriteLine("Saving arrangement: " + str); if(!Directory.Exists("./saves")) Directory.CreateDirectory("./saves/"); System.IO.File.WriteAllText($"./saves/{DateTime.Now.ToString("MM-dd-hh-mm-ss")}.txt", str); return Construct(""); } public async Task OnPostTidyAsync() { var stus = Context.Students.ToList(); var sess = Context.Sessions.ToList(); foreach(var i in stus) { var tm = i.Timelist; var ntm = new List(); foreach(var j in tm) { var k = sess.Find(it => it.Id == j); ntm.Add(k); } ntm.Sort((Session a,Session b) => { var x = a.Day.CompareTo(b.Day); var y = a.BeginTime.CompareTo(b.BeginTime); return x != 0 ? x : y; }); List nl = new List(); foreach(var j in ntm) { if(i.Status != status.不通过 && i.Status != status.通过 && i.Status != status.已确认时间) { if (j.Day.Date.Add(j.BeginTime.TimeOfDay).CompareTo(DateTime.Now) < 0 || (j.Students.Count >= j.Capacity && !j.Students.Any(k => k ==i.Id) )) continue; nl.Add(j.Id); } else { nl.Add(j.Id); } } i.Timelist = nl; } Context.SaveChanges(); return Construct(""); } public async Task OnPostLoadAsync() { var str = ""; List loads = new List(); if (!string.IsNullOrEmpty(savename)) str = System.IO.File.ReadAllText(savename); loads = JsonSerializer.Deserialize>(str); var stus = Context.Students.ToList(); foreach (var s in stus) { if (s.Status == status.已选时间) { s.InterviewTime = 0; s.Timelist.RemoveAll(it => !Context.Sessions.Any(k => k.Id == it)); s.Timelist.Sort((int a, int b) => { var x = Context.Sessions.Find(a); var y = Context.Sessions.Find(b); var k1 = x.Day.CompareTo(y.Day); var k2 = x.BeginTime.CompareTo(y.BeginTime); return k1 != 0 ? k1 : k2; }); } } Context.SaveChanges(); foreach (var s in Context.Sessions) { s.Students.Clear(); } Context.SaveChanges(); foreach(var item in loads) { Session s = Context.Sessions.Find(item.Id); if(s != null) { s.BeginTime = item.BeginTime; s.Day = item.Day; s.Capacity = item.Capacity; s.SendSMS = item.SendSMS; s.Chiefs = item.Chiefs; s.Students = new List(); foreach(var s2 in item.Students) { if (Context.Students.Any(k => k.Id == s2)) { Context.Students.Find(s2).InterviewTime = item.Id; s.Students.Add(s2); } } } } Context.SaveChanges(); return Construct(""); } } }