按《FL最终代码审计与上线阻断清单》194 项已审计工作树形成候选,基座 = origin/main 11e0778。
- 源码/测试/资源:沿用已审计工作树内容(96 项相对远端为新增或更新),含未跟踪实现
CallbackFactStore、CallbackSourcePolicy、VariableContract、FormalApplyCommandService、
FlowActorContextGate 等;C01 续验夹具修正一并入内。
- CI:保留远端 11e0778 的门禁强化(CI_SOURCE_SHA 核对、容器回收验证、空 schema 反向门禁、
main ref 才推镜像);ci/flow-test-schema.sql 按当前实体重新生成(14→20 表,补 6 新表与
6 新列,回调日志复合唯一键 uk_flw_log_event_reg),workflow 表数断言同步 14→20。
- 依据:docs/tasks/evidence/FL-final-audit-20261027(194 项哈希/版本核对)。
102 lines
4.4 KiB
Java
102 lines
4.4 KiB
Java
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;
|
||
|
||
/**
|
||
* 关联表单的<b>确切版本</b>(v3/TASK_1):与 {@link #formUuid} 成对,发布期按这组坐标取快照,
|
||
* 中心返回的坐标与请求不符即阻断发布。
|
||
*
|
||
* <p>为什么必须钉版本而不是"发布时取当前发布版":同一条流程线的两次发布可能落到不同的表结构上,
|
||
* 而表达式校验、办件回显都按嵌入的 formContract 判——版本不钉住,"这条流程当时用的哪张表"
|
||
* 就成了只能猜的历史。存的是服务器侧核验过的版本号。</p>
|
||
*
|
||
* <p>null 只出现在本次改造之前已经关联了表单的存量行上(C1 第一刀没这列):
|
||
* 那种行发布时仍走"当前发布版"的旧口径,改造后新保存/新关联一律成对写入。</p>
|
||
*/
|
||
@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;
|
||
}
|