Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果员工在MVC中多次提交,则累计小时数_C#_Asp.net Mvc - Fatal编程技术网

C# 如果员工在MVC中多次提交,则累计小时数

C# 如果员工在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

创建显示员工在某个日期范围内工作的小时数的报告。我的问题是,我不确定如何获得所有小时数的总和,然后为每个员工显示一行总小时数。下面是我的照片。

这是我想要的样子。

ReportsController.cs

        /// <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代码。我将继续尽我所能地学习,但任何帮助或提示都会得到肯定的感谢。然后你可以决定如何取整或从中格式化。这不包括在开始前打卡和在“一整天”后打卡的人然后你可以决定如何取整或格式化,这不包括开始前打卡和结束后打卡的人,“一整天”之类的完美!这正是我想要的。感谢展示我如何