@ -699,10 +699,12 @@ public class FlowApiServiceImpl implements FlowApiService {
@@ -699,10 +699,12 @@ public class FlowApiServiceImpl implements FlowApiService {
query . taskNameLike ( "%" + taskName + "%" ) ;
}
this . buildCandidateCondition ( query , username ) ;
long totalCount = query . count ( ) ;
query . orderByTaskCreateTime ( ) . desc ( ) ;
Map < String , Boolean > multiInstanceTaskMap = new HashMap < > ( ) ;
long totalCount = this . countOwnedTaskList ( query , username , multiInstanceTaskMap ) ;
int firstResult = ( pageParam . getPageNum ( ) - 1 ) * pageParam . getPageSize ( ) ;
List < Task > taskList = query . listPage ( firstResult , pageParam . getPageSize ( ) ) ;
List < Task > taskList = this . listOwnedTaskPage (
query , username , firstResult , pageParam . getPageSize ( ) , multiInstanceTaskMap ) ;
return new MyPageData < > ( taskList , totalCount ) ;
}
@ -710,7 +712,102 @@ public class FlowApiServiceImpl implements FlowApiService {
@@ -710,7 +712,102 @@ public class FlowApiServiceImpl implements FlowApiService {
public long getTaskCountByUserName ( String username ) {
TaskQuery query = this . createQuery ( ) ;
this . buildCandidateCondition ( query , username ) ;
return query . count ( ) ;
return this . countOwnedTaskList ( query , username , new HashMap < > ( ) ) ;
}
/ * *
* 统计当前用户待办任务数 。
* 多实例会签节点在流程图中将全部会签人同时配置为候选者 , 导致每个实例对所有人可见 。
* 这里只保留会签实例归属人自己的那一条 , 其他会签人的实例不参与统计 。
* /
private long countOwnedTaskList ( TaskQuery query , String username , Map < String , Boolean > multiInstanceTaskMap ) {
long totalCount = 0 ;
int cursor = 0 ;
while ( true ) {
List < Task > batch = query . listPage ( cursor , 500 ) ;
if ( CollUtil . isEmpty ( batch ) ) {
break ;
}
cursor + = batch . size ( ) ;
for ( Task task : batch ) {
if ( this . isTaskOwnedByUser ( task , username , multiInstanceTaskMap ) ) {
totalCount + + ;
}
}
}
return totalCount ;
}
/ * *
* 分页获取当前用户待办任务 。
* 多实例会签节点的实例对候选者全体可见 , 分页时跳过不属于当前用户的其他会签实例 。
* /
private List < Task > listOwnedTaskPage (
TaskQuery query , String username , int firstResult , int pageSize , Map < String , Boolean > multiInstanceTaskMap ) {
List < Task > resultList = new LinkedList < > ( ) ;
int skipCount = firstResult ;
int cursor = 0 ;
while ( resultList . size ( ) < pageSize ) {
List < Task > batch = query . listPage ( cursor , Math . max ( pageSize , 500 ) ) ;
if ( CollUtil . isEmpty ( batch ) ) {
break ;
}
cursor + = batch . size ( ) ;
for ( Task task : batch ) {
if ( ! this . isTaskOwnedByUser ( task , username , multiInstanceTaskMap ) ) {
continue ;
}
if ( skipCount > 0 ) {
skipCount - - ;
continue ;
}
resultList . add ( task ) ;
if ( resultList . size ( ) > = pageSize ) {
break ;
}
}
}
return resultList ;
}
/ * *
* 判断任务是否属于当前用户 。
* 多实例会签实例的元素变量 assignee 即该实例真正的归属人 。
* /
private boolean isTaskOwnedByUser ( Task task , String username , Map < String , Boolean > multiInstanceTaskMap ) {
String taskKey = task . getProcessDefinitionId ( ) + ":" + task . getTaskDefinitionKey ( ) ;
Boolean isMultiInstance = multiInstanceTaskMap . get ( taskKey ) ;
if ( isMultiInstance = = null ) {
isMultiInstance = this . isMultiInstanceTask ( task . getProcessDefinitionId ( ) , task . getTaskDefinitionKey ( ) ) ;
multiInstanceTaskMap . put ( taskKey , isMultiInstance ) ;
}
if ( ! isMultiInstance ) {
return true ;
}
Object assignee = taskService . getVariable ( task . getId ( ) , "assignee" ) ;
return assignee = = null | | StrUtil . equals ( assignee . toString ( ) , username ) ;
}
/ * *
* 获取任务的审批人 。
* 多实例会签实例的指派人保存在元素变量 assignee 中 , 普通任务取任务的指派人 。
* /
private String getTaskAssignee ( Task task , Map < String , Boolean > multiInstanceTaskMap ) {
String assignee = task . getAssignee ( ) ;
if ( StrUtil . isNotBlank ( assignee ) ) {
return assignee ;
}
String taskKey = task . getProcessDefinitionId ( ) + ":" + task . getTaskDefinitionKey ( ) ;
Boolean isMultiInstance = multiInstanceTaskMap . get ( taskKey ) ;
if ( isMultiInstance = = null ) {
isMultiInstance = this . isMultiInstanceTask ( task . getProcessDefinitionId ( ) , task . getTaskDefinitionKey ( ) ) ;
multiInstanceTaskMap . put ( taskKey , isMultiInstance ) ;
}
if ( ! isMultiInstance ) {
return null ;
}
Object assigneeVar = taskService . getVariable ( task . getId ( ) , "assignee" ) ;
return assigneeVar = = null ? null : assigneeVar . toString ( ) ;
}
@Override
@ -807,6 +904,7 @@ public class FlowApiServiceImpl implements FlowApiService {
@@ -807,6 +904,7 @@ public class FlowApiServiceImpl implements FlowApiService {
workOrderList . stream ( ) . collect ( Collectors . toMap ( FlowWorkOrder : : getProcessInstanceId , c - > c ) ) ;
List < FlowTaskExt > allFlowTaskExtList = flowTaskExtService . getByProcessDefinitionId ( processDefinitionIdSet ) ;
Map < String , FlowTaskExt > flowTaskExtMap = allFlowTaskExtList . stream ( ) . collect ( Collectors . toMap ( t - > t . getProcessDefinitionId ( ) + ":" + t . getTaskId ( ) , t - > t , ( k1 , k2 ) - > k1 ) ) ;
Map < String , Boolean > multiInstanceTaskMap = new HashMap < > ( ) ;
for ( Task task : taskList ) {
FlowTaskVo flowTaskVo = new FlowTaskVo ( ) ;
flowTaskVo . setTaskId ( task . getId ( ) ) ;
@ -814,6 +912,7 @@ public class FlowApiServiceImpl implements FlowApiService {
@@ -814,6 +912,7 @@ public class FlowApiServiceImpl implements FlowApiService {
flowTaskVo . setTaskKey ( task . getTaskDefinitionKey ( ) ) ;
flowTaskVo . setTaskFormKey ( task . getFormKey ( ) ) ;
flowTaskVo . setTaskStartTime ( task . getCreateTime ( ) ) ;
flowTaskVo . setAssignee ( this . getTaskAssignee ( task , multiInstanceTaskMap ) ) ;
flowTaskVo . setEntryId ( flowEntryPublishMap . get ( task . getProcessDefinitionId ( ) ) . getEntryId ( ) ) ;
ProcessDefinition processDefinition = definitionMap . get ( task . getProcessDefinitionId ( ) ) ;
flowTaskVo . setProcessDefinitionId ( processDefinition . getId ( ) ) ;
@ -841,6 +940,8 @@ public class FlowApiServiceImpl implements FlowApiService {
@@ -841,6 +940,8 @@ public class FlowApiServiceImpl implements FlowApiService {
}
Set < String > loginNameSet = flowTaskVoList . stream ( )
. map ( FlowTaskVo : : getProcessInstanceInitiator ) . collect ( Collectors . toSet ( ) ) ;
loginNameSet . addAll ( flowTaskVoList . stream ( )
. map ( FlowTaskVo : : getAssignee ) . filter ( StrUtil : : isNotBlank ) . collect ( Collectors . toSet ( ) ) ) ;
List < FlowUserInfoVo > flowUserInfos = flowCustomExtFactory
. getFlowIdentityExtHelper ( ) . getUserInfoListByUsernameSet ( loginNameSet ) ;
Map < String , FlowUserInfoVo > userInfoMap =
@ -849,6 +950,10 @@ public class FlowApiServiceImpl implements FlowApiService {
@@ -849,6 +950,10 @@ public class FlowApiServiceImpl implements FlowApiService {
FlowUserInfoVo userInfo = userInfoMap . get ( flowTaskVo . getProcessInstanceInitiator ( ) ) ;
flowTaskVo . setShowName ( userInfo . getShowName ( ) ) ;
flowTaskVo . setHeadImageUrl ( userInfo . getHeadImageUrl ( ) ) ;
FlowUserInfoVo assigneeInfo = userInfoMap . get ( flowTaskVo . getAssignee ( ) ) ;
if ( assigneeInfo ! = null ) {
flowTaskVo . setAssigneeShowName ( assigneeInfo . getShowName ( ) ) ;
}
}
return flowTaskVoList ;
}