ProcessRunner.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. using System;
  2. using System.Collections;
  3. using IwbZero.Expr;
  4. using IwbZero.IwbBase;
  5. using IwbZero.IwbDataQuery;
  6. using IwbZero.Processes.StatementTypes;
  7. using IwbZero.ToolCommon.AssemblyHelpers;
  8. using IwbZero.ToolCommon.LogHelpers;
  9. using IwbZero.ToolCommon.StringModel;
  10. namespace IwbZero.Processes.Runner
  11. {
  12. public class ProcessRunner
  13. {
  14. public int Depth { get; private set; }
  15. private string _parameterMapping = "";
  16. private IwbProcess _process;
  17. private readonly Hashtable _variables = new Hashtable();
  18. public bool Run(IwbProcess poProcess, string pcParameterMappings)
  19. {
  20. DataSources.Clear();
  21. FilterFields.Clear();
  22. _variables.Clear();
  23. _parameterMapping = pcParameterMappings;
  24. _process = poProcess;
  25. InitializeProcessVariables();
  26. //var processResult = GenerateAndStampInstanceId(pcParameterMappings);
  27. var processResult = "Y".ValB();
  28. if (processResult)
  29. {
  30. //LogText(string.Format("The process started with instance id {0}.", ProcessInstanceId));
  31. if (_process.ProcessScript != "")
  32. {
  33. IwbXmlNode node = IwbXmlNode.ParseGenericXml(poProcess.ProcessScript);
  34. if (node != null)
  35. {
  36. foreach (ProcessParameter parameter in ProcessMethods.ParseProcessParameter(poProcess.ProcessParameters))
  37. {
  38. FilterFields.Add(IwbVariableType.Global + parameter.Id.UAndT(), "");
  39. }
  40. if (pcParameterMappings != "")
  41. {
  42. ArrayList list2 = StringHelper.MappingToArrayList(pcParameterMappings);
  43. if (list2 != null)
  44. {
  45. foreach (IwbIdName name in list2)
  46. {
  47. SetValue(IwbVariableType.Global + name.Id, name.Name, false);
  48. }
  49. }
  50. }
  51. RunStatements(node.Nodes);
  52. }
  53. }
  54. else
  55. {
  56. object obj2 = AssemblyHelper.CreateInstance(_process.ProcessClass, _process.ProcessLib);
  57. if (obj2 == null)
  58. {
  59. typeof(ProcessRunner).LogError(
  60. $"Unable to create static process runner at {_process.ProcessClass}.");
  61. //AbortProcessWithMessage(string.Format("Unable to create static process runner at {0}.", _Process.ProcessClass));
  62. }
  63. else if (!(obj2 is IProcessRunner))
  64. {
  65. typeof(ProcessRunner).LogError($"The process runner, {_process.ProcessClass}, is invalid.");
  66. //AbortProcessWithMessage(string.Format("The process runner, {0}, is invalid.", _Process.ProcessClass));
  67. }
  68. else
  69. {
  70. IProcessRunner runner = (IProcessRunner)obj2;
  71. if (!runner.Run(_process, pcParameterMappings))
  72. {
  73. typeof(ProcessRunner).LogError(runner.ErrorMessage);
  74. //AbortProcessWithMessage(runner.ErrorMessage);
  75. }
  76. }
  77. }
  78. processResult = ProcessResult;
  79. //StampProcessHistory();
  80. //_History.SetField(cn.ProcLog, _LogText);
  81. //_History.SaveTable(_UserSession);
  82. }
  83. if (ProcessMessage == "")
  84. {
  85. ProcessMessage = ProcessResult ? $"{_process.ProcessName}执行成功" : $"{_process.ProcessName}执行失败";
  86. }
  87. typeof(ProcessRunner).LogInfo(ProcessMessage);
  88. //CloseProgressForm();
  89. return processResult;
  90. }
  91. public bool RunStatements(ArrayList poStatements)
  92. {
  93. bool flag = true;
  94. Depth++;
  95. int count = poStatements.Count;
  96. for (int i = 0; i < count; i++)
  97. {
  98. var poStatement = (IwbXmlNode)poStatements[i];
  99. string childValue = poStatement.GetChildValue("Comment");
  100. //ShowStepInfo(count, i + 1, childValue);
  101. string processMessage = ProcessMessage;
  102. try
  103. {
  104. bool flag2 = poStatement.GetChildValue("RunWhenFail").StrToBool();
  105. bool processResult = ProcessResult;
  106. if (childValue != "")
  107. {
  108. typeof(ProcessRunner).LogInfo("\r\n\r\n");
  109. typeof(ProcessRunner).LogInfo(childValue);
  110. typeof(ProcessRunner).LogInfo($"Process Result: {processResult}");
  111. typeof(ProcessRunner).LogInfo($"RunWhenFail option: {(flag2 ? "On" : "Off")}");
  112. }
  113. if (processResult || flag2)
  114. {
  115. flag = ProcessMethods.RunOneStatement(this, poStatement);
  116. }
  117. }
  118. catch (Exception e)
  119. {
  120. typeof(ProcessRunner).LogError(e);
  121. // AbortProcessWithMessage(exception.Message);
  122. }
  123. if (!ProcessResult)
  124. {
  125. flag = false;
  126. }
  127. if (ProcessMessage != processMessage)
  128. {
  129. typeof(ProcessRunner).LogInfo(processMessage);
  130. }
  131. }
  132. Depth--;
  133. return flag;
  134. }
  135. private void InitializeProcessVariables()
  136. {
  137. CreateVariable(PdStmtType.ProcMessage.VariableName, PdStmtType.ProcMessage.VariableType);
  138. CreateVariable(PdStmtType.ProcInstanceId.VariableName, PdStmtType.ProcInstanceId.VariableType);
  139. CreateVariable(PdStmtType.ProcResult.VariableName, PdStmtType.ProcResult.VariableType);
  140. SetValue(PdStmtType.ProcMessage.VariableName, "", false);
  141. SetValue(PdStmtType.ProcInstanceId.VariableName, "0", false);
  142. SetValue(PdStmtType.ProcResult.VariableName, "1", false);
  143. }
  144. public void CreateVariable(string pcVariableId, string pcVariableType)
  145. {
  146. pcVariableId = pcVariableId.UAndT();
  147. var variable = new IwbRtVariable(pcVariableId, pcVariableType);
  148. _variables[pcVariableId] = variable;
  149. }
  150. public string Evaluate(string pcExpression)
  151. {
  152. string str = "";
  153. var poRoot = new ExprObject(pcExpression);
  154. if (EvalExpr.Parse(poRoot, true))
  155. {
  156. TransProcessVariables(poRoot);
  157. str = EvalExpr.Evaluate(poRoot);
  158. }
  159. return str;
  160. }
  161. public bool EvaluateBool(string pcExpression)
  162. {
  163. bool flag = true;
  164. if (pcExpression != "")
  165. {
  166. flag = Evaluate(pcExpression).StrToBool();
  167. }
  168. return flag;
  169. }
  170. private void TransProcessVariables(ExprObject poRoot)
  171. {
  172. foreach (ExprObject expr in poRoot.ChildNodes)
  173. {
  174. if (expr.ElementType == ExprElements.Variable)
  175. {
  176. if (expr.Expr.Trim() != "")
  177. {
  178. expr.Expr = GetValue(expr.Expr);
  179. expr.ElementType = ExprElements.Value;
  180. }
  181. }
  182. else if ((expr.ElementType == ExprElements.Expression) || (expr.ElementType == ExprElements.Function))
  183. {
  184. TransProcessVariables(expr);
  185. }
  186. }
  187. }
  188. //private bool GenerateAndStampInstanceId(string pcParameterMappings)
  189. //{
  190. // bool flag = false;
  191. // _History = new npTable();
  192. // _History.Open(tn.ddProcessHistory, "1=2", "");
  193. // if (_History.IsOpened)
  194. // {
  195. // int num = DBConn.GetNextRecordId(0, "System.ProcessInstanceId", 1);
  196. // if (num > 0)
  197. // {
  198. // SetValue(PdStmtType.ProcInstanceId.VariableName, num.ToString(), false);
  199. // if (_Process != null)
  200. // {
  201. // _History.NewRow();
  202. // _History.SetField(cn.ProcInstanceId, num.ToString());
  203. // _History.SetField(cn.ProcessId, _Process.ProcessId.ToString());
  204. // _History.SetField(cn.ProcessName, _Process.ProcessName);
  205. // _History.SetField(cn.ProcStartTime, ReportLib.DtToStr(AppEnv.CurrentTime));
  206. // _History.SetField(cn.ParameterMapping, pcParameterMappings);
  207. // }
  208. // flag = true;
  209. // }
  210. // }
  211. // if (!flag)
  212. // {
  213. // AbortProcessWithMessage("Failed to generate instance id.");
  214. // }
  215. // return flag;
  216. //}
  217. public IwbDataSource GetDataSource(string pcDataSourceId)
  218. {
  219. IwbDataSource source = null;
  220. pcDataSourceId = pcDataSourceId.UAndT();
  221. if (DataSources.ContainsKey(pcDataSourceId))
  222. {
  223. source = (IwbDataSource)DataSources[pcDataSourceId];
  224. }
  225. return source;
  226. }
  227. public string GetValue(string pcIdentity)
  228. {
  229. string str = pcIdentity;
  230. pcIdentity = pcIdentity.UAndT();
  231. if (pcIdentity.IndexOf(IwbVariableType.Global, StringComparison.Ordinal) == 0)
  232. {
  233. if (FilterFields.ContainsKey(pcIdentity))
  234. {
  235. return FilterFields[pcIdentity].ToString();
  236. }
  237. //return UserSession.GetSessionVariableValue(pcIdentity);
  238. }
  239. if (_variables.ContainsKey(pcIdentity))
  240. {
  241. var variable = (IwbRtVariable)_variables[pcIdentity];
  242. return variable.GetStringValue();
  243. }
  244. Array array = pcIdentity.StrToArrayEx(PdStmtType.Separator);
  245. if (array.Length == 2)
  246. {
  247. string pcDataSourceId = array.GetValue(0).ToString();
  248. string name = array.GetValue(1).ToString();
  249. var dataSource = GetDataSource(pcDataSourceId);
  250. if (dataSource?.Data != null && dataSource.Data.IsOpened)
  251. {
  252. str = dataSource.Data.GetString(name);
  253. }
  254. }
  255. return str;
  256. }
  257. public void SetValue(string pcIdentifier, string pcExpression, bool plToEvaluate)
  258. {
  259. pcIdentifier = pcIdentifier.UAndT();
  260. string pcValue = pcExpression;
  261. if (plToEvaluate)
  262. {
  263. pcValue = Evaluate(pcExpression);
  264. }
  265. if (pcIdentifier.IndexOf(IwbVariableType.Global, StringComparison.Ordinal) == 0)
  266. {
  267. if (FilterFields.ContainsKey(pcIdentifier))
  268. {
  269. FilterFields[pcIdentifier] = pcValue;
  270. }
  271. //else
  272. //{
  273. // UserSession.SetSessionVariable(pcIdentifier, pcValue);
  274. //}
  275. }
  276. else if (_variables.ContainsKey(pcIdentifier))
  277. {
  278. var variable = (IwbRtVariable)_variables[pcIdentifier];
  279. variable.VarValue = pcValue;
  280. }
  281. else
  282. {
  283. Array array = pcIdentifier.StrToArrayEx( "$");
  284. if (array.Length == 2)
  285. {
  286. string pcDataSourceId = array.GetValue(0).ToString();
  287. string name = array.GetValue(1).ToString();
  288. IwbDataSource dataSource = GetDataSource(pcDataSourceId);
  289. if (((dataSource != null) && (dataSource.Data != null)) && ( dataSource.Data.IsOpened))
  290. {
  291. dataSource.Data.SetField(name, pcValue);
  292. }
  293. }
  294. }
  295. }
  296. public Hashtable DataSources { get; } = new Hashtable();
  297. public Hashtable FilterFields { get; } = new Hashtable();
  298. //private string LineTimestamp => (DateTime.Now.DtToStr() + " ");
  299. public string ParameterMapping => _parameterMapping;
  300. public string ProcessInstanceId => GetValue(PdStmtType.ProcInstanceId.VariableName);
  301. public string ProcessMessage
  302. {
  303. get => GetValue(PdStmtType.ProcMessage.VariableName);
  304. set => SetValue(PdStmtType.ProcMessage.VariableName, value, false);
  305. }
  306. public bool ProcessResult => (StringHelper.ValI(GetValue(PdStmtType.ProcResult.VariableName)) != 0);
  307. }
  308. }