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()); } }