feat: implement RollCallController and enhance workshop roll call reporting functionality
This commit is contained in:
@@ -14,7 +14,7 @@ namespace Query.AdminReports.Handlers
|
|||||||
List<WorkshopWithRollCallServiceQueryModel> Handle(WorkshopWithRollCallServiceQueryParameters parameters);
|
List<WorkshopWithRollCallServiceQueryModel> Handle(WorkshopWithRollCallServiceQueryParameters parameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class GetWorkshopWithRollCallHandler: IGetWorkshopWithRollCallHandler
|
public class GetWorkshopWithRollCallHandler : IGetWorkshopWithRollCallHandler
|
||||||
{
|
{
|
||||||
private readonly CompanyContext _companyContext;
|
private readonly CompanyContext _companyContext;
|
||||||
private readonly IWorkFlowApplication workFlowApplication;
|
private readonly IWorkFlowApplication workFlowApplication;
|
||||||
@@ -30,7 +30,6 @@ namespace Query.AdminReports.Handlers
|
|||||||
var now = DateTime.Now.Date;
|
var now = DateTime.Now.Date;
|
||||||
var lastWeek = now.AddDays(-7);
|
var lastWeek = now.AddDays(-7);
|
||||||
|
|
||||||
|
|
||||||
//workshop filter by parameters
|
//workshop filter by parameters
|
||||||
var rollCallServiceQuery = _companyContext.RollCallServices.AsSplitQuery();
|
var rollCallServiceQuery = _companyContext.RollCallServices.AsSplitQuery();
|
||||||
|
|
||||||
@@ -46,11 +45,15 @@ namespace Query.AdminReports.Handlers
|
|||||||
rollCallServiceQuery = rollCallServiceQuery.Where(x => x.ServiceType == parameters.RollCallServiceType);
|
rollCallServiceQuery = rollCallServiceQuery.Where(x => x.ServiceType == parameters.RollCallServiceType);
|
||||||
|
|
||||||
if (parameters.FilterMode == FilterMode.Active)
|
if (parameters.FilterMode == FilterMode.Active)
|
||||||
rollCallServiceQuery = rollCallServiceQuery.Where(x => x.StartService.Date <= now && x.EndService.Date >= now);
|
rollCallServiceQuery =
|
||||||
else if (parameters.FilterMode == FilterMode.DeActive)
|
rollCallServiceQuery.Where(x => x.StartService.Date <= now && x.EndService.Date >= now);
|
||||||
rollCallServiceQuery = rollCallServiceQuery.Where(x => x.EndService.Date < now || x.StartService.Date > now);
|
|
||||||
|
|
||||||
var workshopsWithService = rollCallServiceQuery.Join(allWorkshops, x => x.WorkshopId, y => y.id, (rcs, workshop) =>
|
else if (parameters.FilterMode == FilterMode.DeActive)
|
||||||
|
rollCallServiceQuery =
|
||||||
|
rollCallServiceQuery.Where(x => x.EndService.Date < now || x.StartService.Date > now);
|
||||||
|
|
||||||
|
var workshopsWithService = rollCallServiceQuery.Join(allWorkshops, x => x.WorkshopId, y => y.id,
|
||||||
|
(rcs, workshop) =>
|
||||||
new WorkshopWithRollCallServiceQueryModel()
|
new WorkshopWithRollCallServiceQueryModel()
|
||||||
{
|
{
|
||||||
WorkshopId = workshop.id,
|
WorkshopId = workshop.id,
|
||||||
@@ -64,17 +67,27 @@ namespace Query.AdminReports.Handlers
|
|||||||
|
|
||||||
|
|
||||||
//workshop population
|
//workshop population
|
||||||
var workshopLeftWorks = _companyContext.Workshops.AsSplitQuery().Where(x => workshopsWithService.Any(y => y.WorkshopId == x.id)).Include(x => x.LeftWorks).Include(x => x.LeftWorkInsurances)
|
var workshopLeftWorks = _companyContext.Workshops.AsSplitQuery()
|
||||||
|
.Where(x => workshopsWithService.Any(y => y.WorkshopId == x.id)).Include(x => x.LeftWorks)
|
||||||
|
.Include(x => x.LeftWorkInsurances)
|
||||||
.Select(x => new
|
.Select(x => new
|
||||||
{
|
{
|
||||||
WorkshopId = x.id,
|
WorkshopId = x.id,
|
||||||
LeftWorks = x.LeftWorks.Where(y => y.StartWorkDate <= lastWeek && y.LeftWorkDate > now).Select(y => y.EmployeeId),
|
LeftWorks = x.LeftWorks.Where(y => y.StartWorkDate <= lastWeek && y.LeftWorkDate > now)
|
||||||
LeftWorkInsurances = x.LeftWorkInsurances.Where(y => y.StartWorkDate <= lastWeek && (y.LeftWorkDate > now || y.LeftWorkDate == null)).Select(y => y.EmployeeId)
|
.Select(y => y.EmployeeId),
|
||||||
|
LeftWorkInsurances = x.LeftWorkInsurances
|
||||||
|
.Where(y => y.StartWorkDate <= lastWeek && (y.LeftWorkDate > now || y.LeftWorkDate == null))
|
||||||
|
.Select(y => y.EmployeeId)
|
||||||
}).ToList();
|
}).ToList();
|
||||||
|
|
||||||
var workshopsWorkingEmployeesList = workshopLeftWorks
|
var workshopsWorkingEmployeesList = workshopLeftWorks
|
||||||
.Select(x => new { x.WorkshopId, TotalWorkingEmployeesCount = x.LeftWorks.Concat(x.LeftWorkInsurances).Distinct().Count(), EmployeeIds = x.LeftWorks.Concat(x.LeftWorkInsurances).Distinct() }).ToList();
|
.Select(x =>
|
||||||
|
new
|
||||||
|
{
|
||||||
|
x.WorkshopId,
|
||||||
|
TotalWorkingEmployeesCount = x.LeftWorks.Concat(x.LeftWorkInsurances).Distinct().Count(),
|
||||||
|
EmployeeIds = x.LeftWorks.Concat(x.LeftWorkInsurances).Distinct()
|
||||||
|
}).ToList();
|
||||||
|
|
||||||
|
|
||||||
var activeEmployees = _companyContext.RollCallEmployees.AsSplitQuery()
|
var activeEmployees = _companyContext.RollCallEmployees.AsSplitQuery()
|
||||||
@@ -83,15 +96,25 @@ namespace Query.AdminReports.Handlers
|
|||||||
workshopsWithService.Any(y => y.WorkshopId == x.WorkshopId))
|
workshopsWithService.Any(y => y.WorkshopId == x.WorkshopId))
|
||||||
.Select(x => new { x.WorkshopId, x.EmployeeId });
|
.Select(x => new { x.WorkshopId, x.EmployeeId });
|
||||||
|
|
||||||
var lastWeekRollCalls = _companyContext.RollCalls.AsSplitQuery().Where(x => x.StartDate.HasValue && x.StartDate.Value >= lastWeek
|
var lastWeekRollCalls = _companyContext.RollCalls.AsSplitQuery()
|
||||||
&& workshopsWithService.Any(y => y.WorkshopId == x.WorkshopId)).GroupBy(x => x.EmployeeId).Select(x => x.Key);
|
.Where(x => x.StartDate.HasValue &&
|
||||||
|
x.StartDate.Value >= lastWeek
|
||||||
|
&& workshopsWithService
|
||||||
|
.Any(y => y.WorkshopId == x.WorkshopId))
|
||||||
|
.GroupBy(x => x.EmployeeId)
|
||||||
|
.Select(x => x.Key);
|
||||||
|
|
||||||
|
|
||||||
var leaves = _companyContext.LeaveList.AsSplitQuery().Where(x => x.StartLeave <= lastWeek && x.EndLeave >= now && (x.LeaveType == "استعلاجی" || x.PaidLeaveType == "روزانه")
|
var leaves = _companyContext.LeaveList.AsSplitQuery().Where(x =>
|
||||||
&& workshopsWithService.Any(y => y.WorkshopId == x.WorkshopId)).Select(x => x.EmployeeId);
|
x.StartLeave <= lastWeek && x.EndLeave >= now &&
|
||||||
|
(x.LeaveType == "استعلاجی" || x.PaidLeaveType == "روزانه")
|
||||||
|
&& workshopsWithService.Any(y => y.WorkshopId == x.WorkshopId))
|
||||||
|
.Select(x => x.EmployeeId);
|
||||||
|
|
||||||
|
|
||||||
var activeEmployeesList = activeEmployees.ToList().Where(x => workshopsWorkingEmployeesList.Any(w => w.WorkshopId == x.WorkshopId && w.EmployeeIds.Contains(x.EmployeeId)));
|
var activeEmployeesList = activeEmployees.ToList().Where(x =>
|
||||||
|
workshopsWorkingEmployeesList.Any(w =>
|
||||||
|
w.WorkshopId == x.WorkshopId && w.EmployeeIds.Contains(x.EmployeeId)));
|
||||||
var lastWeekRollCallsList = lastWeekRollCalls.ToList();
|
var lastWeekRollCallsList = lastWeekRollCalls.ToList();
|
||||||
var leavesList = leaves.ToList();
|
var leavesList = leaves.ToList();
|
||||||
var workshopsWithServiceList = workshopsWithService.ToList();
|
var workshopsWithServiceList = workshopsWithService.ToList();
|
||||||
@@ -107,12 +130,13 @@ namespace Query.AdminReports.Handlers
|
|||||||
MaxPersonValid = x.MaxPersonValid,
|
MaxPersonValid = x.MaxPersonValid,
|
||||||
WorkshopName = x.WorkshopName,
|
WorkshopName = x.WorkshopName,
|
||||||
ActiveEmployeesCount = activeEmployeesList.Count(y => y.WorkshopId == x.WorkshopId),
|
ActiveEmployeesCount = activeEmployeesList.Count(y => y.WorkshopId == x.WorkshopId),
|
||||||
ActiveEmployeesWithRollCallInLastWeekCount = activeEmployeesList.Count(y => y.WorkshopId == x.WorkshopId &&
|
ActiveEmployeesWithRollCallInLastWeekCount = activeEmployeesList.Count(y =>
|
||||||
|
y.WorkshopId == x.WorkshopId &&
|
||||||
lastWeekRollCallsList.Contains(y.EmployeeId) && !leavesList.Contains(y.EmployeeId)),
|
lastWeekRollCallsList.Contains(y.EmployeeId) && !leavesList.Contains(y.EmployeeId)),
|
||||||
TotalEmployeesCount = workshopsWorkingEmployeesList.FirstOrDefault(y => y.WorkshopId == x.WorkshopId)?.TotalWorkingEmployeesCount ?? 0,
|
TotalEmployeesCount = workshopsWorkingEmployeesList
|
||||||
|
.FirstOrDefault(y => y.WorkshopId == x.WorkshopId)?.TotalWorkingEmployeesCount ?? 0,
|
||||||
//UndoneWorkFlowsCount = workFlowApplication.GetAllWorkFlowCount(x.WorkshopId).Result
|
//UndoneWorkFlowsCount = workFlowApplication.GetAllWorkFlowCount(x.WorkshopId).Result
|
||||||
}).OrderByDescending(x => x.IsActive).ToList();
|
}).OrderByDescending(x => x.IsActive).ToList();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -14,14 +14,7 @@
|
|||||||
|
|
||||||
public int UndoneWorkFlowsCount { get; set; }
|
public int UndoneWorkFlowsCount { get; set; }
|
||||||
|
|
||||||
|
public float ActiveEmployeesWithRollCallPercentage => ActiveEmployeesCount == 0 ? 0f : ((float)ActiveEmployeesWithRollCallInLastWeekCount / ActiveEmployeesCount) * 100f;
|
||||||
public float ActiveEmployeesWithRollCallPercentage
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return ((float)ActiveEmployeesWithRollCallInLastWeekCount / ActiveEmployeesCount) * 100;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public int MaxPersonValid { get; set; }
|
public int MaxPersonValid { get; set; }
|
||||||
public bool IsActive { get; set; }
|
public bool IsActive { get; set; }
|
||||||
|
|||||||
36
ServiceHost/Areas/Admin/Controllers/RollCallController.cs
Normal file
36
ServiceHost/Areas/Admin/Controllers/RollCallController.cs
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
using _0_Framework.Application;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Query.AdminReports.Handlers;
|
||||||
|
using Query.AdminReports.Models;
|
||||||
|
using ServiceHost.BaseControllers;
|
||||||
|
using WorkFlow.Application.Contracts.WorkFlow;
|
||||||
|
|
||||||
|
namespace ServiceHost.Areas.Admin.Controllers;
|
||||||
|
|
||||||
|
public class RollCallController:AdminBaseController
|
||||||
|
{
|
||||||
|
private readonly IGetWorkshopWithRollCallHandler _workshopWithRollCallHandler;
|
||||||
|
private readonly IWorkFlowApplication _workFlowApplication;
|
||||||
|
private readonly long _currentAccountId;
|
||||||
|
|
||||||
|
public RollCallController(IGetWorkshopWithRollCallHandler workshopWithRollCallHandler,IAuthHelper _authHelper, IWorkFlowApplication workFlowApplication)
|
||||||
|
{
|
||||||
|
_workshopWithRollCallHandler = workshopWithRollCallHandler;
|
||||||
|
_workFlowApplication = workFlowApplication;
|
||||||
|
_currentAccountId = _authHelper.CurrentAccountId();
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet("report")]
|
||||||
|
public ActionResult<List<WorkshopWithRollCallServiceQueryModel>> GetRollCallReport([FromQuery] WorkshopWithRollCallServiceQueryParameters searchModel)
|
||||||
|
{
|
||||||
|
var result = _workshopWithRollCallHandler.Handle(searchModel);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet("repoert/workfloecount/{workshopId}")]
|
||||||
|
public async Task<ActionResult<int>> GetWorkFlowCountByWorkshopId(long workshopId)
|
||||||
|
{
|
||||||
|
var result = await _workFlowApplication.GetAllWorkFlowCount(workshopId, _currentAccountId);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user