async Task IWorkScheduleGrain.PutWorkSchedule(WorkSchedule source)
        {
            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 (!(unlimited || User.Identity.Id == Manager))
            {
                throw new SecurityException("管好自己的工作档期就行啦!");
            }

            List <long> receivers = new List <long>();
            DateTime    key       = Standards.FormatYearMonth(source.Year, source.Month);

            if (Kernel.TryGetValue(key, out WorkSchedule workSchedule))
            {
                receivers.AddRange(workSchedule.Workers);
                Database.Execute(dbTransaction =>
                {
                    workSchedule.UpdateSelf(dbTransaction, source);
                    ResetWorkers(dbTransaction, workSchedule);
                });
                foreach (long item in source.Workers)
                {
                    if (!receivers.Contains(item))
                    {
                        receivers.Add(item);
                    }
                }
            }
            else
            {
                Database.Execute(dbTransaction =>
                {
                    source.InsertSelf(dbTransaction);
                    ResetWorkers(dbTransaction, source);
                    Kernel[key] = source;
                });
                receivers.AddRange(source.Workers);
            }

            //播报
            foreach (long item in receivers)
            {
                await SendEventForRefreshProjectWorkloads(item, Manager.ToString());
            }
        }