ComponentRunner.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510
  1. using System;
  2. using System.Collections;
  3. using System.Configuration;
  4. using Abp.Dependency;
  5. using Abp.Runtime.Caching;
  6. using Abp.UI;
  7. using IwbZero.Expr;
  8. using IwbZero.IwbBase;
  9. using IwbZero.IwbDataQuery;
  10. using IwbZero.ToolCommon;
  11. using IwbZero.ToolCommon.LogHelpers;
  12. using IwbZero.ToolCommon.StringModel;
  13. using WeEngine.ComponentInfo;
  14. using WeEngine.Components.InterfaceFactory;
  15. using WeEngine.Packages;
  16. namespace WeEngine.Components
  17. {
  18. /// <summary>
  19. /// 事务运行器
  20. /// </summary>
  21. public class ComponentRunner : ISingletonDependency
  22. {
  23. #region 属性
  24. /// <summary>
  25. /// 当前运行节点
  26. /// </summary>
  27. public NodeBase CurrentNode { get; set; }
  28. public ICacheManager CacheManager { get; }
  29. public IIocManager IocManager { get; }
  30. private int Depth { get; set; }
  31. public EngineComponent Component { get; set; }
  32. public string ParameterMapping { get; set; }
  33. public Hashtable Variables { get; set; }
  34. public Hashtable DataSources { get; }
  35. public Hashtable FilterFields { get; }
  36. public string ProcessInstanceId => GetValue(CompStmtType.CompInstanceId.VariableName);
  37. public string ProcessMessage
  38. {
  39. get => GetValue(CompStmtType.CompMessage.VariableName);
  40. set => SetValue(CompStmtType.CompMessage.VariableName, value);
  41. }
  42. public bool ProcessResult => (GetValue(CompStmtType.CompResult.VariableName).ValI() != 0);
  43. #endregion
  44. public ComponentRunner(ICacheManager cacheManager, IIocManager iocManager)
  45. {
  46. CacheManager = cacheManager;
  47. IocManager = iocManager;
  48. Variables = new Hashtable();
  49. DataSources = new Hashtable();
  50. FilterFields = new Hashtable();
  51. }
  52. /// <summary>
  53. /// 运行事务组件
  54. /// </summary>
  55. /// <param name="cId"></param>
  56. /// <param name="mapping"></param>
  57. /// <returns></returns>
  58. public bool Run(string cId, string mapping="")
  59. {
  60. var flag = false;
  61. var component = LoadComponentById(cId);
  62. if (component != null)
  63. {
  64. flag = Run(component, mapping);
  65. }
  66. return flag;
  67. }
  68. /// <summary>
  69. /// 运行事务组件
  70. /// </summary>
  71. /// <param name="component"></param>
  72. /// <param name="mapping"></param>
  73. /// <returns></returns>
  74. public bool Run(EngineComponent component,string mapping="")
  75. {
  76. DataSources.Clear();
  77. FilterFields.Clear();
  78. //Variables.Clear();
  79. Component = component;
  80. ParameterMapping = mapping;
  81. InitializeVariables();
  82. if (Component.ComponentScript != "")
  83. {
  84. var xml = component.ComponentScript;
  85. IwbXmlNode node = IwbXmlNode.ParseGenericXml(xml);
  86. if (node != null)
  87. {
  88. foreach (ComponentParameter parameter in ParseComponentParameter(component.Parameters))
  89. {
  90. FilterFields.Add(IwbVariableType.Global + parameter.Id.UAndT(), "");
  91. }
  92. if (mapping != "")
  93. {
  94. ArrayList list2 = mapping.MappingToArrayList();
  95. if (list2 != null)
  96. {
  97. foreach (IwbIdName name in list2)
  98. {
  99. SetValue(IwbVariableType.Global + name.Id, name.Name);
  100. }
  101. }
  102. }
  103. RunStatements(node.Nodes);
  104. }
  105. }
  106. else
  107. {
  108. IComponentRunner runner = IocManager.Resolve<IComponentRunner>(Component.RegisterKey);
  109. if (!runner.Run(Component, mapping))
  110. {
  111. typeof(ComponentRunner).LogError(runner.ErrorMessage);
  112. }
  113. //object obj2 = AssemblyHelper.CreateInstance(Component.ProcessClass, Component.ProcessLib);
  114. //if (obj2 == null)
  115. //{
  116. // typeof(ComponentRunner).LogError(
  117. // $"Unable to create static process runner at {Component.ProcessClass}.");
  118. // //AbortProcessWithMessage(string.Format("Unable to create static process runner at {0}.", _Process.ProcessClass));
  119. //}
  120. //else if (!(obj2 is IComponentRunner))
  121. //{
  122. // typeof(ComponentRunner).LogError($"The process runner, {Component.ProcessClass}, is invalid.");
  123. // //AbortProcessWithMessage(string.Format("The process runner, {0}, is invalid.", _Process.ProcessClass));
  124. //}
  125. //else
  126. //{
  127. // IComponentRunner runner = (IComponentRunner)obj2;
  128. // if (!runner.Run(Component, pcParameterMappings))
  129. // {
  130. // typeof(ComponentRunner).LogError(runner.ErrorMessage);
  131. // //AbortProcessWithMessage(runner.ErrorMessage);
  132. // }
  133. //}
  134. }
  135. return true;
  136. }
  137. #region 私有方法
  138. /// <summary>
  139. /// 解析参数
  140. /// </summary>
  141. /// <param name="pcParameter"></param>
  142. /// <returns></returns>
  143. private ArrayList ParseComponentParameter(string pcParameter)
  144. {
  145. ArrayList list = new ArrayList();
  146. foreach (string str in pcParameter.StrToArray())
  147. {
  148. if (str.IndexOf(":", StringComparison.Ordinal) != -1)
  149. {
  150. string pcStr = str.Substring(0, str.IndexOf(":", StringComparison.Ordinal));
  151. ComponentParameter parameter = new ComponentParameter(str.Substring(str.IndexOf(":", StringComparison.Ordinal) + 1, (str.Length - str.IndexOf(":", StringComparison.Ordinal)) - 1), ParameterTypeFromStr(pcStr));
  152. list.Add(parameter);
  153. }
  154. }
  155. return list;
  156. }
  157. /// <summary>
  158. /// 转换参数类型
  159. /// </summary>
  160. /// <param name="pcStr"></param>
  161. /// <returns></returns>
  162. private ComponentParameterType ParameterTypeFromStr(string pcStr)
  163. {
  164. ComponentParameterType filterField = ComponentParameterType.Variable;
  165. string str = pcStr;
  166. if (str.IsEmpty())
  167. {
  168. return filterField;
  169. }
  170. str = string.IsInterned(str);
  171. if (str == "FilterField")
  172. {
  173. return ComponentParameterType.FilterField;
  174. }
  175. if (str == "File")
  176. {
  177. return ComponentParameterType.File;
  178. }
  179. if (str == "Folder")
  180. {
  181. return ComponentParameterType.Folder;
  182. }
  183. if (str != "PrinterSetting")
  184. {
  185. return filterField;
  186. }
  187. return ComponentParameterType.PrinterSetting;
  188. }
  189. /// <summary>
  190. /// 变量初始化
  191. /// </summary>
  192. private void InitializeVariables()
  193. {
  194. CreateVariable(CompStmtType.CompMessage.VariableName, CompStmtType.CompMessage.VariableType,false);
  195. CreateVariable(CompStmtType.CompInstanceId.VariableName, CompStmtType.CompInstanceId.VariableType, false);
  196. CreateVariable(CompStmtType.CompResult.VariableName, CompStmtType.CompResult.VariableType, false);
  197. SetValue(CompStmtType.CompMessage.VariableName, "");
  198. SetValue(CompStmtType.CompInstanceId.VariableName, "0");
  199. SetValue(CompStmtType.CompResult.VariableName, "1");
  200. }
  201. /// <summary>
  202. /// 转换表达式变量
  203. /// </summary>
  204. /// <param name="poRoot"></param>
  205. private void TransComponentVariables(ExprObject poRoot)
  206. {
  207. foreach (ExprObject expr in poRoot.ChildNodes)
  208. {
  209. if (expr.ElementType == ExprElements.Variable)
  210. {
  211. if (expr.Expr.Trim() != "")
  212. {
  213. expr.Expr = GetValue(expr.Expr);
  214. expr.ElementType = ExprElements.Value;
  215. }
  216. }
  217. else if ((expr.ElementType == ExprElements.Expression) || (expr.ElementType == ExprElements.Function))
  218. {
  219. TransComponentVariables(expr);
  220. }
  221. }
  222. }
  223. /// <summary>
  224. /// 加载组件
  225. /// </summary>
  226. /// <param name="cId"></param>
  227. /// <returns></returns>
  228. private EngineComponent LoadComponentById(string cId)
  229. {
  230. var packageId = CurrentNode?.CurPackageInfo?.Id ?? "";
  231. EngineComponent component = null;
  232. if (packageId.IsNotEmpty()) component = CacheManager.GetEngineComponent(packageId, cId);
  233. if (component == null)
  234. {
  235. try
  236. {
  237. string url = $"{ConfigurationManager.AppSettings["DataCenter.Engine.Component"]}";
  238. string authKey = ConfigurationManager.AppSettings["DataCenter.Engine.AuthKey"];
  239. var result = url.RequestPost(new { Id = cId }.Obj2String(),authKey);
  240. var obj = result.Str2Obj<EngineComponent>();
  241. return obj;
  242. }
  243. catch (Exception e)
  244. {
  245. throw new UserFriendlyException($"没有找到Id为{cId}的引擎组件!{e.Message}");
  246. }
  247. }
  248. return component;
  249. }
  250. public string TransMappingWithRunner( string pcMapping)
  251. {
  252. string pcSource = "";
  253. foreach (IwbIdName name in pcMapping.MappingToArrayList())
  254. {
  255. string str2 = Evaluate(name.Name);
  256. if (str2 != "")
  257. {
  258. pcSource = pcSource.AddStr($"{name.Id}={str2}");
  259. }
  260. }
  261. return pcSource;
  262. }
  263. #endregion
  264. #region 事务
  265. /// <summary>
  266. /// 运行事务
  267. /// </summary>
  268. /// <param name="poStatement"></param>
  269. /// <returns></returns>
  270. public bool RunOneStatement(IwbXmlNode poStatement)
  271. {
  272. IStatementRunner StatementRunner = null;
  273. try
  274. {
  275. StatementRunner = IocManager.Resolve<IStatementRunnerFactory>().Create(poStatement.Name);
  276. }
  277. catch (Exception e)
  278. {
  279. this.LogError(e);
  280. }
  281. return StatementRunner?.Run(this, poStatement) ?? false;
  282. }
  283. /// <summary>
  284. /// 运行事务
  285. /// </summary>
  286. /// <param name="poStatements"></param>
  287. /// <returns></returns>
  288. public bool RunStatements(ArrayList poStatements)
  289. {
  290. bool flag = true;
  291. Depth++;
  292. int count = poStatements.Count;
  293. for (int i = 0; i < count; i++)
  294. {
  295. var poStatement = (IwbXmlNode)poStatements[i];
  296. string childValue = poStatement.GetChildValue("Comment");
  297. //ShowStepInfo(count, i + 1, childValue);
  298. string processMessage = ProcessMessage;
  299. try
  300. {
  301. bool flag2 = poStatement.GetChildValue("RunWhenFail").StrToBool();
  302. bool processResult = ProcessResult;
  303. if (childValue != "")
  304. {
  305. typeof(ComponentRunner).LogInfo("\r\n\r\n");
  306. typeof(ComponentRunner).LogInfo(childValue);
  307. typeof(ComponentRunner).LogInfo($"Process Result: {processResult}");
  308. typeof(ComponentRunner).LogInfo($"RunWhenFail option: {(flag2 ? "On" : "Off")}");
  309. }
  310. if (processResult || flag2)
  311. {
  312. flag = RunOneStatement(poStatement);
  313. }
  314. }
  315. catch (Exception e)
  316. {
  317. typeof(ComponentRunner).LogError(e);
  318. // AbortProcessWithMessage(exception.Message);
  319. }
  320. if (!ProcessResult)
  321. {
  322. flag = false;
  323. }
  324. if (ProcessMessage != processMessage)
  325. {
  326. typeof(ComponentRunner).LogInfo(processMessage);
  327. }
  328. }
  329. Depth--;
  330. return flag;
  331. }
  332. /// <summary>
  333. /// 创建变量
  334. /// </summary>
  335. /// <param name="pcVariableId"></param>
  336. /// <param name="pcVariableType"></param>
  337. /// <param name="save2node"></param>
  338. public void CreateVariable(string pcVariableId, string pcVariableType,bool save2node=true)
  339. {
  340. pcVariableId = pcVariableId.UAndT();
  341. var variable = new IwbRtVariable(pcVariableId, pcVariableType);
  342. Variables[pcVariableId] = variable;
  343. if(save2node && CurrentNode != null && !CurrentNode.Variables.ContainsKey(pcVariableId))
  344. {
  345. CurrentNode.Variables[pcVariableId] = variable;
  346. }
  347. }
  348. /// <summary>
  349. /// 设置变量值
  350. /// </summary>
  351. /// <param name="pcIdentifier"></param>
  352. /// <param name="pcExpression"></param>
  353. /// <param name="plToEvaluate"></param>
  354. public void SetValue(string pcIdentifier, string pcExpression, bool plToEvaluate = false)
  355. {
  356. pcIdentifier = pcIdentifier.UAndT();
  357. string pcValue = pcExpression;
  358. if (plToEvaluate)
  359. {
  360. pcValue = Evaluate(pcExpression);
  361. }
  362. if (pcIdentifier.IndexOf(IwbVariableType.Global, StringComparison.Ordinal) == 0)
  363. {
  364. if (FilterFields.ContainsKey(pcIdentifier))
  365. {
  366. FilterFields[pcIdentifier] = pcValue;
  367. }
  368. //else
  369. //{
  370. // UserSession.SetSessionVariable(pcIdentifier, pcValue);
  371. //}
  372. }
  373. else if (Variables.ContainsKey(pcIdentifier))
  374. {
  375. var variable = (IwbRtVariable)Variables[pcIdentifier];
  376. variable.VarValue = pcValue;
  377. CurrentNode.Variables[pcIdentifier] = variable;
  378. }
  379. else
  380. {
  381. Array array = pcIdentifier.StrToArrayEx("$");
  382. if (array.Length == 2)
  383. {
  384. string pcDataSourceId = array.GetValue(0).ToString();
  385. string name = array.GetValue(1).ToString();
  386. IwbDataSource dataSource = GetDataSource(pcDataSourceId);
  387. if (dataSource?.Data != null && (dataSource.Data.IsOpened))
  388. {
  389. dataSource.Data.SetField(name, pcValue);
  390. }
  391. }
  392. else
  393. {
  394. var variable = new IwbRtVariable(pcIdentifier.UAndT()).SetValue(pcValue);
  395. CurrentNode.Variables[pcIdentifier] = variable;
  396. }
  397. }
  398. }
  399. /// <summary>
  400. /// 查询变量值
  401. /// </summary>
  402. /// <param name="pcIdentity"></param>
  403. /// <returns></returns>
  404. public string GetValue(string pcIdentity)
  405. {
  406. string str = pcIdentity;
  407. pcIdentity = pcIdentity.UAndT();
  408. if (pcIdentity.IndexOf(IwbVariableType.Global, StringComparison.Ordinal) == 0)
  409. {
  410. if (FilterFields.ContainsKey(pcIdentity))
  411. {
  412. return FilterFields[pcIdentity].ToString();
  413. }
  414. //return UserSession.GetSessionVariableValue(pcIdentity);
  415. }
  416. if (Variables.ContainsKey(pcIdentity))
  417. {
  418. var variable = (IwbRtVariable)Variables[pcIdentity];
  419. return variable.GetStringValue();
  420. }
  421. Array array = pcIdentity.StrToArrayEx(CompStmtType.Separator);
  422. if (array.Length == 2)
  423. {
  424. string pcDataSourceId = array.GetValue(0).ToString();
  425. string name = array.GetValue(1).ToString();
  426. var dataSource = GetDataSource(pcDataSourceId);
  427. if (dataSource?.Data != null && dataSource.Data.IsOpened)
  428. {
  429. str = dataSource.Data.GetString(name);
  430. }
  431. }
  432. return str;
  433. }
  434. /// <summary>
  435. /// 计算表达式
  436. /// </summary>
  437. /// <param name="pcExpression"></param>
  438. /// <returns></returns>
  439. public string Evaluate(string pcExpression)
  440. {
  441. string str = "";
  442. var poRoot = new ExprObject(pcExpression);
  443. if (EvalExpr.Parse(poRoot, true))
  444. {
  445. TransComponentVariables(poRoot);
  446. str = EvalExpr.Evaluate(poRoot);
  447. }
  448. return str;
  449. }
  450. /// <summary>
  451. /// 计算表达式
  452. /// </summary>
  453. /// <param name="pcExpression"></param>
  454. /// <returns></returns>
  455. public bool EvaluateBool(string pcExpression)
  456. {
  457. bool flag = true;
  458. if (pcExpression != "")
  459. {
  460. flag = Evaluate(pcExpression).ValB();
  461. }
  462. return flag;
  463. }
  464. /// <summary>
  465. /// 查询数据源
  466. /// </summary>
  467. /// <param name="pcDataSourceId"></param>
  468. /// <returns></returns>
  469. public IwbDataSource GetDataSource(string pcDataSourceId)
  470. {
  471. IwbDataSource source = null;
  472. pcDataSourceId = pcDataSourceId.UAndT();
  473. if (DataSources.ContainsKey(pcDataSourceId))
  474. {
  475. source = (IwbDataSource)DataSources[pcDataSourceId];
  476. }
  477. return source;
  478. }
  479. #endregion
  480. }
  481. }