下面通过一个具体的例子示范如何使用脚本环节、脚本参与者和脚本条件。这个例子如下图所示:
这个例子所使用的是一张由InfoPath设计的请假单,如下图所示:
流程定义中的“脚本参与者审批”环节所使用的是“审批人”字段所设置的参与者,所以其脚本如下:
import clr;
clr.AddReference('mscorlib','System.Xml');
from System import String;
from System.Xml import XmlDocument,XmlNamespaceManager;
mdom = XmlDocument();
mdom.LoadXml(DataItems.ApplicationData.FormData.ToString());
nsmgr = XmlNamespaceManager(mdom.NameTable);
prefix = mdom.DocumentElement.Prefix;
nsmgr.AddNamespace(prefix, mdom.DocumentElement.GetNamespaceOfPrefix(prefix));
users = mdom.SelectSingleNode(String.Format("//{0}:审批人", prefix), nsmgr);
userData = users.InnerText.Split(";");
Result = [];
for user in userData:
loginID = user[user.index("(")+1 : -1];
Result.append(OrganizationProvider.DefaultProvider.GetUserByLoginID(loginID));
从脚本中可看到是通过调用XML的相关方法,在表单数据DataItems.ApplicationData.FormData中提取相关数据来获取审批人的,最后的结果存放到变量Result中,对应于脚本参与者设置的结果参数属性。
下面来看看脚本条件是如何实现对请假天数的比较的(以“大于5天”这个条件为例):
import clr;
clr.AddReference('mscorlib','System.Xml');
from System import String, Int32;
from System.Xml import XmlDocument,XmlNamespaceManager;
mdom = XmlDocument();
mdom.LoadXml(DataItems.ApplicationData.FormData.ToString());
nsmgr = XmlNamespaceManager(mdom.NameTable);
prefix = mdom.DocumentElement.Prefix;
nsmgr.AddNamespace(prefix, mdom.DocumentElement.GetNamespaceOfPrefix(prefix));
days = mdom.SelectSingleNode(String.Format("//{0}:天数", prefix), nsmgr);
data = Int32.Parse(days.InnerText);
if data > 5:
Result = True;
else:
Result = False;
当中的原理跟脚本参与者雷同,也是把结果存到变量Result中,注意这里的Result只能是True或False代表条件是否成立。
“设置参数”这个环节是个脚本环节,使用它可以执行一段脚本,例如设置参数等,如下:
import sys, clr;
clr.AddReferenceToFile('Bingosoft.Workflow.WFAPI.dll');
from Bingosoft.Workflow.WFAPI import WorkflowHelper;
#设置参数
flowHelper = WorkflowHelper(OrganizationProvider.GetUserByID(DataItems.CurrentUser.ID));
caseID = DataItems.FlowInstance.ProcID;
taskID = DataItems["CurrentTask"];
flowHelper.OpenWorkflow(caseID, taskID);
flowHelper.SetParameter("opt", 200);
flowHelper.Save();