`
taotaogo1980
  • 浏览: 84214 次
社区版块
存档分类
最新评论

移动审批工作流设计与实现

阅读更多

   
<p style="text-indent: 2em; margin: 1em 0px; color: #000;">移动审批,通过手机方便快捷地登陆企业内部网及互联网,即使处于无线的状态下,也能进行远程办公,以此来提高对于突发事件的反应能力,提升企业竞争力。

这篇文章我将使用iPhone作为移动终端进行设计与实现,iPhone引入了基于大型多触点显示屏和领先性新软件的全新用户界面,让用户用手指即可控制iPhone。iPhone还开创了移动设备软件尖端功能的新纪元,重新定义了移动电话的功能。iPhone开发中,除了比较复杂的游戏开发,还有一种就是跟数据库打交道的应用程序,这可以在本文中得到体现。

WF4.0是微软提供的一套工作流开发框架,里面包含:流程设计器,各种类型封装好的工作流活动,持久化服务,WCF服务等功能。这篇文章我将结合iPhone+WF4.0实现移动审批工作流。通过一个简单的例子你可以清楚的看到与数据库相关的iPhone应用程序的开发,以及使用iPhone+WCF+WF实现移动审批的各种关键技术的使用。

设计架构图:
由于是使用了WCF的restful服务,所以其它手机平台也会很方便使用此工作流服务。

<img src="http://pic002.cnblogs.com/images/2011/38542/2011050722032129.png" alt="">

iPhone客户端的表单可以通过从服务端设计的表单结构的XML动态产生。

下面通过一个简单的请假流程说明如何实现:

用例流程图:


<img src="http://pic002.cnblogs.com/images/2011/38542/2011050721304048.png" alt="">

上面的流程大致为:申请人在iPhone上打开请假流程,填写姓名和请假天数,点击提交,这个流程将走到他的上级,上级进行审批,并将审批结果通过短信知道申请者。

参考上图,通过WF4.0设计器设计一个流程,如下图:


<img src="http://pic002.cnblogs.com/images/2011/38542/2011050721322245.png" alt="">

下面我使用WCF将此流程封装到restful服务中。

wcf restful服务设计如下:


<div class="cnblogs_code">
<pre><div>
<span style="color: #000000;"> <textarea cols="50" rows="15" name="code" class="c-sharp">  [ServiceContract]
    public interface IRestServiceImpl
    {
        [OperationContract]
        [WebInvoke(Method = "GET",
            ResponseFormat = WebMessageFormat.Json,
            BodyStyle = WebMessageBodyStyle.Wrapped,
            UriTemplate = "getleavelist")]
        List<Leave> GetLeaveList();

        [OperationContract]
        [WebInvoke(Method = "POST",
            ResponseFormat = WebMessageFormat.Json,
            BodyStyle = WebMessageBodyStyle.Wrapped,
            UriTemplate = "createleave/{name}/{day}")]
        string CreateLeave(string name, string day);


        [OperationContract]
        [WebInvoke(Method = "POST",
            ResponseFormat = WebMessageFormat.Json,
            BodyStyle = WebMessageBodyStyle.Wrapped,
            UriTemplate = "auditingleave/{id}/{comment}")]
        string AuditingLeave(string id, string comment);
    }</textarea></span>


</pre>

数据库设计:


1、WF持久化数据表:使用WF自带的数据表。

</strong>


2、业务数据表:请假单,设计如下:

[b]<img src="http://pic002.cnblogs.com/images/2011/38542/2011050816575847.png" alt="">



WF流程启动和运行代码:
[/b]


<div class="cnblogs_code">
<pre><div><textarea cols="50" rows="15" name="code" class="c-sharp">public  class WorkFlowProcess
    {
        static AutoResetEvent instanceUnloaded = new AutoResetEvent(false);

        static Hashtable InstanceHashtable = new Hashtable();

        public static string RunInstance(Guid ID,string Comment)
        {
            SqlWorkflowInstanceStore instanceStore = new SqlWorkflowInstanceStore("Data Source=PC-ZHUQL//ZHUQL;Initial Catalog=TestDB;Integrated Security=True;Pooling=False");
            WorkflowApplication application1 = new WorkflowApplication(new LeaveProcess());
            application1.InstanceStore = instanceStore;
            application1.Completed = (workflowApplicationCompletedEventArgs) =>
            {
                Console.WriteLine("/nWorkflowApplication has Completed in the {0} state.", workflowApplicationCompletedEventArgs.CompletionState);
            };
            application1.Unloaded = (workflowApplicationEventArgs) =>
            {
                Console.WriteLine("WorkflowApplication has Unloaded/n");
                instanceUnloaded.Set();
            };
            application1.Load(ID);
            application1.ResumeBookmark("Check", Comment);
            instanceUnloaded.WaitOne();
            return "success";
        }

        // creates a workflow application, binds parameters, links extensions and run it
        public static string CreateAndRun(string LeaveName, int LeaveDay)
        {
            SqlWorkflowInstanceStore instanceStore = new SqlWorkflowInstanceStore("Data Source=PC-ZHUQL//ZHUQL;Initial Catalog=TestDB;Integrated Security=True;Pooling=False");

            InstanceView view = instanceStore.Execute(instanceStore.CreateInstanceHandle(), new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(30));

            instanceStore.DefaultInstanceOwner = view.InstanceOwner;

            IDictionary<string, object> input = new Dictionary<string, object>
            {
                { "LeaveName" , LeaveName },
                { "LeaveDay" , LeaveDay }
            };

            WorkflowApplication application = new WorkflowApplication(new LeaveProcess(), input);

            application.InstanceStore = instanceStore;

            application.PersistableIdle = (e) =>
            {
                instanceUnloaded.Set();
                return PersistableIdleAction.Unload;

            };

            application.Unloaded = (e) =>
            {

                instanceUnloaded.Set();

            };
            application.OnUnhandledException = (ex) =>
            {
                Console.Write("Exception");
                return UnhandledExceptionAction.Terminate;
            };
           Guid id = application.Id;
           application.Run();
           instanceUnloaded.WaitOne();
           return "success";
        }

        // executed when instance is persisted
        public static void OnWorkflowCompleted(WorkflowApplicationCompletedEventArgs e)
        {
        }

        // executed when instance goes idle
        public static void OnIdle(WorkflowApplicationIdleEventArgs e)
        {
        }

        public static PersistableIdleAction OnIdleAndPersistable(WorkflowApplicationIdleEventArgs e)
        {
            return PersistableIdleAction.Persist;
        }
    }</textarea>

</pre>

[b]iPhone客户端调用:



在前一篇文章:<a id="homepage1_HomePageDays_DaysList_DayItem_1_DayList_1_TitleUrl_0" class="postTitle2" href="http://www.cnblogs.com/zhuqil/archive/2011/04/26/iphone-restful-wcf.html"><span style="color: #6466b3;">iPhone中调用WCF RESTFUL Service</span>
</a>
,讲解了iPhone中如何调用WCF restful服务,下面用启动流程为例说明:

<div class="cnblogs_code">
<pre><div><textarea cols="50" rows="15" name="code" class="c-sharp">-(IBAction) btnSender:(id)sender
{
NSString * urlString =@"http://10.5.23.117:8008/RestServiceImpl.svc/createleave/%@/%@";
   NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:urlString,txtName.text,txtDay.text]];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setRequestMethod:@"POST"];
[request startSynchronous];
NSError *error = [request error];
if (!error) {
NSString *response = [request responseString];
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"杩斿洖缁撴灉"
message:@"鎻愪氦鎴愬姛"
   delegate:nil
  cancelButtonTitle:@"OK"
  otherButtonTitles:nil];
[alertView show];
[alertView release];
}
}</textarea>

</pre>

iPhone界面设计:


1、启动流程界面:

<img src="http://pic002.cnblogs.com/images/2011/38542/2011050721501281.png" alt="">

2、填写表单信息:

<img src="http://pic002.cnblogs.com/images/2011/38542/2011050721505228.png" alt="">

3、启动流程

<img src="http://pic002.cnblogs.com/images/2011/38542/2011050721511861.png" alt="">

4、待审核列表:

<img src="http://pic002.cnblogs.com/images/2011/38542/2011050721521142.png" alt="">

5、审核界面:

<img src="http://pic002.cnblogs.com/images/2011/38542/2011050721530411.png" alt="">

6、审核结果:

<img src="http://pic002.cnblogs.com/images/2011/38542/2011050721534593.png" alt="">

这里是个简单的demo,界面非常的简陋。

总结:
本文通过一个简单的用例来说明了移动审批流程的各个层面的各种技术的实现。使用这些技术实现一个工作流服务以及工作流客户端界面将非常简单。

代码:<a href="http://http//files.cnblogs.com/zhuqil/RestService.rar%0D%0A%0D%0A"><span style="color: #6466b3;">服务端</span>
</a>

<strong>,<a href="http://files.cnblogs.com/zhuqil/iPhoneView.zip%0D%0A%0D%0A"><span style="color: #6466b3;">iPhone客户端</span>
</a>
[/b]


 
0
0
分享到:
评论

相关推荐

    基于React框架 仿钉钉审批流、工作流源代码

    "基于React框架 仿钉钉审批流、工作流源代码"这个项目,显然是利用React的强大功能来模拟和实现类似钉钉的审批流程和工作流程管理。下面将详细解释相关知识点。 1. **React框架**:React是由Facebook开发的开源...

    用友NC移动审批,NC待办集成,NCC移动审批

    【用友NC移动审批】是针对企业信息化管理中审批流程的一种解决方案,旨在提升工作效率,实现随时随地的业务审批。NC待办集成与NCC移动审批功能的结合,使得用户无需安装额外的应用程序,只需通过H5应用,即可在微信...

    SharePoint多级审批工作流含控件

    在SharePoint中,多级审批工作流是一种常见的业务流程,它用于实现复杂决策过程,例如财务报销、请假申请等需要经过多个部门或人员审批的场景。 在SharePoint中,多级审批工作流可以通过SharePoint Designer进行...

    用户自定义工作流设计器

    10. 审批与协作:工作流设计器通常包含审批机制,支持多级审批、会签等功能,同时提供评论和附件上传,便于团队成员间的沟通和协作。 综上所述,用户自定义工作流设计器利用一系列技术,如VML、JavaScript、XML和...

    web工作流设计-myflow

    本项目“web工作流设计-myflow”是专为实现基于Web的工作流设计而构建的,它利用myflow.js这个JavaScript库来帮助开发者轻松地在网页上创建和操作工作流。下面将详细介绍myflow.js的工作原理、主要特点以及如何在...

    基于工作流的方正集团OA系统设计与实现

    ### 基于工作流的方正集团OA系统设计与实现 #### 一、引言 随着信息技术的不断发展,企业内部的信息管理系统也在不断进化和完善。办公自动化(Office Automation,简称OA)系统作为企业信息化建设的重要组成部分,...

    K3Cloud移动工作流

    K3Cloud移动工作流,

    一套完整的OA系统源码可自己设计审批流程

    开发者可以通过学习和修改这些源码,了解OA系统的架构设计,掌握审批流程的实现方式,以及如何将业务规则融入到系统中。对于想要构建或改进OA系统的人来说,这是一个宝贵的资源,能帮助他们快速上手并实现定制化需求...

    工作流/图形设计器 (ext/easyui/jqueryui)

    在工作流设计场景下,jQueryUI的拖放功能可以用于流程节点的移动,而其可定制的对话框和弹出窗口则可用于展示详细信息或者处理用户确认操作。 工作流设计通常包括以下几个关键特性: - **流程建模**:通过图形化...

    基于Web的移动办公系统的设计与实现-全套

    【基于Web的移动办公系统的设计与实现】 移动办公系统,又称移动OA(Office Automation),是随着互联网技术尤其是Web技术的发展而出现的一种新型办公模式。它允许用户在任何时间、任何地点,只要有网络连接,就...

    web|FLEX|B/S工作流设计器

    "WEB工作流"与"B/S工作流"类似,强调的是在Web环境下实现工作流的管理和执行。 【bin-debug】文件夹通常包含的是编译后的调试版本代码,这些代码可能包含了开发者在开发过程中用于测试和调试的类库和资源。在Flex...

    工作流WEB设计器

    7. **集成能力**:工作流Web设计器通常可以与其他企业系统(如ERP、CRM、HRM等)集成,实现数据交换和流程联动,进一步提升工作效率。 8. **权限管理**:为了确保流程的安全性,设计器应具备权限管理功能,允许管理...

    工作流与数据流解决方案

    工作流与数据流是IT行业中两个重要的概念,尤其在软件开发和系统集成中扮演着关键角色。本篇文章将深入探讨这两个主题,并结合JavaScript常用函数、移动电子运行维护系统以及SSH架构,来阐述它们在实际应用中的重要...

    拖拽配置工作流控件demodemo

    本文将详细探讨一个名为“拖拽配置工作流控件demodemo”的开源项目,它为开发者提供了一种高效、直观的方式来设计和实现工作流。该控件以其独特的拖拽配置特性,使得非编程背景的用户也能参与到工作流的设计中,大大...

    用网页形式做的可视化设计工作流系统!

    1. 友好的用户界面:网页形式的设计使得工作流系统可以跨平台访问,无论是在桌面还是移动设备上,用户都能轻松操作。同时,可视化设计使复杂的工作流程变得简洁明了,用户可以通过拖拽元素、设定条件和连接步骤来...

    通达oa工作流使用详解2008

    总的来说,通达OA工作流使用详解2008涵盖了工作流的设计、发布、运行和管理等多个方面,旨在帮助企业实现业务流程的规范化和自动化。通过深入学习和实践,用户可以充分利用这一工具,优化企业的内部管理,提高工作...

    工作流系统功能

    6. **集成能力**:工作流系统通常具有良好的API和插件机制,可以与企业的其他系统(如ERP、CRM)无缝集成,实现数据共享和流程协同。 7. **版本控制**:对于流程的变更,系统应具备版本控制功能,保存历史版本,...

    144种工作流功能

    工作流(Workflow)是信息化管理中的重要概念,它是指在组织内部或跨组织间,按照预定义的规则和过程自动或半自动地进行流转、审批、处理等活动的流程。"144种工作流功能"可能涵盖了从简单任务分配到复杂业务流程...

    工作流—常见问题

    - **功能概述**:工作流表单支持通过“二维码”控件将重要信息转化为二维码,便于移动设备快速扫描获取信息。 - **应用场景**:适用于需要快速分享或存档重要文档的情况,如会议资料、产品说明书等。 - **操作方法**...

Global site tag (gtag.js) - Google Analytics