using DS.Module.Core; using DS.Module.Core.Data; using DS.WMS.Core.Op.Dtos.TaskInteraction; using DS.WMS.Core.Op.Entity.TaskInteraction; using DS.WMS.Core.Op.Interface.TaskInteraction; using DS.WMS.Core.TaskPlat; using Masuit.Tools; using SqlSugar; using Fasterflect; namespace DS.WMS.Core.Op.Method.TaskInteraction { /// /// 动作执行管理 /// public class ActionManagerService : ServiceBase, IActionManagerService { /// /// 初始化 /// public ActionManagerService(IServiceProvider serviceProvider) : base(serviceProvider) { } /// /// 触发任务执行动作 /// /// 任务信息 /// public async Task TriggerAction(BusinessTask businessTask) { ArgumentNullException.ThrowIfNull(businessTask, nameof(businessTask)); //目前只限制任务完成才触发 if (businessTask.TaskStatus != TaskStatusEnum.Complete) return; // 执行自动化操作 TaskFlowDataContext dataContext = new( (TaskFlowDataNameConst.BusinessTask, businessTask) ); TaskFlowRuner taskFlow = new(TenantDb, ServiceProvider); await taskFlow.RunWithBsno(businessTask.TaskType, businessTask.BusinessId, dataContext); } public async Task ExecuteAsync(TaskFlowDataContext dataContext) { ArgumentNullException.ThrowIfNull(dataContext, nameof(dataContext)); var context = new ActionExecutionContext { TaskInfo = dataContext.GetOrDefault(TaskFlowDataNameConst.BusinessTask), ServiceProvider = ServiceProvider }; foreach (var key in dataContext.Keys) context.AdditionalData[key] = dataContext[key]; string selectorType = dataContext.GetOrDefault("SelectorType"); if (selectorType.IsNullOrEmpty()) return; Type t = Type.GetType(selectorType, true, false); if (t == null) { await new ApplicationException($"未能获取类型【{t.AssemblyQualifiedName}】的信息").LogAsync(Db); return; } IActionSelector selector = ConstructorExtensions.CreateInstance(t) as IActionSelector; if (selector == null) { await new ApplicationException($"未能创建执行选择器【{t.AssemblyQualifiedName}】的实例").LogAsync(Db); return; } var executor = await selector.GetActionExecutor(context); executor?.ExecuteAsync(context); //TaskActionType actionType = (TaskActionType)dataContext.GetOrDefault("ActionType"); //if (ExecutorMappings.TryGetValue(actionType, out IActionExecutor executor)) //{ // await executor.ExecuteAsync(context); //} } public async Task TriggerTest(TaskBaseTypeEnum taskType, long? id) { var task = await TenantDb.Queryable() .Where(t => t.TaskType == taskType //&& SqlFunc.Subqueryable().Where(s => t.BusinessId == s.Id && s.BillSubmitStatus == AuditStatusEnum.Approve).Any() ) //.Where(x => x.TaskStatus == TaskStatusEnum.Complete) .WhereIF(id.HasValue, x => x.BusinessId == id) .OrderByDescending(t => SqlFunc.GetRandom()).Take(1).FirstAsync(); if (task != null) { TaskFlowDataContext dataContext = new( (TaskFlowDataNameConst.BusinessTask, task) ); TaskFlowRuner taskFlow = new(TenantDb, ServiceProvider); await taskFlow.RunWithBsno(task.TaskType, task.BusinessId, dataContext); return DataResult.Success; } var result = DataResult.Failed("找不到指定类型的任务"); result.Data = 404; return result; } } /// /// 任务执行类型 /// public enum TaskActionType { /// /// 后台任务 /// Background, /// /// 邮件 /// Email, /// /// EDI /// EDI, } }