package jnpf.bizcommon.onlyoffice.entity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.util.Date; /** * OnlyOffice 编辑会话(onlyoffice_session)。 * *

一个文件一行,随保存递增 {@link #versionNo} 并轮换 {@link #docKey}。它承担两个职责: *

    *
  1. 业务上下文的落脚点——OnlyOffice 回调体字段是固定的一套,config 里的自定义 * 字段不会回传,所以 bizModule/bizDataId 必须在签发 config 时落库,回调时靠 docKey 反查;
  2. *
  3. 编辑锁——DS 默认行为就是协同(同 docKey 自动合并会话),本期不做协同, * 靠 lockUserId + lockHeartbeat 让第二个人只拿到只读 config。
  4. *
* *

表名前缀用能力名而非服务名(对齐 audit_events):能力会在服务间搬家, * 表名绑服务迟早名不符实。 */ @Data @TableName("onlyoffice_session") public class OnlyOfficeSessionEntity { @TableId(value = "f_id") private String id; @TableField(value = "f_tenant_id", fill = FieldFill.INSERT_UPDATE) private String tenantId; /** * 交给 DS 的文档版本标识,md5(fileId + "_" + versionNo)。 * 字符集只允许 [0-9a-zA-Z_-]、长度 ≤128,且必须与内容版本一一对应—— * 内容变了不换 key,DS 会命中自身缓存返回旧内容。 */ @TableField("doc_key") private String docKey; /** jnpf-file 的文件标识(annex 类型下即磁盘文件名) */ @TableField("file_id") private String fileId; /** 文件存储类型,默认 annex(表单附件) */ @TableField("file_type") private String fileType; /** 原始文件名,做编辑器标题用 */ @TableField("file_name") private String fileName; /** DS 的文档类型:word / cell / slide / pdf */ @TableField("document_type") private String documentType; /** 业务归属模块,权限判定与审计留痕用 */ @TableField("biz_module") private String bizModule; /** 业务归属记录 id */ @TableField("biz_data_id") private String bizDataId; /** 内容版本号,保存成功后 +1;与 docKey 联动 */ @TableField("version_no") private Integer versionNo; /** 会话状态,取值见 {@code SessionStatus} 常量 */ @TableField("session_status") private Integer sessionStatus; /** 当前持有编辑锁的用户;为空表示无人编辑 */ @TableField("lock_user_id") private String lockUserId; /** 锁心跳,随 status 1 回调刷新;超过 lock-timeout-minutes 视为失效 */ @TableField("lock_heartbeat") private Date lockHeartbeat; /** 最近一次保存回写完成的时间 */ @TableField("last_save_time") private Date lastSaveTime; /** 最近一次保存时 DS 报告的编辑者(回调 users 字段,逗号分隔) */ @TableField("last_editor_ids") private String lastEditorIds; @TableField("f_version") private Integer version; @TableField("f_delete_mark") private Integer deleteMark; @TableField("f_delete_time") private Date deleteTime; @TableField("f_delete_user_id") private String deleteUserId; @TableField(value = "f_creator_user_id", fill = FieldFill.INSERT) private String creatorUserId; @TableField(value = "f_creator_time", fill = FieldFill.INSERT) private Date creatorTime; @TableField(value = "f_last_modify_user_id", fill = FieldFill.UPDATE) private String lastModifyUserId; @TableField(value = "f_last_modify_time", fill = FieldFill.UPDATE) private Date lastModifyTime; /** 会话状态取值 */ public static final class SessionStatus { /** 空闲:无人打开,或已保存关闭 */ public static final int IDLE = 0; /** 编辑中:已下发可编辑 config,锁生效 */ public static final int EDITING = 1; /** 保存出错:DS 回调 status 3/7,需人工介入 */ public static final int SAVE_FAILED = 3; private SessionStatus() { } } }