在我們的工作流系統裡已經有工作移交的功能,工作移交常用于使用者離職、異動、崗位變化、長期不在崗位等情況,将已經配置設定給該使用者的工作移交給其他使用者。移交的本質是更改正在審批中的任務的審批人。而委托和轉交功能中的轉交功能與移交相似,移交功能由管理者發起,而轉交則是由目前審批人主動發起的改變審批的行為。在日常運維中,經常出現類似這樣的場景,某一工作被錯誤的移交到我手裡,或者是我現在已經不辦理類似流程了,我想主動的将該流程轉給他人辦理,這就是轉交。另外,使用者請假、外出、出差或針對某些低級别的流程(按照流程規定需要高層審批,比如總監級的請假單、加班單會由越級上司進階副總裁審批,而進階副對類似的單子不願意去審批)希望委托他人審批,這即是一種事前的委托,而轉交或轉辦也被稱為審批中的委托。
在中國特色的工作流系統中,委托與轉交功這樣較常見。以下是我對委托與轉交功能的基本定義:
1.首先在t_bpm_process_task中需增加委托人和轉交人,同理将審批人改變為被委托人或被轉交人;
2.該功能由該任務的審批人主動發起;
3.委托人資料(被委托人、委托時間)來源暫定為請假表的代理人及請假的開始、結束時間;
4.所有單據均可委托;
5.轉交是目前審批人将該任務的審批權移交他人;
6.被轉交人和被委托人不允許再将任務轉交或委托他人;
7.我的工作中新增兩個标簽,我轉交和我委托,轉交人或委托人可以通過這兩個子產品檢視自己轉交或委托的任務的辦理情況
以上功能為必要功能;
另外,還可增加更豐富的委托設定資料,比如
1.被委托人可以設定自己不允許被委托;
2.委托任務可以設定為是否允許轉委托;
3.允許被委托或被轉交人在委托/轉交人恢複工作後仍未辦理結束的任務退回委托/轉交人;
在實際編碼的過程中,對一些未清晰的需求進一步明确:
1.關于搶辦的轉交功能,搶辦點選轉交相當于jbpm4中候選功能的pick,即将搶辦的任務先隻歸到自己名下,然後再進行轉交,是以轉交後暫定為隻有被轉交人有審批權限;
2.非OA任務不準轉交;
3.改變審批人、加簽等情況不自動轉給被委托人;
4.搶辦的暫無檢視委托任務辦理詳情;
5.菜單表中需增加我轉交我委托的菜單
我們先看看實作轉交和委托所需要的表結構,實際是任務表,增加了兩個字段用于表示委托人和轉交人,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<code><</code><code>resultMap</code> <code>type</code><code>=</code><code>"com.fx.oa.module.bpm.workflow.api.shared.domain.ProcessTaskEntity"</code> <code>id</code><code>=</code><code>"TaskResultMap"</code><code>></code>
<code> </code><code><</code><code>id</code> <code>property</code><code>=</code><code>"id"</code> <code>column</code><code>=</code><code>"id"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"processExecutionId"</code> <code>column</code><code>=</code><code>"processExecutionId"</code> <code>jdbcType</code><code>=</code><code>"VARCHAR"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"processDefineId"</code> <code>column</code><code>=</code><code>"processDefineId"</code> <code>jdbcType</code><code>=</code><code>"VARCHAR"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"processDefineName"</code> <code>column</code><code>=</code><code>"processDefineName"</code> <code>jdbcType</code><code>=</code><code>"VARCHAR"</code><code>/> </code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"activityName"</code> <code>column</code><code>=</code><code>"activityName"</code> <code>jdbcType</code><code>=</code><code>"VARCHAR"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"finishTime"</code> <code>column</code><code>=</code><code>"finishTime"</code> <code>jdbcType</code><code>=</code><code>"TIMESTAMP"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"timeConsuming"</code> <code>column</code><code>=</code><code>"timeConsuming"</code> <code>jdbcType</code><code>=</code><code>"BIGINT"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"fromTaskId"</code> <code>column</code><code>=</code><code>"fromTaskId"</code> <code>jdbcType</code><code>=</code><code>"VARCHAR"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"fromTaskName"</code> <code>column</code><code>=</code><code>"fromTaskName"</code> <code>jdbcType</code><code>=</code><code>"VARCHAR"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"taskId"</code> <code>column</code><code>=</code><code>"taskId"</code> <code>jdbcType</code><code>=</code><code>"VARCHAR"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"transTo"</code> <code>column</code><code>=</code><code>"transTo"</code> <code>jdbcType</code><code>=</code><code>"VARCHAR"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"status"</code> <code>column</code><code>=</code><code>"status"</code> <code>jdbcType</code><code>=</code><code>"VARCHAR"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"preProcessTaskId"</code> <code>column</code><code>=</code><code>"preProcessTaskId"</code> <code>jdbcType</code><code>=</code><code>"VARCHAR"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"description"</code> <code>column</code><code>=</code><code>"description"</code> <code>jdbcType</code><code>=</code><code>"VARCHAR"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"creatorName"</code> <code>column</code><code>=</code><code>"creatorName"</code> <code>jdbcType</code><code>=</code><code>"VARCHAR"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"createTime"</code> <code>column</code><code>=</code><code>"createTime"</code> <code>jdbcType</code><code>=</code><code>"TIMESTAMP"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"modifyTime"</code> <code>column</code><code>=</code><code>"modifyTime"</code> <code>jdbcType</code><code>=</code><code>"TIMESTAMP"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"createUserCode"</code> <code>column</code><code>=</code><code>"createUserCode"</code> <code>jdbcType</code><code>=</code><code>"VARCHAR"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"modifyUserCode"</code> <code>column</code><code>=</code><code>"modifyUserCode"</code> <code>jdbcType</code><code>=</code><code>"VARCHAR"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"entrustedUserCode"</code> <code>column</code><code>=</code><code>"entrustedUserCode"</code> <code>jdbcType</code><code>=</code><code>"VARCHAR"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"substituteUserCode"</code> <code>column</code><code>=</code><code>"substiuteUserCode"</code> <code>jdbcType</code><code>=</code><code>"VARCHAR"</code><code>/> </code>
<code> </code><code></</code><code>resultMap</code><code>></code>
我們先來看轉交功能。對于前端頁面我們直接使用單選的人員選擇器,選中某使用者後,點選确定後進入轉交的處理,代碼如下:
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<code>/**</code>
<code> </code><code>* raid task to other people</code>
<code> </code><code>* @author chao.gao</code>
<code> </code><code>* @date 2015-3-11 上午11:39:04</code>
<code> </code><code>* @see com.gaochao.oa.module.bpm.workflow.api.server.service.IProcessActivityService#raidTo(com.gaochao.oa.module.bpm.workflow.api.shared.dto.FlowRunTime, com.gaochao.oa.module.bpm.workflow.api.shared.vo.TaskVo)</code>
<code> </code><code>* @param flowRunTime</code>
<code> </code><code>* @param taskVo</code>
<code> </code><code>*/</code>
<code> </code><code>@Override</code>
<code> </code><code>public</code> <code>boolean</code> <code>raidTo(FlowRunTime flowRunTime, TaskVo task) {</code>
<code> </code><code>if</code><code>(StringUtils.isNotEmpty(flowRunTime.getCurrentUser())){</code>
<code> </code><code>ProcessExecutionEntity processExecutionEntity = processExecutionService.queryProcessExecutionByPkValue(flowRunTime.getPkValue());</code>
<code> </code>
<code> </code><code>List<Task> list = jbpmOperatorService.getTasksByProcessInstanceId(processExecutionEntity.getProcessInstanceId()); </code>
<code> </code><code>processExecutionService.changePeople(flowRunTime); </code>
<code> </code><code>MailSettingEntity mailSetting = mailSettingService.queryMailSetting(); </code>
<code> </code><code>Map<String, List<MailblackwhitelistEntity>> mailBlackWhiteListMap = mailblackwhitelistService.queryMailBlackWhiteList();</code>
<code> </code><code>//設定流程處理ID</code>
<code> </code><code>flowRunTime.setProcessExecutionId(processExecutionEntity.getId());</code>
<code> </code><code>for</code><code>(</code><code>int</code> <code>i=</code><code>0</code><code>;i<list.size();i++){</code>
<code> </code><code>Task task1 = list.get(i);</code>
<code> </code><code>if</code><code>(task1.getId().equals(task.getTaskId())){</code>
<code> </code><code>task.setTaskId(task1.getId());</code>
<code> </code><code>processTaskService.raidTo(task);</code>
<code> </code><code>//設定任務Id</code>
<code> </code><code>flowRunTime.setNextTaskId(task1.getId());</code>
<code> </code><code>//經辦人</code>
<code> </code><code>final</code> <code>String assign = flowRunTime.getCurrentUser();</code>
<code> </code><code>jbpmOperatorService.assignTask(task1.getId(), assign);</code>
<code> </code>
<code> </code><code>//發送郵件</code>
<code> </code><code>EmailUtil.sendMail2Proxy(assign, flowRunTime, mailSetting, mailBlackWhiteListMap);</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
<code> </code><code>}</code><code>else</code><code>{</code>
<code> </code><code>throw</code> <code>new</code> <code>ProcessActivityException(</code><code>"沒有選擇人員"</code><code>);</code>
<code> </code><code>}</code>
<code> </code>
<code> </code><code>return</code> <code>true</code><code>;</code>
<code> </code><code>}</code>
在以上的代碼中,共有三處引用,分别是jbpm配置設定任務、更新擴充任務清單和向轉交的審批人發送郵件。我們着重看一下配置設定任務:
<code> </code><code>* 配置設定任務</code>
<code> </code><code>* @date 2013-10-9 下午7:18:31</code>
<code> </code><code>* @param taskId 任務Id</code>
<code> </code><code>* @param userId 使用者</code>
<code> </code><code>public</code> <code>void</code> <code>assignTask(String taskId,String userId){</code>
<code> </code><code>UserEntity userEntity = userService.queryUserByUserCode(userId);</code>
<code> </code><code>if</code><code>(userEntity == </code><code>null</code><code>){</code>
<code> </code><code>throw</code> <code>new</code> <code>ProcessActivityException(</code><code>"流程引擎運作錯誤:審批使用者異常!"</code><code>);</code>
<code> </code><code>processEngine.getTaskService().assignTask(taskId,userId);</code>
在更新擴充任務清單中,我們會将選中的使用者用作目前任務的審批人,同時将轉交人指派為目前使用者,即
<code>substituteUserCode=OAUserContext.getUserCode;</code>
下面介紹一下委托,委托是一種事前的工作委托,即前一步使用者在将工作下發時,即将任務下發給工作的代理人,這裡需要配合授權子產品。授權子產品的核心字段是委托人工号、被委托人工号和委托單号。如下:
<code><</code><code>resultMap</code> <code>type</code><code>=</code><code>"com.fx.oa.module.auth.authorize.api.shared.domain.AuthorizeEntity"</code> <code>id</code><code>=</code><code>"authorizeObject"</code><code>></code>
<code> </code><code><</code><code>id</code> <code>property</code><code>=</code><code>"id"</code> <code>column</code><code>=</code><code>"id"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"staffId"</code> <code>column</code><code>=</code><code>"staff_id"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"staffName"</code> <code>column</code><code>=</code><code>"staff_name"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"authTime"</code> <code>column</code><code>=</code><code>"auth_time"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"pstaffId"</code> <code>column</code><code>=</code><code>"p_staff_id"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"pstaffName"</code> <code>column</code><code>=</code><code>"p_staff_name"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"authorizeStart"</code> <code>column</code><code>=</code><code>"authorize_start"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"authorizeEnd"</code> <code>column</code><code>=</code><code>"authorize_end"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"active"</code> <code>column</code><code>=</code><code>"active"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"failureTime"</code> <code>column</code><code>=</code><code>"failure_time"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"scopeKey"</code> <code>column</code><code>=</code><code>"scope_key"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"scopeName"</code> <code>column</code><code>=</code><code>"scope_name"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"remarks"</code> <code>column</code><code>=</code><code>"remarks"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"define1"</code> <code>column</code><code>=</code><code>"define1"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"define2"</code> <code>column</code><code>=</code><code>"define2"</code><code>/></code>
<code> </code><code><</code><code>result</code> <code>property</code><code>=</code><code>"define3"</code> <code>column</code><code>=</code><code>"define3"</code><code>/></code>
<code> </code><code></</code><code>resultMap</code><code>></code>
這種事前的委托展現在根據審批人設定規則篩選出審批人後,再根據審批人清單及授權設定将審批人及代理人顯示給使用者。
<a href="http://s3.51cto.com/wyfs02/M02/5B/5F/wKiom1UHfPuB4rmIAADxzfBN91A607.jpg" target="_blank"></a>
後端的處理代碼如下,這段代碼主要實作這樣一個功能,将審批人清單userList周遊看是否在授權表中存在活躍的授權,然後将被授權也就是被委托人拿出,組成一個新的list傳回。
<code> </code><code>* get the final assignee based authorization</code>
<code> </code><code>* TODO(方法較長的描述說明、方法參數的具體涵義)</code>
<code> </code><code>* @date 2015-3-11 下午4:10:15</code>
<code> </code><code>* @param userList</code>
<code> </code><code>* @return</code>
<code> </code><code>private</code> <code>List<UserEntity> filterByAuth(List<UserEntity> userList, String processDefineId) {</code>
<code> </code><code>List<UserEntity> userNewList = </code><code>new</code> <code>ArrayList<UserEntity>();</code>
<code> </code><code>for</code><code>(UserEntity user : userList){</code>
<code> </code><code>AuthorizeEntity authEntity = authorizeService.authorize(user.getStaffId(), processDefineId);</code>
<code> </code><code>if</code><code>(authEntity == </code><code>null</code><code>)</code>
<code> </code><code>userNewList.add(user);</code>
<code> </code><code>else</code> <code>{</code>
<code> </code><code>UserEntity user2 = userService.queryUserByStaffId(authEntity.getPstaffId());</code>
<code> </code><code>if</code><code>(user2 != </code><code>null</code><code>){</code>
<code> </code><code>UserEntity user3 = </code><code>new</code> <code>UserEntity();</code>
<code> </code><code>user3.setUserCode(user2.getUserCode());</code>
<code> </code><code>user3.setUserName(user2.getUserName()+ </code><code>"("</code> <code>+ user.getUserName() + </code><code>"的工作代理人)"</code><code>);</code>
<code> </code><code>user3.setDefine1(user.getUserCode());</code>
<code> </code><code>userNewList.add(user3);</code>
<code> </code><code>return</code> <code>userNewList;</code>
前端我是這樣處理的:
<code>if</code><code>(result.userList.length >0){</code>
<code> </code><code>var</code> <code>jbrArray = [];</code>
<code> </code><code>var</code> <code>hiddenWtr = [];</code>
<code> </code><code>$.each(result.userList,</code><code>function</code><code>(i,r){</code>
<code> </code><code>jbrArray +=</code><code>"<span class='input_checked'><input type='checkbox' class='check_box' name='jbr' checked='checked' value='"</code><code>+ r.userCode+</code><code>"'/></span>"</code><code>+r.userName;</code>
<code> </code><code>if</code><code>(r.define1){</code>
<code> </code><code>hiddenWtr += </code><code>"<input name='wtr' value='"</code> <code>+(r.userCode + ':</code><code>' + r.define1) + "'</code> <code>type=</code><code>'hidden'</code><code>/>"</code>
<code> </code><code>}</code>
<code> </code>
<code> </code><code>});</code>
<code> </code><code>if</code><code>(jbrArray.length > 0){</code>
<code> </code><code>$(</code><code>"#jbr"</code><code>).append(jbrArray);</code>
<code> </code><code>$(</code><code>"#jbr"</code><code>).append(hiddenWtr);</code>
<code> </code><code>if</code><code>($(</code><code>"#jbr input[type='checkbox']"</code><code>).length == 1){</code>
<code> </code><code>$(</code><code>"#jbr input[type='checkbox']"</code><code>).first().attr(</code><code>"checked"</code><code>,</code><code>"checked"</code><code>)</code>
<code> </code><code>...</code>
<code>var</code> <code>wtrArr = </code><code>new</code> <code>Array();</code>
<code> </code><code>$(</code><code>"input[name='jbr']:checked"</code><code>).each(</code><code>function</code><code>(index, element){</code>
<code> </code><code>var</code> <code>userCode = $(element).val()</code>
<code> </code><code>if</code><code>(userCode!=</code><code>null</code><code>&&userCode!=</code><code>""</code><code>){</code>
<code> </code><code>jbrArr.push(userCode);</code>
<code> </code><code>} </code>
<code> </code><code>flag++;</code>
<code> </code><code>});</code>
<code> </code><code>$(</code><code>"input[name='wtr']"</code><code>).each(</code><code>function</code><code>(index, element){</code>
<code> </code><code>wtrArr.push(userCode);</code>
初看下來這樣寫其實是有問題的,其實沒有問題。雖然審批人清單長度可能大于1,在這種情況下,如非會簽,我們可以選擇一到多個審批人,在審批人的數組裡我們隻push了選中的審批人,但在委托人的數組裡卻未對是否選中進行甄别。但這并不影響我們的正确使用,接下來看:
<code> </code><code>if</code><code>(StringUtils.isNotEmpty(task.getAssignee())){</code>
<code> </code><code>taskForm.setCreateUserCode(task.getAssignee());</code>
<code> </code><code>Map<String, String> wtrMap = queryWtr(startFlowRunTime);</code>
<code> </code><code>if</code><code>(StringUtils.isNotEmpty(wtrMap.get(task.getAssignee()))){</code>
<code> </code><code>taskForm.setEntrustedUserCode(wtrMap.get(task.getAssignee()));</code>
<code> </code><code>}</code>
<code> </code><code>this</code><code>.processTaskService.save(taskForm);</code>
<code> </code><code>}</code>
jbpm的配置設定任務跟普通任務是一樣的,因為我們通過授權的篩選已經将審批人替換為被委托人,又通過上述代碼委托人作為擴充任務的trustedUserCode作為主動委托人供委托子產品查詢。我們再看一下queryWtr這個方法是如何處理我們前端傳入的“被委托人:委托人”格式的委托人清單的:
<code> </code><code>* </code>
<code> </code><code>* get entrustedUserCode based wtrList whose style as a : b</code>
<code> </code><code>* @date 2015-3-13 上午8:56:15</code>
<code> </code><code>* @param startFlowRunTime</code>
<code> </code><code>private</code> <code>Map<String, String> queryWtr(FlowRunTime startFlowRunTime) {</code>
<code> </code><code>Map<String, String> map = </code><code>new</code> <code>HashMap<String, String>();</code>
<code> </code><code>List<String> wtrList = startFlowRunTime.getWtrList();</code>
<code> </code><code>if</code><code>(!CollectionUtils.isEmpty(wtrList)){</code>
<code> </code><code>for</code><code>(String wtr : wtrList){</code>
<code> </code><code>if</code><code>(wtr.contains(</code><code>":"</code><code>)){</code>
<code> </code><code>String[] wtrs = wtr.split(</code><code>":"</code><code>);</code>
<code> </code><code>if</code><code>(wtrs.length == </code><code>2</code><code>){</code>
<code> </code><code>map.put(wtrs[</code><code>0</code><code>], wtrs[</code><code>1</code><code>]);</code>
<code> </code><code>return</code> <code>map;</code>
最後是查詢子產品,委托和轉交的查詢語句是相似的,我們拿委托子產品舉例如下:
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<code> </code><code><!-- 查詢我委托工作資訊集合 --></code>
<code> </code><code><</code><code>select</code> <code>id</code><code>=</code><code>"queryMyWtTask"</code> <code>resultMap</code><code>=</code><code>"ExecutionResultMap"</code> <code>parameterType</code><code>=</code><code>"com.fx.oa.module.bpm.workflow.api.shared.domain.ProcessExecutionEntity"</code><code>></code>
<code> </code><code>SELECT</code>
<code> </code><code>DISTINCT(Execution.id),</code>
<code> </code><code>Execution.code,</code>
<code> </code><code>Execution.userId,</code>
<code> </code><code>Execution.processDefineId,</code>
<code> </code><code>Execution.processInstanceId,</code>
<code> </code><code>Execution.status,</code>
<code> </code><code>Execution.tableName,</code>
<code> </code><code>Execution.pkValue,</code>
<code> </code><code>Execution.formDefineId,</code>
<code> </code><code>Execution.urgencyDegree,</code>
<code> </code><code>ProcessDefine.description,</code>
<code> </code><code>Execution.createTime,</code>
<code> </code><code>Execution.modifyTime,</code>
<code> </code><code>sysUser1.userName AS createUserCode,</code>
<code> </code><code>sysUser2.userName AS modifyUserCode,</code>
<code> </code><code>ProcessDefine.name,</code>
<code> </code><code>Execution.active,</code>
<code> </code><code>RejectWork.status as rejectStatus,</code>
<code> </code><code>Task.NAME_ as activityName,</code>
<code> </code><code>task3.activityName AS joinActivityName,</code>
<code> </code><code>Task.ASSIGNEE_ as currentHandler</code>
<code> </code><code>FROM T_BPM_PROCESS_DEFINE ProcessDefine,T_BPM_PROCESS_TASK TASK3,T_BPM_PROCESS_EXECUTION Execution</code>
<code> </code><code>LEFT JOIN T_BPM_REJECTWORK RejectWork</code>
<code> </code><code>ON Execution.pkValue = RejectWork.pkValue</code>
<code> </code><code>LEFT JOIN jbpm4_task task</code>
<code> </code><code>ON Execution.processInstanceId = task.EXECUTION_ID_</code>
<code> </code><code>LEFT JOIN T_SYS_USER sysUser1 </code>
<code> </code><code>ON Execution.createUserCode = sysUser1.userCode </code>
<code> </code><code>LEFT JOIN T_SYS_USER sysUser2 </code>
<code> </code><code>ON Execution.modifyUserCode = sysUser2.userCode </code>
<code> </code><code>WHERE 1 = 1</code>
<code> </code><code>AND Execution.ID = task3.processExecutionId</code>
<code> </code><code>AND task3.entrustedUserCode = #{createUserCode}</code>
<code> </code><code>AND Execution.processDefineId = ProcessDefine.ID </code>
<code> </code><code><</code><code>choose</code><code>></code>
<code> </code><code><</code><code>when</code> <code>test</code><code>=</code><code>"status == '11'"</code><code>></code>
<code> </code><code><!-- AND rejectWork.status = '1' --></code> <code>AND Execution.status = '2' AND Execution.active != 'Y'</code>
<code> </code><code></</code><code>when</code><code>></code>
<code> </code><code><</code><code>when</code> <code>test</code><code>=</code><code>"status == '2'"</code><code>></code>
<code> </code><code><!-- AND rejectWork.status != '1' --></code> <code>AND Execution.active != 'N'</code>
<code> </code><code><</code><code>otherwise</code><code>> </code>
<code> </code><code>AND Execution.active != 'N'</code>
<code> </code><code></</code><code>otherwise</code><code>> </code>
<code> </code><code></</code><code>choose</code><code>> </code>
<code> </code><code>AND Execution.createUserCode != #{createUserCode}</code>
<code> </code><code><</code><code>if</code> <code>test</code><code>=</code><code>"createUserName != null and createUserName !=''"</code><code>></code>
<code> </code><code>AND Execution.createUserCode = (SELECT userCode</code>
<code> </code><code>FROM T_SYS_USER sysUser</code>
<code> </code><code>WHERE sysUser.userName= #{createUserName} LIMIT 0,1)</code>
<code> </code><code></</code><code>if</code><code>></code>
<code> </code><code><</code><code>if</code> <code>test</code><code>=</code><code>"processDefineId != null and processDefineId !=''"</code><code>></code>
<code> </code><code>AND Execution.processDefineId = #{processDefineId} </code>
<code> </code><code><</code><code>if</code> <code>test</code><code>=</code><code>"status != null and status !='' and status !='11'"</code><code>></code>
<code> </code><code>AND Execution.status = #{status}</code>
<code> </code><code><</code><code>if</code> <code>test</code><code>=</code><code>"name != null and name !=''"</code><code>></code>
<code> </code><code>AND ProcessDefine.name LIKE '%' #{name} '%' </code>
<code> </code><code><</code><code>if</code> <code>test</code><code>=</code><code>"startCreateTime != null and startCreateTime !=''"</code><code>></code>
<code> </code><code>AND Execution.createTime </code><code><![CDATA[>= #{startCreateTime} ]]></code>
<code> </code><code><</code><code>if</code> <code>test</code><code>=</code><code>"endCreateTime != null and endCreateTime !=''"</code><code>></code>
<code> </code><code>AND Execution.createTime </code><code><![CDATA[<= #{endCreateTime}]]></code>
<code> </code><code>GROUP BY Execution.id</code>
<code> </code><code>ORDER BY Execution.createTime DESC</code>
<code> </code><code></</code><code>select</code><code>></code>
<code></code>
本文轉自 gaochaojs 51CTO部落格,原文連結:http://blog.51cto.com/jncumter/1621312,如需轉載請自行聯系原作者