ExtFrame里的工作流

本文介绍了一种简易工作流引擎的设计思路与实现细节,重点讨论了节点定义、人员分配及节点动作配置等内容,并通过实例展示了如何启动流程及进行审批。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个工作流其实是个比较简化的版本了,因为没人帮我做图示化的设计器:-(

在我大致搞出来后意识到,其实如果有图示化设计器,可以很容易的搞定图示版本引擎,只是偶实在是不会做SilverLight,又调不到人手(光杆司令,郁闷)

项目又要马上投入使用,只能上比较简单而又比较死的节点定义了,也就是从节点1只能提交到节点2,2只能提交到3这样的流程

这个工作流的设计和我过去在另一个比较大的项目(比较早了,还是CS版本的)写的引擎不太一样,设计机制就完全不一样,那个引擎完全是独立运转的,也就是用户拖拖拽拽定义下流程就行了,而这个引擎,是需要实施人员(其实应该是开发人员,实施人员根本搞不定)对每个流程进行配置,虽然看起来前面那个似乎更灵活些,但我觉得实际上这个新的更好,更容易扩展,主要是机制完全采用的ExtFrame里的框架

先上几个简单的图了:

1:流程列表

这个查询的Grid,操作列什么的,包括上面的添加和查询按钮,都是框架设计的一部分,这里不解释了,在ExtFrame的框架里会进行描述

代码就是ID,用来指定的流程定义,在系统里是直接使用指定的ID来启动流程的,例如启动用车流程,就是Flow.Start('CarRequest')这样的封装

添加流程界面:

这个是简单的添加界面了,添加功能也是框架的一部分

添加了流程后,点流程定义按钮,弹出流程设置的界面

 

 

 

流程设置么,就是添加一个一个的节点了,这个图就省了

另外就是给每个节点设置人员了,用的是Ext.ux.MultiSelect的控件,图也省了

重点是节点动作这个字段,这是啥呢:这就是当前用户可以拥有的操作名称,而这些操作是定义在系统的配置文件里的,例如,对用车申请有一系列的操作可能,而审批这个节点只放置了通过和否决两个操作,那么用户就只能看到这两个按钮,而如果节点有特殊的逻辑,只需要配置额外的操作就可以了,这样就完美的把业务逻辑和工作流结合起来了,例如如果一个节点允许用户修改怎么办,那就放置个edit操作在这个节点上就可以了,这里其实是用的ExtFrame框架的核心设计:采用Command模式封装操作(嗯,其实前面那个Grid列也是这个设计的复用)

 

下面继续放图,如何启动用车申请流程?前篇的树的介绍记得么?有个新增申请,嗯,点开,下面有个用车申请

点一下,弹出了用车申请界面:

填写完毕后,点提交申请,窗口关闭了,我这里流程是管理员提交给管理员自己,多提交几个,然后点等待我审批项目看看(这个树节点定义的是每次展开都会刷新)

点一个,进去看看?

下面不继续了,点通过或否决会出来个意见窗口,不贴了

神马我过去的申请,我过去的审批记录之类的,就不是我的事了,开发人员自己写去,简单的很

转载于:https://www.cnblogs.com/zuxOK/archive/2012/05/07/2487393.html

在CAN(Controller Area Network)通讯中,将扩展帧转换成标准帧通常涉及到数据位的调整和过滤。在CAPL(Controller Area Network Plus Language)这种高级编程语言中,你可以按照以下步骤编写脚本来完成这个过程: 1. **初始化变量**: 首先,你需要定义一些变量来存储原始扩展帧的数据,如ID、远程帧标志(RTR)、扩展标识符(IDE)等。 ```capl stdId Uint32; // 存储标准帧ID extFrame [8] Bool; // 存储扩展帧的标志 ``` 2. **解析扩展帧**: 根据CAN协议,检查每个位是否表示扩展标识符、远程帧标志或其他信息,并将其赋值给相应的变量。 ```capl if (extFrame[0]) stdId |= 0x80000000; // 如果IDE为真,则添加扩展位 if (extFrame[1]) stdId |= CAN_RTR_FLAG; // 如果RTR为真,则设置远程帧标志 ``` 3. **修剪无效位**: 对于扩展帧,可能会有额外的11位标识符。移除这些位并调整DLC(Data Length Code)。 ```capl stdId &= ~((Uint32)1 << 29); // 清除最高位,如果是扩展帧 stdDlc = (Uint8)(extFrame[5] + 8 * extFrame[6]); // 计算新的DLC ``` 4. **生成标准帧**: 将处理后的ID和DLC放入标准帧结构中,然后发送。 ```capl canMsg.Id = stdId; canMsg.Dlc = stdDlc; SendCANMessage(canMsg); ``` 请注意,以上代码是一个简化版的示例,实际应用中你可能需要处理错误检测和处理、缓冲管理等复杂情况。如果你正在使用特定的CAPL库,应查阅其官方文档来了解准确的API调用方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值