feat(REQ-3769) - 调整审批人在签批业务下,文档的阅读状态设置

This commit is contained in:
wangli 2025-04-09 18:09:06 +08:00
parent b94c94e284
commit 2655fa708f
6 changed files with 31 additions and 51 deletions

View File

@ -20,9 +20,9 @@ import lombok.NoArgsConstructor;
@Builder
public class DocStatusDTO {
/**
*
* 文档 ID
*/
@ApiModelProperty(value = "")
@ApiModelProperty(value = "文档 ID")
private Long id;
/**

View File

@ -16,5 +16,7 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor
public class DocPendingVO extends DocBaseVO {
private String fileKey;
private String ossUrl;
}

View File

@ -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) {
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)) {
selectDocIds.addAll((List<Long>) variableInstance.getValue());
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())));
}

View File

@ -29,14 +29,6 @@ public class ExtAxReadRecord extends BaseEntity<ExtAxReadRecord> {
* 流程实例 ID
*/
private String processInstanceId;
/**
* 审批模板节点 ID
*/
private String activityId;
/**
* 任务 ID
*/
private String taskId;
/**
* 自热人 ID

View File

@ -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())
;
}

View File

@ -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));
}
}