传智播客JAVA培训OA项目 审批流转模块(未)
做工作,做技术,最主要的就是有一种专研的功能,特别是在学习的初期阶段也很重要,因为,老师永远不可能把所有的知识交给你,就像,你被你母亲生了下来,他手把手的教会了你走路,但是人生的路却是要你自己去走的一样。往日的学校,也仅仅是教会了你做人的道理,或者是学习一个东西的方法。而今,你我走进了社会,社会,很少会有人来教你了,很多东西都得自己去领悟,做人,人与人之间,同事之间 的关系,都需要我们自己去领悟。
我有时候会因为一些困难而心生疲惫,这也人之常情,每一个人都有累的时候,但是如果不能正确的来调节工作,学习,自己或许会越来越受到挑战。希望你也能在这一条路上越走越远,这是他给我的祝福,我也相信,一定会的,和汤阳光老师说的一样,做人比做事更重要。
小知识点:
1.回退。返回到之前的结点,重新执行!JBPM没有直接支持,要自己来实现。所以,要对JBPM的源码有一定了解。
2.流程嵌套。就是子流程。JBPM支持
3.State结点。暂停。一个流程执行时,可以暂停,去执行其它流程。
审批流转:
1.执行审批流转
直接执行是不可能的,因为审批流程,和文档模块。只有这两个才可以。所以先实现如下。(执行审批流程,要用到ProcessDefinition)
2.文档模块管理
3.审批流程管理
4.查询
实现步骤:
1.文档模块管理
a) 分析
b) 设计实体
主键: Long id;
文件名:String fileName;
说明:String description;
扩展名:extension
文件所用的流程:String processName;
文件的路径:String path;
文件存放的方式:
1.可以存到数据库中,bolb类型。
2.可以放在文件中,存一个路径。
c) 编写对应的domain类和DocumentTemplate类。
d) 编写Action类
i. 与之前相比,多了一个下载的方法。
ii. 写上传文件时注意事项:
1. org.apache.commons.io.FilenameUtils;可以直接根据文件全名,取得其中的文件名和扩展名。
2. 防止上传危险文件(.jsp),把上传过来的所有文件都改名。例如用一个随机的字符串。UUID.randomUUID().toString();
小知识点:
1.如果程序中有没有实现的功能,你可以使用一种特别的方式,使用任 列表的方式进行标注:加入:
1.//FIXME
2.//TODO
3.//XXX
3. 打开一个文件件,如果文件夹中的文件太多了,会速度很慢,相信大家都有过这样的经历。当我们上传的文件在一个文件中,如果文件过多时,也会有这种情况,我们要怎么解决这个问题呢?
4. 这儿删除时,也同时要删除上传的文件,因为这个时候这个文件已经没有人引用了,所以,也要删除悼。(但出于历史记录的原因,是不是可以不删除)。解决方法:重写delete,都删除。
5. 下载功能。
a) 要写头文件
//指定为二进制消息
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + name);
b) 编码问题
String name = documentTemplate.getFileName() + "." + documentTemplate.getExtension();
Name = URLEncoder.encode(name,"utf-8");
在做这个的过程中,有一个问题导致异常:
6. 错误未能重现,真失败。
2.审批流程管理
a) 分析 流程实体不用在设置 jbpm提供
b) ProcessDefActionForm
i. FormFile upload; //用于保存要上传的实体
c) 编写Action类
i. 该类的写类同上步几乎相对。需要写service层接口和实现类。但需要注意的时候,jbpm他自己的实体是要用他自己提供的session来操作。而这之前定义 的实现都是我们自己设计的方法。所以,这儿要改进。
ii. JbpmContext 是取得Session的关键。
d) 每一次请求对应一个线程。而同一个线程中的JbpmContext是相同的。而Jbpm自动提供了JbpmContext与线程绑定的功能。
e) 在用HQL查询时,涉及到一个auto-import的属性,默认时,该值为true,但是如果系统出现两个相同的类名,就会出现问题,所以要谨慎采用该属性。
3.执行审批流转