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> <apache-maven.version>3.2.5</apache-maven.version>
<javaparse.version>3.26.0</javaparse.version> <javaparse.version>3.26.0</javaparse.version>
<elasticsearch.version>7.14.0</elasticsearch.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> </properties>
<dependencyManagement> <dependencyManagement>

View File

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

View File

@ -20,16 +20,6 @@ public class ProcessTaskDocumentVO {
*/ */
private String taskId; private String taskId;
/**
* 归属的流程实例 ID
*/
private String processInstanceId;
/**
* 归属的流程实例定义 ID
*/
private String processDefinitionId;
/** /**
* 任务定义 KEY,对应节点 ID * 任务定义 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.Settings;
import org.dromara.easyes.annotation.rely.FieldType; import org.dromara.easyes.annotation.rely.FieldType;
import org.dromara.easyes.annotation.rely.IdType; import org.dromara.easyes.annotation.rely.IdType;
import org.dromara.easyes.annotation.rely.RefreshPolicy;
import java.util.Date; import java.util.Date;
@ -23,7 +24,7 @@ import static org.dromara.easyes.annotation.rely.Analyzer.IK_MAX_WORD;
*/ */
@Data @Data
@Settings(settingsProvider = CustomIndexSettingProvider.class) @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"})}) @Join(nodes = {@Node(parentClass = ProcessInstanceDocument.class, parentAlias = "process_instance_document", childClasses = {ProcessTaskDocument.class}, childAliases = {"process_task_document"})})
public class ProcessInstanceDocument { public class ProcessInstanceDocument {
@ -31,6 +32,9 @@ public class ProcessInstanceDocument {
* 流程实例 ID * 流程实例 ID
*/ */
@IndexId(type = IdType.CUSTOMIZE) @IndexId(type = IdType.CUSTOMIZE)
private String id;
@IndexField(fieldType = FieldType.KEYWORD)
private String instanceId; private String instanceId;
/** /**

View File

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

View File

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

View File

@ -80,8 +80,6 @@ public class AggregateProcessTaskService {
logs.forEach(log -> { logs.forEach(log -> {
ProcessTaskDocument processTaskDocument = new ProcessTaskDocument(); ProcessTaskDocument processTaskDocument = new ProcessTaskDocument();
processTaskDocument.setTaskId(log.getTaskId()); processTaskDocument.setTaskId(log.getTaskId());
processTaskDocument.setProcessInstanceId(log.getProcessInstanceId());
processTaskDocument.setProcessDefinitionId(hpi.getProcessDefinitionId());
processTaskDocument.setTaskDefinitionKey(log.getActivityId()); processTaskDocument.setTaskDefinitionKey(log.getActivityId());
processTaskDocument.setTaskName(log.getActivityName()); processTaskDocument.setTaskName(log.getActivityName());
processTaskDocument.setTaskStatus(log.getStatus()); processTaskDocument.setTaskStatus(log.getStatus());
@ -142,11 +140,12 @@ public class AggregateProcessTaskService {
// Map<String, List<Attachment>> attachmentMap = bpmnProcessTaskForEsService.queryAttachmentByProcessInstanceId(hpi.getId()) // Map<String, List<Attachment>> attachmentMap = bpmnProcessTaskForEsService.queryAttachmentByProcessInstanceId(hpi.getId())
// .stream().collect(Collectors.groupingBy(Attachment::getTaskId, Collectors.mapping(Function.identity(), Collectors.toList()))); // .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<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<>(); List<ProcessTaskDocument> toEsProcessTaskDocuments = new ArrayList<>();
for (HistoricTaskInstance task : filteredEffectiveTasks) { for (HistoricTaskInstance task : filteredEffectiveTasks) {
ExtAxHiTaskInst extTask = extTaskMap.getOrDefault(task.getId(), new ExtAxHiTaskInst()); ExtAxHiTaskInst extTask = extTaskMap.getOrDefault(task.getId(), new ExtAxHiTaskInst());
@ -155,8 +154,6 @@ public class AggregateProcessTaskService {
ProcessTaskDocument processTaskDocument = new ProcessTaskDocument(); ProcessTaskDocument processTaskDocument = new ProcessTaskDocument();
processTaskDocument.setTaskId(task.getId()); processTaskDocument.setTaskId(task.getId());
processTaskDocument.setProcessInstanceId(task.getProcessInstanceId());
processTaskDocument.setProcessDefinitionId(task.getProcessDefinitionId());
processTaskDocument.setTaskDefinitionKey(task.getTaskDefinitionKey()); processTaskDocument.setTaskDefinitionKey(task.getTaskDefinitionKey());
processTaskDocument.setTaskName(task.getName()); processTaskDocument.setTaskName(task.getName());
processTaskDocument.setTaskStatus(extTask.getStatus()); processTaskDocument.setTaskStatus(extTask.getStatus());
@ -170,23 +167,20 @@ public class AggregateProcessTaskService {
processTaskDocument.setTaskStartTime(task.getCreateTime()); processTaskDocument.setTaskStartTime(task.getCreateTime());
processTaskDocument.setTaskEndTime(task.getEndTime()); processTaskDocument.setTaskEndTime(task.getEndTime());
processTaskDocument.setDuration(task.getDurationInMillis()); processTaskDocument.setDuration(task.getDurationInMillis());
// esProcessTask.setLastUpdateTime(task);
processTaskDocument.setTaskTenantId(task.getTenantId()); 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)) { if(Objects.nonNull(assigner)) {
processTaskDocument.setAssigneeName(assigner.getAssignerName()); processTaskDocument.setAssigneeName(assigner.getAssignerName());
processTaskDocument.setAssigneeOuId(assigner.getOuId()); processTaskDocument.setAssigneeOuId(assigner.getOuId());
processTaskDocument.setAssigneePersonId(assigner.getPersonId()); processTaskDocument.setAssigneePersonId(assigner.getPersonId());
processTaskDocument.setAssigneeTenantId(assigner.getTenantId()); processTaskDocument.setAssigneeTenantId(assigner.getTenantId());
} }
// esProcessTask.setAttachments(attachmentConverter.toVos(attachments));
if (Objects.nonNull(bpmnModel)) { if (Objects.nonNull(bpmnModel)) {
FlowElement flowElement = bpmnModel.getFlowElement(task.getTaskDefinitionKey()); FlowElement flowElement = bpmnModel.getFlowElement(task.getTaskDefinitionKey());
BpmnMetaParserHelper.getApprovalMethod(flowElement) BpmnMetaParserHelper.getApprovalMethod(flowElement)
.ifPresent(e -> processTaskDocument.setApprovalMethod(e.getType())); .ifPresent(e -> processTaskDocument.setApprovalMethod(e.getType()));
BpmnMetaParserHelper.getNodeType(flowElement) BpmnMetaParserHelper.getNodeType(flowElement)
.ifPresent(e -> processTaskDocument.setNodeType(e.getType())); .ifPresent(e -> processTaskDocument.setNodeType(e.getType()));
// esProcessTask.setNodeMode();
} }
toEsProcessTaskDocuments.add(processTaskDocument); toEsProcessTaskDocuments.add(processTaskDocument);
} }

View File

@ -107,7 +107,7 @@ public class EsProcessInstanceServiceImpl implements EsProcessInstanceService {
if (!CollectionUtils.isEmpty(dto.getProcessInstanceIds())) { if (!CollectionUtils.isEmpty(dto.getProcessInstanceIds())) {
List<ProcessInstanceDocument> processInstanceDocuments = esProcessInstanceMapper List<ProcessInstanceDocument> processInstanceDocuments = esProcessInstanceMapper
.selectList(new LambdaEsQueryWrapper<ProcessInstanceDocument>() .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()); 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()) .eq(StringUtils.hasText(dto.getBusinessStatus()), FieldUtils.val(ProcessInstanceDocument::getBusinessStatus), dto.getBusinessStatus())
.matchPhrase(StringUtils.hasText(dto.getProcessInstanceName()), FieldUtils.val(ProcessInstanceDocument::getProcessInstanceName), dto.getProcessInstanceName()) .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()) .ge(Objects.nonNull(dto.getBeginStartTime()), ProcessInstanceDocument::getInstanceStartTime, dto.getBeginStartTime())
.le(Objects.nonNull(dto.getOverStartTime()), ProcessInstanceDocument::getInstanceStartTime, dto.getOverStartTime()) .le(Objects.nonNull(dto.getOverStartTime()), ProcessInstanceDocument::getInstanceStartTime, dto.getOverStartTime())
.ge(Objects.nonNull(dto.getBeginEndTime()), ProcessInstanceDocument::getInstanceEndTime, dto.getBeginEndTime()) .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.common.model.request.es.TaskSearchReqDTO;
import cn.axzo.workflow.es.mapper.EsProcessTaskMapper; 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.model.ProcessTaskDocument;
import cn.axzo.workflow.es.service.EsProcessTaskService; import cn.axzo.workflow.es.service.EsProcessTaskService;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.dromara.easyes.annotation.IndexName; import org.dromara.easyes.annotation.IndexName;
import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper; import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper;
import org.dromara.easyes.core.toolkit.FieldUtils;
import org.springframework.core.annotation.AnnotationUtils; import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
@ -58,12 +60,14 @@ public class EsProcessTaskServiceImpl implements EsProcessTaskService {
@Override @Override
public List<ProcessTaskDocument> search(TaskSearchReqDTO dto) { public List<ProcessTaskDocument> search(TaskSearchReqDTO dto) {
LambdaEsQueryWrapper<ProcessTaskDocument> wrapper = new LambdaEsQueryWrapper<>(); LambdaEsQueryWrapper<ProcessTaskDocument> wrapper = new LambdaEsQueryWrapper<ProcessTaskDocument>()
wrapper.eq(StringUtils.hasText(dto.getAssigneeOuId()), ProcessTaskDocument::getAssigneeOuId, dto.getAssigneeOuId()) .eq(StringUtils.hasText(dto.getAssigneeOuId()), ProcessTaskDocument::getAssigneeOuId, dto.getAssigneeOuId())
.eq(StringUtils.hasText(dto.getAssigneeTenantId()), ProcessTaskDocument::getAssigneeTenantId, dto.getAssigneeTenantId()) .eq(StringUtils.hasText(dto.getAssigneeTenantId()), ProcessTaskDocument::getAssigneeTenantId, dto.getAssigneeTenantId())
.eq(StringUtils.hasText(dto.getAssigneePersonId()), ProcessTaskDocument::getAssigneePersonId, dto.getAssigneePersonId()) .eq(StringUtils.hasText(dto.getAssigneePersonId()), ProcessTaskDocument::getAssigneePersonId, dto.getAssigneePersonId())
.matchPhrase(StringUtils.hasText(dto.getAssigneeName()), ProcessTaskDocument::getAssigneeName, dto.getAssigneeName()) .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) .routing(ES_FIXED_ROUTING)
; ;
return esProcessTaskMapper.selectList(wrapper); return esProcessTaskMapper.selectList(wrapper);