参考記事:
フローアブル承認、次のノードが承認される前に承認を取り消す方法。
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) {
}
});
四、問題
結果のダーティ データ (失効したノード) は削除されません。