• SharePoint 2013 状态机工作流之日常报销示例


      简单介绍下状态机工作流,状态机工作流提供了一系列的状态。工作流从初始状态开始,到终止状态结束。两个状态之间定义行为进行过渡。通常情况下,状态机工作流对事件作出反应,事件的发生将会使状态发生改变。

    1、新建项目,选择SharePoint解决方案,创建空项目:

    clip_image001

    2、选择调试站点,部署为场解决方案,如下图:

    clip_image002

    3、添加新项,选择“Office/SharePoint”下面的“状态机工作流(仅场解决方案)”:

    clip_image003

    4、选择列表工作流,修改工作流名称为“日常报销”:

    clip_image004

    5、选择调试时使用的列表,并选择任务列表和历史记录列表;如果项目创建完毕,想要修改调试列表,可以在工作流项目上右键属性;

    clip_image005

    6、选择工作流的启动方式,如下图:

    clip_image006

    7、修改Feature配置要部署的工作流:

    clip_image007

    8、然后回到开发界面,准备画流程图:

    clip_image008

    9、添加状态,并设置一个为“已完成状态”,同时右键重命名各个状态,如下图:

    clip_image009

    10、添加事件驱动并重命名,添加连接线:

    clip_image010

    11、在状态上右键,添加stateInitialization(用来CreatTask):

    clip_image011

    12、创建CreatTask,重命名并修改属性,添加Correlation Token和OwnerActivityName;

    clip_image012

    13、创建任务ID,如下图,记得选择创建字段,点击确定:

    clip_image013

    14、同任务ID创建任务属性,如下图:

    clip_image014

    15、双击CreatTask进入代码视图,给方法添加代码:

    createJLTask_TaskId1 = Guid.NewGuid();
    createJLTask_TaskProperties1.Title = "经理待审批";
    createJLTask_TaskProperties1.AssignedTo = @"i:0#.w|spli.jing";
    createJLTask_TaskProperties1.DueDate = DateTime.Now.AddDays(1.0);
    createJLTask_TaskProperties1.ExtendedProperties.Add("状态", "已启动");

      如上面代码,分别是任务ID、标题、分配人员、有效期和状态属性;

    clip_image015

    createJLTask_MethodInvoking方法代码截图)

    16、返回到设计视图,双击该状态的事件驱动,进入事件驱动的视图:

      如下图,添加OnTaskChanged事件,监视任务变化,重命名;添加After/Before属性,类似上面任务ID,创建字段;修改Correlation Token和OwnerActivityName,和之前Task的相同即可;修改TaskId,修改为之前任务ID。

    clip_image016

    17、双击OnJLTaskChanged,添加方法代码:

    onJLTaskChanged_AfterProperties1 = onJLTaskChanged.AfterProperties;
    onJLTaskChanged_BeforeProperties1 = onJLTaskChanged.BeforeProperties;

    clip_image017

    OnJLTaskChanged方法截图)

    18、添加IF…ELSE…,如下图:

    clip_image018

    添加分支判断的代码条件,并为方法添加方法体:

    方法如下,如果审批通过则走左侧分支,否则右侧分支;

    public Guid TaskStatusFieldId = new Guid("55b29417-1042-47f0-9dff-ce8156667f96");
    
    private void NextToZJL(object sender, ConditionalEventArgs e)
    
    {
    
    string strresult = onJLTaskChanged_AfterProperties1.ExtendedProperties[TaskStatusFieldId].ToString();
    
    if (strresult == "已批准")
    
    {
    
    e.Result = true;
    
    }
    
    else
    
    {
    
    e.Result = false;
    
    }
    
    }

      特:TaskStatusFieldId是ExtendedProperties的一个Key值,调试可以看到。

    19、设置状态,如下图:

    clip_image019

    20、添加状态字段,如下图:

    clip_image020

    21、双击SetState创建方法:

    private void setStateToJL_MethodInvoking(object sender, EventArgs e)
    
    {
    
    }

    22、添加xml和扩展状态代码:

    clip_image021

    23、添加状态的枚举类型,如下图:

    public enum SPWorkflowStatus
    
    {
    
    经理待审批 = 0,
    
    经理已拒绝 = 1,
    
    总经理待审批 = 2,
    
    总经理已拒绝 = 3,
    
    总裁待审批 = 4,
    
    总裁已拒绝 = 5,
    
    报销审批通过 = 6,
    
    Max = 15
    
    }

    24、完成刚刚创建的setStateToJL_MethodInvoking方法

    setStateToJL_State1 = (Int32)SPWorkflowStatus.Max;

    clip_image022

    25、如此方法创建ZJLstateActivity、ZCstateActivity两个状态,在此不一一重复了,配置好的流程图,附后:

    clip_image023

    审批流程描述:

    普通员工 – 经理审批 – 总经理审批 – 总裁审批;

    经理 – 总经理审批 – 总裁审批;

    总经理 – 总裁审批;

    审批结果:

    任意一级拒绝,工作流结束,状态为该级别拒绝;

    审批通过,可以报销,状态为审批通过。

    流程运行过程

    1、新建一条报销;

    clip_image024

    2、 启动新的工作流;

    clip_image025

    3、查看工作流状态

    clip_image026

    clip_image027

    4、 经理审批页面,如下图:

    clip_image028

    5、 经理审批后的状态,如下图:

    clip_image029

    6、 总经理审批后,总裁批准,如下图:

    clip_image030

    7、 总裁已批准,日常报销页面,如下图:

    clip_image031

    8、 总经理审批后,总裁批准,如下图:

    clip_image032

    9、 总裁已拒绝,日常报销页面,如下图:

    clip_image033

    结束语

      以上,就是SharePoint 2013状态机工作流的简单示例,例子比较简单,希望大家不要吐槽,也希望能够给需要学习的人以参考。

    其实,做工作流的过程,自己也经常吐槽,确实是一个痛苦的过程,接下来还想写表单来跑工作流,不知道还有没有耐心继续写下去了,呵呵,好了,不吐槽了,就这样吧。

      因为截图比较仓促,很多地方可能介绍并不详细,特此做一个总结。SharePoint状态机工作流的设计过程:添加工作流状态 – 添加事件驱动 – 勾画流程图 – 添加工作流初始化 – 添加任务(CreatTask) - 事件驱动里添加OnTaskChanged事件 – 设置IF..ELSE等选择语句 – 设置流程结束状态。基本上就是这样一个过程,希望大家理解后再动手做。

    回复一楼留言

      简单修改下流程~

      IF...ELSE分支加代码

    private void IfMoneyBelow500(object sender, ConditionalEventArgs e)
    {
        if (Convert.ToInt32(workflowProperties.Item["报销金额"].ToString()) >= 500)
        {
            e.Result = true;
        }
        else
        {
            e.Result = false;
        }
    }

       结果如下图:

      代码下载SPStateMechineWorkFlow.rar~~

  • 相关阅读:
    MySQL Lock--gap before rec insert intention waiting
    MySQL Index--InnoDB引擎的主键索引
    MySQL Binlog--事务日志和BINLOG落盘参数对磁盘IO的影响
    MySQL Partition Table--分区表优缺点
    MySQL DataType--当整数列遇到小数
    MySQL DataType--日期格式
    MySQL DataType--隐式类型转换
    MySQL Hardware--RAID卡常用信息查看
    DBA常用SQL之表空间与数据文件
    DBA常用SQL之数据库基础信息
  • 原文地址:https://www.cnblogs.com/jianyus/p/3423109.html
Copyright © 2020-2023  润新知