Task <int> IProjectGrain.TotalProjectWorkload() { int result = 0; foreach (ProjectWorkload item in _projectWorkloads ??= ProjectWorkload.FetchList(Database, p => p.PiId == PrimaryKeyLong, OrderBy.Ascending <ProjectWorkload>(p => p.Year). Ascending(p => p.Month). Ascending(p => p.Worker))) { result = result + item.TotalWorkload; } return(Task.FromResult(result)); }
public ProjectWorkload GetProjectWorkload(int projectId, DateTimeRange dateRange) { var dateOnlyRange = new DateTimeRange(dateRange.Begin.Date, dateRange.End.Date); var projectEmployees = ProjectMembershipSvc.GetEmployeesOnProject(projectId, dateOnlyRange); var membershipByEmployees = GetProjectMembershipByEmployees(dateOnlyRange, projectEmployees); var workhoursByDate = ProductionCalendarSvc.GetWorkHoursByDate(dateOnlyRange); var projectWorkload = new ProjectWorkload { ProjectId = projectId, DateFrom = dateOnlyRange.Begin.Date, DateTo = dateOnlyRange.End.Date }; var employeeWorkloads = GetEmployeesWorkloadForDateRange(projectEmployees, dateOnlyRange, WorkloadPeriod.Week, membershipByEmployees, workhoursByDate, projectId); projectWorkload.EmployeeWorkloads.AddRange(employeeWorkloads); projectWorkload.TotalHours = projectWorkload.EmployeeWorkloads.Sum(ew => ew.WorkloadRecords.Sum(wr => wr.CurrentProjectHours)); return(projectWorkload); }
public async Task Put() { ProjectWorkload projectWorkload = await Request.ReadBodyAsync <ProjectWorkload>(); await ClusterClient.Default.GetGrain <IProjectWorkloadGrain>(projectWorkload.Worker, Standards.FormatYearMonth(projectWorkload.Year, projectWorkload.Month).ToString(CultureInfo.InvariantCulture)).PutProjectWorkload(projectWorkload); }
async Task IProjectWorkloadGrain.PutProjectWorkload(ProjectWorkload source) { DateTime today = DateTime.Today; if (source.Year > today.Year || source.Year == today.Year && source.Month > today.Month) { throw new ValidationException("未来不可得~"); } bool unlimited = await User.Identity.IsInRole(ProjectRoles.经营管理); if (!(unlimited || new DateTime(source.Year, source.Month, 1).AddDays(DateTime.Now.Day - 1) < GetDeadline())) { throw new ValidationException("不允许修改已归档的工作量!"); } if (Kernel.TryGetValue(source.PiId, out ProjectWorkload projectWorkload)) { ProjectInfo projectInfo = await ClusterClient.GetGrain <IProjectGrain>(source.PiId).FetchKernel(); if (projectInfo == null) { throw new ValidationException("项目不存在!"); } if (!(unlimited || User.Identity.Id == source.Worker || User.Identity.Id == projectInfo.ProjectManager || User.Identity.Id == projectInfo.DevelopManager)) { throw new SecurityException("管好自己的工作量就行啦!"); } //汇总当前已登记项目工作量 int oldAllWorkload = 0; foreach (KeyValuePair <long, ProjectWorkload> kvp in Kernel) { oldAllWorkload = oldAllWorkload + kvp.Value.TotalWorkload; } //不允许新汇总数超出当月工作日 int overmuchWorkload = oldAllWorkload - projectWorkload.TotalWorkload + source.TotalWorkload - (await ClusterClient.GetGrain <IWorkdayGrain>(source.Year).GetWorkday(source.Month)).Days; if (overmuchWorkload > 0) { throw new ValidationException(String.Format("请将超出当月工作日的 {0} 天摊到所有参与项目上以尽可能体现真实的投入占比!", overmuchWorkload)); } //持久化 if (projectWorkload.TotalWorkload == 0) { if (source.TotalWorkload > 0) { source.InsertSelf(); Kernel[source.PiId] = source; } } else if (projectWorkload.TotalWorkload > 0) { if (source.TotalWorkload > 0) { projectWorkload.UpdateSelf(source); } else if (source.TotalWorkload == 0) { projectWorkload.DeleteSelf(); Kernel[source.PiId] = source; } } //播报 await SendEventForRefreshProjectWorkloads(source.PiId); } else { throw new ValidationException("非项目组成员是填报不了工作量的!"); } }