使用Dispatch模式设计信息上报审批功能

在做一个教育系统的项目,遇到一个这样的需求,下级部门要向上级部门上报各种申请共有10种左右,在上级的界面里,需要列出所有下属部门未审批的申请,同时根据不同的信息,调出不同的处理界面来。具体上报的消息类型,将来可能扩充。

如果采用一般的做法,那么,就是在点击某一条消息的时候,根据消息id,判断属于什么类型的消息,然后调用相对应的处理过程:

If msgid=1 then  //
    else if mesid=2 then //

…..

这样的方式日后维护起来麻烦,所以打算采用设计模式里的Dispatch模式进行设计。

TfrmMsgList是消息列表的窗体,用户点击了某一条消息后,直接SendMessage(Dispatch,MsgID)dispatcherDispatcher里面申明了每个消息id对应的消息处理函数,只需要直接分发就可以了,类似消息处理过程。

点击消息的时候:

procedure TfrmMsgList.HandleUploadMsg;

var

  MsgID,msgCode: integer;

  SenderCode: pstring;

begin

  if lstMsgs.Selected = nil then exit;

  MsgID := StrToInt(pstring(lstMsgs.Selected.Data)^);

  MsgCode := fMsgs.GetMsgCode(msgID);

  new(SenderCode);

  SenderCode^ := lstMsgs.Selected.Caption;

  SendMessage(MsgDisp.Handle,MsgCode,integer(SenderCode),MsgID);

end;

而在dispatch单元:

/// <summary>

/// 消息分发类,首先定义消息参数,消息参数等于数据库里的消息码,然后定义对于每个消息的处理

/// 过程。使用的时候,用户选择了某条消息,只要把消息码post过来,

/// 比如:

/// SendMessage(MsgDisp.Handle,MsgCode,integer(SenderCode),MsgID);

/// </summary>

/// <author> bohe </author>

/// <date> 2005-04-06 </date>

unit untMsgDisp;

 

interface

 

uses

  SysUtils, Windows, Messages, Classes, Graphics, Controls,

  Forms, Dialogs, contnrs, unt_SignBase;

 

const

  WM_MSGSIGNED = WM_USER + 103; //消息已经审批了的通知消息,通知owner

  WM_NEWSTU = 10010;  //:上报新生

  WM_EDUINFO = 10015; {上报学籍信息}

  WM_STUMOVE = 10020; //上报学生变动

  WM_SCHINFO = 10030; //上传学校信息

  WM_SCHLIB = 10040;//:上报学校信息库

  WM_CHANGENAME = 10050;//改名申请

 

  WM_STATCLASS = 11010;//上报班级升学统计

  WM_STATSTATUS = 11020; //上报学额巩固统计

  WM_STATEDU = 11030; //:上报在校生统计

  WM_STATENROLL = 11040; //上报服务区适龄儿童入学统计

  WM_STATGRADUATE = 11060; //上报毕业生统计信息

  WM_BURINFO = 11050; //上报管理部门基本信息

 

type

  //TMsgEvent = procedure(varMsg: TMessage);

  TfrmSignBaseClass = class of Tfrm_SignBase;

 

  TMsgDisp = class(TWinControl)

  private

    fMsgList: TObjectList;

    frmSign: Tfrm_SignBase;

    procedure SignMsg(TfrmClass: TfrmSignBaseClass; Message: TMessage);

    procedure NotifySigned;

  public

    //constructor Create();

    //destructor Destroy; override;

    //procedure RegisterMsg(Message: integer; MsgEvent: TMsgEvent);

    procedure WMNewStu(var Message: TMessage); message WM_NEWSTU;

    procedure WMEduInfo(var Message: TMessage); message WM_EDUINFO;

    procedure WMStuMove(var Message: TMessage); message WM_STUMOVE;

    procedure WMSchInfo(var Message: TMessage); message WM_SCHINFO;

    procedure WMSCHLIB(var Message: TMessage); message WM_SCHLIB;

    procedure WMCHANGENAME(var Message: TMessage); message WM_CHANGENAME;

    procedure WMSTATCLASS(var Message: TMessage); message WM_STATCLASS;

    procedure WMSTATSTATUS(var Message: TMessage); message WM_STATSTATUS;

    procedure WMSTATEDU(var Message: TMessage); message WM_STATEDU;

    procedure WMSTATENROLL(var Message: TMessage); message WM_STATENROLL;

    procedure WMStatGraduate(var Message: TMessage); message WM_STATGRADUATE;

 

    procedure WMBURINFO(var Message: TMessage); message WM_BURINFO;

  end;

 

 

implementation

 

uses untSignNewStu, untSignSchInfo, untSignStatClass, untSignStatEdu,

  untSignStatEnroll, untSignStatStatus, untSignSchLib, untSignBurInfo,

  untSignMove, untSignStatGraduate, untSignAStuInfo;

 

{

**********************************TMsgDisp ******************************

}

{constructor TMsgDisp.Create();

begin

  //fMsgList := TObjectList.Create;

end;

 

destructor TMsgDisp.Destroy;

begin

  fMsgList.Free;

  inherited;

end;  }

 

{procedure TMsgDisp.RegisterMsg(Message: integer; MsgEvent: TMsgEvent);

begin

  //fMsgList.Add()

end;  }

 

/// <summary>

/// 通知owner,审批完成

/// </summary>

procedure TMsgDisp.NotifySigned;

begin

  if Assigned(owner) then

    SendMessage((Owner as TWinControl).Handle,WM_MSGSIGNED,0,0);

end;

 

procedure TMsgDisp.SignMsg(TfrmClass: TfrmSignBaseClass; Message: TMessage);

begin

  frmSign := TfrmClass.Create(nil);

  with frmSign do

  begin

    try

      MsgID := Message.lParam;

      SenderCode := pstring(Message.wparam)^;

      if ShowModal = mrOk then

        NotifySigned; //通知审批完成

    finally

      Free;

    end;

  end;

 

end;

 

procedure TMsgDisp.WMCHANGENAME(var Message: TMessage);

begin

 

end;

 

procedure TMsgDisp.WMNewStu(var Message: TMessage);

begin

  SignMsg(TfrmSignNewStu,Message);

end;

 

procedure TMsgDisp.WMSchInfo(var Message: TMessage);

begin

  SignMsg(TfrmSignSchInfo,Message);

end;

 

procedure TMsgDisp.WMSCHLIB(var Message: TMessage);

begin

  SignMsg(TfrmSignSchLib,Message);

end;

 

procedure TMsgDisp.WMBURINFO(var Message: TMessage);

begin

  SignMsg(TfrmSignBurInfo,Message);

end;

 

procedure TMsgDisp.WMSTATCLASS(var Message: TMessage);

begin

  SignMsg(TfrmSignStatClass,Message);

end;

 

procedure TMsgDisp.WMSTATEDU(var Message: TMessage);

begin

  SignMsg(TfrmSignStatEdu,Message);

end;

 

procedure TMsgDisp.WMSTATENROLL(var Message: TMessage);

begin

  SignMsg(TfrmSignStatEnroll,Message);

end;

 

procedure TMsgDisp.WMStatGraduate(var Message: TMessage);

begin

  signMsg(TfrmSignStatGraduate,Message);

end;

 

procedure TMsgDisp.WMSTATSTATUS(var Message: TMessage);

begin

  SignMsg(TfrmSignStatStatus,Message);

end;

 

procedure TMsgDisp.WMStuMove(var Message: TMessage);

begin

  SignMsg(TfrmSignMove,Message);

end;

 

procedure TMsgDisp.WMEduInfo(var Message: TMessage);

begin

  SignMsg(TfrmSignAStuInfo,Message);

end;

 

end.

 

具体的审批窗体全部从一个窗体派生:

通用OA系统源代码(asp.net)包含完整源代码和数据库,除了具有传统OA的邮件、工作流、文档等功能外,还引进了项目管理和知识管理的思想,更加注重工作任务的分解、协同和监督;知识的积累、沉淀和分享,多条件跳转的分支流更为特色,有效为企业构筑协同工作平台 我的任务:今天未完成任务列表 我的邮件:最新收到的邮件列表 我的文档:最新归档的项目文档 我的审批:待我审批的项目文档 考勤:成员上下班的考勤 全文检索:对系统中项目文档的全文检索,并有权限过滤机制 系统设置各类接点:系统的权限中心和配置中心 人员管理:系统账户;由系统管理员添加、修改;可以定义新增、离职、调职还可自定义查询 职位管理:组织内的职位结构树,是权限的基本结构 角色管理:权力的集合,可以自由定义。系统默认的有组长、组员和系统成员。 修改口令:成员修改自己的口令(系统管理员在成员模块中修改口令) 考勤查询:查询包括自己在内的考勤纪录,或系统指定的成员如人事助理可查全部成员 考勤设置:考勤日和考勤时间的设置 公司论坛:包括公司公告和各版块BBS;有BBS管理权可以添加桌面公告和版块公告,版主可以自由添加版块和版块公告。BBS的功能同常见的,但无须登录; 客户管理(客户接触点的管理) 我的客户:显示由我负责的客户信息,并添加接触纪录(电话、拜访等) 查询、统计:客户资料的统计和分析,销售人员的业绩管理 我的联系人 公司内部联系人:系统成员列表中获得 公司外部联系人:等同于公司客户的联系人 自定义联系人:管理私人的联系人 我的任务:(含任务协同、任务指派、任务查询) 待完成任务:显示今日往后的未完成任务,并对任务操作,如新建、取消、完成、接受 未完成任务:显示今日以前的未完成任务 已完成任务:显示完成的任务 我的发起任务:显示所有我发起的任务,其中包括我仅发起而不执行的指派任务 订阅/查询任务:显示我不参加的任务,查询他人的任务 我的邮件 收件箱:我收到的邮件,全部显示 发件箱 :我曾经发送的邮件,全部显示 废件箱 :我删除的收到过的的邮件 撰写新邮件:可以有项目属性,并可归档 公文流转 待批文档:流程走到我这里的文档,等待我处理 我的申请:我发起的流转申请 已批文档:从我这里过的,被我处理过的文档 流程管理:由我创建和管理的流程,需要制定环节和绑定角色 拟稿箱:我可以发起的文档流转的入口,凡流程的第一环节有我的,都显示;并可以对流程有条件查询 我的文档 已归档:我可以查看的已归档项目文档 待审批:正等待我审批的项目文档;审批权包括角色指定,或是项目组长。 公司项目:项目树的管理,每人看到自己参与的项目内容或权限赋予的内容 投递文档:对该项目投递相关的文档 撰写邮件:对该项目组成员发送邮件 项目管理:项目的创建、删除、修改、移动 成员管理:项目成员的添加、删除;组长的标记;组员权限的变更 项目订阅:显示我关心的项目内容(本人并不是项目成员,但有权查看) 目录管理:创建项目文档库,并有严格权限限制,文档目录可扩展 短信管理: 站内短信:系统内的消息机制 站外手机短讯:发送多个附加手机号码 USB_Key 设置:对硬件加密的设置.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值