任務(wù)配置頁簽是人工任務(wù)節(jié)點中最為重要的屬性配置頁簽,在這個配置頁簽當(dāng)中,可以配置當(dāng)前節(jié)點生成任務(wù)的名稱、處理任務(wù)的URL、是否為會簽任務(wù)、任務(wù)處理人等信息。如下圖所示。
我們先從第一部分開始,第一部分是讓我們配置當(dāng)前人工任務(wù)節(jié)點生成任務(wù)時的一些基本屬性的,這其中,任務(wù)名稱與URL兩個屬性我們在開始節(jié)點已經(jīng)有過介紹,這里的這兩個屬性與開始節(jié)點任務(wù)配置的那兩個完成相同,第三個屬性是任務(wù)類型,從下拉框中可以看到,任務(wù)類型有兩種,分別是普通任務(wù)與會簽任務(wù),默認(rèn)就是普通任務(wù)。
當(dāng)我們把任務(wù)類型改為會簽任務(wù)是,第二部分灰掉的會簽任務(wù)完成規(guī)則就變的可用,這就表示當(dāng)前人工任務(wù)節(jié)點在生成任務(wù)時將以會簽任務(wù)的形式創(chuàng)建,這里需要指出的時,如果把任務(wù)類型改為會簽任務(wù),那么就需要在第三部分任務(wù)處理人任務(wù)當(dāng)中至少要保證運行時有超過一個人來處理當(dāng)前任務(wù),這樣每個任務(wù)處理人都有對應(yīng)的任務(wù)生成,默認(rèn)每個任務(wù)處理人都必須完成自己的會簽任務(wù),流程實例才能離開當(dāng)前人工任務(wù)節(jié)點向下流轉(zhuǎn)。在任務(wù)類型為會簽任務(wù),同時任務(wù)處理人超過一個人時,默認(rèn)所有人都必須完成自己的會簽任務(wù)流程才能繼續(xù),如果想改變這種默認(rèn)執(zhí)行方式那么就需要修改第二個會簽任務(wù)完成規(guī)則部分。第二部分會簽任務(wù)完成規(guī)則共有五個選項,其各自含義如下表所示。屬性名 | 類型 | 描述 |
所有任務(wù)全部完成 | 無 | 默認(rèn)值,也就是當(dāng)前人工任務(wù)節(jié)點產(chǎn)生的所有會簽任務(wù)全部完成后流程才能繼續(xù)向下流轉(zhuǎn)。 |
完成任務(wù)數(shù) | 數(shù)字 | 當(dāng)流程會簽任務(wù)完成數(shù)必須要大于等于當(dāng)前數(shù)字的值,流程才能繼續(xù)向下流轉(zhuǎn)。 |
完成百分比 數(shù)字 當(dāng)流程會簽任務(wù)完成數(shù)的百分比必須要大于等于當(dāng)前數(shù)字的值,流程才能繼續(xù)向下流轉(zhuǎn)。 | ||
表達(dá)式 | Boolean類型 | 指定一個表達(dá)式,要求當(dāng)前表達(dá)式的值必須要返回一個Boolean類型,如果返回true,那么流程將繼續(xù)向下流轉(zhuǎn),其它未完成的會簽任務(wù)將會被取消。如定義表達(dá)式為“${approveCount>2?true:false}”,這個表達(dá)式就表示當(dāng)approveCount這個流程變量值大于2時,返回true,否則返回false。每個會簽任務(wù)完成時都會解析這個表達(dá)式的值是否返回true,如果是流程將繼續(xù)向下流轉(zhuǎn),否則流程將繼續(xù)等待。 |
指定Bean | 字符串 | 指定一個實現(xiàn)了com.bstek.uflo.process.handler.CountersignHandler接口的類配置到spring當(dāng)中后的bean的id,運行時引擎會找到這個bean,執(zhí)行CountersignHandler接口實現(xiàn)類的handle方法,如果該訪問返回true,流程將繼續(xù)向下流轉(zhuǎn),否則流程將繼續(xù)等待。 在指定Bean時,除了可以手工輸入外,還可以通過右邊的“選擇”按鈕來連接遠(yuǎn)程包含uflo-console模塊的應(yīng)用服務(wù),我們只需要從中選擇一個合適的bean的id即可,彈出窗口的URL值格式如下: http://localhost:8080/uflo-test/dorado/uflo/list.handler |
屬性名 | 類型 | 描述 |
流程發(fā)起人 | 無 | 用當(dāng)前流程實例的發(fā)起人來作為當(dāng)前人工任務(wù)產(chǎn)生的任務(wù)的任務(wù)處理人,這樣無論任務(wù)類型是什么,只會有一個任務(wù)產(chǎn)生,因為只有一個任務(wù)處理人。 |
指定泳道 | 字符串 | 指定一個在流程模版級別定義的泳道的值為作為當(dāng)前任務(wù)的處理人,這樣,如果泳道的運行時值是一個集合類型,同時任務(wù)類型又是會簽類型,那么就會產(chǎn)生多個任務(wù),如果是普通任務(wù),那么產(chǎn)生的就是競爭任務(wù)。 |
EL表達(dá)式 | 字符串 | 指定一個表達(dá)式的值為作為當(dāng)前任務(wù)的處理人,這樣,如果表達(dá)式的值是一個集合類型,同時任務(wù)類型又是會簽類型,那么就會產(chǎn)生多個任務(wù),如果是普通任務(wù),那么產(chǎn)生的就是競爭任務(wù)。 |
字符串 | 指定一個實現(xiàn)了com.bstek.uflo.process.handler.AssignmentHandler接口并配置到spring中的bean的id作為當(dāng)前任務(wù)的處理人,這樣,如果該接口返回值是一個集合類型,同時任務(wù)類型又是會簽類型,那么就會產(chǎn)生多個任務(wù),如果是普通任務(wù),那么產(chǎn)生的就是競爭任務(wù)。在指定Bean的值時,除了可以手工輸入目標(biāo)bean的id,還可以通過右邊的“選擇”按鈕來選擇一個在服務(wù)器已配置到spring中該接口的bean的id,彈出窗口的URL值格式如下: http://localhost:8080/uflo-test/dorado/uflo/list.handler | |
指定參與者 | 列表 | 指定參與者這種任務(wù)處理人分配方式最為復(fù)雜,它需要與包含uflo-console模塊的已啟動的應(yīng)用建立連接,通過訪問下面格式的URL, http://localhost:8080/uflo-test/dorado/uflo/list.assignee.provider 加載所有實現(xiàn)了com.bstek.uflo.process.assign.AssigneeProvider接口任務(wù)處理人提供類,關(guān)于AssigneeProvider接口見本小節(jié)后半部分描述。 |
關(guān)于任務(wù)處理人分配,這里我們需要重點關(guān)注一下,在UFLO當(dāng)中,對于任務(wù)用戶系統(tǒng)的組織機(jī)構(gòu)員工信息,沒有任何要求,任何類型的用戶組織機(jī)構(gòu)信息都可以通過這里的指定參與者與我們的任務(wù)處理人分配關(guān)聯(lián)起來。在指定參與者這種任務(wù)處理人分配方式當(dāng)中,我們的設(shè)計器需要連接遠(yuǎn)程包含包含uflo-console模塊的已啟動的應(yīng)用,通過訪問指定的URL,實現(xiàn)加載所有實現(xiàn)了com.bstek.uflo.process.assign.AssigneeProvider接口的類,該接口源碼如下。
AssigneeProvider類源碼
import java.util.Collection;
/**
* @author Jacky.gao
* @since 2013年8月17日 */
public interface AssigneeProvider { /**
* 設(shè)計器層面是否要用樹形結(jié)構(gòu)進(jìn)行展示
* @return 返回true,表示設(shè)計器會用樹形加載當(dāng)前任務(wù)處理人列表 */
boolean isTree(); /**
* @return 返回當(dāng)前任務(wù)處理人提供者名稱,比如員工列表,部門列表等
*/
String getName(); /**
* 分頁方式查詢返回具體的任務(wù)處理人,可以是具體的人,也可以是部門等之類容器型對象 * @param pageQuery
* @param parentId
*/
void queryEntities(PageQuery<Entity> pageQuery,String parentId); /**
* 根據(jù)指定的處理人ID,返回具體的任務(wù)處理人用戶名
* @param entityId 處理人ID,可能是一個用戶的用戶名,這樣就是直接返回這個用戶名,也可能是一個部門的ID,那么就是返回這個部門 下的所有用戶的用戶名等
* @return
*/
Collection<String> getUsers(String entityId); /**
* @return 是否禁用當(dāng)前任務(wù)處理人提供器
*/
boolean disable();
}
該接口中所有方法的描述上面的代碼當(dāng)中都進(jìn)行的詳細(xì)的描述,可以看到,它并不要求返回的是一個用戶還是一個部門,它可以是任何一種我們業(yè)務(wù)系統(tǒng)當(dāng)中可能的組織機(jī)構(gòu)信息,所以我們說這種方式在與我們的業(yè)務(wù)系統(tǒng)結(jié)合時是足夠靈活的,開發(fā)人員在實現(xiàn)這個接口后,只需要將其配置到Spring當(dāng)中,就可以在我們的設(shè)計器當(dāng)中看到并使用它了。
在UFLO當(dāng)中,默認(rèn)我們提供了兩個默認(rèn)的AssigneeProvider接口的實現(xiàn)類,分別是com.bstek.uflo.process.assign.impl.DeptAssigneeProvider及com.bstek.uflo.process.assign.impl.UserAssigneeProvider,這兩個實現(xiàn)類分別代表兩種不同類型的任務(wù)處理人提供者,有興趣的開發(fā)人員可以查詢它們的源碼,以學(xué)習(xí)AssigneeProvider的具體寫法。
在任務(wù)處理人配置當(dāng)中,還有最后一個屬性,那就是“允許上一節(jié)為當(dāng)前節(jié)點指定任務(wù)處理人”,如下圖所示。一旦該屬性勾選,那么業(yè)務(wù)流程開發(fā)中,允許在其它人工任務(wù)處理節(jié)點中為當(dāng)前節(jié)點指定一個或多個具體的任務(wù)處理人,在具體操作的時候需要通過TaskClient接口提供的saveTaskAppointor方法實現(xiàn)。
更多建議: