package com.yunhai.flowcenter.entity; import com.yunhai.flowcenter.enums.FlwEnums; import lombok.Getter; import lombok.Setter; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Index; import javax.persistence.Table; import javax.persistence.UniqueConstraint; import java.time.LocalDateTime; /** * 流程定义(概览 §4.1 + V2.0 Part D #2/#3 修订)。 * flow_guid 绑定"这条流程线"而非某个版本:升版后业务方绑定关系零改动,新发起自动走 * 当前已发布最高版本;item_code/form_uuid 留可空列(M1 不启用,原生模式/表单二期)。 */ @Getter @Setter @Entity @Table(name = "flw_def", uniqueConstraints = @UniqueConstraint(name = "uk_flw_def_guid_ver", columnNames = {"sch_id", "flow_guid", "version"}), indexes = @Index(name = "idx_flw_def_guid", columnList = "sch_id, flow_guid, status, version")) public class FlwDef extends BaseEntity { /** 租户键 */ @Column(name = "sch_id", nullable = false) private Long schId; /** 对外稳定流程标识:创建草稿时生成(UUID 去横线小写),同一 code 跨版本不变 */ @Column(name = "flow_guid", nullable = false, length = 32) private String flowGuid; /** * 流程编码(管理端分类/检索标签,可重名)。2026-10-10 起唯一键改为 (sch_id, flow_guid, version), * 编码不再承担唯一性——多条流程线(如同为请假的产假/丧假)可共用一个编码。 */ @Column(name = "code", nullable = false, length = 64) private String code; /** 流程名 */ @Column(name = "name", nullable = false, length = 128) private String name; /** 归属应用(子应用 appKey,可空=未分配;管理端"按应用筛选"维度,2026-10-10) */ @Column(name = "app_key", length = 64) private String appKey; /** 版本,发布后不可改,改定义=升版本 */ @Column(name = "version", nullable = false) private Integer version; /** 关联 CMS 事项业务键(原生模式用,M1 不启用;与外部模式的 biz_* 互斥) */ @Column(name = "item_code", length = 64) private String itemCode; /** 关联表单定义 uuid(表单中心对外身份,32 位;M1 恒 null,二期对接时启用) */ @Column(name = "form_uuid", length = 32) private String formUuid; /** * 关联表单的确切版本(v3/TASK_1):与 {@link #formUuid} 成对,发布期按这组坐标取快照, * 中心返回的坐标与请求不符即阻断发布。 * *

为什么必须钉版本而不是"发布时取当前发布版":同一条流程线的两次发布可能落到不同的表结构上, * 而表达式校验、办件回显都按嵌入的 formContract 判——版本不钉住,"这条流程当时用的哪张表" * 就成了只能猜的历史。存的是服务器侧核验过的版本号。

* *

null 只出现在本次改造之前已经关联了表单的存量行上(C1 第一刀没这列): * 那种行发布时仍走"当前发布版"的旧口径,改造后新保存/新关联一律成对写入。

*/ @Column(name = "form_version") private Integer formVersion; /** * 线级停发标志(2026-10-25 T03):1=该 flowGuid 整线停发——阻止新发起/预览,不影响在途实例 * (在途按实例固定 defId 原版推进)。与版本级 status(DISABLED) 正交:线级停发后 enable() * 恢复的只是版本状态,线仍不可新发起;enableLine 才恢复线可用性,且不改写任何发布内容字节。 * 批量 UPDATE 全版本行同值,读任一行即读线状态。 */ @Column(name = "line_offline", nullable = false, columnDefinition = "INT NOT NULL DEFAULT 0") private Integer lineOffline = 0; /** §5.1 流程定义 JSON */ @Column(name = "content_json", nullable = false, columnDefinition = "LONGTEXT") private String contentJson; /** 0 草稿 / 1 已发布 / 2 停用(停用=不可新发起,存量跑完) */ @Column(name = "status", nullable = false) private Integer status = FlwEnums.DefStatus.DRAFT.getCode(); /** 发布时间 */ @Column(name = "publish_time") private LocalDateTime publishTime; /** 升版本改动说明(议题二③,可跳过;仅新版本行有值,草稿直改不写) */ @Column(name = "change_log", length = 500) private String changeLog; }