转:

在做某个管理项目时,被要求实现一套流程管理,比如请假的申请审批流程等,在参考了很多资料,并和同事讨论后,得到了一个自主实现的流程管理。

以下提供我的设计思路,知道了思路,实现起来就简单很多了。

首先我设计了5个类来实现流程的自主设置,主要是对流程的定义和流程流转。

注:这是设计的图,并不是实现

Dictionary:数据字典,不多说,流程类型存在这里面

Flow:流程,即流程的定义,其中包括流程名称,描述,类型,启用时间,备注等;目前是通过判断某个类别的流程启用时间来进行判断当前流程是否启用的。

一个类别只启用一个流程。所以只需要通过流程类别即可确定流程,并不要特定的状态字段。

FlowInfoMovingNode:流程节点,在分析流程流转的时候,我们发现,流转一步就相当于从一个节点跳到另一个节点,所以我们设计这个流程节点类来表示每一步。

其中包括,所属流程,节点名称,节点描述,监听权限。

解释下监听权限是什么. 由于我们做的大部分是审核的流程,所以每个节点都需要有个审核的过程才进入下一个节点,所以我们要这个handlerRole属性来确定这个节点究竟是什么权限来审核。我们也知道,审核一般是某个人审核,这个我们后面说。这里是规定某个权限,即可以审核这个节点的权限。

FlowInfoMovingRole:流程流转规则,为了解决从节点出来的各个分支,我们设计了这个流转规则,本来其实可以一起放到FlowInfoMovingNode中,但这样话无论从数据上    还是管理上来说都不如加流转规则方便清楚。FlowInfoMovingRole主要用来确定流转规则,比如某个节点通过了应该去哪个节点,某个节点没通过应该去哪个节点,这样无论是分支还是单支还是循环都可以通过相同的方式来进行设置。transition为变换规则,参照shiro验证权限的方式,我们也使用纯字符串格式来进行判断变换规则。

FlowInfoMoving:流程流转信息,这里是每一步流转信息的存放,基本在进行流程流转的过程中,都是通过此类,其中包括:所属节点(得到所属节点同时也就得到所属流      程),申请源(因为我们不知道申请源是什么,我们只是管流程是怎么运转的,其申请源跟我们没有任何关系,我们保存申请源的唯一标识,若是想在审核的过程中进行查看申请源信息,则可以请求在Flow中监听的Url(handlerUrl),来进行查看,我会把申请源的唯一标识当做参数传递到Url中)。

由于这个是操作最频繁的,所以我来具体解释下这个类。

以下为本人具体实现的类设计,属性字段均有注释进行解释:

/*** 流程流转信息

* @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;

//申请源,具体申请信息的唯一标识

@Column

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

//getter...and setter....

}

这样整个流程定义就结束了,我们可以自由设置流程的流程规则,来设置流程的流转方式。这样无论任何复杂的流程都可以进行自定义,并且可以随意的修改。

这样设计的结果首先是可以任意的自定义流程,其次是申请源不需要去管流程的流转了,只需要提交一份申请,其他的事情均由流程进行操作实现。

那么我们来看看一个流程是如何进行运转的。

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();

}

然后是主要的控制流程流转和申请的接口

/***

[email protected]:处理流程业务的Service

[email protected]:lichao

[email protected]:Oct 10, 201412:02:39 PM

*/

public interfaceFlowMainService {

/***

[email protected]: 用于申请

[email protected]: lichao

[email protected]: Oct 10, 20143:19:07 PM

*@paramapplyable

*@return* @throwsException

*/

public void applyFlow(Applyable applyable) throwsException;

/***

[email protected]: 查找当前所处的流转信息

[email protected]: medees

[email protected]: Oct 13, 20148:56:00 AM

*@paramapplyid 申请源

*@paramapplytype 申请类别

*@return

*/

publicFlowInfoMoving findNowMoving(Long applyid,Dictionary applyType);

/***

[email protected]: 查找某一流程下的所有走过的流程 按创建时间升序排序

[email protected]: lichao

[email protected]: Oct 13, 20141:46:54 PM

*@paramapplyid 申请源

*@paramapplytype 申请类别

*@return

*/

public ListfindAllMoving(Long applyid,Dictionary applyType);

/***

[email protected]: 获取所有变换条件

[email protected]: lichao

[email protected]: Oct 13, 20144:27:41 PM

*@paramnodeid 所处节点的id

*@return

*/

public ListfindNextTransition(Long nodeid);

/***

[email protected]: 得到此节点可以审核的所有用户

[email protected]: lichao

[email protected]: Oct 14, 201410:22:50 AM

*@paramnodeid 节点id

*@paramapplyid 申请源

*@paramapplyUserId 申请人id

*@return

*/

public ListfindNextAppUser(Long nodeid,String transition,Long applyUserId);

/***

[email protected]: 分页查询自己所审批的流程

[email protected]: lichao

[email protected]: Oct 14, 20141:39:50 PM

*@return

*/

public PagefindMyMoving(Pageable pageRequest);

/***

[email protected]: 进行审核的方法

[email protected]: lichao

[email protected]: Oct 15, 20142:11:18 PM

*@parammoving

* @throwsException 如果审核出错则抛出异常

*/

public boolean approval(FlowInfoMoving moving) throwsException;

/***

[email protected]: 查找一个流程的所有流转

[email protected]: lichao

[email protected]: Oct 16, 201411:04:03 AM

*@paramapplyid

*@paramapplytype

*@return

*/

public PagefindAllMoving(Long applyid,Long applytype,Pageable Pageable);

/***

[email protected]: 重新申请

[email protected]: lichao

[email protected]: Oct 17, 20141:43:03 PM

*@return

*/

public void resetApply(Applyable applyable) throwsException;

/***

[email protected]: 是否需要重新申请

[email protected]: lichao

[email protected]: Oct 17, 20141:43:03 PM

*@return

*/

public booleanisNeedReset(Long applyid,Dictionary dic);

}

申请源只要调用此接口中的applyFlow进行申请即可。

具体实现就不在提供了!

原文:https://www.cnblogs.com/libin6505/p/10362633.html

java开发 审核流程思路_java 实现一套流程管理、流转的思路(伪工作流) 【仅供参考】...相关推荐

  1. 新东方java开发待遇_新东方教师薪酬与考核曝光!拿去即用(仅供参考)

    一.教师薪酬设计方案 一.薪酬设计原则 1薪酬设计必须简单且容易操作,去除那些繁琐的规章制度. 2必须能充分调动教师工作积极性. 3 必须能体现多劳多得,能者多劳原则. 4 必须能体现团队协作,互相帮 ...

  2. 《Java EE企业级应用开发教程(SSM)》练习题答案---第一章Spring的基本应用(仅供参考)

    多选题 1.以下有关Spring核心容器的说法正确的是(). A.Spring框架提供了两种核心容器,分别为BeanFactory和ApplicationContext B.BeanFactory由o ...

  3. JAVA后端开发必备软件(仅供参考)

    更新一些个人JAVA开发日常会用到的一些工具,只是为了自己可能会换电脑,或者为新手做一些推荐,日后可能会更新相应软件的安装指南,以及一些安装包资源 idea或者eclipse等编程工具 Visio画流 ...

  4. 项目线上问题应急处理规范(不同公司流程规范不一样,仅供参考)

    前言:整理了一下项目线上问题应急处理规范,仅供参考! 1.1线上报障流程 1.2.目的 为了明确线上事件的报告.应急响应和处理机制,确保能以快速.高效.准确的应急处理能力来保证各类系统的正常运转,当发 ...

  5. 软件测试流程规范简介(不同公司流程规范不一样,仅供参考)

    前言:整理了一下软件测试流程规范简介,仅供参考! 一.流程图概述 二.测试启动阶段(需求分析) 参与软件需求评审.技术评审,以测试的角度分析需求的可测性,可构思将来对测试进行的方法.原则等.更重要的是 ...

  6. 第十四届蓝桥杯校内模拟赛第二期-Java个人题解(仅供参考)

    刚刚结束第十四届蓝桥杯校内模拟赛第二期,在这记录下自己的代码 不保证正确! 不保证正确! 不保证正确! 有问题一起改正!! 题解 2048 代码: package _14届模拟2;public cla ...

  7. Java(面试题准备(非技术面)(仅供参考))

    Java(面试题准备(非技术面)(仅供参考)) 1. 请介绍一下你自己? 姓名.年龄.毕业学校- 突出积极的个性和做事的能力 要有礼貌 2. 你觉得你个性上最大的优点是什么? 乐于助人.关心他人.有一 ...

  8. 【java】 ssm+ssh原生态框架(仅供参考)

    以前刚学框架的时候自己搭建的两个框架,一个是Struts2+Spring+Hibernate-(SSH),还有一个就是Spirng+SpringMVC+Mybatise-(SSM), 其中SSH项目中 ...

  9. 地址解析(仅供参考与学习)<Java>

    地址解析步骤如下: 1.检查是否存在省份 2.如果存在省份,将会检查省份是否明确标注省,自治区,市(直辖市),特别行政区的关键字,如果不存在,将会自动拼接上,便于后边正则匹配 3.检查市级地区是否明确 ...

最新文章

  1. Wifi模块—源码分析Wifi热点扫描(Android P)
  2. Windows Server 2008 WDS实现跨网段实现远程部署
  3. 实用知识点梳理:BGP协议、调制解调技术、路由特点、VOIP、FTP、Cookie、滑动窗口协议与自动重传请求
  4. 在Hyper-v中创建并安装虚拟机
  5. 三星s7不能运行java_在调试模式下启动时Android应用程序崩溃
  6. kafka partition分配_logstash消费kafka数据,partition分配不均衡
  7. axure 浏览器插件_7款超级实用的谷歌浏览器插件
  8. 微信小程序上传照片加水印
  9. Python图像灰度化处理
  10. 《C++ Primer 5th》知识点总结练习题解
  11. TP-LINK_841N_V8路由器硬改升级OpenWRT记
  12. verilog latch
  13. 兔子繁殖问题Java实现
  14. 文化 宝藏 文物 古文
  15. linkerd 本地环境安装
  16. ContentProvider--stable参数
  17. 如何防止过拟合(overfitting)
  18. 过山洞java_山洞历险Java源代码JAVA游戏源码下载
  19. GitHub开源社区 最火的Android开源项目
  20. 三层架构和mvc的区别

热门文章

  1. 【总结】4S汽车维修管理系统ssm框架vuejs项目
  2. LRU算法模拟器(基于Java和VUE前端实现)
  3. webgl_gpgpu_birds 样例分析
  4. 操作系统-时间片轮转调度算法
  5. 用java求水仙花数,适合新手
  6. Java生成PDF文件(Itext篇)
  7. 汇编程序的汇编及运行
  8. 小程序时间戳转换成时间格式
  9. 了解一下ES module 和 Commonjs
  10. 串口通信协议--UART、RS-232、RS-485、RS-422