From c5a1e5c27410517bc91ef5d4b428247dfe805608 Mon Sep 17 00:00:00 2001 From: mahan Date: Sun, 26 Oct 2025 11:23:51 +0330 Subject: [PATCH] feat: implement RollCallController and enhance workshop roll call reporting functionality --- .../GetWorkshopWithRollCallHandler.cs | 106 +++++++++++------- .../WorkshopWithRollCallServiceQueryModel.cs | 11 +- .../Admin/Controllers/RollCallController.cs | 36 ++++++ 3 files changed, 103 insertions(+), 50 deletions(-) create mode 100644 ServiceHost/Areas/Admin/Controllers/RollCallController.cs diff --git a/Query/AdminReports/Handlers/GetWorkshopWithRollCallHandler.cs b/Query/AdminReports/Handlers/GetWorkshopWithRollCallHandler.cs index e6f9df89..394d1e9e 100644 --- a/Query/AdminReports/Handlers/GetWorkshopWithRollCallHandler.cs +++ b/Query/AdminReports/Handlers/GetWorkshopWithRollCallHandler.cs @@ -9,20 +9,20 @@ using WorkFlow.Application.Contracts.WorkFlow; namespace Query.AdminReports.Handlers { - public interface IGetWorkshopWithRollCallHandler - { - List Handle(WorkshopWithRollCallServiceQueryParameters parameters); - } + public interface IGetWorkshopWithRollCallHandler + { + List Handle(WorkshopWithRollCallServiceQueryParameters parameters); + } - public class GetWorkshopWithRollCallHandler: IGetWorkshopWithRollCallHandler - { + public class GetWorkshopWithRollCallHandler : IGetWorkshopWithRollCallHandler + { private readonly CompanyContext _companyContext; private readonly IWorkFlowApplication workFlowApplication; public GetWorkshopWithRollCallHandler(CompanyContext companyContext, IWorkFlowApplication workFlowApplication) { - _companyContext = companyContext; - this.workFlowApplication = workFlowApplication; + _companyContext = companyContext; + this.workFlowApplication = workFlowApplication; } public List Handle(WorkshopWithRollCallServiceQueryParameters parameters) @@ -30,7 +30,6 @@ namespace Query.AdminReports.Handlers var now = DateTime.Now.Date; var lastWeek = now.AddDays(-7); - //workshop filter by parameters var rollCallServiceQuery = _companyContext.RollCallServices.AsSplitQuery(); @@ -46,35 +45,49 @@ namespace Query.AdminReports.Handlers rollCallServiceQuery = rollCallServiceQuery.Where(x => x.ServiceType == parameters.RollCallServiceType); if (parameters.FilterMode == FilterMode.Active) - rollCallServiceQuery = rollCallServiceQuery.Where(x => x.StartService.Date <= now && x.EndService.Date >= now); - else if (parameters.FilterMode == FilterMode.DeActive) - rollCallServiceQuery = rollCallServiceQuery.Where(x => x.EndService.Date < now || x.StartService.Date > now); + rollCallServiceQuery = + rollCallServiceQuery.Where(x => x.StartService.Date <= now && x.EndService.Date >= now); - var workshopsWithService = rollCallServiceQuery.Join(allWorkshops, x => x.WorkshopId, y => y.id, (rcs, workshop) => - new WorkshopWithRollCallServiceQueryModel() - { - WorkshopId = workshop.id, - RollCallServiceType = rcs.ServiceType, - WorkshopName = workshop.WorkshopFullName, - MaxPersonValid = rcs.MaxPersonValid, - IsActive = rcs.StartService <= DateTime.Now && rcs.EndService >= DateTime.Now, - ServiceStart = rcs.StartService, - ServiceEnd = rcs.EndService - }); + 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() + { + WorkshopId = workshop.id, + RollCallServiceType = rcs.ServiceType, + WorkshopName = workshop.WorkshopFullName, + MaxPersonValid = rcs.MaxPersonValid, + IsActive = rcs.StartService <= DateTime.Now && rcs.EndService >= DateTime.Now, + ServiceStart = rcs.StartService, + ServiceEnd = rcs.EndService + }); //workshop population - 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 - { - WorkshopId = x.id, - LeftWorks = x.LeftWorks.Where(y => y.StartWorkDate <= lastWeek && y.LeftWorkDate > now).Select(y => y.EmployeeId), - LeftWorkInsurances = x.LeftWorkInsurances.Where(y => y.StartWorkDate <= lastWeek && (y.LeftWorkDate > now || y.LeftWorkDate == null)).Select(y => y.EmployeeId) - }).ToList(); + 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 + { + WorkshopId = x.id, + LeftWorks = x.LeftWorks.Where(y => y.StartWorkDate <= lastWeek && y.LeftWorkDate > now) + .Select(y => y.EmployeeId), + LeftWorkInsurances = x.LeftWorkInsurances + .Where(y => y.StartWorkDate <= lastWeek && (y.LeftWorkDate > now || y.LeftWorkDate == null)) + .Select(y => y.EmployeeId) + }).ToList(); 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() @@ -83,15 +96,25 @@ namespace Query.AdminReports.Handlers workshopsWithService.Any(y => y.WorkshopId == x.WorkshopId)) .Select(x => new { x.WorkshopId, x.EmployeeId }); - var lastWeekRollCalls = _companyContext.RollCalls.AsSplitQuery().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 lastWeekRollCalls = _companyContext.RollCalls.AsSplitQuery() + .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 == "روزانه") - && workshopsWithService.Any(y => y.WorkshopId == x.WorkshopId)).Select(x => x.EmployeeId); + var leaves = _companyContext.LeaveList.AsSplitQuery().Where(x => + 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 leavesList = leaves.ToList(); var workshopsWithServiceList = workshopsWithService.ToList(); @@ -107,12 +130,13 @@ namespace Query.AdminReports.Handlers MaxPersonValid = x.MaxPersonValid, WorkshopName = x.WorkshopName, 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)), - 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 }).OrderByDescending(x => x.IsActive).ToList(); - } } -} +} \ No newline at end of file diff --git a/Query/AdminReports/Models/WorkshopWithRollCallServiceQueryModel.cs b/Query/AdminReports/Models/WorkshopWithRollCallServiceQueryModel.cs index 90bdeb2d..60619858 100644 --- a/Query/AdminReports/Models/WorkshopWithRollCallServiceQueryModel.cs +++ b/Query/AdminReports/Models/WorkshopWithRollCallServiceQueryModel.cs @@ -13,15 +13,8 @@ public int ActiveEmployeesWithRollCallInLastWeekCount { get; set; } public int UndoneWorkFlowsCount { get; set; } - - - public float ActiveEmployeesWithRollCallPercentage - { - get - { - return ((float)ActiveEmployeesWithRollCallInLastWeekCount / ActiveEmployeesCount) * 100; - } - } + + public float ActiveEmployeesWithRollCallPercentage => ActiveEmployeesCount == 0 ? 0f : ((float)ActiveEmployeesWithRollCallInLastWeekCount / ActiveEmployeesCount) * 100f; public int MaxPersonValid { get; set; } public bool IsActive { get; set; } diff --git a/ServiceHost/Areas/Admin/Controllers/RollCallController.cs b/ServiceHost/Areas/Admin/Controllers/RollCallController.cs new file mode 100644 index 00000000..51c29916 --- /dev/null +++ b/ServiceHost/Areas/Admin/Controllers/RollCallController.cs @@ -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> GetRollCallReport([FromQuery] WorkshopWithRollCallServiceQueryParameters searchModel) + { + var result = _workshopWithRollCallHandler.Handle(searchModel); + return result; + } + + [HttpGet("repoert/workfloecount/{workshopId}")] + public async Task> GetWorkFlowCountByWorkshopId(long workshopId) + { + var result = await _workFlowApplication.GetAllWorkFlowCount(workshopId, _currentAccountId); + return result; + } +} \ No newline at end of file