private void ReadWorkflowNodes() { var findTasksInfo = new FindTasksInfo { userIds = Parameters.WorkflowUsers.Split(','), inclWorkflows = true }; var userTasks = Client.IX.findFirstTasks(findTasksInfo, 500).tasks; CheckResult.Message = $"No task found for users '{Parameters.WorkflowUsers}', | nodes=0; errorNodes=0"; CheckResult.ExitCode = ExitCode.Ok; if (userTasks.Length <= 0) { return; } foreach (var task in userTasks) { var taskActivationDate = DateTime.ParseExact(task.wfNode.activateDateIso, "yyyyMMddHHmmss", CultureInfo.InvariantCulture); var differenceTimespan = DateTime.UtcNow - taskActivationDate; var minutesSinceActivation = Convert.ToInt32(differenceTimespan.TotalMinutes); if (minutesSinceActivation <= Parameters.WarningMinutes) { continue; } var node = new WorkflowErrorNode(task.wfNode.nodeName, task.wfNode.userName, minutesSinceActivation) { ExitCode = minutesSinceActivation > Parameters.CriticalMinutes ? ExitCode.Critical : ExitCode.Warning }; _errorNodes.Add(node); } if (_errorNodes.Count > 0) { var criticalNodesCount = _errorNodes.Count(node => node.ExitCode == ExitCode.Critical); CheckResult.ExitCode = criticalNodesCount > 0 ? ExitCode.Critical : ExitCode.Warning; foreach (var errorNode in _errorNodes) { CheckResult.Message += $"User: {errorNode.EloUser} - Node: {errorNode.Name} - Active since: {errorNode.MinutesSinceActivation} Minutes | "; } CheckResult.Message += $"nodes={userTasks.Length}; errorNodes={_errorNodes.Count}"; } else { CheckResult.Message = $"Found '{userTasks.Length}' nodes for users '{Parameters.WorkflowUsers}'. No task is overdue."; } }
/// <summary> /// Returns all tasks for the current user. /// </summary> /// <returns>Tasks</returns> public FWFindTasksCache GetUserTasks() { FindTasksInfo fi = new FindTasksInfo(); fi.lowestPriority = UserTaskPriorityC.LOWEST; fi.highestPriority = UserTaskPriorityC.HIGHEST; fi.inclDeputy = true; fi.inclGroup = true; fi.inclReminders = true; fi.inclWorkflows = true; fi.inclActivities = true; FWFindTasksCache tasksCache = new FWFindTasksCache(this, fi); return(tasksCache); }
public void run() { IXConnFactory connFact = null; IXConnection ix = null; try { IXProperties connProps = IXConnFactory.CreateConnProperties(url); IXProperties sessOpts = IXConnFactory.CreateSessionOptions("IX-Examples", "1.0"); connFact = new IXConnFactory(connProps, sessOpts); Logger.instance().log("create IXConnFactory OK"); // Prepare ClientInfo object with language and country // ClientInfo ci = new ClientInfo(); // ci.language = "de"; // ci.country = "DE"; // LOGIN Logger.instance().log("login..."); ix = connFact.Create(userName, userPwd, "myComputer", null); // ci = ix.Login.ci Logger.instance().log("login OK"); // get constants Logger.instance().log("get const..."); IXServicePortC CONST = ix.CONST; Logger.instance().log("get const OK"); Logger.instance().log("get nodes..."); FindTasksInfo findInfo = new FindTasksInfo(); findInfo.inclWorkflows = true; FindResult findResult = ix.Ix.findFirstTasks(findInfo, 10); int idx = 0; while (true) { Logger.instance().log("#nodes=" + findResult.tasks.Length); for (int i = 0; i < findResult.tasks.Length; i++) { WFCollectNode node = findResult.tasks[i].wfNode; Logger.instance().log("name=" + node.nodeName); Logger.instance().log(" flowId=" + node.nodeId + ", nodeId=" + node.nodeId); Logger.instance().log(" objId=" + node.objId + ", userId=" + node.userId); } if (!findResult.moreResults) { break; } idx += findResult.tasks.Length; findResult = ix.Ix.findNextTasks(findResult.searchId, idx, 10); } Logger.instance().log("get nodes OK"); } catch (Exception e) { throw e; } finally { // Logout // -- if (ix != null) { Logger.instance().log("IX logout..."); ix.Logout(); Logger.instance().log("IX logout OK"); } } }
/// <summary> /// Forwards a node of a user. Logs in as user and edit the node. /// </summary> /// <param name="ix">IndexServer connection</param> /// <param name="CONST">IndexServer constants</param> /// <param name="flowId">Workflow ID</param> /// <param name="userName">Name of user that forwards it's node.</param> /// <param name="userPwd">User password</param> private void internalForwardNode(IXConnection ix, IXServicePortC CONST, int flowId, String userName, String userPwd) { Logger.instance().log("internalForwardNode(user="******"OK from " + userName; // login user Logger.instance().log(" login..."); ClientInfo ci2 = new ClientInfo(); ci2.language = "de"; ci2.country = "DE"; ci2.callId = "WF" + userName; // for debug purposes IXConnection ixUser = connFact.Create(ci2, userName, userPwd, "mypc", null); Logger.instance().log(" login OK"); // get active nodes (should be only one) Logger.instance().log(" Get active nodes..."); FindTasksInfo fti = new FindTasksInfo(); fti.inclWorkflows = true; FindResult findResult = ixUser.Ix.findFirstTasks(fti, 1000); WFCollectNode node = findResult.tasks[0].wfNode; int nodeId = node.nodeId; Logger.instance().log(" Forward node, nodeId=" + nodeId); // begin edit node -> real world: show dialog to forward Logger.instance().log(" begin edit ..."); WFEditNode en = ixUser.Ix.beginEditWorkFlowNode(flowId, nodeId, LockC.NO); Logger.instance().log(" begin edit OK"); // select successor (only one for serial flow) int[] succNodeIds = new int[en.succNodes.Length]; if (en.succNodes.Length > 0) { succNodeIds[0] = en.succNodes[0].id; } // end edit node -> real world: user clicks OK button Logger.instance().log(" end edit ..."); ixUser.Ix.endEditWorkFlowNode(flowId, node.nodeId, false, // terminate false, // cancel okMessage, // name "I don't mind " + userName, // comment succNodeIds // nodes to forward to ); Logger.instance().log(" end edit OK"); Logger.instance().log(" Forward node OK"); // logout Logger.instance().log(" logout..."); ixUser.Ix.logout(); Logger.instance().log(" logout OK"); Logger.instance().log(")internalForwardNode"); }