package jnpf.bizcommon.onlyoffice.service.impl;
|
|
import jnpf.dmsEntity.qianpiye.DmsQianpiyeOnlyOfficeConstants;
|
import jnpf.bizcommon.onlyoffice.entity.OnlyOfficeConfigParam;
|
import jnpf.bizcommon.onlyoffice.entity.OnlyOfficeSessionEntity;
|
import lombok.RequiredArgsConstructor;
|
import org.springframework.core.annotation.Order;
|
import org.springframework.stereotype.Component;
|
import org.springframework.util.StringUtils;
|
import java.util.Objects;
|
|
/** 签批页标注场景的编辑准入与插件运行上下文。 */
|
@Component
|
@Order(300)
|
@RequiredArgsConstructor
|
public class DmsQianpiyeConfigBuilder implements OnlyOfficeSceneConfigBuilder {
|
|
private static final String MODE_VIEW = "view";
|
|
private final OnlyOfficeEditPermissionEvaluator editPermissionEvaluator;
|
private final DmsQianpiyeTicketIssuer ticketIssuer;
|
|
@Override
|
public String scene() {
|
return DmsQianpiyeOnlyOfficeConstants.BIZ_SCENE;
|
}
|
|
@Override
|
public String bizModule() {
|
return DmsQianpiyeOnlyOfficeConstants.BIZ_MODULE;
|
}
|
|
@Override
|
public OnlyOfficeSceneBuildPlan build(OnlyOfficeSceneBuildContext context) {
|
return OnlyOfficeSceneBuildPlan.builder()
|
.editAdmission(() -> editPermissionEvaluator.canEdit(bizModule(), context.getUser()))
|
.allowSameUserLockReopen(true)
|
.hideCommentsWhenWritable(true)
|
.pluginHiddenInReadOnly(DmsQianpiyeOnlyOfficeConstants.PLUGIN_CODE)
|
.pluginContextCustomizer((pluginCode, pluginGuid, pluginContext, writable) -> {
|
if (!DmsQianpiyeOnlyOfficeConstants.PLUGIN_CODE.equals(pluginCode)) {
|
return;
|
}
|
pluginContext.put("canAnnotate", writable);
|
if (writable) {
|
pluginContext.put("scope", DmsQianpiyeOnlyOfficeConstants.SCOPE);
|
pluginContext.put("ticket", ticketIssuer.issue(
|
context.getParam(), context.getUser(), pluginGuid));
|
}
|
})
|
.build();
|
}
|
|
@Override
|
public boolean matchesSession(OnlyOfficeSessionEntity session, OnlyOfficeConfigParam param,
|
String tenantId) {
|
boolean sameQianpiyeFile = Objects.equals(tenantId, session.getTenantId())
|
&& Objects.equals(bizModule(), session.getBizModule())
|
&& Objects.equals(session.getFileId(), param.getFileId())
|
&& Objects.equals(session.getFileType(), param.getFileType());
|
if (sameQianpiyeFile && !StringUtils.hasText(param.getBizDataId())) {
|
// 签批页文件存放在通用附件桶,不以业务记录 ID 归属。兼容历史会话保留的 bizDataId:
|
// 1. 通用上传组件的只读预览不带业务上下文;2. 签批页标注请求只带 dms.qianpiye 场景。
|
boolean genericPreview = MODE_VIEW.equals(param.getMode())
|
&& !StringUtils.hasText(param.getBizModule())
|
&& !StringUtils.hasText(param.getBizScene());
|
boolean qianpiyeAnnotation = Objects.equals(bizModule(), param.getBizModule())
|
&& Objects.equals(scene(), param.getBizScene());
|
return genericPreview || qianpiyeAnnotation;
|
}
|
return OnlyOfficeSceneConfigBuilder.super.matchesSession(session, param, tenantId);
|
}
|
|
@Override
|
public boolean canAdoptUnboundSession(OnlyOfficeSessionEntity session, OnlyOfficeConfigParam param,
|
String tenantId) {
|
if (!Objects.equals(tenantId, session.getTenantId())
|
|| !Objects.equals(session.getFileId(), param.getFileId())
|
|| !Objects.equals(session.getFileType(), param.getFileType())
|
|| !Integer.valueOf(OnlyOfficeSessionEntity.SessionStatus.IDLE).equals(session.getSessionStatus())
|
|| StringUtils.hasText(session.getBizDataId())) {
|
return false;
|
}
|
// 历史普通编辑会话可能留有页面自定义的 bizModule,但未写 bizDataId 就没有业务记录归属。
|
// 签批页仅接管这种空闲会话;已有 bizDataId 的会话始终禁止跨业务迁移。
|
return true;
|
}
|
}
|