JPHD-2021-backend/Pages/Sessions/Index.cshtml.cs

353 lines
12 KiB
C#

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;
using System.Security.Claims;
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<Session> 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<IActionResult> OnGetAsync(string errmsg)
{
return Construct(errmsg);
}
public async Task<IActionResult> 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<IActionResult> OnPost()
{
return Construct("");
}
//public async Task<IActionResult> OnPostLoadAsync()
//{
// return Construct("");
//}
//public async Task<IActionResult> OnPostSaveAsync()
//{
// return Construct("");
//}
public async Task<IActionResult> OnPostArrangeAsync()
{
if (HttpContext.User.HasClaim((c) =>
{
return c.Type == ClaimTypes.Role&& (
c.Value == "admin" || c.Value == "manager");
})){
if (Utils.Arranger.Arrange(Context)) return Construct("");
else return Construct("排班失败,无法满足条件");
}
else
{
return Construct("您无权进行此操作");
}
}
public async Task<IActionResult> OnPostClearAllAsync()
{
if (HttpContext.User.HasClaim((c) =>
{
return c.Type == ClaimTypes.Role && (
c.Value == "admin" || c.Value == "manager");
}))
{
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("");
}
else
{
return Construct("您无权进行此操作");
}
}
public async Task<IActionResult> OnPostResetAllAsync()
{
if (HttpContext.User.HasClaim((c) =>
{
return c.Type == ClaimTypes.Role && (
c.Value == "admin" || c.Value == "manager");
}))
{
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("");
}
else
{
return Construct("您无权进行此操作");
}
}
public async Task<IActionResult> OnPostSaveAsync()
{
if (HttpContext.User.HasClaim((c) =>
{
return c.Type == ClaimTypes.Role && (
c.Value == "admin" || c.Value == "manager");
}))
{
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("");
}
else
{
return Construct("您无权进行此操作");
}
}
public async Task<IActionResult> OnPostTidyAsync()
{
if (HttpContext.User.HasClaim((c) =>
{
return c.Type == ClaimTypes.Role && (
c.Value == "admin" || c.Value == "manager");
}))
{
var stus = Context.Students.ToList();
var sess = Context.Sessions.ToList();
foreach (var i in stus)
{
var tm = i.Timelist;
var ntm = new List<Session>();
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<int> nl = new List<int>();
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("");
}
else
{
return Construct("您无权进行此操作");
}
}
public async Task<IActionResult> OnPostLoadAsync()
{
if (HttpContext.User.HasClaim((c) =>
{
return c.Type == ClaimTypes.Role && (
c.Value == "admin" || c.Value == "manager");
}))
{
var str = "";
List<Session> loads = new List<Session>();
if (!string.IsNullOrEmpty(savename)) str = System.IO.File.ReadAllText(savename);
loads = JsonSerializer.Deserialize<List<Session>>(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<int>();
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("");
}
else
{
return Construct("您无权进行此操作");
}
}
}
}