最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android開發(fā)之a(chǎn)ctiviti節(jié)點(diǎn)跳轉(zhuǎn)

 更新時(shí)間:2016年04月26日 11:28:53   作者:分享牛  
這篇文章主要介紹了Android開發(fā)之a(chǎn)ctiviti節(jié)點(diǎn)跳轉(zhuǎn)的相關(guān)資料,需要的朋友可以參考下

activiti使用的時(shí)候,通常需要跟業(yè)務(wù)緊密的結(jié)合在一起,有些業(yè)務(wù)非常的復(fù)雜,比如一個(gè)簡單的采購流程:流程如下:

 

供應(yīng)商上新商品的時(shí)候,提交商務(wù)審核,商務(wù)審核通過提交運(yùn)營審核,審核失敗退回供應(yīng)商。

運(yùn)營審核成功提交合同簽訂。交運(yùn)營審核審核失敗退回商務(wù)審核或者直接退回供應(yīng)商。

合同簽訂審核通過結(jié)束,合同簽訂審核不通過返回運(yùn)營審核或者退回商務(wù)審核,或者退回供應(yīng)商。

上面的流程就出現(xiàn)了一個(gè)問題,什么問題呢?

我們來觀察一下退回線的問題。

1.商務(wù)審核退回供應(yīng)商上新。

2.運(yùn)營審核可能退回商務(wù)審核,運(yùn)營審核可能退回供應(yīng)商上新。

3.合同簽訂可能退回運(yùn)營審核,合同簽訂可能退回商務(wù)審核,合同簽訂可能退回供應(yīng)商上新。

4....

假如以后我們的流程在添加新的部門審核,是不是我們的退回線更加的多了。其實(shí)就是n!的問題,難道我們沒添加一個(gè)節(jié)點(diǎn),就要畫很多的退回線嗎?這顯然是一個(gè)糟糕的設(shè)計(jì)。oh my god.

存在的問題就是,我們要是想讓我們的流程更加的通用,我們可能在設(shè)計(jì)的時(shí)候,需要添加很多的退回線控制,防止業(yè)務(wù)變化,流程跟起來變化,這就是應(yīng)對了變化,同時(shí)在增加了冗余設(shè)計(jì)。

那有沒有一種更好的方式,能解決上面的問題呢?很顯然這就是我們本章要解決的問題。

1.1.1. activiti節(jié)點(diǎn)跳轉(zhuǎn)實(shí)現(xiàn)

實(shí)現(xiàn)之前,我們考慮幾個(gè)問題。

1.當(dāng)前流程在哪一個(gè)節(jié)點(diǎn)。

2.流程需要跳轉(zhuǎn)的目標(biāo)節(jié)點(diǎn)。

3.跳轉(zhuǎn)到目標(biāo)節(jié)點(diǎn)之后,需要添加變量嗎?有可能需要把,總不能無緣無故的跳轉(zhuǎn)到了目標(biāo)節(jié)點(diǎn)。痕跡肯定要記錄。

4.跳轉(zhuǎn)到目標(biāo)節(jié)點(diǎn),那當(dāng)前節(jié)點(diǎn)配置的任務(wù)監(jiān)聽需要觸發(fā)嗎?(可參考 activiti監(jiān)聽器使用).當(dāng)前節(jié)點(diǎn)跳轉(zhuǎn)到目標(biāo)節(jié)點(diǎn)的時(shí)候,如果當(dāng)前節(jié)點(diǎn)配置了任務(wù)監(jiān)聽業(yè)務(wù),調(diào)轉(zhuǎn)到目標(biāo)節(jié)點(diǎn)之前,這些當(dāng)前的任務(wù)節(jié)點(diǎn)的是否觸發(fā)任務(wù)監(jiān)聽業(yè)務(wù)必須能支持靈活配置。

上面的思考點(diǎn),也是我們接下來需要重點(diǎn)講解的內(nèi)容。那下面就開始我們的設(shè)計(jì)吧。

1.1.1.1. 流程圖

下面我們先定義一個(gè)流程如下圖所示:

 

1.1.1.2. xml

下面我們先定義一個(gè)xml定義如下所示:

<?xml version="1.0" encoding="UTF-8"?> 
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="daling"> 
 <process id="daling" name="name_daling" isExecutable="true" activiti:candidateStarterUsers="a,b,c,d"> 
  <userTask id="usertask2" name="usertask2" activiti:assignee="c"></userTask> 
  <userTask id="usertask3" name="usertask3"></userTask> 
  <sequenceFlow id="flow4" sourceRef="usertask2" targetRef="usertask3"></sequenceFlow> 
  <userTask id="usertask4" name="usertask4"></userTask> 
  <sequenceFlow id="flow5" sourceRef="usertask3" targetRef="usertask4"></sequenceFlow> 
  <userTask id="usertask5" name="usertask5"></userTask> 
  <sequenceFlow id="flow6" sourceRef="usertask4" targetRef="usertask5"></sequenceFlow> 
  <endEvent id="endevent1" name="End"></endEvent> 
  <sequenceFlow id="flow7" sourceRef="usertask5" targetRef="endevent1"></sequenceFlow> 
  <startEvent id="startevent1" name="Start"></startEvent> 
  <sequenceFlow id="flow8" sourceRef="startevent1" targetRef="usertask2"></sequenceFlow> 
 </process> 
 <bpmndi:BPMNDiagram id="BPMNDiagram_daling"> 
  <bpmndi:BPMNPlane bpmnElement="daling" id="BPMNPlane_daling"> 
   <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2"> 
    <omgdc:Bounds height="55.0" width="105.0" x="300.0" y="90.0"></omgdc:Bounds> 
   </bpmndi:BPMNShape> 
   <bpmndi:BPMNShape bpmnElement="usertask3" id="BPMNShape_usertask3"> 
    <omgdc:Bounds height="55.0" width="105.0" x="450.0" y="90.0"></omgdc:Bounds> 
   </bpmndi:BPMNShape> 
   <bpmndi:BPMNShape bpmnElement="usertask4" id="BPMNShape_usertask4"> 
    <omgdc:Bounds height="55.0" width="105.0" x="600.0" y="90.0"></omgdc:Bounds> 
   </bpmndi:BPMNShape> 
   <bpmndi:BPMNShape bpmnElement="usertask5" id="BPMNShape_usertask5"> 
    <omgdc:Bounds height="55.0" width="105.0" x="750.0" y="90.0"></omgdc:Bounds> 
   </bpmndi:BPMNShape> 
   <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1"> 
    <omgdc:Bounds height="35.0" width="35.0" x="900.0" y="100.0"></omgdc:Bounds> 
   </bpmndi:BPMNShape> 
   <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1"> 
    <omgdc:Bounds height="35.0" width="35.0" x="140.0" y="90.0"></omgdc:Bounds> 
   </bpmndi:BPMNShape> 
   <bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4"> 
    <omgdi:waypoint x="405.0" y="117.0"></omgdi:waypoint> 
    <omgdi:waypoint x="450.0" y="117.0"></omgdi:waypoint> 
   </bpmndi:BPMNEdge> 
   <bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5"> 
    <omgdi:waypoint x="555.0" y="117.0"></omgdi:waypoint> 
    <omgdi:waypoint x="600.0" y="117.0"></omgdi:waypoint> 
   </bpmndi:BPMNEdge> 
   <bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6"> 
    <omgdi:waypoint x="705.0" y="117.0"></omgdi:waypoint> 
    <omgdi:waypoint x="750.0" y="117.0"></omgdi:waypoint> 
   </bpmndi:BPMNEdge> 
   <bpmndi:BPMNEdge bpmnElement="flow7" id="BPMNEdge_flow7"> 
    <omgdi:waypoint x="855.0" y="117.0"></omgdi:waypoint> 
    <omgdi:waypoint x="900.0" y="117.0"></omgdi:waypoint> 
   </bpmndi:BPMNEdge> 
   <bpmndi:BPMNEdge bpmnElement="flow8" id="BPMNEdge_flow8"> 
    <omgdi:waypoint x="175.0" y="107.0"></omgdi:waypoint> 
    <omgdi:waypoint x="300.0" y="117.0"></omgdi:waypoint> 
   </bpmndi:BPMNEdge> 
  </bpmndi:BPMNPlane> 
 </bpmndi:BPMNDiagram> 
</definitions>

1.1.1.3. 代碼實(shí)現(xiàn)

package com.daling.ch1.jd; 
import java.util.Iterator; 
import java.util.Map; 
import org.activiti.engine.impl.context.Context; 
import org.activiti.engine.impl.interceptor.Command; 
import org.activiti.engine.impl.interceptor.CommandContext; 
import org.activiti.engine.impl.persistence.entity.ExecutionEntity; 
import org.activiti.engine.impl.persistence.entity.ExecutionEntityManager; 
import org.activiti.engine.impl.persistence.entity.TaskEntity; 
import org.activiti.engine.impl.pvm.process.ActivityImpl; 
/** 
 * 
 * JD節(jié)點(diǎn)的跳轉(zhuǎn) 
 * 分享牛原創(chuàng)(尊重原創(chuàng) 轉(zhuǎn)載對的時(shí)候第一行請注明,轉(zhuǎn)載出處來自分享牛http://blog.csdn.net/qq_30739519) 
 */ 
public class JDJumpTaskCmd implements Command<Void> { 
protected String executionId; 
protected ActivityImpl desActivity; 
protected Map<String, Object> paramvar; 
protected ActivityImpl currentActivity; 
/** 
 * 分享牛原創(chuàng)(尊重原創(chuàng) 轉(zhuǎn)載對的時(shí)候第一行請注明,轉(zhuǎn)載出處來自分享牛http://blog.csdn.net/qq_30739519) 
 */ 
public Void execute(CommandContext commandContext) { 
ExecutionEntityManager executionEntityManager = Context 
.getCommandContext().getExecutionEntityManager(); 
// 獲取當(dāng)前流程的executionId,因?yàn)樵诓l(fā)的情況下executionId是唯一的。 
ExecutionEntity executionEntity = executionEntityManager 
.findExecutionById(executionId); 
executionEntity.setVariables(paramvar); 
executionEntity.setEventSource(this.currentActivity); 
executionEntity.setActivity(this.currentActivity); 
// 根據(jù)executionId 獲取Task 
Iterator<TaskEntity> localIterator = Context.getCommandContext() 
.getTaskEntityManager() 
.findTasksByExecutionId(this.executionId).iterator(); 
while (localIterator.hasNext()) { 
TaskEntity taskEntity = (TaskEntity) localIterator.next(); 
// 觸發(fā)任務(wù)監(jiān)聽 
taskEntity.fireEvent("complete"); 
// 刪除任務(wù)的原因 
Context.getCommandContext().getTaskEntityManager() 
.deleteTask(taskEntity, "completed", false); 
} 
executionEntity.executeActivity(this.desActivity); 
return null; 
} 
/** 
 * 構(gòu)造參數(shù) 可以根據(jù)自己的業(yè)務(wù)需要添加更多的字段 
 * 分享牛原創(chuàng)(尊重原創(chuàng) 轉(zhuǎn)載對的時(shí)候第一行請注明,轉(zhuǎn)載出處來自分享牛http://blog.csdn.net/qq_30739519) 
 * @param executionId 
 * @param desActivity 
 * @param paramvar 
 * @param currentActivity 
 */ 
public JDJumpTaskCmd(String executionId, ActivityImpl desActivity, 
Map<String, Object> paramvar, ActivityImpl currentActivity) { 
this.executionId = executionId; 
this.desActivity = desActivity; 
this.paramvar = paramvar; 
this.currentActivity = currentActivity; 
} 
} 

1.1.1.4. 使用

我們先讓流程運(yùn)轉(zhuǎn)到usertask3節(jié)點(diǎn)的時(shí)候開始測試跳轉(zhuǎn)。

怎么使用上面的JDJumpTaskCmd類呢,直接new JDJumpTaskCmd()調(diào)用,肯定不行了,因?yàn)閍ctiviti引擎程序沒有獲取,肯定報(bào)錯(cuò),正確的的使用方式如下:

1.1.1.4.1. 第一種方式

我們先來觀察一下數(shù)據(jù)庫ACT_RU_TASK表任務(wù)的記錄信息,方便我們的操作,數(shù)據(jù)庫記錄如下圖所示:

 

可以看到當(dāng)前的節(jié)點(diǎn)在usertask3,我們現(xiàn)在把usertask3跳轉(zhuǎn)到usertask5節(jié)點(diǎn),看是否能成功,因?yàn)閡sertask3到usertask5沒有連線,如果成功了,就說明我們這個(gè)方法正確。

執(zhí)行下面的代碼,根據(jù)自己的數(shù)據(jù)庫信息修改相對應(yīng)的值即可。

Map<String, Object> vars = new HashMap<String, Object>(); 
String[] v = { "shareniu1", "shareniu2", "shareniu3", "shareniu4" }; 
vars.put("assigneeList", Arrays.asList(v)); 
//分享牛原創(chuàng)(尊重原創(chuàng) 轉(zhuǎn)載對的時(shí)候第一行請注明,轉(zhuǎn)載出處來自分享牛http://blog.csdn.net/qq_30739519) 
RepositoryService repositoryService = demo.getRepositoryService(); 
ReadOnlyProcessDefinition processDefinitionEntity = (ReadOnlyProcessDefinition) repositoryService 
.getProcessDefinition("daling:29:137504"); 
// 目標(biāo)節(jié)點(diǎn) 
ActivityImpl destinationActivity = (ActivityImpl) processDefinitionEntity 
.findActivity("usertask5"); 
String executionId = "137509"; 
// 當(dāng)前節(jié)點(diǎn) 
  ActivityImpl currentActivity = (ActivityImpl)processDefinitionEntity 
   .findActivity("usertask3"); 
demo.getManagementService().executeCommand( 
new JDJumpTaskCmd(executionId, destinationActivity, vars, 
currentActivity)); 

執(zhí)行上面的代碼之后,我們看一下數(shù)據(jù)庫中的記錄。

 

節(jié)點(diǎn)確實(shí)跳轉(zhuǎn)到了usertask5。ok了這個(gè)方法確實(shí)可以沒問題,下面說一下第二種方式執(zhí)行executeCommand命令。

1.1.1.4.2. 第二種方式

Map<String, Object> vars = new HashMap<String, Object>(); 
String[] v = { "shareniu1", "shareniu2", "shareniu3", "shareniu4" }; 
vars.put("assigneeList", Arrays.asList(v)); 
//分享牛原創(chuàng)(尊重原創(chuàng) 轉(zhuǎn)載對的時(shí)候第一行請注明,轉(zhuǎn)載出處來自分享牛http://blog.csdn.net/qq_30739519) 
  CommandExecutor commandExecutor = taskServiceImpl 
   .getCommandExecutor(); 
  commandExecutor.execute(new JDJumpTaskCmd(executionId, 
   destinationActivity, vars, currentActivity)); 

上面的兩種方式都可以執(zhí)行自定義的Command子類。讀者選擇自己喜歡使用的方式即可。

1.1.2. 小結(jié)

1.任意節(jié)點(diǎn)的跳轉(zhuǎn),前提是節(jié)點(diǎn)必須在模板定義中。

2.任意節(jié)點(diǎn)的跳轉(zhuǎn)暫時(shí)不能跨流程跳轉(zhuǎn)。

3.任意節(jié)點(diǎn)的跳轉(zhuǎn)不需要連線即可、

4.任意節(jié)點(diǎn)的跳轉(zhuǎn)可以實(shí)現(xiàn)回退、轉(zhuǎn)辦、轉(zhuǎn)閱、越級(jí)上報(bào)、一步到底等等功能,關(guān)于這些更多的實(shí)戰(zhàn),我們將在最后的工作流實(shí)戰(zhàn)項(xiàng)目中一步步封裝。使用。

以上所述是小編給大家介紹的activiti節(jié)點(diǎn)跳轉(zhuǎn)的相關(guān)知識(shí),希望對大家有所幫助!

相關(guān)文章

  • AndroidStudio實(shí)現(xiàn)微信界面設(shè)計(jì)

    AndroidStudio實(shí)現(xiàn)微信界面設(shè)計(jì)

    這篇文章帶你通過Androidstudio來實(shí)現(xiàn)微信的基礎(chǔ)界面,微信的界面主要包含了主頁、通訊錄、發(fā)現(xiàn)以及我的賬號(hào)功能區(qū),下文包含了整個(gè)開發(fā)過程,以及解決該問題的過程及思路并提供了源碼
    2021-10-10
  • 淺析KJFrameForAndroid框架如何高效加載Bitmap

    淺析KJFrameForAndroid框架如何高效加載Bitmap

    Bitmap是Android系統(tǒng)中的圖像處理的最重要類之一。用它可以獲取圖像文件信息,進(jìn)行圖像剪切、旋轉(zhuǎn)、縮放等操作,并可以指定格式保存圖像文件。本文主要是從KJFrameForAndroid框架中分析高效加載Bitmap的方法
    2014-07-07
  • Android 應(yīng)用APP加入聊天功能

    Android 應(yīng)用APP加入聊天功能

    本文主要給大家介紹的是如何一步步的實(shí)現(xiàn)Android應(yīng)用APP中加入聊天功能,十分的細(xì)致全面,有相同需求的小伙伴快來參考下吧。
    2015-03-03
  • 基于Android實(shí)現(xiàn)仿QQ5.0側(cè)滑

    基于Android實(shí)現(xiàn)仿QQ5.0側(cè)滑

    本課程將帶領(lǐng)大家通過自定義控件實(shí)現(xiàn)QQ5.0側(cè)滑菜單,課程將循序漸進(jìn),首先實(shí)現(xiàn)最普通的側(cè)滑菜單,然后引入屬性動(dòng)畫與拖動(dòng)菜單效果相結(jié)合,最終實(shí)現(xiàn)QQ5.0側(cè)滑菜單效果。通過本課程大家會(huì)對側(cè)滑菜單有更深層次的了解,通過自定義控件和屬性動(dòng)畫打造千變?nèi)f化的側(cè)滑菜單效果
    2015-12-12
  • Android實(shí)現(xiàn)簡單動(dòng)態(tài)搜索功能

    Android實(shí)現(xiàn)簡單動(dòng)態(tài)搜索功能

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)簡單動(dòng)態(tài)搜索功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Android 中解決Viewpage調(diào)用notifyDataSetChanged()時(shí)界面無刷新的問題

    Android 中解決Viewpage調(diào)用notifyDataSetChanged()時(shí)界面無刷新的問題

    這篇文章主要介紹了Android 中解決Viewpage調(diào)用notifyDataSetChanged()時(shí)界面無刷新的問題的相關(guān)資料,這里提供相應(yīng)的解決辦法,需要的朋友可以參考下
    2017-08-08
  • Android實(shí)現(xiàn)好看的微信聊天氣泡效果

    Android實(shí)現(xiàn)好看的微信聊天氣泡效果

    在聊天類應(yīng)用中,通常用氣泡作為聊天內(nèi)容的背景色,比如微信的聊天背景,別人發(fā)過來的是白色的氣泡,自己發(fā)的是綠色的氣泡。本文將用Android實(shí)現(xiàn)好看的微信聊天氣泡效果,感興趣的可以了解一下
    2022-06-06
  • android實(shí)現(xiàn)圓角矩形背景的方法

    android實(shí)現(xiàn)圓角矩形背景的方法

    這篇文章主要介紹了android實(shí)現(xiàn)圓角矩形背景的方法,以實(shí)例形式分析了Android編程實(shí)現(xiàn)圓角矩形背景的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-10-10
  • Android編程加密算法小結(jié)(AES、Base64、RAS加密算法)

    Android編程加密算法小結(jié)(AES、Base64、RAS加密算法)

    這篇文章主要介紹了Android編程加密算法,結(jié)合實(shí)例分析了AES、Base64及RAS加密算法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • Android通過自定義Activity實(shí)現(xiàn)懸浮的Dialog詳解

    Android通過自定義Activity實(shí)現(xiàn)懸浮的Dialog詳解

    這篇文章主要給大家介紹了關(guān)于Android通過自定義Activity實(shí)現(xiàn)懸浮的Dialog的相關(guān)資料,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),對大家具有一定的參考學(xué)習(xí)價(jià)值,感興趣的朋友們下面來一起看看吧。
    2017-05-05

最新評(píng)論

张掖市| 安多县| 石狮市| 冷水江市| 龙南县| 涡阳县| 双峰县| 太谷县| 会东县| 浦东新区| 马边| 内江市| 花莲县| 临桂县| 深泽县| 新郑市| 柳江县| 南投县| 博罗县| 德令哈市| 尼勒克县| 开封县| 漯河市| 富阳市| 南岸区| 岳阳县| 禹州市| 广州市| 额尔古纳市| 南皮县| 正定县| 米泉市| 澎湖县| 崇仁县| 寿光市| 大埔区| 南部县| 沾化县| 连山| 双流县| 健康|