zoukankan      html  css  js  c++  java
  • 使用silverlight构建一个工作流设计器(十八)持久化数据到数据库—服务器段功能实现

    源代码下载:http://www.shareidea.net/opensource.htm

    在线演示:http://www.shareidea.net/workflow.htm

    视频教程: http://www.shareidea.net/video/sharedesigner/sharedesigner.html

    QQ群:85444465 

    本文系列索引:   

    使用silverlight构建一个工作流设计器(一)

    使用silverlight构建一个工作流设计器(二)

    使用silverlight构建一个工作流设计器(三)

    使用silverlight构建一个工作流设计器(四)

    使用silverlight构建一个工作流设计器(五)

    使用silverlight构建一个工作流设计器(六)

    使用silverlight构建一个工作流设计器(七)

    使用silverlight构建一个工作流设计器(八)

    使用silverlight构建一个工作流设计器(九)

    使用silverlight构建一个工作流设计器(十)  

    使用silverlight构建一个工作流设计器(十一)  

    使用silverlight构建一个工作流设计器(十二)  

    使用silverlight构建一个工作流设计器(十三)  

    使用silverlight构建一个工作流设计器(十四)  

    使用silverlight构建一个工作流设计器(十五)    

    使用silverlight构建一个工作流设计器(十六) 

    使用silverlight构建一个工作流设计器(十七) 

    使用silverlight构建一个工作流设计器(十八) 

     

    十八、保存到数据库服务器段功能实现

     

    17.3 服务器端代码实现

    服务器端的功能是将数据保存到数据库,以及从数据库中取出xml描述文件返回给客户端。本文使用LINQ to Sql Classes的方法对数据库进行操作。如下图所示,增加一个linq的类

      

    然后在左边的数据库链接管理器中,增加一个数据库链接,如下图所示:

     

     

    剩下的工作就是编写更新和获取工作流xml描述的代码了。

    l         获取工作流xml描述

    /// <summary>

            /// 获取工作流xml描述

            /// </summary>

            /// <param name="workflowID">流程ID</param>

            /// <returns></returns>

            [WebMethod]

            public string GetWorkFlowXML(string workflowID)

            {

                string xml = "";

                using (ShareDesigner.Web.Class.WorkFlowDataContext dataContext = new WorkFlowDataContext())

                { 

                    WorkFlow_Process process = dataContext.WorkFlow_Processes.First(p => p.WorkFlowID == workflowID); 

                    if (process != null)

                        xml = process.WorkFlowXML;

                } 

                return xml;

            }

    l         更新工作流xml描述

    /// <summary>

            /// 更新流程xml

            /// </summary>

            /// <param name="workFlowXml">流程xml描述</param>

            [WebMethod]

            public void UpdateWorkFlowXML(string workFlowXml)        {  

                using (ShareDesigner.Web.Class.WorkFlowDataContext dataContext = new WorkFlowDataContext())            {

                    WorkFlow_Process process = new WorkFlow_Process(); 

                    Byte[] b = System.Text.UTF8Encoding.UTF8.GetBytes(workFlowXml);

                    XElement xele = XElement.Load(System.Xml.XmlReader.Create(new 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 = new 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 = new 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 string GetWorkFlowList()

            {

                string xml = "";

                using (ShareDesigner.Web.Class.WorkFlowDataContext dataContext = new WorkFlowDataContext())

                {

                    try

                    {

                        XDocument doc = new XDocument(

         new XElement("WorkFlows", from p in dataContext.WorkFlow_Processes

                                   select (new XElement("WorkFlow",

                                           new XAttribute("Name", p.WorkFlowName),

                                           new XAttribute("ID", p.WorkFlowID)))));

                        xml = doc.ToString(); 

                    }

                    catch (Exception e)

                    {

                        xml = "";

                    }

                }

                return xml;        }

    客户端获取流程并显示的方法如下: 

    Byte[] b = System.Text.UTF8Encoding.UTF8.GetBytes(xml);

                XElement xele = XElement.Load(System.Xml.XmlReader.Create(new MemoryStream(b)));

                var partNos = from item in xele.Descendants("WorkFlow")

                              select new WorkflowListItem { Name = item.Attribute("Name").Value, ID = item.Attribute("ID").Value };

                cbSubFlowList.ItemsSource = partNos;

                cbSubFlowList.SelectedIndex = 0;

    其中WorkflowListItem是一个类,定义如下:

    public class WorkflowListItem

            {

                public string Name { get; set; }

                public string ID { get; set; }

                public WorkflowListItem()         {     }

                public WorkflowListItem(string name, string id)

                {

                    Name = name;

                    ID = id;

                }

            }

    从上面的代码可以看出,使用.net framework确实可以提高我们的开发效率,并且代码更加简洁。

    到此我们的持久化工作已经完成了,但是距离一个可用的工作流设计器还有一定距离。因为还没有关于工作流属性的配置信息,因为工作流系统各家的实现方法都不一样。因此很难有一个统一的标准,后文将根据wfmc提供的工作流参考模型来具体实现剩下的工作。敬请关注。

    ========================================================

    比sharepoint更强大的表单功能,图形化的流程设计,与asp.net完美结合,支持vs.net编程扩展

    ========================================================

  • 相关阅读:
    [组合][DP]luogu P3643 [APIO2016]划艇
    [倍增]luogu P4155 [SCOI2015]国旗计划
    [并查集][线段树]luogu P3273 [SCOI2011]棘手的操作
    pytest警告DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3,and in 3.9 it will stop working
    docker-compose5分钟搭建wordpress博客网站
    Docker安装入门
    Windows10安装wget命令
    CRC (Cyclic Redundancy Check)
    Linux学习笔记
    Linux学习笔记
  • 原文地址:https://www.cnblogs.com/chegan/p/1512899.html
Copyright © 2011-2022 走看看