feat(REQ-3769) - 调整审批人在签批业务下,文档的阅读状态设置
This commit is contained in:
parent
b94c94e284
commit
2655fa708f
@ -20,9 +20,9 @@ import lombok.NoArgsConstructor;
|
||||
@Builder
|
||||
public class DocStatusDTO {
|
||||
/**
|
||||
*
|
||||
* 文档 ID
|
||||
*/
|
||||
@ApiModelProperty(value = "")
|
||||
@ApiModelProperty(value = "文档 ID")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
|
||||
@ -16,5 +16,7 @@ import lombok.NoArgsConstructor;
|
||||
@NoArgsConstructor
|
||||
public class DocPendingVO extends DocBaseVO {
|
||||
|
||||
private String fileKey;
|
||||
|
||||
private String ossUrl;
|
||||
}
|
||||
|
||||
@ -10,14 +10,17 @@ import org.flowable.common.engine.impl.interceptor.Command;
|
||||
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
||||
import org.flowable.engine.HistoryService;
|
||||
import org.flowable.engine.RepositoryService;
|
||||
import org.flowable.engine.RuntimeService;
|
||||
import org.flowable.engine.history.HistoricProcessInstance;
|
||||
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
||||
import org.flowable.engine.impl.util.CommandContextUtil;
|
||||
import org.flowable.engine.repository.ProcessDefinition;
|
||||
import org.flowable.variable.api.history.HistoricVariableInstance;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
@ -28,6 +31,7 @@ import static cn.axzo.workflow.common.code.BpmnModelRespCode.MODEL_FILE_QUERY_ER
|
||||
import static cn.axzo.workflow.common.code.BpmnProcessDefinitionRespCode.PROCESS_DEFINITION_ID_ILLEGAL;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.NO_TENANT_ID;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.SIGN_PROCESS_ENABLE_DOC_IDS;
|
||||
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.PROCESSING;
|
||||
import static cn.axzo.workflow.core.service.impl.ExtAxModelDocServiceImpl.buildQueryWrapper;
|
||||
|
||||
|
||||
@ -80,22 +84,33 @@ public class CustomGetModelDocsCmd implements Command<List<DocBaseVO>> {
|
||||
ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
||||
RepositoryService repositoryService = processEngineConfiguration.getRepositoryService();
|
||||
ProcessDefinition processDefinition;
|
||||
List<Long> selectDocIds = new ArrayList<>();
|
||||
List<Long> enableDocIds = new ArrayList<>();
|
||||
if (StringUtils.hasText(processInstanceId)) {
|
||||
HistoryService historyService = processEngineConfiguration.getHistoryService();
|
||||
HistoricProcessInstance instance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
|
||||
processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(instance.getProcessDefinitionId()).singleResult();
|
||||
if (filterSelect) {
|
||||
HistoricVariableInstance variableInstance = historyService.createHistoricVariableInstanceQuery().processInstanceId(processInstanceId).variableName(SIGN_PROCESS_ENABLE_DOC_IDS).singleResult();
|
||||
if (Objects.nonNull(variableInstance)) {
|
||||
selectDocIds.addAll((List<Long>) variableInstance.getValue());
|
||||
if (Objects.isNull(instance)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
if (Objects.equals(PROCESSING.getStatus(), instance.getBusinessStatus())) {
|
||||
RuntimeService runtimeService = processEngineConfiguration.getRuntimeService();
|
||||
enableDocIds.addAll(runtimeService.getVariable(processInstanceId, SIGN_PROCESS_ENABLE_DOC_IDS, List.class));
|
||||
} else {
|
||||
HistoricVariableInstance variableInstance = historyService.createHistoricVariableInstanceQuery().processInstanceId(processInstanceId).variableName(SIGN_PROCESS_ENABLE_DOC_IDS).singleResult();
|
||||
if (Objects.nonNull(variableInstance)) {
|
||||
enableDocIds.addAll((List<Long>) variableInstance.getValue());
|
||||
}
|
||||
}
|
||||
}
|
||||
processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(instance.getProcessDefinitionId()).singleResult();
|
||||
} else {
|
||||
List<ProcessDefinition> definitions = repositoryService.createProcessDefinitionQuery()
|
||||
.processDefinitionKey(parseProcessDefinitionKey())
|
||||
.processDefinitionWithoutTenantId()
|
||||
.list();
|
||||
if (CollectionUtils.isEmpty(definitions)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
Optional<ProcessDefinition> first = definitions.stream().filter(i -> i.getTenantId().equals(tenantId))
|
||||
.max(Comparator.comparing(ProcessDefinition::getVersion));
|
||||
processDefinition = first.orElseGet(() -> definitions.stream().filter(i -> i.getTenantId().equals(NO_TENANT_ID)).max(Comparator.comparing(ProcessDefinition::getVersion)).get());
|
||||
@ -108,7 +123,7 @@ public class CustomGetModelDocsCmd implements Command<List<DocBaseVO>> {
|
||||
List<ExtAxModelDoc> docs = extAxModelDocMapper.selectList(buildQueryWrapper(query));
|
||||
|
||||
if (filterSelect) {
|
||||
docs = docs.stream().filter(i -> selectDocIds.contains(i.getId())).collect(Collectors.toList());
|
||||
docs = docs.stream().filter(i -> enableDocIds.contains(i.getId())).collect(Collectors.toList());
|
||||
}
|
||||
return BeanMapper.copyList(docs, DocBaseVO.class, (s, t) -> t.setFileType(FileTypeEnum.valueOfType(s.getFileType())));
|
||||
}
|
||||
|
||||
@ -29,14 +29,6 @@ public class ExtAxReadRecord extends BaseEntity<ExtAxReadRecord> {
|
||||
* 流程实例 ID
|
||||
*/
|
||||
private String processInstanceId;
|
||||
/**
|
||||
* 审批模板节点 ID
|
||||
*/
|
||||
private String activityId;
|
||||
/**
|
||||
* 任务 ID
|
||||
*/
|
||||
private String taskId;
|
||||
|
||||
/**
|
||||
* 自热人 ID
|
||||
|
||||
@ -12,7 +12,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.google.common.collect.Lists;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.flowable.engine.TaskService;
|
||||
import org.flowable.task.api.Task;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
@ -52,7 +51,6 @@ public class ExtAxReadRecordServiceImpl extends ServiceImpl<ExtAxReadRecordMappe
|
||||
public Boolean changeReadStatus(ChangeApproverReadStatusDTO dto) {
|
||||
ExtAxReadRecord entity = new ExtAxReadRecord();
|
||||
entity.setProcessInstanceId(dto.getProcessInstanceId());
|
||||
entity.setTaskId(dto.getTaskId());
|
||||
entity.setPersonId(Long.valueOf(dto.getAssigner().getPersonId()));
|
||||
|
||||
ExtAxReadRecord record;
|
||||
@ -60,14 +58,8 @@ public class ExtAxReadRecordServiceImpl extends ServiceImpl<ExtAxReadRecordMappe
|
||||
record = extAxReadRecordMapper.selectOne(buildWrapper(entity));
|
||||
if (Objects.isNull(record)) {
|
||||
// 新增全新阅读记录
|
||||
Task task = taskService.createTaskQuery().processInstanceId(dto.getProcessInstanceId()).taskId(dto.getTaskId()).singleResult();
|
||||
if (Objects.isNull(task)) {
|
||||
return false;
|
||||
}
|
||||
record = new ExtAxReadRecord();
|
||||
record.setProcessInstanceId(dto.getProcessInstanceId());
|
||||
record.setActivityId(task.getTaskDefinitionKey());
|
||||
record.setTaskId(dto.getTaskId());
|
||||
record.setPersonId(Long.valueOf(dto.getAssigner().getPersonId()));
|
||||
record.setReadStatus(Lists.newArrayList(SimpleDocDTO.builder()
|
||||
.id(dto.getDocId())
|
||||
@ -97,8 +89,6 @@ public class ExtAxReadRecordServiceImpl extends ServiceImpl<ExtAxReadRecordMappe
|
||||
private LambdaQueryWrapper<ExtAxReadRecord> buildWrapper(ExtAxReadRecord entity) {
|
||||
return new LambdaQueryWrapper<ExtAxReadRecord>()
|
||||
.eq(StringUtils.hasText(entity.getProcessInstanceId()), ExtAxReadRecord::getProcessInstanceId, entity.getProcessInstanceId())
|
||||
.eq(StringUtils.hasText(entity.getActivityId()), ExtAxReadRecord::getActivityId, entity.getActivityId())
|
||||
.eq(StringUtils.hasText(entity.getTaskId()), ExtAxReadRecord::getTaskId, entity.getTaskId())
|
||||
.eq(Objects.nonNull(entity.getPersonId()), ExtAxReadRecord::getPersonId, entity.getPersonId())
|
||||
;
|
||||
}
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
package cn.axzo.workflow.server.controller.web.bpmn;
|
||||
|
||||
import cn.axzo.nanopart.doc.api.anonymous.DocAnonymousDatabaseApi;
|
||||
import cn.axzo.nanopart.doc.api.index.request.GetNodeInfoRequest;
|
||||
import cn.axzo.oss.http.api.ServerFileServiceApi;
|
||||
import cn.axzo.oss.http.model.ApiSignUrlDownloadRequest;
|
||||
import cn.axzo.oss.http.model.ApiSignUrlDownloadResponse;
|
||||
@ -52,7 +51,6 @@ import cn.axzo.workflow.server.controller.web.BasicPopulateAvatarController;
|
||||
import cn.azxo.framework.common.model.CommonResponse;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||
import com.google.common.collect.Lists;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections4.ListUtils;
|
||||
@ -76,7 +74,6 @@ import javax.annotation.Nullable;
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
@ -104,7 +101,7 @@ public class BpmnProcessInstanceController extends BasicPopulateAvatarController
|
||||
@Resource
|
||||
private ServerFileServiceApi serverFileServiceApi;
|
||||
@Resource
|
||||
private DocAnonymousDatabaseApi docApi;
|
||||
private DocAnonymousDatabaseApi docAnonymousApi;
|
||||
@Resource
|
||||
private ExtAxReadRecordService readRecordService;
|
||||
@Resource
|
||||
@ -462,23 +459,15 @@ public class BpmnProcessInstanceController extends BasicPopulateAvatarController
|
||||
@PostMapping("/select/doc/list")
|
||||
public CommonResponse<List<DocPendingVO>> processInstanceSelectDocs(ProcessDocQueryDTO dto) {
|
||||
List<DocPendingVO> docs = bpmnProcessInstanceService.processInstanceSelectDocs(dto);
|
||||
GetNodeInfoRequest request = new GetNodeInfoRequest();
|
||||
List<String> wpsCodes = docs.stream().map(DocPendingVO::getFileRelationId).distinct().collect(Collectors.toList());
|
||||
// TODO 需要提供支持批量查询 fileKey 的接口
|
||||
// request.setCode(wpsCodes);
|
||||
docApi.getNodeInfo(request);
|
||||
Map</*wpsCode*/String, /*fileKey*/String> wpsCodeWithFileKeyMap = new HashMap<>();
|
||||
|
||||
List<String> fileKeys = docs.stream().map(DocPendingVO::getFileKey).filter(StringUtils::hasText).collect(Collectors.toList());
|
||||
ApiSignUrlDownloadRequest ossRequest = new ApiSignUrlDownloadRequest();
|
||||
ossRequest.setFileKeys(Lists.newArrayList(wpsCodeWithFileKeyMap.values()));
|
||||
Map</*fileKey*/String, /*ossUrl*/String> ossUrlMap = RpcExternalUtil.rpcProcessor(() -> serverFileServiceApi.signUrlFetchDownload(ossRequest), "批量获取文件 OSS 地址", request)
|
||||
ossRequest.setFileKeys(fileKeys);
|
||||
Map</*fileKey*/String, /*ossUrl*/String> ossUrlMap = RpcExternalUtil.rpcProcessor(() -> serverFileServiceApi.signUrlFetchDownload(ossRequest), "批量获取文件 OSS 地址", ossRequest)
|
||||
.stream().collect(Collectors.toMap(ApiSignUrlDownloadResponse::getFileKey, ApiSignUrlDownloadResponse::getSignUrl, (s, t) -> s));
|
||||
docs.forEach(i -> {
|
||||
String fileKey = wpsCodeWithFileKeyMap.getOrDefault(i.getFileRelationId(), null);
|
||||
if (!StringUtils.hasText(fileKey)) {
|
||||
return;
|
||||
if (StringUtils.hasText(i.getFileKey())) {
|
||||
i.setOssUrl(ossUrlMap.getOrDefault(i.getFileKey(), null));
|
||||
}
|
||||
i.setOssUrl(ossUrlMap.getOrDefault(fileKey, null));
|
||||
});
|
||||
return success(docs);
|
||||
}
|
||||
@ -490,12 +479,6 @@ public class BpmnProcessInstanceController extends BasicPopulateAvatarController
|
||||
if (!StringUtils.hasText(dto.getAssigner().getPersonId())) {
|
||||
throw new WorkflowEngineException(PROCESS_DOC_READ_PARAM_ERROR);
|
||||
}
|
||||
try {
|
||||
String taskId = bpmnProcessTaskService.findTaskIdByInstanceIdAndPersonId(dto.getProcessInstanceId(), dto.getAssigner().getPersonId());
|
||||
dto.setTaskId(taskId);
|
||||
} catch (Exception e) {
|
||||
// ignore
|
||||
}
|
||||
return success(readRecordService.queryReadStatus(dto));
|
||||
}
|
||||
|
||||
@ -511,8 +494,6 @@ public class BpmnProcessInstanceController extends BasicPopulateAvatarController
|
||||
relationDocs.stream().filter(i -> Objects.equals(i.getId(), dto.getDocId()))
|
||||
.findAny().orElseThrow(() -> new WorkflowEngineException(PROCESS_DOC_ID_NOT_IN_MODEL));
|
||||
|
||||
String taskId = bpmnProcessTaskService.findTaskIdByInstanceIdAndPersonId(dto.getProcessInstanceId(), dto.getAssigner().getPersonId());
|
||||
dto.setTaskId(taskId);
|
||||
return success(readRecordService.changeReadStatus(dto));
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user