/// <summary> /// 根据通过RegisterTaskSyncService方法注册的同步服务,对任务进行双向同步 /// </summary> /// <param name="tasks">与某个账号相关的所有任务</param> /// <param name="syncInfos">与某个账号相关的所有同步信息</param> /// <returns>同步结果,包含本地任务数据的增删改,以及外部数据源数据的增删改</returns> public TaskSyncResult SyncTasks(IEnumerable <TaskSyncData> tasks, IEnumerable <SyncInfo> syncInfos) { TaskSyncResult syncResult = new TaskSyncResult(); foreach (var taskSyncService in _taskSyncServices) { TaskSyncResult result = null; bool success = false; try { _logger.InfoFormat("----开始使用同步服务【{0}】比对任务数据", taskSyncService.GetType().FullName); result = taskSyncService.ProcessTwoWaySynchronization(tasks, syncInfos); _logger.InfoFormat("----结束使用同步服务【{0}】比对任务数据", taskSyncService.GetType().FullName); success = true; } catch (Exception ex) { _logger.Error(string.Format("{0}.ProcessTwoWaySynchronization has exception.", taskSyncService.GetType().Name), ex); } if (success) { syncResult.MergeResult(result); } } return(syncResult); }
/// <summary> /// 根据通过RegisterTaskSyncService方法注册的同步服务,对任务进行双向同步 /// </summary> /// <param name="tasks">与某个账号相关的所有任务</param> /// <param name="syncInfos">与某个账号相关的所有同步信息</param> /// <returns>同步结果,包含本地任务数据的增删改,以及外部数据源数据的增删改</returns> public TaskSyncResult SyncTasks(IEnumerable<TaskSyncData> tasks, IEnumerable<SyncInfo> syncInfos) { TaskSyncResult syncResult = new TaskSyncResult(); foreach (var taskSyncService in _taskSyncServices) { TaskSyncResult result = null; bool success = false; try { _logger.InfoFormat("----开始使用同步服务【{0}】比对任务数据", taskSyncService.GetType().FullName); result = taskSyncService.ProcessTwoWaySynchronization(tasks, syncInfos); _logger.InfoFormat("----结束使用同步服务【{0}】比对任务数据", taskSyncService.GetType().FullName); success = true; } catch (Exception ex) { _logger.Error(string.Format("{0}.ProcessTwoWaySynchronization has exception.", taskSyncService.GetType().Name), ex); } if (success) { syncResult.MergeResult(result); } } return syncResult; }
/// <summary> /// 持久化本地需要增删改的任务 /// </summary> private void PersistLocalTaskDatas(TaskSyncResult taskSyncResult, Account account) { if (taskSyncResult.LocalDatasToCreate.Count() == 0 && taskSyncResult.LocalDatasToUpdate.Count() == 0 && taskSyncResult.LocalDatasToDelete.Count() == 0) { return; } //处理在本地需要新增的任务 foreach (var taskData in taskSyncResult.LocalDatasToCreate) { //TODO, 以后下面这三步需要放在一个Transaction中实现 //创建任务 CooperTask task = new CooperTask(account); task.SetSubject(taskData.Subject ?? string.Empty); task.SetBody(FormatTaskBody(taskData.Body)); task.SetDueTime(FormatTaskDueTime(taskData.DueTime)); if (taskData.IsCompleted) { task.MarkAsCompleted(); } else { task.MarkAsInCompleted(); } task.SetPriority(ConvertToPriority(taskData.Priority)); _taskService.Create(task); //任务创建后更新最后更新时间,更新为和这条任务关联的外部系统任务的最后更新时间 task.SetLastUpdateTime(taskData.LastUpdateLocalTime); _taskService.Update(task); //创建同步信息 if (taskData.IsFromDefault) { SyncInfo syncInfo = new SyncInfo(); syncInfo.AccountId = account.ID; syncInfo.LocalDataId = task.ID.ToString(); syncInfo.SyncDataId = taskData.SyncId; syncInfo.SyncDataType = taskData.SyncType; InsertSyncInfo(syncInfo); } } //处理在本地需要更新的任务 foreach (var taskData in taskSyncResult.LocalDatasToUpdate) { //更新任务 CooperTask task = _taskService.GetTask(long.Parse(taskData.Id)); task.SetSubject(taskData.Subject ?? string.Empty); task.SetBody(FormatTaskBody(taskData.Body)); task.SetDueTime(FormatTaskDueTime(taskData.DueTime)); if (taskData.IsCompleted) { task.MarkAsCompleted(); } else { task.MarkAsInCompleted(); } task.SetPriority(ConvertToPriority(taskData.Priority)); _taskService.Update(task); //任务更新后更新最后更新时间,更新为和这条任务关联的外部系统任务的最后更新时间 task.SetLastUpdateTime(taskData.LastUpdateLocalTime); _taskService.Update(task); } //暂时去掉删除本地数据的功能 ////处理在本地需要删除的任务 //foreach (var taskData in taskSyncResult.LocalDatasToDelete) //{ // Cooper.Model.Tasks.Task task = _taskService.GetTask(long.Parse(taskData.Id)); // _taskService.Delete(task); // //删除同步信息 // SyncInfo syncInfo = new SyncInfo(); // syncInfo.AccountId = account.ID; // syncInfo.LocalDataId = task.ID.ToString(); // syncInfo.SyncDataId = taskData.SyncId; // syncInfo.SyncDataType = taskData.SyncType; // DeleteSyncInfo(syncInfo); //} }