起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 19116|回复: 22

[结贴] 根据后台配置的流程数据 决定流转走向 动态赋值流转执行者

[复制链接]

649

主题

2068

帖子

3741

积分

论坛元老

Rank: 8Rank: 8

积分
3741
QQ
发表于 2013-9-5 08:46:46 | 显示全部楼层 |阅读模式
版本: X5.2.5 小版本号:
数据库: 服务器操作系统: 应用服务器:
客户端操作系统: 浏览器:
举个例子

  申购单

人力资源部门要申购一套人力资源系统

审批流程如下:

业务环节审批:人力专员写单-人力主管审批-人力经理审批-人力总监审批
协助环节审批:信息部主管审批-信息部经理审批-信息部总监审批
核查环节审批:采购经理审批-采购总监审批---总经理审批

人力专员填写申购单,传一些条件到后台,取得流程处理人相关信息到临时表
注意:前台的条件就是某些字段的值  字段的值不一样取得的流转处理人数据也就不一样
表结构如下:


流程图:


疑惑:人力专员填写完申购单,点流转 要根据什么 条件取得人力主管 执行者信息 给流程环节
人力主管回退给人力专员,人力专员再次点流转,又是根据什么条件重新取得人力主管执行者信息
以上所有环节的逻辑 同上


临时表表结构.jpg
流程图.jpg
IMOM智能制造管理大师
官网:http://www.i-mom.cn
Tel:15905043811

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
发表于 2013-9-5 09:17:48 | 显示全部楼层
在业务审批环节中设置执行者表达式,使用自定义表达式函数实现,在这个自定义表达式函数中,调用findActivityCreator获得当前环节的创建者,然后到数据库中取下一个执行者
远程的联系方法 QQ 728094812。添加好友时,需要填写论坛账号
发远程时同时也发一下帖子的地址,方便了解要解决的问题

如按照该方法解决,请及时跟帖,便于版主结贴
回复 支持 反对

使用道具 举报

发表于 2013-9-5 15:42:19 | 显示全部楼层
本帖最后由 liangyongfei 于 2013-9-6 09:28 编辑

我做了一个例子供您参考:如有不懂之处,请回帖告之
首先添加执行规则,在执行者表达式里边调用一个自定义fn的方法,
C~2FBO7LDUB1@GEU9JG`)~0.jpg
自定义方法的制作请参考快速开发手册。
在java的方法中写如下代码

  1. //返回值必须是 List<OrgUnit>对象
  2.         public static List<OrgUnit> getMyNextPersion() {
  3.                 //根据环节标识得当前环节的创建者
  4.                 List<OrgUnit> nowPertion = null;
  5. //判断是否第一次执行这个环节,如果还没执行过,则找到前一个环节的执行者
  6.                 if(ProcessUtils.findActivityCreator("businessActivity2").size()<1){
  7.                         nowPertion = ProcessUtils.findActivityExecutor("businessActivity1");
  8.                 }
  9.                 else{
  10.                         nowPertion = ProcessUtils.findActivityExecutor("businessActivity2");
  11.                 }

  12.                 String[] str = nowPertion.get(0).getFName().split("/");
  13. //的到执行者的名字
  14.                 String nowName = str[str.length-1];
  15.                
  16.                 //审批类型
  17.                 String splx = "";
  18.                 //处理人级别
  19.                 int clrjb = -1;
  20.                 //下一个执行者的名称
  21.                 String nextName = null;
  22.                 //下一个执行者的ID
  23.                 String id = null;

  24.                 //要返回的组织单元
  25.                 List<OrgUnit> orgUnit = null;
  26.                 try {
  27.                         //根据当前环节执行者找到当前执行者的业务类型和处理级别
  28.                         String KsqlGW = "select MY_RYB.fSPLX as splx,MY_RYB.fCLRJB as clrjb FROM MY_RYB MY_RYB where MY_RYB.fRYMC='" +nowName+ "'";
  29.                         Table table1 = KSQL.select(KsqlGW, null, "/myDemo/liucheng/data", null);
  30.                         Iterator<Row> rows = table1.iterator();
  31.                         Row row;
  32.                         while(rows.hasNext()){
  33.                                 row = rows.next();
  34.                                 splx = row.getValue("splx").toString();
  35.                                 clrjb = Integer.parseInt(row.getValue("clrjb").toString());
  36.                         }
  37.                         

  38.                         //根据业务类型和处理级别得到下一个执行者名称和人员的ID,我自己建的表里存了人的id,如果没有ID,需要自己查得。
  39.                         String Ksql = "select MY_RYB.fRYMC as name,MY_RYB.fRYID as id FROM MY_RYB MY_RYB where MY_RYB.fSPLX='" + splx + "' and MY_RYB.fCLRJB>'"
  40.                                         + clrjb + "' order by MY_RYB.fCLRJB asc LIMIT 0, 1";         
  41.                         Table table2 = KSQL.select(Ksql, null, "/myDemo/liucheng/data", null);
  42.                         Iterator<Row> rows2 = table2.iterator();
  43.                         Row row2;
  44.                         while(rows2.hasNext()){
  45.                                 row2 = rows2.next();
  46.                                 nextName = row2.getValue("name").toString();
  47.                                 id = row2.getValue("id").toString();
  48.                         }
  49.                         

  50.                         //根据ID得到下一个执行者返回值OrgUnit列表对象
  51.                         if(id != null){
  52.                                 orgUnit = OrgUtils.findOrgUnitsByID(id);
  53.                                 
  54.                         }
  55.                         

  56.                 } catch (Exception e) {
  57.                         throw new RuntimeException(e.getMessage());
  58.                 }
  59.                 return orgUnit;
  60.         }
复制代码
我做的这个案例只是做了第一个审批环节,当流转到下一个审批环节时,您可以从数据库中拿出处理级别最低的那个人作为当前环节的执行者
您可以为这个java方法添加三个参数,前一个执行环节的ID,当前环节的ID,审批类型,
执行第一个审批环节时,只传:前一个执行环节的ID,当前环节的ID。判断,如果前一个执行者有值,并且本环节没有执行过,则通过得到前一个执行者,来查得当前的执行者。
执行后边的审批环节时,只传:当前环节的ID,审批类型。判断,如果前一个执行环节ID没传值,为null,并且本环节没有执行过,根据 ‘审批类型’找到处理级别最低的人当做这个审批环节的第一个执行者

如果本环节已经执行过了,则根据本环节的上一次执行者得到当前的执行者
qq:1912779713
WeX5教程--WeX5下载
回复 支持 反对

使用道具 举报

649

主题

2068

帖子

3741

积分

论坛元老

Rank: 8Rank: 8

积分
3741
QQ
 楼主| 发表于 2013-9-5 17:06:49 | 显示全部楼层
liangyongfei 发表于 2013-9-5 15:42
我做了一个例子供您参考:如有不懂之处,请回帖告之
首先添加执行规则,在执行者表达式里边调用一个自定义f ...

谢谢
看了 代码 好像 是很符合 需求
根据环节找 环节创建者 findActivityCreator
/判断是否第一次执行这个环节,如果还没执行过,则找到前一个环节的执行者

执行者是从流程权限表 根据条件 取出来 塞到另一个 临时表 假设取出来有7条数据 就需要 7个人审批
7条数据有区分 业务部门的执行者  核查部门的执行者 协助部门的执行者
每次流程流转之前 都应该 根据条件从这个临时表取执行者 OrgUnit
IMOM智能制造管理大师
官网:http://www.i-mom.cn
Tel:15905043811
回复 支持 反对

使用道具 举报

649

主题

2068

帖子

3741

积分

论坛元老

Rank: 8Rank: 8

积分
3741
QQ
 楼主| 发表于 2013-9-5 17:08:25 | 显示全部楼层
lbx888 发表于 2013-9-5 17:06
谢谢
看了 代码 好像 是很符合 需求
根据环节找 环节创建者 findActivityCreator

不是 特别符合我的需求
IMOM智能制造管理大师
官网:http://www.i-mom.cn
Tel:15905043811
回复 支持 反对

使用道具 举报

649

主题

2068

帖子

3741

积分

论坛元老

Rank: 8Rank: 8

积分
3741
QQ
 楼主| 发表于 2013-9-5 17:13:47 | 显示全部楼层
lbx888 发表于 2013-9-5 17:08
不是 特别符合我的需求

我的思路是
如果是开始环节填写单据
判断是否开始环节
如果是开始环节的话 selet top 1 from 权限表 order by 权限级别

流转后 就要把 这个执行者的数据 从临时表更新为 占用状态 回退后又得启用 才能再次流转给他
想过这么处理 会遇到很多 不可预测问题了
IMOM智能制造管理大师
官网:http://www.i-mom.cn
Tel:15905043811
回复 支持 反对

使用道具 举报

649

主题

2068

帖子

3741

积分

论坛元老

Rank: 8Rank: 8

积分
3741
QQ
 楼主| 发表于 2013-9-5 17:18:33 | 显示全部楼层
liangyongfei 发表于 2013-9-5 15:42
我做了一个例子供您参考:如有不懂之处,请回帖告之
首先添加执行规则,在执行者表达式里边调用一个自定义f ...

您可以从数据库中拿出处理级别最低的那个人作为当前环节的执行者
那你是传入当前这个人的岗位级别 与数据库校对??
IMOM智能制造管理大师
官网:http://www.i-mom.cn
Tel:15905043811
回复 支持 反对

使用道具 举报

发表于 2013-9-5 17:25:41 | 显示全部楼层
lbx888 发表于 2013-9-5 17:18
您可以从数据库中拿出处理级别最低的那个人作为当前环节的执行者
那你是传入当前这个人的岗位级别 与数据 ...

我刚刚更新了帖子,传参就可以解决问题,您再慢慢参考一下
qq:1912779713
WeX5教程--WeX5下载
回复 支持 反对

使用道具 举报

649

主题

2068

帖子

3741

积分

论坛元老

Rank: 8Rank: 8

积分
3741
QQ
 楼主| 发表于 2013-9-6 08:36:00 | 显示全部楼层
liangyongfei 发表于 2013-9-5 17:25
我刚刚更新了帖子,传参就可以解决问题,您再慢慢参考一下

当某个人管理多个部门
取下个环节执行者会有问题
888.jpg
IMOM智能制造管理大师
官网:http://www.i-mom.cn
Tel:15905043811
回复 支持 反对

使用道具 举报

发表于 2013-9-6 08:48:24 | 显示全部楼层
本帖最后由 liangyongfei 于 2013-9-6 08:51 编辑
lbx888 发表于 2013-9-6 08:36
当某个人管理多个部门
取下个环节执行者会有问题

上边案例中用代码
  1. String[] str = nowPertion.get(0).getFName().split("/");
复制代码
会得到全路径各个字段的数组,里边就含有部门,您可以截取出来,然后在返回前先判断部门是否一样即可
qq:1912779713
WeX5教程--WeX5下载
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2024-5-10 03:23 , Processed in 0.096968 second(s), 28 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表