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

QQ登录

只需一步,快速开始

查看: 2300|回复: 9

[处理中5] 回退后的流程可以定制吗?

[复制链接]

56

主题

215

帖子

647

积分

高级会员

Rank: 4

积分
647
QQ
发表于 2013-11-27 16:44:21 | 显示全部楼层 |阅读模式
我有一个审批流程:申请人->部门经理->部门总监->预算专员->财务经理->财务总监->副总经理->总经理
如果某张单据流转到“财务总监”的时候被回退到了首环节,这时X5的回退规则中提供了两种返回方式:“原路返回”和“重新流转”。
现在我的需求是:单据被回退后,申请人必须先提交给部门经理和部门总监,再返回到财务总监,进而继续流转。
这样似乎不能简单地用回退规则中的两种返回方式,这种情况,该如何解决?谢谢!

91

主题

13万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
35945
发表于 2013-11-27 17:36:40 | 显示全部楼层
可以不用回退加分支条件做判断实现
7.png
远程的联系方法QQ1392416607,添加好友时,需在备注里注明其论坛名字及ID,公司等信息
发远程时同时也发一下帖子地址,方便了解要解决的问题  WeX5教程  WeX5下载



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

使用道具 举报

发表于 2013-11-27 21:05:02 | 显示全部楼层
可以实现回退的定制,主要是修改回退里面的判断条件,修改processExecute里面的mainActivity.js
if(nodeNum >= 3) {
                        //包括三个节点及三个节点以上的,可作回退处理
//                        alert(processActionType);
                        if("流转" == processActionType) {
                                var executeReturnData = doSetCurrentExecuteData();
                                if (executeReturnData) {
                                        windowEnsure(executeReturnData);
                                        var verdict = executeReturnData.getValueByName("fVerdict");
                                        if("回退" == processActionType){
                                                processEngine.backQuery();
                                        } else if("流转" == processActionType){
                                                if(verdict != '同意') {
                                                        alert("意见为不同意,不能流转!");
                                                        return;
                                                }
                                                windowEnsure();
                                                processEngine.advanceQuery();
                                        }
                                }
                        } else {
                                openReturnDialog();
                        }
                } else {
                        //按照普通的流程走,不需考虑回退
                        var executeReturnData = doSetCurrentExecuteData();
                        if (executeReturnData) {
                                windowEnsure(executeReturnData);
                                var verdict = executeReturnData.getValueByName("fVerdict");
                                if("回退" == processActionType){
                                        processEngine.backQuery();
                                } else if("流转" == processActionType){
                                        if(verdict != '同意') {
                                                alert("意见为不同意,不能流转!");
                                                return;
                                        }
                                        //startupEvaluate();
                                        windowEnsure();
                                        processEngine.advanceQuery();
                                }
                        }
                }
        }

/**
* @author:
* @date:2013-04-03
* @description:点击不同意按钮弹出选择回退方式对话框
* @param
* @return null
* @History
*/
function openReturnDialog() {
        var title = "确认信息";
        var process = "/KYBG/common/process/dialog/backReasonDialog/backReasonDialogProcess";
        var activity = "commonReturnActivity";
        var desWindowPath = "/KYBG/common/process/dialog/backReasonDialog/commonReturnActivity.w";
        var url = desWindowPath + "?process=" + process + "&activity=" + activity;
        var params = {
                        "processActionType" : processActionType
        };
        justep.xbl("wDialogCommonReason").open(params, title, url);
},具体的功能要根据你的需求来了,不会很难的。
回复 支持 反对

使用道具 举报

56

主题

215

帖子

647

积分

高级会员

Rank: 4

积分
647
QQ
 楼主| 发表于 2013-11-28 10:56:39 | 显示全部楼层
jishuang 发表于 2013-11-27 17:36
可以不用回退加分支条件做判断实现

这种方式好像太麻烦了吧,我说财务总监只是举了个例子,其实所有部门总监后面的环节出现回退的时候都是这样处理的,那就是说我要做N多个判断条件,而且部门总监提交的时候,似乎也很难判断当初是谁回退回来的。
回复 支持 反对

使用道具 举报

56

主题

215

帖子

647

积分

高级会员

Rank: 4

积分
647
QQ
 楼主| 发表于 2013-11-28 11:05:24 | 显示全部楼层
lanware_smf 发表于 2013-11-27 21:05
可以实现回退的定制,主要是修改回退里面的判断条件,修改processExecute里面的mainActivity.js
if(nodeNum ...

你的方法似乎是为了解决满足什么条件才可以回退或流转,而不是回退之后流转该如何进行的。

不知道我理解的对不对
回复 支持 反对

使用道具 举报

发表于 2013-11-28 12:04:48 | 显示全部楼层
leechin 发表于 2013-11-28 11:05
你的方法似乎是为了解决满足什么条件才可以回退或流转,而不是回退之后流转该如何进行的。

不知道我理解 ...

回退时的选择的回退方式决定申请人流转后的走向是重新流程还是回到本环节
回复 支持 反对

使用道具 举报

56

主题

215

帖子

647

积分

高级会员

Rank: 4

积分
647
QQ
 楼主| 发表于 2013-11-28 12:23:02 | 显示全部楼层
lanware_smf 发表于 2013-11-28 12:04
回退时的选择的回退方式决定申请人流转后的走向是重新流程还是回到本环节 ...

我的问题是:回退后的流程不是简单的所有环节重新流转或直接返回到本环节,而是回退后要先重新流转部分指定的环节,然后再回到本环节。
回复 支持 反对

使用道具 举报

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
发表于 2013-11-28 14:13:11 | 显示全部楼层
在部门总监环节的流转查询之后事件中写代码判断是否回退过,如果没有回退过,就继续流转,否则修改processControl,将里面的环节和执行者替换为回退环节和执行者
远程的联系方法 QQ 728094812。添加好友时,需要填写论坛账号
发远程时同时也发一下帖子的地址,方便了解要解决的问题

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

使用道具 举报

12

主题

2627

帖子

2866

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2866
发表于 2013-11-28 14:22:44 | 显示全部楼层
本帖最后由 hecr 于 2013-11-28 14:23 编辑

可以在“部门总监”的biz层流转查询后事件中,修改返回的ProcessControl, 如果发现是回退到首环节的模式,则流转到回退的环节, 否则按正常的流程图运行。 代码类似如下:
  1. public static void bizActivity2AfterAdvanceQuery() {
  2.         String rootActivity = "bizActivity1"; //入口环节
  3.         Set<String> items = new HashSet<String>(); //回退后按流程图运行的环节
  4.         items.add("bizActivity1");
  5.         items.add("bizActivity2");
  6.         ActivityInstance startBackAI = getStartBackAI(rootActivity, items);
  7.         if (startBackAI != null){
  8.               modifyProcessControl(startBackAI);
  9.         }
  10. }

  11. private static ActivityInstance getStartBackAI(String rootActivity, Set<String> items){
  12.         ActivityInstance ai = ProcessUtils.getCurrentAI();
  13.         while (true){
  14.                ActivityInstance prevAI = ai.getPrevAI(); //当前场景下,只有一个前序
  15.                if (prevAI == null){
  16.                     break;
  17.                }

  18.               //当前环节是入口环节,且前序环节不在指定的范围内
  19.               if (ai.getActivityID().equals(rootActivity)
  20.                    && prevAI.getTask().getStatus().equals(TaskStatus.RETURNED)
  21.                    && !items.contains(prevAI.getActivityID())){

  22.                   return prevAI;
  23.               }

  24.             ai = prevAI;
  25.        }

  26.        return null;
  27. }

  28. private static void modifyProcessControl(ActivityInstance startBackAI){
  29.         ProcessControl control = new ProcessControl();

  30.         String id = CommonUtils.createGUID();
  31.         RunnableActivity run = new RunnableActivity(startBackAI.getActivityID(), "true", "false", startBackAI.getActivityLabel(), id);
  32.         control.setRunableActivity(run);

  33.       ProcessControlItem item = new ProcessQueryEngine(ProcessUtils.getProcessContext()).createProcessControlItemWithTask(startBackAI.getTask(), TaskStatus.RETURNED, id);
  34.       item.getTask().setCURL(TemplateHelper.getURL(ActionUtils.getRequestContext().getActionContext().getActivity()));

  35.       control.addFlowTo(item);
  36.       ContextHelper.getActionContext().setActionResult(control);
  37. }
复制代码
其中
        String rootActivity = "bizActivity1"; //入口环节
        Set<String> items = new HashSet<String>(); //回退后按流程图运行的环节
        items.add("bizActivity1");
        items.add("bizActivity2");

这两个地方需要改成你自己的环节标识
回复 支持 反对

使用道具 举报

56

主题

215

帖子

647

积分

高级会员

Rank: 4

积分
647
QQ
 楼主| 发表于 2013-12-11 11:05:21 | 显示全部楼层
hecr 发表于 2013-11-28 14:22
可以在“部门总监”的biz层流转查询后事件中,修改返回的ProcessControl, 如果发现是回退到首环节的模式, ...

怎么是流转查询后事件?这样流转的目标人和UI显示的执行人不就是不一样了吗?
可不可以写在流转查询前事件?

还有,如果采用这种方式,是不是在回退规则里要改为“重新流转”?
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-21 13:26 , Processed in 0.069365 second(s), 26 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

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