/// <summary> /// /// 执行队列 /// 执行TaskQueue中的队列 /// Executes the task. /// </summary> /// <typeparam name="TParameter"></typeparam> /// <param name="moduleType"></param> /// <param name="taskQueue"></param> /// <param name="parameter"></param> public void ExecuteQueue <TParameter>(Type moduleType, TaskQueue taskQueue, TParameter parameter) where TParameter : class { if (parameter == null) { throw new ArgumentNullException(nameof(parameter)); } if (moduleType == null) { throw new ArgumentNullException(nameof(moduleType)); } var taskModuleAttribute = moduleType.GetTypeInfo().GetAttribute <TaskModuleAttribute>(); if (taskModuleAttribute == null) { throw new ArgumentNullException(nameof(moduleType)); } // 如果模块Id不相同退出 if (taskModuleAttribute.Id != taskQueue.ModuleId) { return; } //从数据库中获取所有分润模块 var modules = _taskModuleFactory.CreateModules(moduleType); if (modules.Count() <= 0) { return; } // 参数处理 var taskParameter = new TaskParameter(); var propertyList = GetOrCreatePropertyCache <TParameter>(); foreach (var item in propertyList) { taskParameter.AddValue(item.Key.Name, item.Value(parameter)); } var taskMessage = new TaskMessage { Type = moduleType.FullName, ModuleId = taskModuleAttribute.Id, ModuleName = taskModuleAttribute.Name }; IList <ITaskResult> resultList = new List <ITaskResult>(); var success = false; foreach (var item in modules) { taskParameter.TryGetValue("QueueId", out long queueId); try { var result = item.Execute(taskParameter); if (result != null) { if (result.Status == ResultStatus.Success && result.Result.Count() > 0) { resultList.AddRange(result.Result); success = true; } else { var taskQueueUpdate = Ioc.Resolve <ITaskQueueService>().GetSingle(taskQueue.Id); // 将操作记录更新到数据 taskMessage.Message = result.Message; taskQueueUpdate.Status = QueueStatus.Error; taskQueueUpdate.Message = $"升级队列失败,.message{taskMessage.Message}"; taskQueueUpdate.HandleTime = DateTime.Now; Ioc.Resolve <ITaskQueueService>().Update(taskQueueUpdate); _logger.LogWarning(result.Message); } } } catch (Exception ex) { //执行出错,将错误写入到数据库中 var taskQueueUpdate = Ioc.Resolve <ITaskQueueService>().GetSingle(taskQueue.Id); taskMessage.Message = $"升级队列失败执行出错{moduleType}:{ex.Message}"; taskQueueUpdate.Status = QueueStatus.Error; taskQueueUpdate.Message = $"{taskMessage.Message}"; taskQueueUpdate.HandleTime = DateTime.Now; Ioc.Resolve <ITaskQueueService>().Update(taskQueueUpdate); } } var repositoryContext = Ioc.Resolve <IUserRepository>().RepositoryContext; IList <UserGradeChangeResult> gradeResultList = new List <UserGradeChangeResult>(); foreach (var graderesult in resultList) { if (graderesult is UserGradeChangeResult) { gradeResultList.Add((UserGradeChangeResult)graderesult); } } // 更新分润结果,财务结果到数据库 Ioc.Resolve <IShareOrderRepository>().UpdateUpgradeTaskResult(gradeResultList); if (success) { //更新成功 var taskQueueUpdate = Ioc.Resolve <ITaskQueueService>().GetSingle(taskQueue.Id); taskQueueUpdate.Status = QueueStatus.Handled; taskQueueUpdate.Message = "success"; taskQueueUpdate.HandleTime = DateTime.Now; taskQueueUpdate.ExecutionTimes = taskQueue.ExecutionTimes + 1; Ioc.Resolve <ITaskQueueService>().Update(taskQueueUpdate); } }
/// <summary> /// 开始执行task任务,包括会员升级,分润等 /// Executes the task. /// </summary> /// <typeparam name="TParameter">The type of the t parameter.</typeparam> /// <param name="moduleType">The type.</param> /// <param name="parameter">参数</param> /// <param name="shareOrder"></param> /// <returns>ServiceResult.</returns> public void ExecuteTask <TParameter>(Type moduleType, ShareOrder shareOrder, TParameter parameter) where TParameter : class { if (parameter == null) { throw new ArgumentNullException(nameof(parameter)); } if (moduleType == null) { throw new ArgumentNullException(nameof(moduleType)); } var taskModuleAttribute = moduleType.GetTypeInfo().GetAttribute <TaskModuleAttribute>(); if (taskModuleAttribute == null) { throw new ArgumentNullException(nameof(moduleType)); } //从数据库中获取所有分润模块 var modules = _taskModuleFactory.CreateModules(moduleType); if (modules.Count() <= 0) { return; } // 参数处理 var taskParameter = new TaskParameter(); var propertyList = GetOrCreatePropertyCache <TParameter>(); foreach (var item in propertyList) { taskParameter.AddValue(item.Key.Name, item.Value(parameter)); } var taskMessage = new TaskMessage { Type = moduleType.FullName, ModuleId = taskModuleAttribute.Id, ModuleName = taskModuleAttribute.Name }; IList <ITaskResult> resultList = new List <ITaskResult>(); foreach (var item in modules) { // 通过动态类型获取配置属性 var configuration = ((dynamic)item).Configuration; var triggerType = (TriggerType)configuration.TriggerType; if (triggerType != shareOrder.TriggerType) { continue; } taskMessage.ConfigName = (string)configuration.Name; taskParameter.TryGetValue("ShareOrderId", out long ShareOrderId); try { var result = item.Execute(taskParameter); if (result != null) { if (result.Status == ResultStatus.Success && result.Result.Count() > 0) { resultList.AddRange(result.Result); } else { // 将操作记录更新到数据 taskMessage.Message = result.Message; Ioc.Resolve <IShareOrderService>() .AddTaskMessage(ShareOrderId, taskMessage); _logger.LogWarning(result.Message); } } } catch (Exception ex) { //执行出错,将错误写入到数据库中 taskMessage.Message = $"DefaultTaskActuator.Execute执行出错{moduleType}:{ex.Message}"; Ioc.Resolve <IShareOrderService>().AddTaskMessage(ShareOrderId, taskMessage); } } //更新执行次数 var repositoryContext = Ioc.Resolve <IShareOrderRepository>(); repositoryContext.UpdateExcuteCount(shareOrder.Id, modules.Count()); if (resultList.Count > 0) { var shareOrderNative = Ioc.Resolve <IShareOrderService>() .GetSingleNative(shareOrder.Id); if (shareOrderNative.Status == ShareOrderStatus.Pending) { UpdateTaskPriceResult(resultList); } } }