flowable はプロセスのロールバック タスクを実装します

参考記事:
フローアブル承認、次のノードが承認される前に承認を取り消す方法。
Flowable クイック スタート チュートリアル: タスクの拒否とリターン
Flowable 実際の戦闘 (5) Flowable 拒否/戻る 前のステップに戻る/戻る

1. 背景

同社のプロジェクトは自社のフレームワークで実現されており、現在のプロジェクトはフロー可能なワークフローを使用しています。

昨日突然要求が発生しました。センターが承認する前に、会社はタスクを取り下げることができます。例えば、企業が自らの情報を報告する場合、センターはそれに署名してレビューする必要がありますが、突然、企業は報告した情報に問題があることに気付き、この時点で [撤回] ボタンをクリックすることができます。報告された情報を撤回する。(シリアル通常ノードのフォールバック)。

コードの一部は詳細に貼り付けることができないので、主に大まかなアイデアを記録します~~

自分で気づいたので訂正してほしいです~~~ woo woo woo woo woo woo woo woo woo woo woo woo woo.

二、アイデア

1. 現在のタスク ノードを取得します
。 2. 署名されているかどうかを判断します
。 3. 署名されている場合、撤回できないことを示すプロンプトが表示されます。
4. 署名されていない場合は、return タスクを実行します。

//核心
runtimeService.createChangeActivityStateBuilder()
        .processInstanceId(proInstanceId)
        .moveActivityIdsToSingleActivityId(curTaskKeys, targetTaskKey)
        .changeState();

5. タスクに自動的に署名します。
6.ジャンプ先のパスを返す

3.コード

1.FlowableEngineAPI.quash()を実装!!

/**
	 * 撤回任务
	 */
	public DataObject quash(String piid, String taskid, String taskkey) throws AppException{
    
    
		//存最终结果
		DataObject result = DataObject.getInstance();
		
		//判空
		this.isEmpty(piid, "流程实例id不可为空");

		//获取当前任务信息
		Task task = taskService.createTaskQuery().taskId(taskid).singleResult();
		//判断该任务是否被签领
		String assignee = task.getAssignee();
		if (null != assignee){
    
    
			result.put("statu","0");
			result.put("msg","任务已被签领,无法撤回!");
		}else{
    
    
			//获取历史任务节点
			List<HistoricTaskInstance> historicTaskInstanceList = historyService.createHistoricTaskInstanceQuery().processInstanceId(task.getProcessInstanceId()).orderByHistoricTaskInstanceStartTime().asc().list();
			Iterator<HistoricTaskInstance> it = historicTaskInstanceList.iterator();
			//循环节点,获取当前节点的上一节点的key
			String tkey = "";
			while(it.hasNext())    {
    
    
				HistoricTaskInstance his = it.next();
				if (!taskkey.equals(his.getTaskDefinitionKey())){
    
    
					tkey = his.getTaskDefinitionKey();
				}
			}

			//回退(节点跳转)
			runtimeService.createChangeActivityStateBuilder()
				.processInstanceId(piid)
				.moveActivityIdTo(taskkey, tkey)
				.changeState();

			//删除当前任务节点,不知道咋实现

			//返回成功消息
			result.put("statu","1");
			result.put("msg","撤回成功!请尽快完成任务");

		}
		return result;
	}


2.コントローラー層

/**
	 * 撤回任务,并进入相应页面
	 *
	 * @param para
	 * @return
	 * @author: tcy
	 * 时间:2021年12月07日
	 */
	@PostMapping("/quash")
	@ResponseBody
	public DataObject quash(@RequestBody DataObject para) {
    
    
		String piid = para.getString("piid");
		String pdkey = para.getString("pdkey");

		//获取当前任务节点
		DataObject rdo = DataObject.getInstance();
		rdo.put("piid",piid);
		DataObject active = flowableEngineAPI.getActiveTaskListByPiid(rdo);
		DataStore rows = active.getDataStore("rows");
		DataObject row = rows.getRow(0);
		String taskid = row.getString("taskid");//任务id
		String taskkey = row.getString("taskkey");//任务名称

		//执行退回任务
		DataObject result = flowableEngineAPI.quash(piid,taskid,taskkey);

		//自动签领任务
		String statu = result.getString("statu");
		if ("1".equals(statu)){
    
    
			active = flowableEngineAPI.getActiveTaskListByPiid(rdo);
			rows = active.getDataStore("rows");
			taskid = rows.getString(0, "taskid");
			String curruser = SecurityUtils.getUser().getUserId();
			rdo.clear();
			rdo.put("userid", curruser);
			rdo.put("taskid", taskid);
			//签领任务
			flowableEngineAPI.claim(rdo);

			//返回需跳转的路径
			rdo.clear();
			rdo.put("pdkey", pdkey);
			rdo.put("taskkey", active.getDataStore("rows").getString(0, "taskkey"));
			DataObject path = flowableService.getTaskPath(rdo);
			result.put("piid",piid);
			result.put("task_path",path.getString("task_path"));

		}
		return result;
	}

3.フロントエンド

layui.sight.ajaxRequest({
    
    
                    type: 'post',
                    async: true,
                    url: layui.sight.compileUrl('${rc.contextPath}/flowable/quash'),//调用方法路径
                    data: {
    
    //方法需要的参数
                        piid: '${piid}',
                        pdkey: '${pdkey}'
                    },
                    callback: function (data) {
    
    
                    //回调
                        var statu = data.statu;
                        layer.confirm(data.msg + '<br>', {
    
    
                                btn: ['确认']
                            }, function(){
    
    
                            //当可以执行撤回时,刷新页面
                            if ("1" == statu){
    
    
                                var url = layui.sight.compileUrl('${rc.contextPath}' + data.task_path + '?piid=' + data.piid);
                                window.open(url, target = "_self");
                            }else{
    
    
                            //不可以执行撤回时,直接关闭该弹窗
                                return;
                            }
                            }
                        );
                    },
                    failedCallback: function (data) {
    
     }
                });

四、問題

結果のダーティ データ (失効したノード) は削除されません。

おすすめ

転載: blog.csdn.net/qq_42622871/article/details/121787127