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