| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510 |
- using System;
- using System.Collections;
- using System.Configuration;
- using Abp.Dependency;
- using Abp.Runtime.Caching;
- using Abp.UI;
- using IwbZero.Expr;
- using IwbZero.IwbBase;
- using IwbZero.IwbDataQuery;
- using IwbZero.ToolCommon;
- using IwbZero.ToolCommon.LogHelpers;
- using IwbZero.ToolCommon.StringModel;
- using WeEngine.ComponentInfo;
- using WeEngine.Components.InterfaceFactory;
- using WeEngine.Packages;
- namespace WeEngine.Components
- {
- /// <summary>
- /// 事务运行器
- /// </summary>
- public class ComponentRunner : ISingletonDependency
- {
- #region 属性
- /// <summary>
- /// 当前运行节点
- /// </summary>
- public NodeBase CurrentNode { get; set; }
- public ICacheManager CacheManager { get; }
- public IIocManager IocManager { get; }
- private int Depth { get; set; }
- public EngineComponent Component { get; set; }
- public string ParameterMapping { get; set; }
- public Hashtable Variables { get; set; }
- public Hashtable DataSources { get; }
- public Hashtable FilterFields { get; }
- public string ProcessInstanceId => GetValue(CompStmtType.CompInstanceId.VariableName);
- public string ProcessMessage
- {
- get => GetValue(CompStmtType.CompMessage.VariableName);
- set => SetValue(CompStmtType.CompMessage.VariableName, value);
- }
- public bool ProcessResult => (GetValue(CompStmtType.CompResult.VariableName).ValI() != 0);
- #endregion
- public ComponentRunner(ICacheManager cacheManager, IIocManager iocManager)
- {
- CacheManager = cacheManager;
- IocManager = iocManager;
- Variables = new Hashtable();
- DataSources = new Hashtable();
- FilterFields = new Hashtable();
- }
-
- /// <summary>
- /// 运行事务组件
- /// </summary>
- /// <param name="cId"></param>
- /// <param name="mapping"></param>
- /// <returns></returns>
- public bool Run(string cId, string mapping="")
- {
- var flag = false;
- var component = LoadComponentById(cId);
- if (component != null)
- {
- flag = Run(component, mapping);
- }
- return flag;
- }
- /// <summary>
- /// 运行事务组件
- /// </summary>
- /// <param name="component"></param>
- /// <param name="mapping"></param>
- /// <returns></returns>
- public bool Run(EngineComponent component,string mapping="")
- {
- DataSources.Clear();
- FilterFields.Clear();
- //Variables.Clear();
- Component = component;
- ParameterMapping = mapping;
- InitializeVariables();
- if (Component.ComponentScript != "")
- {
- var xml = component.ComponentScript;
- IwbXmlNode node = IwbXmlNode.ParseGenericXml(xml);
- if (node != null)
- {
- foreach (ComponentParameter parameter in ParseComponentParameter(component.Parameters))
- {
- FilterFields.Add(IwbVariableType.Global + parameter.Id.UAndT(), "");
- }
- if (mapping != "")
- {
- ArrayList list2 = mapping.MappingToArrayList();
- if (list2 != null)
- {
- foreach (IwbIdName name in list2)
- {
- SetValue(IwbVariableType.Global + name.Id, name.Name);
- }
- }
- }
- RunStatements(node.Nodes);
- }
- }
- else
- {
- IComponentRunner runner = IocManager.Resolve<IComponentRunner>(Component.RegisterKey);
- if (!runner.Run(Component, mapping))
- {
- typeof(ComponentRunner).LogError(runner.ErrorMessage);
- }
- //object obj2 = AssemblyHelper.CreateInstance(Component.ProcessClass, Component.ProcessLib);
- //if (obj2 == null)
- //{
- // typeof(ComponentRunner).LogError(
- // $"Unable to create static process runner at {Component.ProcessClass}.");
- // //AbortProcessWithMessage(string.Format("Unable to create static process runner at {0}.", _Process.ProcessClass));
- //}
- //else if (!(obj2 is IComponentRunner))
- //{
- // typeof(ComponentRunner).LogError($"The process runner, {Component.ProcessClass}, is invalid.");
- // //AbortProcessWithMessage(string.Format("The process runner, {0}, is invalid.", _Process.ProcessClass));
- //}
- //else
- //{
- // IComponentRunner runner = (IComponentRunner)obj2;
- // if (!runner.Run(Component, pcParameterMappings))
- // {
- // typeof(ComponentRunner).LogError(runner.ErrorMessage);
- // //AbortProcessWithMessage(runner.ErrorMessage);
- // }
- //}
- }
- return true;
- }
- #region 私有方法
- /// <summary>
- /// 解析参数
- /// </summary>
- /// <param name="pcParameter"></param>
- /// <returns></returns>
- private ArrayList ParseComponentParameter(string pcParameter)
- {
- ArrayList list = new ArrayList();
- foreach (string str in pcParameter.StrToArray())
- {
- if (str.IndexOf(":", StringComparison.Ordinal) != -1)
- {
- string pcStr = str.Substring(0, str.IndexOf(":", StringComparison.Ordinal));
- ComponentParameter parameter = new ComponentParameter(str.Substring(str.IndexOf(":", StringComparison.Ordinal) + 1, (str.Length - str.IndexOf(":", StringComparison.Ordinal)) - 1), ParameterTypeFromStr(pcStr));
- list.Add(parameter);
- }
- }
- return list;
- }
- /// <summary>
- /// 转换参数类型
- /// </summary>
- /// <param name="pcStr"></param>
- /// <returns></returns>
- private ComponentParameterType ParameterTypeFromStr(string pcStr)
- {
- ComponentParameterType filterField = ComponentParameterType.Variable;
- string str = pcStr;
- if (str.IsEmpty())
- {
- return filterField;
- }
- str = string.IsInterned(str);
- if (str == "FilterField")
- {
- return ComponentParameterType.FilterField;
- }
- if (str == "File")
- {
- return ComponentParameterType.File;
- }
- if (str == "Folder")
- {
- return ComponentParameterType.Folder;
- }
- if (str != "PrinterSetting")
- {
- return filterField;
- }
- return ComponentParameterType.PrinterSetting;
- }
- /// <summary>
- /// 变量初始化
- /// </summary>
- private void InitializeVariables()
- {
- CreateVariable(CompStmtType.CompMessage.VariableName, CompStmtType.CompMessage.VariableType,false);
- CreateVariable(CompStmtType.CompInstanceId.VariableName, CompStmtType.CompInstanceId.VariableType, false);
- CreateVariable(CompStmtType.CompResult.VariableName, CompStmtType.CompResult.VariableType, false);
- SetValue(CompStmtType.CompMessage.VariableName, "");
- SetValue(CompStmtType.CompInstanceId.VariableName, "0");
- SetValue(CompStmtType.CompResult.VariableName, "1");
- }
-
- /// <summary>
- /// 转换表达式变量
- /// </summary>
- /// <param name="poRoot"></param>
- private void TransComponentVariables(ExprObject poRoot)
- {
- foreach (ExprObject expr in poRoot.ChildNodes)
- {
- if (expr.ElementType == ExprElements.Variable)
- {
- if (expr.Expr.Trim() != "")
- {
- expr.Expr = GetValue(expr.Expr);
- expr.ElementType = ExprElements.Value;
- }
- }
- else if ((expr.ElementType == ExprElements.Expression) || (expr.ElementType == ExprElements.Function))
- {
- TransComponentVariables(expr);
- }
- }
- }
-
- /// <summary>
- /// 加载组件
- /// </summary>
- /// <param name="cId"></param>
- /// <returns></returns>
- private EngineComponent LoadComponentById(string cId)
- {
- var packageId = CurrentNode?.CurPackageInfo?.Id ?? "";
- EngineComponent component = null;
- if (packageId.IsNotEmpty()) component = CacheManager.GetEngineComponent(packageId, cId);
-
- if (component == null)
- {
- try
- {
- string url = $"{ConfigurationManager.AppSettings["DataCenter.Engine.Component"]}";
- string authKey = ConfigurationManager.AppSettings["DataCenter.Engine.AuthKey"];
- var result = url.RequestPost(new { Id = cId }.Obj2String(),authKey);
- var obj = result.Str2Obj<EngineComponent>();
- return obj;
- }
- catch (Exception e)
- {
- throw new UserFriendlyException($"没有找到Id为{cId}的引擎组件!{e.Message}");
- }
- }
-
- return component;
- }
- public string TransMappingWithRunner( string pcMapping)
- {
- string pcSource = "";
- foreach (IwbIdName name in pcMapping.MappingToArrayList())
- {
- string str2 = Evaluate(name.Name);
- if (str2 != "")
- {
- pcSource = pcSource.AddStr($"{name.Id}={str2}");
- }
- }
- return pcSource;
- }
- #endregion
- #region 事务
- /// <summary>
- /// 运行事务
- /// </summary>
- /// <param name="poStatement"></param>
- /// <returns></returns>
- public bool RunOneStatement(IwbXmlNode poStatement)
- {
- IStatementRunner StatementRunner = null;
- try
- {
- StatementRunner = IocManager.Resolve<IStatementRunnerFactory>().Create(poStatement.Name);
- }
- catch (Exception e)
- {
- this.LogError(e);
- }
- return StatementRunner?.Run(this, poStatement) ?? false;
- }
- /// <summary>
- /// 运行事务
- /// </summary>
- /// <param name="poStatements"></param>
- /// <returns></returns>
- public bool RunStatements(ArrayList poStatements)
- {
- bool flag = true;
- Depth++;
- int count = poStatements.Count;
- for (int i = 0; i < count; i++)
- {
- var poStatement = (IwbXmlNode)poStatements[i];
- string childValue = poStatement.GetChildValue("Comment");
- //ShowStepInfo(count, i + 1, childValue);
- string processMessage = ProcessMessage;
- try
- {
- bool flag2 = poStatement.GetChildValue("RunWhenFail").StrToBool();
- bool processResult = ProcessResult;
- if (childValue != "")
- {
- typeof(ComponentRunner).LogInfo("\r\n\r\n");
- typeof(ComponentRunner).LogInfo(childValue);
- typeof(ComponentRunner).LogInfo($"Process Result: {processResult}");
- typeof(ComponentRunner).LogInfo($"RunWhenFail option: {(flag2 ? "On" : "Off")}");
- }
- if (processResult || flag2)
- {
- flag = RunOneStatement(poStatement);
- }
- }
- catch (Exception e)
- {
- typeof(ComponentRunner).LogError(e);
- // AbortProcessWithMessage(exception.Message);
- }
- if (!ProcessResult)
- {
- flag = false;
- }
- if (ProcessMessage != processMessage)
- {
- typeof(ComponentRunner).LogInfo(processMessage);
- }
- }
- Depth--;
- return flag;
- }
- /// <summary>
- /// 创建变量
- /// </summary>
- /// <param name="pcVariableId"></param>
- /// <param name="pcVariableType"></param>
- /// <param name="save2node"></param>
- public void CreateVariable(string pcVariableId, string pcVariableType,bool save2node=true)
- {
- pcVariableId = pcVariableId.UAndT();
- var variable = new IwbRtVariable(pcVariableId, pcVariableType);
- Variables[pcVariableId] = variable;
- if(save2node && CurrentNode != null && !CurrentNode.Variables.ContainsKey(pcVariableId))
- {
- CurrentNode.Variables[pcVariableId] = variable;
- }
- }
- /// <summary>
- /// 设置变量值
- /// </summary>
- /// <param name="pcIdentifier"></param>
- /// <param name="pcExpression"></param>
- /// <param name="plToEvaluate"></param>
- public void SetValue(string pcIdentifier, string pcExpression, bool plToEvaluate = false)
- {
- pcIdentifier = pcIdentifier.UAndT();
- string pcValue = pcExpression;
- if (plToEvaluate)
- {
- pcValue = Evaluate(pcExpression);
- }
- if (pcIdentifier.IndexOf(IwbVariableType.Global, StringComparison.Ordinal) == 0)
- {
- if (FilterFields.ContainsKey(pcIdentifier))
- {
- FilterFields[pcIdentifier] = pcValue;
- }
- //else
- //{
- // UserSession.SetSessionVariable(pcIdentifier, pcValue);
- //}
- }
- else if (Variables.ContainsKey(pcIdentifier))
- {
- var variable = (IwbRtVariable)Variables[pcIdentifier];
- variable.VarValue = pcValue;
- CurrentNode.Variables[pcIdentifier] = variable;
- }
- else
- {
- Array array = pcIdentifier.StrToArrayEx("$");
- if (array.Length == 2)
- {
- string pcDataSourceId = array.GetValue(0).ToString();
- string name = array.GetValue(1).ToString();
- IwbDataSource dataSource = GetDataSource(pcDataSourceId);
- if (dataSource?.Data != null && (dataSource.Data.IsOpened))
- {
- dataSource.Data.SetField(name, pcValue);
- }
- }
- else
- {
- var variable = new IwbRtVariable(pcIdentifier.UAndT()).SetValue(pcValue);
- CurrentNode.Variables[pcIdentifier] = variable;
- }
- }
- }
- /// <summary>
- /// 查询变量值
- /// </summary>
- /// <param name="pcIdentity"></param>
- /// <returns></returns>
- public string GetValue(string pcIdentity)
- {
- string str = pcIdentity;
- pcIdentity = pcIdentity.UAndT();
- if (pcIdentity.IndexOf(IwbVariableType.Global, StringComparison.Ordinal) == 0)
- {
- if (FilterFields.ContainsKey(pcIdentity))
- {
- return FilterFields[pcIdentity].ToString();
- }
- //return UserSession.GetSessionVariableValue(pcIdentity);
- }
- if (Variables.ContainsKey(pcIdentity))
- {
- var variable = (IwbRtVariable)Variables[pcIdentity];
- return variable.GetStringValue();
- }
- Array array = pcIdentity.StrToArrayEx(CompStmtType.Separator);
- if (array.Length == 2)
- {
- string pcDataSourceId = array.GetValue(0).ToString();
- string name = array.GetValue(1).ToString();
- var dataSource = GetDataSource(pcDataSourceId);
- if (dataSource?.Data != null && dataSource.Data.IsOpened)
- {
- str = dataSource.Data.GetString(name);
- }
- }
- return str;
- }
- /// <summary>
- /// 计算表达式
- /// </summary>
- /// <param name="pcExpression"></param>
- /// <returns></returns>
- public string Evaluate(string pcExpression)
- {
- string str = "";
- var poRoot = new ExprObject(pcExpression);
- if (EvalExpr.Parse(poRoot, true))
- {
- TransComponentVariables(poRoot);
- str = EvalExpr.Evaluate(poRoot);
- }
- return str;
- }
- /// <summary>
- /// 计算表达式
- /// </summary>
- /// <param name="pcExpression"></param>
- /// <returns></returns>
- public bool EvaluateBool(string pcExpression)
- {
- bool flag = true;
- if (pcExpression != "")
- {
- flag = Evaluate(pcExpression).ValB();
- }
- return flag;
- }
- /// <summary>
- /// 查询数据源
- /// </summary>
- /// <param name="pcDataSourceId"></param>
- /// <returns></returns>
- public IwbDataSource GetDataSource(string pcDataSourceId)
- {
- IwbDataSource source = null;
- pcDataSourceId = pcDataSourceId.UAndT();
- if (DataSources.ContainsKey(pcDataSourceId))
- {
- source = (IwbDataSource)DataSources[pcDataSourceId];
- }
- return source;
- }
- #endregion
- }
- }
|