<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实现移动审批的各种关键技术的使用。

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

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

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

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

[b] 用例流程图:[/b]

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

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

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

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

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

[b]wcf restful服务设计如下:[/b]

<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>

[b]数据库设计:[/b]

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

[b]</strong>

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

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

[b]WF流程启动和运行代码:[/b]
[b][/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客户端调用:[/b]

在前一篇文章:<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>

[b]iPhone界面设计:[/b]

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,界面非常的简陋。

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

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

移动审批工作流设计与实现相关推荐

  1. SharePoint Designer2010 设计多级审批工作流。

    用SPD设计无代码工作流比较简单实用,这里就来探讨一下如何用SPD设计以下流程的工作流. 要求:1.部门内部流程分为两级:办事员审批.部门经理审批. 2.如果审批不通过,下次再次开启工作流,则通过的部 ...

  2. ASP.NET MVC5+EF6+EasyUI 后台管理系统(42)-工作流设计-表建立

    系列目录 工作流在实际应用中还是比较广泛,网络中存在很多工作流的图形化插件,可以做到拉拽的工作流设计,非常简便,再配合第三方编辑器,可以直接生成表单,我没有刻意的浏览很多工作流的实际设计,我认为工作流 ...

  3. Workflow Core + asp.net core 5.0 实现简单审批工作流

    我们知道企业业务系统到处都可以审批工作流的,但也很少有像OA系统一样复杂多级多条件的审批工作流需要设计,所以我们需要一个轻量级的容易上手的workflow框架,通过GitHub,我发现danielge ...

  4. SharePoint无代码工作流设计开发实例——交通费报销流程(一)

    开发环境: (1)SharePoint Designer 2010 (2)SharePoint Online(Office 365) 关于Office 365和SharePoint Online的相关 ...

  5. oa处理会签流程图_简易OA漫谈之工作流设计(四,怎么支持会签)

    会签:就是一个步骤要所有人都审批完成才能完成. 上一步提交到会签步骤时,该步骤的每个人都能收到一条待办任务, 会签审批人每次提交时都检查该步骤所有会签人是否已经审批,如果全部审批就产生下一手任务. 1 ...

  6. 审批工作流系列教程 前言

    开始之前请先问自己几个问题? 1.何为审批工作流? 2.审批工作流适用哪些应用场景? 3.如何设计一个审批工作流? 后续我会陆续讲解相关章节,希望可以帮到您.

  7. 用MongoDB数据库来管理办公系统中文档型的表单和信息——通用流程化应用审批单设计思路(二,续)

    1.办公系统中文档的定义 办公系统中的文档就是指对数据不敏感的业务,例如流程中的审批单.信息专栏.数据上报.信息记录等.而对于这些信息的管理,特别是时效性较强的管理记录,仍采用关系型数据库进行管理. ...

  8. asp.net中的报销多级审批工作流

    最近正在学习工作流,正好从网上搜索到一个 Asp.net工作流(WWF+LINQ)的例子,之前学习MOSS时接触过工作流,不过那是针对MOSS的工作流,我一直从事B/S架构开发,知道工作流可用于很多环 ...

  9. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(44)-工作流设计-设计表单...

    构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(44)-工作流设计-设计表单 原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后 ...

最新文章

  1. Openssl req命令
  2. [原创]Fluent NHibernate之旅
  3. mysql安全性实验心得_mysql安全小结
  4. 第三次学JAVA再学不好就吃翔(part113)--对象操作流
  5. abb智能控制系统_ABB助力国网冀北电力打造虚拟电厂
  6. 一个寄存器有几个字节_STM32f103ZET6 学习资料 (连载2 寄存器的操作界限)
  7. PAT乙级 1021 个位数统计
  8. 使用Regsvr32命令修复系统故障
  9. 智能指针——C++实现
  10. Nginx负载均衡服务器实现会话粘贴的几种方式
  11. mysql资源估算_关于数据库查询要耗费的服务器资源估算!高手进~
  12. Phpmyadmin的一次渗透测试
  13. HTML5期末大作业:中华美德文化网站设计——中华美德文化(6页) HTML+CSS+JavaScript 中国传统美德文化网页HTML代码
  14. pythonrequests发送数据_使用Python爬虫库requests发送表单数据和JSON数据
  15. 如何制作微信小程序(三个步骤开发小程序)
  16. Thingworx 调用外部接口
  17. linux sh解释器
  18. matlab wolfe准则,[原创]用“人话”解释不精确线搜索中的Armijo-Goldstein准则及Wolfe-Powell准则...
  19. Linux查看安装包
  20. 深圳计算机网络学校,深圳广外公开学院计算机网络含金量高吗 中专技校学历提升...

热门文章

  1. Intellij IDEA 项目编码格式(File Encodings)设置
  2. 【luogu CF1693D】Decinc Dividing(DP)
  3. jsp中c标签的引入
  4. 明日方舟苹果IOS脚本快速刷关卡刷图
  5. Pandas简易入门(四)
  6. Lotka振子模拟及其振幅周期涨落现象简述
  7. Shopee发布Apple(苹果)品牌限售政策
  8. 计算机网络双绞线特点,计算机网路·实验一--常见网络设备及双绞线的制作和连接(11页)-原创力文档...
  9. 罗永浩锤子手机系统发布会
  10. python request下载word,下载word文档python