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