java中审核订单流程图_java实现⼀套流程管理、流转的思路
(伪⼯作流)
在做某个管理项⽬时,被要求实现⼀套流程管理,⽐如请假的申请审批流程等,在参考了很多资料,并和同事讨论后,得到了⼀个⾃主实现的流程管理。
以下提供我的设计思路,知道了思路,实现起来就简单很多了。
⾸先我设计了5个类来实现流程的⾃主设置,主要是对流程的定义和流程流转。
注:这是设计的图,并不是实现
Dictionary:数据字典,不多说,流程类型存在这⾥⾯
Flow:流程,即流程的定义,其中包括流程名称,描述,类型,启⽤时间,备注等;⽬前是通过判断某个类别的流程启⽤时间来进⾏判断当前流程是否启⽤的。
⼀个类别只启⽤⼀个流程。所以只需要通过流程类别即可确定流程,并不要特定的状态字段。
FlowInfoMovingNode:流程节点,在分析流程流转的时候,我们发现,流转⼀步就相当于从⼀个节点跳到另⼀个节点,所以我们设计这个流程节点类来表⽰每⼀步。
其中包括,所属流程,节点名称,节点描述,监听权限。
解释下监听权限是什么. 由于我们做的⼤部分是审核的流程,所以每个节点都需要有个审核的过程才进⼊下⼀个节点,所以我们要这个handlerRole属性来确定这个节点究竟是什么权限来审核。我们也知道,审核⼀般是某个⼈审核,这个我们后⾯说。这⾥是规定某个权限,即可以审核这个节点的权限。
FlowInfoMovingRole:流程流转规则,为了解决从节点出来的各个分⽀,我们设计了这个流转规则,本来其实可以⼀起放到FlowInfoMovingNode中,但这样话⽆论从数据上    还是管理上来说都不如加流转规则⽅便清楚。FlowInfoMovingRole主要⽤来确定流转规则,⽐如某个节点通过了应该去哪个节点,某个节点没通过应该去哪个节点,这样⽆论是分⽀还是单⽀还是循环都可以通过相同的⽅式来进
⾏设置。transition为变换规则,参照shiro验证权限的⽅式,我们也使⽤纯字符串格式来进⾏判断变换规则。
FlowInfoMoving:流程流转信息,这⾥是每⼀步流转信息的存放,基本在进⾏流程流转的过程中,都是通过此类,其中包括:所属节点(得到所属节点同时也就得到所属流      程),申请源(因为我们不知道申请源是什么,我们只是管流程是怎么运转的,其申请源跟我们没有任何关系,我们保存申请源的唯⼀标识,若是想在审核的过程中进⾏查看申请源信息,则可以请求在Flow中监听的Url(handlerUrl),来进⾏查看,我会把申请源的唯⼀标识当做参数传递到Url中)。
由于这个是操作最频繁的,所以我来具体解释下这个类。
以下为本⼈具体实现的类设计,属性字段均有注释进⾏解释:
trycatch和throw区别
/*** 流程流转信息
*@authorlichao **/@Entity
@Table(name=FlowInfoMoving.TABLE_NAME)public class FlowInfoMoving extendsBaseAuditEntity {private static final long serialVersionUID = 1L;public static final String TABLE_NAME = "t_flowInfoMoving";//流程节点,标识此流转信息是流转到了哪个节点
@ManyToOne(fetch =FetchType.EAGER)
@JoinColumn(name= "node_id",nullable = true)privateFlowInfoMovingNode node;//申请源,具体申请信息的唯⼀标识
@ColumnprivateLong applyId;//申请⼈,具体申请信息的申请⼈
@ManyToOne(fetch =FetchType.EAGER)
@JoinColumn(name= "applyuser_id",nullable = false)privateUser applyUser;//申请信息,具体申请信息的简要概述,由申请提供
@Column(length = 50)
@Size(max= 50)privateString discription;//申请类别,即申请的流程的类型
@ManyToOne(fetch =FetchType.EAGER)
@JoinColumn(name= "flowtype_id",nullable = false)privateDictionary applyType;//变换的结果,即审核通过未通过等条件,此条件同FlowInfoMovingRole种的transition,//但有⼀些区别,因为有添加待审核,已结束等其他信息条件
@Column(length = 50)
@Size(max= 50)privateString transition;//处理信息,即审核信息,由审核⼈添加
@Column(length = 100)
@Size(max= 100)privateString handlerInfo;//处理⼈,即此流转应该由谁来申请,由FlowInfoMovingNode中的handlerRole来进⾏筛选,//并由上⼀个节点的处理⼈来进⾏选择具体审核⼈。
@ManyToOne(fetch =FetchType.EAGER)
@JoinColumn(name= "handleruser_id",nullable = false)privateUser handlerUser;//此流转信息的状态,⽤于查询,0未审核,1已审核,2本申请已经结束
@Column()private intstatus;//
}
FlowInfoMoving
这样整个流程定义就结束了,我们可以⾃由设置流程的流程规则,来设置流程的流转⽅式。这样⽆论任何复杂的流程都可以进⾏⾃定义,并且可以随意的修改。
这样设计的结果⾸先是可以任意的⾃定义流程,其次是申请源不需要去管流程的流转了,只需要提交⼀份申请,其他的事情均由流程进⾏操作实现。
那么我们来看看⼀个流程是如何进⾏运转的。
1.⾸先通过⼀个接⼝来传递具体的⼀些申请信息。
2.通过接⼝中的getType()来确定是哪个流程
3.查询到开始的流程节点。
4.将开始的信息保存到流转信息中,并等待处理
5.由审核⼈处理,指定下⼀个审核⼈
6.通过处理结果来获得下⼀个流程节点
7.查下⼀个节点
8.将这次的处理信息和下⼀个节点的信息保存到流转信息中,并等待处理
9.由审核⼈处理,这样⼀直循环知道流程结束
10.通过审核信息查的下⼀个节点为null,则表⽰此流程已经结束,
11.将结束的信息保存到流程流转信息中
12.将整个流程流转的状态改为已结束。
⾸先是Applyable是怎么设计的:其实⼀个接⼝,⽤于提供⼀些申请的信息
public interfaceApplyable {//得到申请的id,与类别进⾏联合查询,⽤于确定具体是哪个流程Long getId();//得到申请的类别,⽤于确定具体是哪类流程
String getApplyType();//得到变换条件,⽤于确定申请后的第⼀个步骤
String getTransition();//得到此次申请的描述
String getDiscription();//得到审批⼈,即第⼀个步骤由谁审批
User getHandlerUser();
}
Applyable
然后是主要的控制流程流转和申请的接⼝
vbs代码循环次数控制
/***
*@Description:处理流程业务的Service
*@Author:lichao
*@Since:Oct 10, 201412:02:39 PM*/
public interfaceFlowMainService {/***
*@Description: ⽤于申请
*@Author: lichao
*@Since: Oct 10, 20143:19:07 PM
*@paramapplyable
*@return*@throwsException*/
public void applyFlow(Applyable applyable) throwsException;/***
在c语言中什么是结构体*@Description: 查当前所处的流转信息
*@Author: medees
*@Since: Oct 13, 20148:56:00 AM
*@paramapplyid 申请源
*@paramapplytype 申请类别
*@return
*/
publicFlowInfoMoving findNowMoving(Long applyid,Dictionary applyType);/*** *@Description: 查某⼀流程下的所有⾛过的流程 按创建时间升序排序
*@Author: lichao
*@Since: Oct 13, 20141:46:54 PM
*@paramapplyid 申请源
*@paramapplytype 申请类别
*@return
*/
public ListfindAllMoving(Long applyid,Dictionary applyType);/***
*@Description: 获取所有变换条件
*@Author: lichao
*@Since: Oct 13, 20144:27:41 PM
*@paramnodeid 所处节点的id
java下载过程*@return
*/
public ListfindNextTransition(Long nodeid);/***
*@Description: 得到此节点可以审核的所有⽤户
*@Author: lichao
*@Since: Oct 14, 201410:22:50 AM
*@paramnodeid 节点id
*@paramapplyid 申请源
*@paramapplyUserId 申请⼈id
*@return
*/json解析字符串
乱世三义优酷免费完整版
public ListfindNextAppUser(Long nodeid,String transition,Long applyUserId);/*** *@Description: 分页查询⾃⼰所审批的流程
*@Author: lichao
*@Since: Oct 14, 20141:39:50 PM
*@return
*/
public PagefindMyMoving(Pageable pageRequest);/***
*@Description: 进⾏审核的⽅法
*@Author: lichao
*@Since: Oct 15, 20142:11:18 PM
*@parammoving
*@throwsException 如果审核出错则抛出异常*/
public boolean approval(FlowInfoMoving moving) throwsException;/***
*@Description: 查⼀个流程的所有流转
*@Author: lichao
*@Since: Oct 16, 201411:04:03 AM
*@paramapplyid
*@paramapplytype
*@return
*/
public PagefindAllMoving(Long applyid,Long applytype,Pageable Pageable);/*** *@Description: 重新申请

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。