我需要計算員工的總分配周數和總替補周數。
員工在某個時間段內被分配到不同的專案中,該時間段總是從星期一開始,總是在星期五結束。周一至周五將被視為 1 周。任何專案的持續時間都不能超過 2 周。應調整分配狀態的任何重疊周。如果分配了員工身份并且該持續時間與任何替補周持續時間重疊或下降,則根本不應計算替補狀態的該周持續時間。
下面是相關的場景如下。
"AssignedHistory":[
{"Project":1,"status":"Assigned","Startdate":"01/03/2022", "Enddate":"01/07/2022" },
{"Project":2,"status":"Assigned","Startdate":"01/10/2022", "Enddate":"01/14/2022" },
{"Project":3,"status":"Assigned", "Startdate":"01/10/2022", "Enddate":"01/21/2022" },
{"Project":4,"status":"Assigned", "Startdate":"02/21/2022", "Enddate":"02/25/2022" },
{"Project":5,"status":"Bench","Startdate":"01/17/2022", "Enddate":"01/21/2022" },
{"Project":6,"status":"Bench","Startdate":"02/07/2022", "Enddate":"02/11/2022" }
{"Project":7,"status":"Bench","Startdate":"02/21/2022", "Enddate":"03/04/2022" }
]
在這里,我需要找到員工的總分配周數和總替補周數,預期結果應該是:
Total assigned week:4
Total benched week :1
Since 1 week of assigned status is overlapping for 2 projects(no2 and no 3) from 10th Jan to 14 Jan so project 2 and 3 together will be counted as 2 .Also for assigned week of project 3 it is overlapping with benched week of project 5 from 17th Jan to 21st Jan so in that case bench week for project 5 will be counted as 0.Similarly for assigned week of project 4,duration from 21st feb to 25th feb is overlapping or falls under benched week of project 7 so in this case project 7 will be counted as 0.So only we have project 6 for benched week which doest not overlaps with any of the assined project duration.
這就是為什么總替補人數將是 1。
這就是我的想法。
var assignedweek = AssignedHistory.Where(x => new []{"Assigned"}.Contains(x.status)).ToList();
var benchedweek = AssignedHistory.Where(x => new []{"Bench"}.Contains(x.status)).ToList();
List<DateTime> AssignedWeeklist = assignedweek
.SelectMany(a => {
DateTime firstSunday = a.Startdate.AddDays(-(int)a.Startdate.DayOfWeek);
DateTime lastSunday = a.Enddate.AddDays(-(int)a.Enddate.DayOfWeek);
int weeks = (lastSunday - firstSunday).Days / 7 1;
// Enumerate one Sunday per week
return Enumerable.Range(0, weeks).Select(i => firstSunday.AddDays(7 * i));
})
.Distinct()
.ToList();
List<DateTime> BenchWeeklist = benchedweek
.SelectMany(a => {
DateTime firstSunday = a.Startdate.AddDays(-(int)a.Startdate.DayOfWeek);
DateTime lastSunday = a.Enddate.AddDays(-(int)a.Enddate.DayOfWeek);
int weeks = (lastSunday - firstSunday).Days / 7 1;
// Enumerate one Sunday per week
return Enumerable.Range(0, weeks).Select(i => firstSunday.AddDays(7 * i));
})
.Distinct()
.ToList();
int assignedweekcount = AssignedWeeklist.Count();
int benchedweekcount = BenchWeeklist.Except(AssignedWeeklist).Count();
它給出了正確的分配周數,但是如果板凳周與指定周重疊,則給出不正確的板凳周數。有什么辦法可以做到這一點?
uj5u.com熱心網友回復:
您必須在 benchweek 上更改計算的邏輯,您必須按專案保留星期日日期:
List<List<DateTime>> BenchWeeklist = benchedweek
.Select(a => {
DateTime firstSunday = a.StartDate.AddDays(-(int)a.StartDate.DayOfWeek);
DateTime lastSunday = a.EndDate.AddDays(-(int)a.EndDate.DayOfWeek);
return new List<DateTime>() { firstSunday, lastSunday }.Distinct().ToList() ;
})
.Distinct()
.ToList();
int assignedweekcount = AssignedWeeklist.Count();
var benchedweekcount = 0;
foreach(var l in BenchWeeklist)
{
var found = false;
foreach(var it in l)
{
if (AssignedWeeklist.Contains(it)) found = true;
}
if (!found) benchedweekcount ;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/411344.html
標籤:
