C# 如果员工在MVC中多次提交,则累计小时数
创建显示员工在某个日期范围内工作的小时数的报告。我的问题是,我不确定如何获得所有小时数的总和,然后为每个员工显示一行总小时数。下面是我的照片。 这是我想要的样子。 ReportsController.csC# 如果员工在MVC中多次提交,则累计小时数,c#,asp.net-mvc,C#,Asp.net Mvc,创建显示员工在某个日期范围内工作的小时数的报告。我的问题是,我不确定如何获得所有小时数的总和,然后为每个员工显示一行总小时数。下面是我的照片。 这是我想要的样子。 ReportsController.cs /// <summary>Gets the timecards report view as an asynchronous operation.</summary> /// <param name="model">The rep
/// <summary>Gets the timecards report view as an asynchronous operation.</summary>
/// <param name="model">The reports view model.</param>
/// <returns>The timecards report view.</returns>
[HttpPost, ActionName("Hours")]
public async Task<ActionResult> HoursAsync(HoursViewModel model)
{
if (ModelState.IsValid)
{
DateRange dateRange = DateRange.Parse(model.Dates, " - ");
DateTime startDateUtc = dateRange.Start.ToUniversalTime().Date;
DateTime endDateUtc = dateRange.End.ToUniversalTime().AddDays(1).AddTicks(-1);
// Get all timecards for the given date range.
List<Timecard> timecards = await _Context.Timecards
.Include(t => t.Employee)
.Where(t => t.PunchInDateUtc <= endDateUtc && startDateUtc <= t.PunchOutDateUtc)
.OrderBy(t => t.PunchInDateUtc)
.ToListAsync();
// Map the domain objects to the view model.
model.Items = timecards.Select(t =>
{
return new HoursItemViewModel
{
EmployeeId = t.Employee.Id,
Employee = $"{t.Employee.FirstName} {t.Employee.LastName}",
Hours = (t.PunchOutDateUtc - t.PunchInDateUtc)?.TotalHours ?? 0
};
}).ToList();
}
return View(model);
}
///将timecards报告视图作为异步操作获取。
///报表视图模型。
///时间卡报告视图。
[HttpPost,ActionName(“小时”)]
公共异步任务HoursAsync(HoursViewModel模型)
{
if(ModelState.IsValid)
{
DateRange DateRange=DateRange.Parse(model.Dates,“-”);
DateTime startDateUtc=dateRange.Start.ToUniversalTime().Date;
DateTime endDateUtc=dateRange.End.ToUniversalTime().AddDays(1.AddTicks(-1);
//获取给定日期范围内的所有时间卡。
列出时间卡=等待_Context.timecards
.包括(t=>t.Employee)
.其中(t=>t.punchindate UTC
{
返回新的HoursItemViewModel
{
EmployeeId=t.Employee.Id,
Employee=$“{t.Employee.FirstName}{t.Employee.LastName}”,
小时=(t.PunchOutDateUtc-t.punchintateUTC)?。总小时数??0
};
}).ToList();
}
返回视图(模型);
}
Hours.cshtml
<div class="m-portlet__body table-responsive">
@if (Model != null)
{
<table class="table m-table">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Items.FirstOrDefault().Employee)
</th>
<th>
@Html.DisplayNameFor(model => model.Items.FirstOrDefault().Hours)
</th>
</tr>
</thead>
<tbody>
@if (Model.Items.Count == 0)
{
<tr><td colspan="5" class="text-center">No records found</td></tr>
}
else
{
@Html.DisplayFor(model => model.Items)
}
</tbody>
</table>
}
</div>
@如果(型号!=null)
{
@DisplayNameFor(model=>model.Items.FirstOrDefault().Employee)
@DisplayNameFor(model=>model.Items.FirstOrDefault().Hours)
@如果(Model.Items.Count==0)
{
没有发现任何记录
}
其他的
{
@DisplayFor(model=>model.Items)
}
}
HoursItemViewModel.cshtml
@model SentryCrane.AdminApp.Models.ReportViewModels.HoursItemViewModel
<tr>
<td>
@Html.ActionLink(Model.Employee, "Details", "Employees", routeValues: new { id = Model.EmployeeId }, htmlAttributes: null)
</td>
<td>
@Html.DisplayFor(model => model.Hours)
</td>
</tr>
@model SentryCrane.AdminApp.Models.ReportViewModels.hourItemViewModel
@ActionLink(Model.Employee,“Details”,“Employees”,routeValue:new{id=Model.EmployeeId},htmlAttributes:null)
@DisplayFor(model=>model.Hours)
我对C#和MVC应用程序相当陌生,所以如果我错过了帮助我所需的任何东西,请告诉我。谢谢 获取您的小时/小时分数列表(开始时间或打卡时间)
TimeFrom
(结束时间或打卡时间)TimeTo
以括号中的时间为准
.Select(c => c.TimeTo - c.TimeFrom)
.Aggregate( (working, next) => working.Add(next) )
.TotalHours
获取您的小时/小时分数列表(开始时间或打卡时间)
TimeFrom
(结束时间或打卡时间)TimeTo
以括号中的时间为准
.Select(c => c.TimeTo - c.TimeFrom)
.Aggregate( (working, next) => working.Add(next) )
.TotalHours
请更新正在填充模型的上一条语句。ReportsController.cs操作中的项如下:
// Map the domain objects to the view model.
model.Items = timecards.Select(t =>new HoursItemViewModel
{
EmployeeId = t.Employee.Id,
Employee = $"{t.Employee.FirstName} {t.Employee.LastName}",
Hours = (t.PunchOutDateUtc - t.PunchInDateUtc)?.TotalHours ?? 0
}).GroupBy(i => i.EmployeeId).Select(g => new HoursItemViewModel
{
EmployeeId = g.FirstOrDefault().EmployeeId, EmployeeName = g.FirstOrDefault().EmployeeName,
Hours = g.Sum(i => i.Hours)
}).ToList();
除了按ViewModel分组,您还可以按域对象分组并获得最终结果(没有测试下面的代码,但您会明白我的意思)
请更新正在填充模型的上一条语句。ReportsController.cs操作中的项如下:
// Map the domain objects to the view model.
model.Items = timecards.Select(t =>new HoursItemViewModel
{
EmployeeId = t.Employee.Id,
Employee = $"{t.Employee.FirstName} {t.Employee.LastName}",
Hours = (t.PunchOutDateUtc - t.PunchInDateUtc)?.TotalHours ?? 0
}).GroupBy(i => i.EmployeeId).Select(g => new HoursItemViewModel
{
EmployeeId = g.FirstOrDefault().EmployeeId, EmployeeName = g.FirstOrDefault().EmployeeName,
Hours = g.Sum(i => i.Hours)
}).ToList();
除了按ViewModel分组,您还可以按域对象分组并获得最终结果(没有测试下面的代码,但您会明白我的意思)
是否应
t.PunchInDateUtc=startDateUtc
,另一个是否应相同?(反向)打卡日期必须早于结束日期。打卡日期必须晚于开始日期。或者至少是这个想法。将其更改为您提到的日期不会产生预期的结果。很清楚,您希望这两个日期都在这两个日期之间,对吗?(你如何解释有人打进来,但还没有被拳击出来,或者有人在开始时间前拳击而在中间冲出(越过时间边界)。很抱歉离开你的问题,但你证明了我的观点。现在,我希望我能解决手头的问题。我看到了一些关于groupby的东西,所以我想看看我是否能找到关于它的任何东西,并将其整合到我的应用程序中。我想在生成列表之前设置一个if或foreach循环,但我不知道如何操作d编码。我将继续尽我所能地学习,但任何帮助或提示都将受到感谢。是否应该t.PunchInDateUtc=startDateUtc
,另一个也应该如此?(颠倒)打卡日期必须早于结束日期。打卡日期必须晚于开始日期。或者至少是这样。将其更改为您提到的日期不会产生预期的结果。很清楚,您希望这两个日期都介于两者之间,对吗?(你如何解释有人打进来,但还没有被拳击出来,或者有人在开始时间前拳击而在中间冲出(越过时间边界)。很抱歉离开你的问题,但你证明了我的观点。现在,我希望我能解决手头的问题。我看到了一些关于groupby的东西,所以我想看看我是否能找到关于它的任何东西,并将其整合到我的应用程序中。我想在生成列表之前设置一个if或foreach循环,但我不知道如何操作d代码。我将继续尽我所能地学习,但任何帮助或提示都会得到肯定的感谢。然后你可以决定如何取整或从中格式化。这不包括在开始前打卡和在“一整天”后打卡的人然后你可以决定如何取整或格式化,这不包括开始前打卡和结束后打卡的人,“一整天”之类的完美!这正是我想要的。感谢展示我如何