自定义流程通知窗口

上一节介绍了如何在工作流中发通知信息。
本节我们更进一步,自定义一个流程消息提示窗口,单击窗口中的按钮可以自动完成一些操作。

本节内容需要实现下述任务:

送货单由用户张三开单,由李四审核。
当张三开送货单保存时,系统自动发给李四发一个消息:“张三已新增送货单20151028001,请审核”。
李四收到此消息后,点此消息,打开这张送货单,进行审核,审核后,反馈回张三消息:“送货单20151028001已由用户李四审”

下图就是我们要设计的提示窗口:

李四收到信息之后,单击提示窗口的查看按钮,即可加载(或刷新)并定位到此送货单,并自动打开送货单编辑窗口,查看该送货单信息并审核。

本节内容使用OpenQQ发送和接收信息,关于OpenQQ服务端和客户端的设计,前面的章节已经有详细介绍,这里就不重复。

以下的设计全部在客户端项目完成。

设计步骤

1、首先我们要定义一个集合,用于存储收到的审核申请,在全局代码中定义一个Public变量:

Public fhs As New List(of String)

因为存在一种可能,就是张三连续开了多个送货单,李四因故没有即时审核,所以我们应该将收到的审核申请存储在集合fhs中,逐个提醒李四。

2、现在我们要约定一个消息格式,审核申请的格式为"+@|主键|送货单号|制单人",审核完成的格式为"-@|送货单号|审核人"。

3、在发货单编辑窗口的保存按钮中,写入如下代码:

Dim r As Row  = Tables("送货单").Current
r
.Save()
QQClient
.Send("李四","+@|" & r("_Identify") & "|" & r("单号") & "|" & User.Name)

4、在发货单编辑窗口的审核按钮中,写入如下代码:

Dim r As Row  = Tables("送货单").Current
r
("审核") = True
r
.Save()
'发送审核通过的消息

QQClient
.Send("张三","-@|" & r("单 号") & "|" & User.Name)

5、在OpenQQ客户端的MessageReceived事件中编写代码:

Dim pts() As String  = e.Message.Split("|")
If
pts.Length = 4 AndAlso pts(0) = "+@" '如果是申请审核消息
    fhs.Add(pts(1) & "|" & pts(2) & "|" & pts(3))
'
将主健、单号和制单人 合成为一个字符串存储在集合中
ElseIf
pts.Length = 3 AndAlso pts(0) = "-@" '如果是审核通过消息
    PopMessage(
"
送货单" & pts(1) & "已由" & pts(2) & "审核通过!")
    Dim dr As DataRow = DataTables(
"
送货单").Find("单号 = '" & pts(1) & "'")
    If dr IsNot Nothing Then
        dr.Load
    End
If

End
If

6、在客户端项目新建一个下图所示的窗口,窗口名为“审核提示”,窗口类型设置为PopupForm:

这个窗口有两个Label控件,Label1用于显示提示信息,Label2的可见属性设置为False,用于存储发货单的主键(Identify)。
这是一个技巧,因为Foxtable并没有提供窗口级别的变量,所以通常用一些不可见的Label控件来存储临时信息。

将查看按钮的代码设置为:

DataTables("送货单").Save() '接下来要根据主键查找,必须先保存,因为只有保存后新增行的主键才是有效值。
Dim
id As String = e.Form.Controls("Label2").Text
Dim
dr As DataRow = DataTables("送货单").Find("[_Identify] = " & id)
If
dr Is Nothing Then
    DataTables(
"
送货单").AppendLoad("[_Identify] = " & id)
    drDataTables(
"
送货单").Find("[_Identify] = " & id)
Else

    dr.Load()

End
If
If
dr IsNot Nothing Then
    Dim wz As Integer = Tables(
"
送货单").FindRow(dr)
    If wz < 0 Then
'
如果因为筛选导致此送货单不可见
        Tables(
"
送货单").Filter = ""
        wz =Tables(
"
送货单").FindRow(dr)
   
End If
    If wz >= 0 Then
        Tables("送货单").Position = wz
        Forms("发货单").Open()
    End
If

End
If
e
.Form.Close()

上面的代码不难理解,需要注意的是,为什么必须首先保存一下送货单表呢?
实际上如果李四只有审核送货单的权限,没有增加送货单的权限,那么第一行保存表的代码是可以省略的,这又是为什么呢?
假定送货单表原来有10行(主键值0-9),张三和李四都可以增加送货单,两人分别增加1个订货单,主键值都是10。
张三保存后,李四收到通知,如果李四不保存,直接用AppendLoad追载主键为10的行,由于表中已经有一个主键为10的行,所以会出现错误提示。
如果李四先保存,其新增行的主键会在保存后变为11,此时就可以正常根据通知信息追载主键为10的行了。

7、在项目事件SystemIdle中加入代码:

If fhs.Count > 0 AndAlso Forms("审核申请").Opened = False Then
    Dim pts() As String = fhs(0).Split("|")
    fhs.RemoveAt(0)
    With Forms("审核申请")
        .Open()
        .Controls("Label1").Text = pts(2) & "新增订货单" & pts(1) & ",请审核!"
        .Controls("Label2").Text = pts(0) '将发货单主健设置为Label2的标题
    End
With

End
If

上述代码在系统空闲的时间检查fhs集合,判断是否有新的审核申请;如果有新的申请且审核申请提示窗口未显示,则显示集合中的第一个审核申请,并将其从集合中移除。
上述代码将待审核送货单的主键设置为Label2的标题,这样在审核申请窗口单击查看按钮时,可以根据Label2的标题找出待审核的订单。


本页地址:http://www.foxtable.com/webhelp/topics/3055.htm