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