feat(REQ-2752) - 调整索引字段,解决任务维度数据搜索异常

This commit is contained in:
wangli 2024-10-15 16:03:26 +08:00
parent 52244bd087
commit 9742fe3504
9 changed files with 20 additions and 42 deletions

View File

@ -28,7 +28,7 @@
<apache-maven.version>3.2.5</apache-maven.version>
<javaparse.version>3.26.0</javaparse.version>
<elasticsearch.version>7.14.0</elasticsearch.version>
<easy-es.version>2.0.0-beta7</easy-es.version>
<easy-es.version>2.0.0</easy-es.version>
</properties>
<dependencyManagement>

View File

@ -22,11 +22,9 @@ import java.util.List;
public class InstanceSearchReqDTO extends BpmPageParam {
@ApiModelProperty(value = "审批人所属租户 ID")
@NotBlank(message = "租户 ID 不能为空")
private String tenantId;
@ApiModelProperty(value = "审批人所属单位 ID")
@NotBlank(message = "单位 ID 不能为空")
private String ouId;
@ApiModelProperty(value = "审批人自然人 ID")

View File

@ -20,16 +20,6 @@ public class ProcessTaskDocumentVO {
*/
private String taskId;
/**
* 归属的流程实例 ID
*/
private String processInstanceId;
/**
* 归属的流程实例定义 ID
*/
private String processDefinitionId;
/**
* 任务定义 KEY,对应节点 ID
*/

View File

@ -10,6 +10,7 @@ import org.dromara.easyes.annotation.Node;
import org.dromara.easyes.annotation.Settings;
import org.dromara.easyes.annotation.rely.FieldType;
import org.dromara.easyes.annotation.rely.IdType;
import org.dromara.easyes.annotation.rely.RefreshPolicy;
import java.util.Date;
@ -23,7 +24,7 @@ import static org.dromara.easyes.annotation.rely.Analyzer.IK_MAX_WORD;
*/
@Data
@Settings(settingsProvider = CustomIndexSettingProvider.class)
@IndexName(value = "process_instance_document", keepGlobalPrefix = true)
@IndexName(value = "process_instance_document", keepGlobalPrefix = true, refreshPolicy = RefreshPolicy.IMMEDIATE)
@Join(nodes = {@Node(parentClass = ProcessInstanceDocument.class, parentAlias = "process_instance_document", childClasses = {ProcessTaskDocument.class}, childAliases = {"process_task_document"})})
public class ProcessInstanceDocument {
@ -31,6 +32,9 @@ public class ProcessInstanceDocument {
* 流程实例 ID
*/
@IndexId(type = IdType.CUSTOMIZE)
private String id;
@IndexField(fieldType = FieldType.KEYWORD)
private String instanceId;
/**

View File

@ -24,18 +24,6 @@ public class ProcessTaskDocument {
@IndexId(type = IdType.CUSTOMIZE)
private String taskId;
/**
* 归属的流程实例 ID
*/
@IndexField(fieldType = FieldType.KEYWORD)
private String processInstanceId;
/**
* 归属的流程实例定义 ID
*/
@IndexField(fieldType = FieldType.KEYWORD)
private String processDefinitionId;
/**
* 任务定义 KEY,对应节点 ID
*/

View File

@ -60,6 +60,7 @@ public class AggregateProcessInstanceService {
return Collections.emptyList();
}
ProcessInstanceDocument processInstanceDocument = new ProcessInstanceDocument();
processInstanceDocument.setId(hpi.getId());
processInstanceDocument.setInstanceId(hpi.getId());
processInstanceDocument.setProcessInstanceName(hpi.getName());
processInstanceDocument.setBusinessKey(hpi.getBusinessKey());
@ -115,7 +116,6 @@ public class AggregateProcessInstanceService {
.max(Comparator.comparing(ProcessTaskDocument::getTaskEndTime))
.ifPresent(processTaskDocument -> {
processInstanceDocument.setLastOperationTime(processTaskDocument.getTaskEndTime());
esProcessInstanceService.update(ES_FIXED_ROUTING, processInstanceDocument);
});
} else {
processInstanceDocument.setLastOperationTime(null);

View File

@ -80,8 +80,6 @@ public class AggregateProcessTaskService {
logs.forEach(log -> {
ProcessTaskDocument processTaskDocument = new ProcessTaskDocument();
processTaskDocument.setTaskId(log.getTaskId());
processTaskDocument.setProcessInstanceId(log.getProcessInstanceId());
processTaskDocument.setProcessDefinitionId(hpi.getProcessDefinitionId());
processTaskDocument.setTaskDefinitionKey(log.getActivityId());
processTaskDocument.setTaskName(log.getActivityName());
processTaskDocument.setTaskStatus(log.getStatus());
@ -142,11 +140,12 @@ public class AggregateProcessTaskService {
// Map<String, List<Attachment>> attachmentMap = bpmnProcessTaskForEsService.queryAttachmentByProcessInstanceId(hpi.getId())
// .stream().collect(Collectors.groupingBy(Attachment::getTaskId, Collectors.mapping(Function.identity(), Collectors.toList())));
Map<String, Object> variables = hpi.getProcessVariables();
// 过滤出有效任务, 比如同节点的多实例下或签, 一个人操作了同节点的一个任务,会把同节点的其他任务处理了,此时被处理的任务认为非人工处理
List<HistoricTaskInstance> filteredEffectiveTasks = filterEffectiveTasks(tasks, instanceVersion);
List<String> taskIds = filteredEffectiveTasks.stream().map(i-> INTERNAL_TASK_RELATION_ASSIGNEE_INFO + i.getId()).distinct().collect(Collectors.toList());
Map<String, Object> taskAssigneeMap = bpmnProcessInstanceForEsService.queryInstanceVariables(hpi.getId(), taskIds);
List<ProcessTaskDocument> toEsProcessTaskDocuments = new ArrayList<>();
for (HistoricTaskInstance task : filteredEffectiveTasks) {
ExtAxHiTaskInst extTask = extTaskMap.getOrDefault(task.getId(), new ExtAxHiTaskInst());
@ -155,8 +154,6 @@ public class AggregateProcessTaskService {
ProcessTaskDocument processTaskDocument = new ProcessTaskDocument();
processTaskDocument.setTaskId(task.getId());
processTaskDocument.setProcessInstanceId(task.getProcessInstanceId());
processTaskDocument.setProcessDefinitionId(task.getProcessDefinitionId());
processTaskDocument.setTaskDefinitionKey(task.getTaskDefinitionKey());
processTaskDocument.setTaskName(task.getName());
processTaskDocument.setTaskStatus(extTask.getStatus());
@ -170,23 +167,20 @@ public class AggregateProcessTaskService {
processTaskDocument.setTaskStartTime(task.getCreateTime());
processTaskDocument.setTaskEndTime(task.getEndTime());
processTaskDocument.setDuration(task.getDurationInMillis());
// esProcessTask.setLastUpdateTime(task);
processTaskDocument.setTaskTenantId(task.getTenantId());
BpmnTaskDelegateAssigner assigner = BpmnTaskDelegateAssigner.toObjectCompatible(variables.getOrDefault(INTERNAL_TASK_RELATION_ASSIGNEE_INFO + task.getId(), null));
BpmnTaskDelegateAssigner assigner = BpmnTaskDelegateAssigner.toObjectCompatible(taskAssigneeMap.getOrDefault(INTERNAL_TASK_RELATION_ASSIGNEE_INFO + task.getId(), null));
if(Objects.nonNull(assigner)) {
processTaskDocument.setAssigneeName(assigner.getAssignerName());
processTaskDocument.setAssigneeOuId(assigner.getOuId());
processTaskDocument.setAssigneePersonId(assigner.getPersonId());
processTaskDocument.setAssigneeTenantId(assigner.getTenantId());
}
// esProcessTask.setAttachments(attachmentConverter.toVos(attachments));
if (Objects.nonNull(bpmnModel)) {
FlowElement flowElement = bpmnModel.getFlowElement(task.getTaskDefinitionKey());
BpmnMetaParserHelper.getApprovalMethod(flowElement)
.ifPresent(e -> processTaskDocument.setApprovalMethod(e.getType()));
BpmnMetaParserHelper.getNodeType(flowElement)
.ifPresent(e -> processTaskDocument.setNodeType(e.getType()));
// esProcessTask.setNodeMode();
}
toEsProcessTaskDocuments.add(processTaskDocument);
}

View File

@ -107,7 +107,7 @@ public class EsProcessInstanceServiceImpl implements EsProcessInstanceService {
if (!CollectionUtils.isEmpty(dto.getProcessInstanceIds())) {
List<ProcessInstanceDocument> processInstanceDocuments = esProcessInstanceMapper
.selectList(new LambdaEsQueryWrapper<ProcessInstanceDocument>()
.in(FieldUtils.val(ProcessInstanceDocument::getInstanceId), dto.getProcessInstanceIds()));
.in(FieldUtils.val(ProcessInstanceDocument::getId), dto.getProcessInstanceIds()));
return new BpmPageResult<>(processInstanceDocuments, (long) processInstanceDocuments.size());
}
@ -120,7 +120,7 @@ public class EsProcessInstanceServiceImpl implements EsProcessInstanceService {
)
.eq(StringUtils.hasText(dto.getBusinessStatus()), FieldUtils.val(ProcessInstanceDocument::getBusinessStatus), dto.getBusinessStatus())
.matchPhrase(StringUtils.hasText(dto.getProcessInstanceName()), FieldUtils.val(ProcessInstanceDocument::getProcessInstanceName), dto.getProcessInstanceName())
.in(CollectionUtils.isEmpty(dto.getProcessInstanceIds()), FieldUtils.val(ProcessInstanceDocument::getInstanceId), dto.getProcessInstanceIds())
.in(CollectionUtils.isEmpty(dto.getProcessInstanceIds()), FieldUtils.val(ProcessInstanceDocument::getId), dto.getProcessInstanceIds())
.ge(Objects.nonNull(dto.getBeginStartTime()), ProcessInstanceDocument::getInstanceStartTime, dto.getBeginStartTime())
.le(Objects.nonNull(dto.getOverStartTime()), ProcessInstanceDocument::getInstanceStartTime, dto.getOverStartTime())
.ge(Objects.nonNull(dto.getBeginEndTime()), ProcessInstanceDocument::getInstanceEndTime, dto.getBeginEndTime())

View File

@ -2,12 +2,14 @@ package cn.axzo.workflow.es.service.impl;
import cn.axzo.workflow.common.model.request.es.TaskSearchReqDTO;
import cn.axzo.workflow.es.mapper.EsProcessTaskMapper;
import cn.axzo.workflow.es.model.ProcessInstanceDocument;
import cn.axzo.workflow.es.model.ProcessTaskDocument;
import cn.axzo.workflow.es.service.EsProcessTaskService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.easyes.annotation.IndexName;
import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper;
import org.dromara.easyes.core.toolkit.FieldUtils;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
@ -58,12 +60,14 @@ public class EsProcessTaskServiceImpl implements EsProcessTaskService {
@Override
public List<ProcessTaskDocument> search(TaskSearchReqDTO dto) {
LambdaEsQueryWrapper<ProcessTaskDocument> wrapper = new LambdaEsQueryWrapper<>();
wrapper.eq(StringUtils.hasText(dto.getAssigneeOuId()), ProcessTaskDocument::getAssigneeOuId, dto.getAssigneeOuId())
LambdaEsQueryWrapper<ProcessTaskDocument> wrapper = new LambdaEsQueryWrapper<ProcessTaskDocument>()
.eq(StringUtils.hasText(dto.getAssigneeOuId()), ProcessTaskDocument::getAssigneeOuId, dto.getAssigneeOuId())
.eq(StringUtils.hasText(dto.getAssigneeTenantId()), ProcessTaskDocument::getAssigneeTenantId, dto.getAssigneeTenantId())
.eq(StringUtils.hasText(dto.getAssigneePersonId()), ProcessTaskDocument::getAssigneePersonId, dto.getAssigneePersonId())
.matchPhrase(StringUtils.hasText(dto.getAssigneeName()), ProcessTaskDocument::getAssigneeName, dto.getAssigneeName())
.parentId(StringUtils.hasText(dto.getProcessInstanceId()), dto.getProcessInstanceId(), "process_instance_document")
.hasParent(StringUtils.hasText(dto.getProcessInstanceId()), "process_instance_document",
w-> w.eq(FieldUtils.val(ProcessInstanceDocument::getInstanceId), dto.getProcessInstanceId()))
// .parentId(StringUtils.hasText(dto.getProcessInstanceId()), dto.getProcessInstanceId(), "process_instance_document")
.routing(ES_FIXED_ROUTING)
;
return esProcessTaskMapper.selectList(wrapper);