Beispiel #1
0
        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("非项目组成员是填报不了工作量的!");
            }
        }