コード例 #1
0
ファイル: TaskActuator.cs プロジェクト: 2644783865/alabo
        /// <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);
            }
        }
コード例 #2
0
ファイル: TaskActuator.cs プロジェクト: 2644783865/alabo
        /// <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);
                }
            }
        }