|
|
|
@ -699,10 +699,12 @@ public class FlowApiServiceImpl implements FlowApiService { |
|
|
|
query.taskNameLike("%" + taskName + "%"); |
|
|
|
query.taskNameLike("%" + taskName + "%"); |
|
|
|
} |
|
|
|
} |
|
|
|
this.buildCandidateCondition(query, username); |
|
|
|
this.buildCandidateCondition(query, username); |
|
|
|
long totalCount = query.count(); |
|
|
|
|
|
|
|
query.orderByTaskCreateTime().desc(); |
|
|
|
query.orderByTaskCreateTime().desc(); |
|
|
|
|
|
|
|
Map<String, Boolean> multiInstanceTaskMap = new HashMap<>(); |
|
|
|
|
|
|
|
long totalCount = this.countOwnedTaskList(query, username, multiInstanceTaskMap); |
|
|
|
int firstResult = (pageParam.getPageNum() - 1) * pageParam.getPageSize(); |
|
|
|
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); |
|
|
|
return new MyPageData<>(taskList, totalCount); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -710,7 +712,102 @@ public class FlowApiServiceImpl implements FlowApiService { |
|
|
|
public long getTaskCountByUserName(String username) { |
|
|
|
public long getTaskCountByUserName(String username) { |
|
|
|
TaskQuery query = this.createQuery(); |
|
|
|
TaskQuery query = this.createQuery(); |
|
|
|
this.buildCandidateCondition(query, username); |
|
|
|
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 |
|
|
|
@Override |
|
|
|
@ -807,6 +904,7 @@ public class FlowApiServiceImpl implements FlowApiService { |
|
|
|
workOrderList.stream().collect(Collectors.toMap(FlowWorkOrder::getProcessInstanceId, c -> c)); |
|
|
|
workOrderList.stream().collect(Collectors.toMap(FlowWorkOrder::getProcessInstanceId, c -> c)); |
|
|
|
List<FlowTaskExt> allFlowTaskExtList = flowTaskExtService.getByProcessDefinitionId(processDefinitionIdSet); |
|
|
|
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, 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) { |
|
|
|
for (Task task : taskList) { |
|
|
|
FlowTaskVo flowTaskVo = new FlowTaskVo(); |
|
|
|
FlowTaskVo flowTaskVo = new FlowTaskVo(); |
|
|
|
flowTaskVo.setTaskId(task.getId()); |
|
|
|
flowTaskVo.setTaskId(task.getId()); |
|
|
|
@ -814,6 +912,7 @@ public class FlowApiServiceImpl implements FlowApiService { |
|
|
|
flowTaskVo.setTaskKey(task.getTaskDefinitionKey()); |
|
|
|
flowTaskVo.setTaskKey(task.getTaskDefinitionKey()); |
|
|
|
flowTaskVo.setTaskFormKey(task.getFormKey()); |
|
|
|
flowTaskVo.setTaskFormKey(task.getFormKey()); |
|
|
|
flowTaskVo.setTaskStartTime(task.getCreateTime()); |
|
|
|
flowTaskVo.setTaskStartTime(task.getCreateTime()); |
|
|
|
|
|
|
|
flowTaskVo.setAssignee(this.getTaskAssignee(task, multiInstanceTaskMap)); |
|
|
|
flowTaskVo.setEntryId(flowEntryPublishMap.get(task.getProcessDefinitionId()).getEntryId()); |
|
|
|
flowTaskVo.setEntryId(flowEntryPublishMap.get(task.getProcessDefinitionId()).getEntryId()); |
|
|
|
ProcessDefinition processDefinition = definitionMap.get(task.getProcessDefinitionId()); |
|
|
|
ProcessDefinition processDefinition = definitionMap.get(task.getProcessDefinitionId()); |
|
|
|
flowTaskVo.setProcessDefinitionId(processDefinition.getId()); |
|
|
|
flowTaskVo.setProcessDefinitionId(processDefinition.getId()); |
|
|
|
@ -841,6 +940,8 @@ public class FlowApiServiceImpl implements FlowApiService { |
|
|
|
} |
|
|
|
} |
|
|
|
Set<String> loginNameSet = flowTaskVoList.stream() |
|
|
|
Set<String> loginNameSet = flowTaskVoList.stream() |
|
|
|
.map(FlowTaskVo::getProcessInstanceInitiator).collect(Collectors.toSet()); |
|
|
|
.map(FlowTaskVo::getProcessInstanceInitiator).collect(Collectors.toSet()); |
|
|
|
|
|
|
|
loginNameSet.addAll(flowTaskVoList.stream() |
|
|
|
|
|
|
|
.map(FlowTaskVo::getAssignee).filter(StrUtil::isNotBlank).collect(Collectors.toSet())); |
|
|
|
List<FlowUserInfoVo> flowUserInfos = flowCustomExtFactory |
|
|
|
List<FlowUserInfoVo> flowUserInfos = flowCustomExtFactory |
|
|
|
.getFlowIdentityExtHelper().getUserInfoListByUsernameSet(loginNameSet); |
|
|
|
.getFlowIdentityExtHelper().getUserInfoListByUsernameSet(loginNameSet); |
|
|
|
Map<String, FlowUserInfoVo> userInfoMap = |
|
|
|
Map<String, FlowUserInfoVo> userInfoMap = |
|
|
|
@ -849,6 +950,10 @@ public class FlowApiServiceImpl implements FlowApiService { |
|
|
|
FlowUserInfoVo userInfo = userInfoMap.get(flowTaskVo.getProcessInstanceInitiator()); |
|
|
|
FlowUserInfoVo userInfo = userInfoMap.get(flowTaskVo.getProcessInstanceInitiator()); |
|
|
|
flowTaskVo.setShowName(userInfo.getShowName()); |
|
|
|
flowTaskVo.setShowName(userInfo.getShowName()); |
|
|
|
flowTaskVo.setHeadImageUrl(userInfo.getHeadImageUrl()); |
|
|
|
flowTaskVo.setHeadImageUrl(userInfo.getHeadImageUrl()); |
|
|
|
|
|
|
|
FlowUserInfoVo assigneeInfo = userInfoMap.get(flowTaskVo.getAssignee()); |
|
|
|
|
|
|
|
if (assigneeInfo != null) { |
|
|
|
|
|
|
|
flowTaskVo.setAssigneeShowName(assigneeInfo.getShowName()); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return flowTaskVoList; |
|
|
|
return flowTaskVoList; |
|
|
|
} |
|
|
|
} |
|
|
|
|