服务器端功能是将数据保存到数据库以及从数据库中取出xml描述文件返回给客户端本文使用LINQ to Sql Classes思路方法对数据库进行操作如下图所示增加个linq类
图片看不清楚?请点击这里查看原图(大图)
然后在左边数据库链接管理器中增加个数据库链接如下图所示:
剩下工作就是编写更新和获取工作流xml描述代码了
l 获取工作流xml描述
/// <summary>
/// 获取工作流xml描述
/// </summary>
/// <param name="workflowID">流程ID</param>
/// <s></s>
[WebMethod]
public GetWorkFlowXML( workflowID)
{
xml = "";
using (ShareDesigner.Web.Class.WorkFlowDataContext dataContext = WorkFlowDataContext)
{
WorkFlow_Process process = dataContext.WorkFlow_Processes.First(p => p.WorkFlowID workflowID);
(process != null)
xml = process.WorkFlowXML;
}
xml;
}
l 更新工作流xml描述
/// <summary>
/// 更新流程xml
/// </summary>
/// <param name="workFlowXml">流程xml描述</param>
[WebMethod]
public void UpdateWorkFlowXML( workFlowXml) {
using (ShareDesigner.Web.Class.WorkFlowDataContext dataContext = WorkFlowDataContext) {
WorkFlow_Process process = WorkFlow_Process;
Byte b = .Text.UTF8Encoding.UTF8.GetBytes(workFlowXml);
XElement xele = XElement.Load(.Xml.XmlReader.Create( MemoryStream(b)));
process.WorkFlowName = xele.Attribute(XName.Get("Name")).Value;
process.WorkFlowID = xele.Attribute(XName.Get("UniqueID")).Value;
process.WorkFlowXML = workFlowXml;
deleteExistsWorkFlow(process.WorkFlowID);
var partNos = from item in xele.Descendants("Activity") select item;
foreach (XElement node in partNos)
{
WorkFlow_Activity activity = WorkFlow_Activity;
process.WorkFlow_Activities.Add(activity);
activity.ActivityID = node.Attribute(XName.Get("UniqueID")).Value;
activity.ActivityName = node.Attribute(XName.Get("ActivityName")).Value;
activity.ActivityType = node.Attribute(XName.Get("Type")).Value;
}
dataContext.WorkFlow_Processes.InsertOnSubmit(process);
partNos = from item in xele.Descendants("Rule") select item;
WorkFlow_Rule rule = null;
foreach (XElement node in partNos)
{ rule = WorkFlow_Rule;
rule.BeginActivityID = node.Attribute(XName.Get("BeginActivityUniqueID")).Value;
rule.Condition = node.Attribute(XName.Get("RuleCondition")).Value;
rule.EndActivityID = node.Attribute(XName.Get("EndActivityUniqueID")).Value;
rule.RuleID = node.Attribute(XName.Get("UniqueID")).Value;
rule.RuleName = node.Attribute(XName.Get("RuleName")).Value;
rule.RuleType = node.Attribute(XName.Get("LineType")).Value;
dataContext.WorkFlow_Rules.InsertOnSubmit(rule);
}
dataContext.SubmitChanges;
}
}
17.5 增加子流程选择
有了以上基础我们可以在活动属性中设置子流程了如下图所示:
其中获取子流程服务思路方法如下所示:
[WebMethod]
public GetWorkFlowList
{
xml = "";
using (ShareDesigner.Web.Class.WorkFlowDataContext dataContext = WorkFlowDataContext)
{
try
{
XDocument doc = XDocument(
XElement("WorkFlows", from p in dataContext.WorkFlow_Processes
select ( XElement("WorkFlow",
XAttribute("Name", p.WorkFlowName),
XAttribute("ID", p.WorkFlowID)))));
xml = doc.;
}
catch (Exception e)
{
xml = "";
}
}
xml; }
客户端获取流程并显示思路方法如下:
Byte b = .Text.UTF8Encoding.UTF8.GetBytes(xml);
XElement xele = XElement.Load(.Xml.XmlReader.Create( MemoryStream(b)));
var partNos = from item in xele.Descendants("WorkFlow")
select WorkflowListItem { Name = item.Attribute("Name").Value, ID = item.Attribute("ID").Value };
cbSubFlowList.ItemsSource = partNos;
cbSubFlowList.SelectedIndex = 0;
其中WorkflowListItem是个类定义如下:
public WorkflowListItem
{
public Name { get; ; }
public ID { get; ; }
public WorkflowListItem { }
public WorkflowListItem( name, id)
{
Name = name;
ID = id;
}
}
从上面代码可以看出使用.net framework确实可以提高我们开发效率并且代码更加简洁
到此我们持久化工作已经完成了但是距离个可用工作流设计器还有定距离还没有有关工作流属性配置信息工作流系统各家实现思路方法都不样因此很难有个统标准后文将根据wfmc提供工作流参考模型来具体实现剩下工作敬请关注
最新评论