feat(REQ-2752) - 增加任务维度的数据搜索

This commit is contained in:
wangli 2024-10-12 22:58:15 +08:00
parent 3a2c137503
commit 3318e09da2
12 changed files with 175 additions and 22 deletions

View File

@ -10,6 +10,7 @@ import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.HashMap;
@ -46,6 +47,7 @@ public class BpmnProcessInstanceCreateDTO {
* <h1 color=red>建议都传值在安心筑中对应工作台 ID</h1>
*/
@ApiModelProperty(value = "发起的审批是属于哪个租户")
@NotBlank(message = "工作台 ID 不能为空")
private String tenantId;
/**

View File

@ -6,7 +6,6 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
import java.util.List;
/**
@ -21,11 +20,11 @@ import java.util.List;
public class InstanceSearchReqDTO extends BpmPageParam {
@ApiModelProperty(value = "审批人所属租户 ID")
@NotBlank(message = "租户 ID 不能为空")
// @NotBlank(message = "租户 ID 不能为空")
private String tenantId;
@ApiModelProperty(value = "审批人所属单位 ID")
@NotBlank(message = "单位 ID 不能为空")
// @NotBlank(message = "单位 ID 不能为空")
private String ouId;
@ApiModelProperty(value = "审批人自然人 ID")

View File

@ -21,29 +21,31 @@ import java.util.List;
public class TaskSearchReqDTO extends BpmPageParam {
private static final long serialVersionUID = -1L;
@ApiModelProperty(value = "流程实例 ID")
private String processInstanceId;
/**
* 搜索含有指定该租户的任务
*/
@ApiModelProperty(value = "租户 ID 集合")
private List<String> tenantIds;
@ApiModelProperty(value = "租户 ID")
private String assigneeTenantId;
/**
* 搜索含有指定单位的任务
*/
@ApiModelProperty(value = "单位 ID 集合")
private List<String> ouIds;
@ApiModelProperty(value = "单位 ID")
private String assigneeOuId;
/**
* 搜索含有指定自然人的任务
*/
@ApiModelProperty(value = "自然人 ID")
private String personId;
private String assigneePersonId;
/**
* 搜索含有指定自然人名称的任务
*/
@ApiModelProperty(value = "自然人姓名集合")
private String name;
@ApiModelProperty(value = "自然人姓名")
private String assigneeName;
/**
* 与上面三个属性互斥

View File

@ -0,0 +1,112 @@
package cn.axzo.workflow.common.model.response.es;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.util.Date;
/**
* 搜索 ES 的流程任务相关数据模型
*
* @author wangli
* @since 2024-10-12 21:53
*/
@Data
@ApiModel("搜索 ES 的流程任务相关数据模型")
public class ProcessTaskDocumentVO {
/**
* 任务 ID
*/
private String id;
/**
* 归属的流程实例 ID
*/
private String processInstanceId;
/**
* 归属的流程实例定义 ID
*/
private String processDefinitionId;
/**
* 任务定义 KEY,对应节点 ID
*/
private String taskDefinitionKey;
/**
* 任务名称
*/
private String name;
/**
* 任务状态:审批中/通过/驳回/转交/加签...
*/
private String status;
/**
* 操作建议
*/
private String advice;
/**
* 操作描述
*/
private String operationDesc;
/**
* 流程实例的发起时间
*/
private Date startTime;
/**
* 流程实例的结束时间
*/
private Date endTime;
/**
* 流程实例的持续时间 ms
*/
private Long duration;
/**
* 归属租户, processInstance#tenantId 一致
*/
private String tenantId;
/**
* 审批人姓名
*/
private String assigneeName;
/**
* 审批人自然人 ID
*/
private String assigneePersonId;
/**
* 审批人所属单位 ID
*/
private String assigneeOuId;
/**
* 审批人所属租户 ID
*/
private String assigneeTenantId;
/**
* 审批方式:配置审批人/业务指定/业务触发(不含人)
*/
private String approvalMethod;
/**
* 节点类型:审批节点/业务节点/评论节点/抄送节点
*/
private String nodeType;
/**
* 节点模式:会签/或签
*/
private String nodeMode;
}

View File

@ -33,7 +33,7 @@ public class ProcessInstanceDocument {
* 流程实例 ID
*/
@IndexId(type = IdType.CUSTOMIZE)
private String id;
private String instanceId;
/**
* 流程实例名称

View File

@ -3,8 +3,6 @@ package cn.axzo.workflow.es.model;
import lombok.Data;
import org.dromara.easyes.annotation.IndexField;
import org.dromara.easyes.annotation.IndexId;
import org.dromara.easyes.annotation.IndexName;
import org.dromara.easyes.annotation.Settings;
import org.dromara.easyes.annotation.rely.FieldType;
import org.dromara.easyes.annotation.rely.IdType;
@ -24,7 +22,7 @@ public class ProcessTaskDocument {
* 任务 ID
*/
@IndexId(type = IdType.CUSTOMIZE)
private String id;
private String taskId;
/**
* 归属的流程实例 ID

View File

@ -2,9 +2,9 @@ package cn.axzo.workflow.es.service;
import cn.axzo.workflow.common.model.request.es.TaskSearchReqDTO;
import cn.axzo.workflow.es.model.ProcessTaskDocument;
import org.dromara.easyes.core.biz.EsPageInfo;
import java.util.Collection;
import java.util.List;
/**
* 操作流程任务的 ES Service
@ -41,4 +41,5 @@ public interface EsProcessTaskService {
*/
Integer insertBatch(String routing, String parentId, Collection<ProcessTaskDocument> processTaskDocuments);
List<ProcessTaskDocument> search(TaskSearchReqDTO dto);
}

View File

@ -55,7 +55,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());
processInstanceDocument.setProcessDefinitionId(hpi.getProcessDefinitionId());

View File

@ -1,6 +1,9 @@
package cn.axzo.workflow.es.service.aggregation;
import cn.axzo.basics.common.BeanMapper;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import cn.axzo.workflow.common.model.request.es.TaskSearchReqDTO;
import cn.axzo.workflow.common.model.response.es.ProcessTaskDocumentVO;
import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper;
import cn.axzo.workflow.core.repository.entity.ExtAxHiTaskInst;
import cn.axzo.workflow.core.repository.entity.ExtAxProcessLog;
@ -76,7 +79,7 @@ public class AggregateProcessTaskService {
List<ProcessTaskDocument> toEsProcessTaskDocuments = new ArrayList<>();
logs.forEach(log -> {
ProcessTaskDocument processTaskDocument = new ProcessTaskDocument();
processTaskDocument.setId(log.getTaskId());
processTaskDocument.setTaskId(log.getTaskId());
processTaskDocument.setProcessInstanceId(log.getProcessInstanceId());
processTaskDocument.setProcessDefinitionId(hpi.getProcessDefinitionId());
processTaskDocument.setTaskDefinitionKey(log.getActivityId());
@ -151,7 +154,7 @@ public class AggregateProcessTaskService {
// List<Attachment> attachments = attachmentMap.getOrDefault(task.getId(), Collections.emptyList());
ProcessTaskDocument processTaskDocument = new ProcessTaskDocument();
processTaskDocument.setId(task.getId());
processTaskDocument.setTaskId(task.getId());
processTaskDocument.setProcessInstanceId(task.getProcessInstanceId());
processTaskDocument.setProcessDefinitionId(task.getProcessDefinitionId());
processTaskDocument.setTaskDefinitionKey(task.getTaskDefinitionKey());
@ -230,4 +233,8 @@ public class AggregateProcessTaskService {
|| (Objects.equals(i.getAssignee(), OLD_TASK_ASSIGNEE_SKIP_FLAT) && Objects.equals(REJECTION_AUTO_COMPLETED.getDesc(), i.getDeleteReason()))
).filter(i -> !(!Objects.equals(i.getAssignee(), OLD_TASK_ASSIGNEE_SKIP_FLAT) && Objects.equals(MI_END.getStatus(), i.getDeleteReason())));
}
public List<ProcessTaskDocumentVO> search(TaskSearchReqDTO dto) {
return BeanMapper.copyList(esProcessTaskService.search(dto), ProcessTaskDocumentVO.class);
}
}

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::getId), dto.getProcessInstanceIds()));
.in(FieldUtils.val(ProcessInstanceDocument::getInstanceId), dto.getProcessInstanceIds()));
return new BpmPageResult<>(processInstanceDocuments, (long) processInstanceDocuments.size());
}
@ -122,7 +122,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())
.like(StringUtils.hasText(dto.getProcessInstanceName()), FieldUtils.val(ProcessInstanceDocument::getProcessInstanceName), dto.getProcessInstanceName())
.in(CollectionUtils.isEmpty(dto.getProcessInstanceIds()), FieldUtils.val(ProcessInstanceDocument::getId), dto.getProcessInstanceIds())
.in(CollectionUtils.isEmpty(dto.getProcessInstanceIds()), FieldUtils.val(ProcessInstanceDocument::getInstanceId), dto.getProcessInstanceIds())
// .routing(ES_FIXED_ROUTING)
.orderByDesc(FieldUtils.val(ProcessInstanceDocument::getStartTime))
;

View File

@ -7,12 +7,13 @@ 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.biz.EsPageInfo;
import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.Collection;
import java.util.List;
/**
* 操作流程任务的 ES Service 实现
@ -53,4 +54,16 @@ public class EsProcessTaskServiceImpl implements EsProcessTaskService {
return esProcessTaskMapper.insertBatch(routing, parentId, processTaskDocuments);
}
@Override
public List<ProcessTaskDocument> search(TaskSearchReqDTO dto) {
LambdaEsQueryWrapper<ProcessTaskDocument> wrapper = new LambdaEsQueryWrapper<>();
wrapper.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())
.eq(StringUtils.hasText(dto.getAssigneeName()), ProcessTaskDocument::getAssigneeName, dto.getAssigneeName())
.parentId(StringUtils.hasText(dto.getProcessInstanceId()), dto.getProcessInstanceId(), "process_instance_document")
// .hasParent(StringUtils.hasText(dto.getProcessInstanceId()), "workflow_engine_test_process_instance_document", w -> w.eq(FieldUtils.val(ProcessInstanceDocument::getId), dto.getProcessInstanceId()))
;
return esProcessTaskMapper.selectList(wrapper);
}
}

View File

@ -2,12 +2,16 @@ package cn.axzo.workflow.server.controller.web.es;
import cn.axzo.workflow.client.feign.es.EsProcessInstanceApi;
import cn.axzo.workflow.common.model.request.es.InstanceSearchReqDTO;
import cn.axzo.workflow.common.model.request.es.TaskSearchReqDTO;
import cn.axzo.workflow.common.model.response.BpmPageResult;
import cn.axzo.workflow.common.model.response.es.ProcessInstanceDocumentVO;
import cn.axzo.workflow.common.model.response.es.ProcessTaskDocumentVO;
import cn.axzo.workflow.es.service.aggregation.AggregateProcessInstanceService;
import cn.axzo.workflow.es.service.aggregation.AggregateProcessTaskService;
import cn.azxo.framework.common.model.CommonResponse;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@ -15,6 +19,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
/**
* ES 搜索相关操作
@ -29,6 +34,8 @@ import javax.annotation.Resource;
public class ElasticSearchController implements EsProcessInstanceApi {
@Resource
private AggregateProcessInstanceService aggregateProcessInstanceService;
@Autowired
private AggregateProcessTaskService aggregateProcessTaskService;
/**
* 审批数据搜索
@ -38,8 +45,20 @@ public class ElasticSearchController implements EsProcessInstanceApi {
*/
@PostMapping("/instance/search")
public CommonResponse<BpmPageResult<ProcessInstanceDocumentVO>> searchInstanceInEs(@Validated @RequestBody InstanceSearchReqDTO dto) {
log.info("审批数据搜索 processInstanceSearch===>>>参数:{}", JSONUtil.toJsonStr(dto));
log.info("审批数据搜索 searchInstanceInEs===>>>参数:{}", JSONUtil.toJsonStr(dto));
return CommonResponse.success(aggregateProcessInstanceService.search(dto));
}
/**
* 审批任务数据搜索
*
* @param dto
* @return
*/
@PostMapping("/task/search")
public CommonResponse<List<ProcessTaskDocumentVO>> searchTaskInEs(@Validated @RequestBody TaskSearchReqDTO dto) {
log.info("审批任务数据搜索 searchTaskInEs===>>>参数:{}", JSONUtil.toJsonStr(dto));
return CommonResponse.success(aggregateProcessTaskService.search(dto));
}
}