• H3流程开发笔记(二)启动一个新流程(上)


    H3流程开发笔记入门资料

    H3流程开发笔记(二)启动一个新流程(下)

    前提

    1.请假流程模板流程 ,设计如下图


    点击工具栏的表单,添加表单页面地址
    image

    右击发起结点,在弹出的页面中设置该活动的表单
    image 

    发布模板

    2.创建业务数据库以及请假记录表

    image

    数据库名称:H2_BusinessDemo,表ApplyLeaveInfo语句如下

    create table ApplyLeaveInfo(
    ID int identity , --主键编号
    startDate date ,--起始日期
    endDate date,--结束日期
    ApplyResult bit,--结果
    WorkItemId nvarchar(36), --流程项编号,与H3的OT_WorkItem关联

    tokenId [int] NULL--步骤编号
    )

    3.创建网站

    新建WebSite,这里取名为FlowSite

    添加H3相关DLL的引用 (下图中有WorkSheet.DLL,如果不用H3的表单控件,可不添加之类库)

    image

    添加InterPrise的Data和Common的引用,用于操作业务库数据

    image

    新建类BasePage,放到App_code,定义一些方法在该类里(比如获取用户信息),然后所有的表单页面继承该类

    4.创建登录页面Login.aspx

    拉一个登录控件,在登录事件中定义如下

    protected void Login1_LoggingIn(object sender, LoginCancelEventArgs e)
    {
        lblErrorMessage.Text = string.Empty;
       string userId=  OThinker.H3.Server.Engine.Organization.GetUserIDByAlias(Login1.UserName);
       if (string.IsNullOrEmpty(userId))
       {
           e.Cancel = true;
           lblErrorMessage.Text = string.Format("用户{0}不存在", Login1.UserName);
       }
       else
       {           
           OThinker.Organization.User user = (OThinker.Organization.User)OThinker.H3.Server.Engine.Organization.GetUnit(userId);
           if (user == null)
           {
               e.Cancel = true;
               lblErrorMessage.Text = string.Format("用户{0}不存在", Login1.UserName);
           }
           else
           {
               if (user.Password != Login1.Password)
               {
                   e.Cancel = true;
                   lblErrorMessage.Text = string.Format("用户{0}的密码不正确", Login1.UserName);
               }
               else
               {
                   
                   //记录用户验证到Session
                   this.Session[BasePage.UserValidatorSessionName] = new OThinker.H3.Acl.DefaultUserValidator(new OThinker.H3.Acl.UserValidator.EngineDelegate(OThinker.H3.Server.GetEngine), user.ObjectID);
    
                   //检查流程引擎
                   try
                   {
                       OThinker.H3.EngineState state = OThinker.H3.Server.Engine.State;
                   }
                   catch (System.Net.Sockets.SocketException ex)
                   {
                       e.Cancel = true;
                       this.Response.Write("<BR>");
                       this.Response.Write(
                           "出错了!" + "<BR>" +
                           "请检查:" + "<BR>" +
                           "1、工作流服务器是否启动。" + "<BR>" +
                           ex.StackTrace.Replace("\r", "<BR>"));
                       return;
                   }
                   catch (System.Reflection.TargetInvocationException ex)
                   {
                       e.Cancel = true;
                       this.Response.Write("<BR>");
                       this.Response.Write(
                           "出错了!请检查:" + "<BR>" +
                           "1、是否安装了.Net 3.0;<BR>" +
                           "2、数据库是否启动;" + "<BR>" +
                           "3、数据库连接设置是否正确;" + "<BR>" +
                           "4、是否可以从本机连接到数据库上。" + "<BR>" +
                           ex.StackTrace.Replace("\r", "<BR>"));
                       return;
                   }
                   if (OThinker.H3.Server.Engine.SettingManager.Initialized)
                   {
                       Response.Redirect("default.aspx?State=" + OThinker.H3.WorkItem.WorkItemState.Unfinished);
    
                   }
                   else
                   {
                       this.Response.Write("出错了!流程引擎尚未启动完毕:" + "<BR>");
                   }
    
               }
           }
       }

    注意其中两地方:
    1).获取用户信息和保存用户权限,这里使用Session记录,当然也可以换其它方式,BasePage.UserValidatorSessionName就是一个只读字符串,定义在BasePage中

    OThinker.Organization.User user = (OThinker.Organization.User)OThinker.H3.Server.Engine.Organization.GetUnit(userId);

    this.Session[BasePage.UserValidatorSessionName] = new OThinker.H3.Acl.DefaultUserValidator(new OThinker.H3.Acl.UserValidator.EngineDelegate(OThinker.H3.Server.GetEngine), user.ObjectID);

    2).检测流程引擎是否就绪,这里使用了Try…Catch的方式

    5.显示待处理列表

    获取流程类型和名称:

    // 获取所有工作流模板的包(流程模板类型)
    string[] packages = OThinker.H3.Server.Engine.WorkflowManager.GetWorkflowPackages();
    //获取流程类型下所有的流程名
    string[] names = OThinker.H3.Server.Engine.WorkflowManager.GetWorkflowNames(selectedPackage, OThinker.H3.WorkflowTemplate.WorkflowState.Active);


    //查询待处理表

    H3中,操作的流程记录放在OT_WorkItem这张表里,里面有流程实例,流程名称,版本,以及发起人,参考者,如果一个活动项的参考者为一个组,那么在完成这个活动的前一个活动后,会插入组内的所有用户的待处理,登录人的待处理只要以自己的ID去查询该表,查询语句如下

    SELECT * FROM OT_WorkItem WHERE WorkflowPackage='流程类型' AND WorkflowName='流程名称' AND Participant='参与者ID' AND State!=2 AND State!=3         ORDER BY ReceiveTime DESC

    在H3的Portal里有封装这样的方法

    public static System.Data.DataTable QueryWorkItem(
              string WorkflowPackage, // 流程类型
              string WorkflowName, // 流程名称
              int WorkflowVersion, // 流程版本
              string ActivityName, // 流动项名称(流程步聚名称)
              string[] Instances, // 实例ID(启动一个流程产生一个实例)
              string[] Participants, // 参与者
              System.DateTime From, //开始时间
              System.DateTime To, // 结束时间
              OThinker.H3.WorkItem.WorkItemState State, //工作项的状态{等待,正在工作中,完成,被取消}
              OThinker.H3.Instance.PriorityType Priority, //优先级的类型{低,普通,高}
              string InstanceName, // 实例名称,与InstanceId对应
              string Receiptor, // 暂时还不知道干嘛的
              OThinker.Data.BoolMatchValue Approval, // 是否批准
              OThinker.Data.BoolMatchValue Elapsed) //是否计划完成(true的话,就是计划完成时间要小于当前时间)

    以下是查询事件内容:

    protected void btnSearch_Click(object sender, EventArgs e)
      {
          OThinker.H3.Acl.UserValidator userValidator = base.UserValidator;
          string Sql = "SELECT OT_WorkItem. *,OT_User.Name OriginatorUserName  FROM OT_WorkItem  left Join OT_User on OT_User.ObjectID =   OT_WorkItem.Originator WHERE Participant = '" + userValidator.UserID + "' AND State!=2 AND State!=3 ";
          if (ddlFlowType.SelectedIndex > 0)
          {
              Sql += " and WorkflowPackage='" + ddlFlowType.Text + "'";
          }
          if (ddlFlowName.SelectedIndex > 0)
          {
              Sql += " and WorkflowName='" + ddlFlowName.Text + "'";
          }
          Sql += " ORDER BY ReceiveTime DESC";
          OThinker.Data.Database.CommandFactory factory = new OThinker.Data.Database.CommandFactory(OThinker.H3.Configs.Config.Current.DataBase.DBType, OThinker.H3.Configs.Config.Current.DataBase.DBConnString);
          OThinker.Data.Database.ICommand command = factory.CreateCommand();
          System.Data.DataTable table = command.ExecuteDataTable(Sql);
          command.Commit();
          this.GridView1.DataSource = table;
          this.GridView1.DataBind();
      }

    源码下源:FlowSite

  • 相关阅读:
    网络流与线性规划24题 之 餐巾计划问题
    待刷题目分类(一)
    bzoj1787 [Ahoi2008]Meet 紧急集合
    Hoj2634 How to earn more?
    poj3281 Dining
    浅谈数论(三)水仙花数
    poj1637 Sightseeing tour
    动态规划的思考(1)
    网络流-最大流问题 ISAP 算法解释(转自Renfei Song's Blog)
    poj1273 Drainage Ditches
  • 原文地址:https://www.cnblogs.com/colys/p/1457949.html
Copyright © 2020-2023  润新知