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