Skip to content

Java 更新日志 ​

当前版本 v1.8.54 · Maven Central(com.mldong:jeeflow-*)· 仓库 mldong/jeeflow-java · Releases

v1.8.54 — 2026-10-31 ​

「退回修改、重提直返」首轮发版(参考实现,tag v1.8.54=commit d99fb66;实现两笔 d99fb66+e6546f0,出口契约修复 9cdbfaf)。条文见 规范 04 引擎操作 「退回修改、重提直返」节。

  • 新增(节点属性):审批节点 properties.reapplyMode=NORMAL(缺省)/RETURN_TO_SOURCE, 非法值在解析期报配置错误,不静默按缺省处理。

  • 新增(submitType=6 直返档):来源节点配了 RETURN_TO_SOURCE 时,退发起人不再走 "重放申请节点出边",而是完成来源任务、给发起人建一条绑定本轮来源的申请待办 (任务变量保留键 _reapplyContext = {mode, sourceTaskId, sourceNode, branch}), 不创建来源之后的任务、并行分支中其他分支可继续办。准入校验排在任何状态变更之前 (会签来源、申请节点自身配直返 ⇒ 先报错不留半截事实)。

  • 新增(submitType=5 重提直返):带该上下文的申请待办只接受重新提交;重提直接回来源节点 建待办(parentTaskId=本轮申请行),不执行申请节点出边、不重算来源前条件、不重触发分叉; 参与者按来源节点规则重新解析(不锁定原退回人),遗留的 tf_nextNodeOperator 不参与建单。

  • 新增(并行分支归属与汇合):建单逐档继承父任务同档 round/root(分支根的 round=父任务 id、root=自身 id),落保留键 _branchCtx;汇合判据改为"本轮各分支根下无进行中任务、 且无申请任务携带指向该根该轮的 _reapplyContext.branch 等待"才放行且只放行一次; 存量任务没有 _branchCtx 时回落既有按分支节点名扫描的判据(零 DDL、零迁移)。

  • 新增(并发与入口纪律):办理入口先剥离客户端传入的同名保留键(伪造控制键被忽略且 不落库);同实例办理串行化(进程内按实例互斥),并发重提至多一个成功;带标记的申请待办 在跳转/拒绝/再次退回三个入口一律在任何状态变更之前显式拒绝(只接受 submitType=5)。

  • 新增(直返路径的拦截器与事件):直返建单走 FlowInterceptor 链并 fire TASK_START, 来源节点完成后的 postInterceptors 在直返腿同样执行(NodeModel 的 post 拦截器可见性随 e6546f0 补齐)。

  • 修复(ext 回退契约被新保留键打破):建单无条件写入 _branchCtx(空分支也写 []), 而"任务变量只剩引擎控制键 ⇒ 任务行 ext 回退实例变量"的判据 (issues/82-3 / 121 P1)原先只认 isFirstTaskNode ⇒ 每条任务行都从此 不再回退、内部键还直接从公开出口透出。现把两枚保留键算进控制键集合,回退后把 _reapplyContext 原样合回任务行 ext(前端「重新提交后返回:X」的唯一取数口), 合回落在副本上、不污染同一响应的 instanceExt。同笔补齐内存测试仓的 instance_variable 投影(与 JdbcProcessRepository 的 pi.variable AS instance_variable 同形,spec 06 §4.5 条款 6「同栈两仓同答案」)——缺这一列时门面级回退断言在 T0 恒真空。

  • 夹具(八栈同源):共享 flows/ 新增 14-return-to-source(线性)、 15-return-to-source-fork(并行+汇合)、16-return-to-source-decision(条件分支)、 18-return-to-source-nested(嵌套并行)四份;故意配错 reapplyMode 的那份 (17-...-bad-config.json)不进共享目录——它会污染所有"解析全部共享流程"的套件 与发版漂移门禁,只留在 java 的 jeeflow-core/src/test/resources/flows-invalid/。

读数:jeeflow-core 全量 322/322(直返专项 ReturnToSourceTest 17/17,含嵌套并行、 条件不重算、多分支分别退回、重复退回绑定本轮、并发重提只一个成功、伪造保留键、 非法配置报错、审批人重解析);jeeflow-repository-jdbc 66/66(含 H2 MODE=MySQL 的 ReturnToSourceJdbcTest:直返上下文经 SQL 列往返后仍可消费、并行等待生效、两线程同 重提只 1 个成功);事务三档 TransactionTierTest 10/10;演示站矩阵 23 格全绿。

v1.8.53 — 2026-10-17 ​

audit8 R110+R112(tag v1.8.53)。

  • 新增(删除定义守卫):processDefine/remove 删除前校验该定义下是否存在任何实例(含已办结/已撤回),存在即拒(对外 99999999,内部码 20010005,msg 逐字「存在正在未完成的流程实例,不允许删除!」);批量 {ids} 先整批校验再删,全无实例才执行。
  • 修复(委托 update 缺键清空):surrogate 列 NOT NULL,缺键清空此前落 null 导致更新失败;现落空串(读侧 null 与 '' 同档),修平 L2-13 门禁。
  • 诊断(未知档的边):highLight 补全与决策出边落穿时补 from/to 告警,行为不变。

v1.8.51 — 2026-10-16 ​

audit8 R68② 修复(tag v1.8.51,引擎 commit ca3576e)。

  • 修复(委托 enabled 的布尔档):processSurrogate/save|update 的 enabled 传 JSON 布尔 true 时, 此前走 Integer.parseInt("true") 抛 NumberFormatException 落默认值 ⇒ 启用被读成停用, 与 规范 06 §4.5 条款 5「布尔 true ⇒ 1」相反。现 toInt 补 Boolean 支:true→1、false→0。 字符串数字档与数值档行为逐字不变(回归腿同判据内钉住)。
  • 同版携带(不改 java 行为):issues/230 R92 把 go/python/node 三栈的执行族返回值对齐本栈既有形状 (四法回传「本次动作产出的任务行」、空档 Collections.emptyList());issues/236 R68① 的 「缺键=清空」四腿基准也取自本参考实现——java 侧代码零改动,本条只为跨栈对账留痕。

v1.8.50 — 2026-10-15 ​

audit8 R63+R90 并批(tag v1.8.50,引擎 commit 2e9b524+ea73052)。

  • 行为变更(决策路由,issues/234 丙-9):decision 节点多条出边表达式同时为真时,改首条真边独走 (此前全部执行=多路并行流转)。对齐 规范 02 §5 与 go/python/node/rust/moon 五栈多数派;存量里依赖"多真边齐走"的流程受影响, 升级前自查 decision 节点出边表达式是否可能同时为真。
  • 修复(issues/231①):task 节点 ext 镜像判据沿 superclass 上溯——原 getDeclaredFields() 只看本类声明, 父类 NodeModel/BaseModel 已识别的 name/displayName/layout/pre/postInterceptors 被重复镜像一份进 ext。 对齐 boot2 内置版血统语义;规范 02 头注立法「已识别键(含父类继承链/黑名单 判据识别的)不得再镜像进 ext」。width/height 等非模型字段键仍照常镜像(判据收紧未误伤)。

v1.8.49 — 2026-10-13 ​

issues/180 收口:abandonTask 不再连带把整张单置 99(tag v1.8.49,引擎 commit 670163a)。 条文见 规范 04 · 引擎核心操作 §abandon 一档。

  • 变更:任务级废弃动作只废任务,实例 state 的写点已删——此前废弃一个任务会把同实例 其余待办一起打进「已废弃」。对齐 spec 与 Go/Python/Node 三栈既有形状(五栈同批改动,见各语言页)。
  • 现读更正:「连带置 99」不是内置版(boot2)的产品血统,全仓 abandonTask 零命中,系本栈自创后被 四家移植;五栈该方法全部零生产调用者(调用面 grep 仅定义处命中)⇒ 现生产零行为变化。
  • 判据:废弃后实例仍进行中/其余待办仍可见/整单废弃另走一条腿,三枚齐(摘守卫即红)。
  • 传播面:java→boot2/boot3/boot4,3 张镜像;同批 php/rust/csharp/moon 五引擎。

v1.8.48 — 2026-10-12 ​

issues/179 补修(真机探针定案,同一案的第二腿):processDesign/updateDefine 缺 name 时不再撞 NOT NULL (tag v1.8.48,引擎 commit 2c43ae5+2940b6f)。条文见 规范 08 场景 44。

  • 修复(用户可感知):name/displayName/type 三处改逐字段判空(缺=保持旧值)。改前缺名 content 无条件 setName(null) ⇒ UPDATE 撞 wf_process_design.name NOT NULL(MySQL 1048)⇒ 动作级 事务整体回滚、缺名快照存不进,对外只报「更新流程设计失败」;而 redeploy 随后读到 save 阶段含 name 的旧快照,静默 code=0——同一次缺名调用两条腿两个答案。
  • 为什么守卫在字段级而非动作级:内存腿 ?? stored.Name 会遮罩 null,拒收边界只能落在真正落库的那一腿; 跨栈门禁 L2-45 轴⑤ 用真库把这一形照出来。
  • 判据:JeeflowFacadeTest#test179* 五枚(新增缺名草稿入库一枚,摘 name 守卫定向跑红)+全仓回归绿。
  • 传播面:java→boot2/boot3/boot4 三壳三镜像(与 C# 同轮,见 csharp 页)。

v1.8.47 — 2026-10-12 ​

issues/179 前半(tag v1.8.47)。空值当没填这条通用放行在定义定位腿上的后果收口。

  • 修复(后果级):getLastByName 缺名/空串/全空白三档此前丢掉 t.name 条件继续查——返回的是 另一条流程的定义且 code=0;缺 name 时 saveDeployedDefine 的版本号会 +1 到别的流程头上。 本版起三档统一报「缺少processDefineName参数」。
  • 拒收边界:deploy/designDeploy/designRedeploy 缺 name ⇒ 报「流程定义缺少 name」且不落行。
  • 判据:跨栈门禁 L2-45 五轴(含双拒收且 recordCount 不落行);本栈 5 枚新格。

v1.8.46 — 2026-10-12 ​

issues/176 收口:startAndExecute 自动办理腿的 operator 改 flow.auto(tag v1.8.46, 引擎 commit a9f9cec)。条文见 规范 04 · 引擎核心操作。

  • 变更(用户可感知):一键「发起并直接办掉申请节点」时,那条任务的办理人记成系统哨兵 flow.auto, 不再记成真实发起人。此前发起人同时出现在「我发起的」与「我已办」两栏,doneList 可见性与产品语义相反; 审批记录里那条「已办理」也随之换人。
  • 八引擎同批(go/py/node/php/rust/csharp/moon+java),java 是门面腿、其余六家含引擎腿,见各语言页。
  • 判据:跨栈门禁 L2-43 落格同轮完成;修前红四家族 51/1+moon 通道 48/1/3,唯一红即这一格。
  • 传播面:java→boot2/boot3/boot4;本轮总传播面 8 引擎→13 壳+moon 插件→14 张镜像全晋升。

v1.8.45 — 2026-10-11 ​

issues/145 事务七条债 · java 第二轮=动作级事务边界(tag v1.8.45,引擎 commit 02183d7+c46f8a8)。 条文见 规范 12 · 事务与持久化 §12.2。

  • 补的是首轮的盲区:v1.8.44 只把引擎入口包进事务,门面自组的复合写仍各拍各的—— startAndExecute=发起+参与者写+办理三拍、redeploy=define+design 两拍,中途失败留半完成 (实例行在、任务行缺这类坏形状)。
  • 修法:inTx 提为 JeeflowEngine 默认方法(有则用、无则裸跑=§12.1 原则 4 的显式降级档); JeeflowFacade.flow() 把整次 dispatch 收进 engine.inTx;入口内已有的包裹嵌套并入(Spring REQUIRED); 信封在门面 catch(事务外)生成 ⇒ 先整体回滚再转失败信封。
  • 判据:TransactionTierTest 扩到 10/10(动作档两枚=复合回滚+裸拼对照红样);摘 engine.inTx 包裹 ⇒ 复合枚红「动作档:实例行必须整体回滚 expected:<0> but was:<1>」,其余 9 枚照绿。

v1.8.44 — 2026-10-11 ​

issues/145 事务七条债 · java 第一轮(tag v1.8.44,引擎 commit 12e7af7+47df025)。

  • 变更:引擎入口的写腿并入宿主事务(§12.2「一次动作=一个事务边界」),persist 业务表写腿与引擎 自身写腿同源提交/回滚。动作级边界在下一版 v1.8.45 补齐(见该节盲区说明)。
  • 判据:TransactionTierTest 真库 tier 档;变异对照=摘包裹即红。

v1.8.43 — 2026-10-11 ​

issues/174 收口:redeploy 原地替换保留 version/state(tag v1.8.43,release commit b9c3e5f); 同批带上 issues/162 的 java 腿。条文见 规范 08 场景 42。

  • 修复(用户可感知):processDesign/redeploy 与 processDefine/redeploy 两 action+两条仓储腿此前 原地替换时把 version/state 覆成 1。已办结/已废弃的实例指向的定义一旦重部署,行状态被打回, 实例列表与审批记录按 state 取数的那几格随之错乱。本版保留原值。
  • 参考实现在少数边:本栈与 go/python/node/csharp 五栈同批修;php/rust/moon 与内置 boot2 本就不丢。
  • issues/162 java 腿:门面 catch (Exception ignored) 静默原件改为降级面保留+可诊断日志—— 坏定义高亮补全失败时不再无声吞掉,日志带原因、对外仍 code=0。
  • 判据:跨栈门禁 L2-41(deploy/redeploy 两 action 此前整族零格);修前红三家族 49/1。
  • 传播面:java→boot2/boot3/boot4、go→三壳、py→三壳、node→nestjs、csharp→csharp,11 张镜像。

v1.8.42 — 2026-10-11 ​

issues/165 A+issues/166 A(种子)收口(Maven Central,引擎 commit 8dcc4c3)。条文见 规范 04 · 引擎核心操作「放行表达式的求值原料」。

  • 变更(用户可感知):CountersignHandler.buildCountersignVars 的求值原料同时挂裸名 (nrOfInstances / nrOfActivateInstances / nrOfCompletedInstances)与前缀键(csv_{node}_*, 保留兼容)。改前按文档/设计器形状 #nrOfCompletedInstances>=2 配的并行会签在生产 SpEL 上恒 false (#变量 精确查表查不到裸名,活栈实测 3/3 全办完仍停住);本版起按文档配的会签真能按阈值放行。
  • 测试基建:TestExpressionEvaluator(core 测试)摘掉 endsWith 后缀桥(#key 精确查表, 对齐生产形状)——"测试绿生产红"的根源拆除;jeeflow-spring-boot-autoconfigure 补测试模块, SpelExpressionEvaluatorTest 5 格按生产求值器实例化判裸名/前缀键/缺失档。
  • 种子:demo BusinessSeed FINISHED 三行(F5/F8/F9)补 finalAmount=8000(issues/166, define 映射漂移修复,读数回 15/10)。
  • 不变:java 是决策零命中的报错派基准(NOT_FOUND_NEXT_NODE),本版零改动; go/node/rust/moon 四栈于同日对齐(见各语言页)。

版本日期以本仓 git tag 为准;跨语言对齐脉络见 更新记录总览。

1.0.0–1.8.4 为四语言同构对齐期(Java / Go / Python / Node 同号演进);1.8.5 起按语言节奏发版,版本号不必同号(Java 未发布 1.8.22–1.8.24,该区间为 Go / Python 独立发版,Java 无对应变更;1.8.38 与 1.8.39 两号有 tag 但从未上架 Maven Central——发布链的 CI 工具链换代导致校验失败,同一批内容改从 1.8.40 发出,与 Go / Python / Node 的 1.8.38 是同一批语义)。

跨栈对齐:自 v1.8.29 起,Java 的退回上一步两格对外文案与委托查询判据取行顺序同时被写成硬性条款(见 规范 04 · 引擎核心操作 与 规范 06 · 统一门面),其余七栈逐字对齐 Java;对外 msg 一律不带内部码数字前缀。

v1.8.41 — 2026-10-10 ​

issues/154 ①④ 两条:审批记录行的排序尺子与主键出口(Maven Central,引擎 commit 2461b8b)。 条文见 规范 06 · 统一门面 §4.6,判据基线见 规范 08。

  • 新增:processInstance/approvalRecord 每行补首列 id(任务行主键,显式字符串化—— 19 位雪花 id 不经数字出口,JS 侧取值不会掉精度)。
  • 变更:该行集排序从 create_time 并成 id ASC,与 Go / Python / Node 用同一把尺子; 同一份流程定义在不同语言后端上,审批记录的行序不再漂。
  • 不变:highLight 三条义务(模型路径补全、决策出边先求值、成员姓名解析走 IUserProvider)本栈原样是基准实现, 其余七栈向它对齐;本版本没有改这条腿的行为。

v1.8.40 — 2026-10-08 ​

issues/152 委托三件收口(Maven Central,引擎 commit 2ddd203)。规范条文见 规范 06 §2.5 口径表 与 §4.5「processSurrogate/page 归属不变式」, 判据基线=规范 08 用例 38–41。升级前两处用户可感知的行为变更必读(见下)。

  • 新增:processSurrogate/page 的归属不变式落到引擎自己身上——门面按 §2.5 把归一后的 operator (缺键/空串/全空白 ⇒ demo 缺省 user1)作为 t.operator EQ 下发,形状与本栈 instancePage 一致; 仓储侧补第二层(SQL 侧 AND 1=0、内存侧判不命中),内存仓与 SQL 仓同答案。 此前这条语义全靠集成壳注入 operator(换宿主/直调 SPI 即退化成全库台账,vben5 前端本就不传)。
  • 变更:归属条件的缺失档与空值档同判——绕过门面直调 pageSurrogates 时,t.operator 那条 EQ 值为空或整条没给都返回空页,不再"这条条件不加"放出全库;只收归属列, m_LIKE_* 那套"空值当没填"的可选过滤放行原样不动(与 §2.5 抄送侧同一条尺子)。
  • 修复:写侧授权人三档归一。processSurrogate/save 收到空串/全空白 operator 时不再落进 operator (那种行是死行:getSurrogate 的 WHERE operator = ? 永不命中,台账看得见、待办永不并人); save 缺省档落归一值,update 缺省档保留原授权人不变。
  • 不变:委托查询的作用域优先级(精确优先)与择优顺序(先按 id 取最新一条再交判据裁决) 维持 v1.8.2x 起的既有立法(issues/123 收口形状),与内置 mldong-wf 版方向相反—— 差异与迁移动作已写进 §4.5「与内置版(mldong-wf)的三条方向差异」。
  • ⚠️ 行为变更(用户可感知):① 集成方若曾依赖"processSurrogate/page 不带 operator 返回全库", 升级后该档只返回归一缺省 user1 名下的行;② 直调仓储的调用方若不给归属条件,将拿到空页。 jeeflow-ui 与 vben5 两条前端腿都经门面且各栈已实测零回归。
  • 测试:仓内 T0 五档判据(作用域优先级/停用不自愈/自委托/写侧三档/分页归属两层), 每档配真值档阳性对照;摘掉兜底判据必红。

v1.8.37 — 2026-10-02 ​

本版是 issues/137 那一批的基准腿(八栈同批改,Java 侧每一处都是其余七栈逐字对齐的对象), 另收 issues/115 的门面第 47 个 action。

  • 新增(issues/115 §3-8):门面 action processTask/removeTaskActor(摘单个参与人), 语义 5/6 定形——匹配取归一后的值、DELETE 取行上的原值,历史脏行(" 9101 ")不算"另一个人"; 主键档定形:processTaskId 缺失/空串/纯空白/0/负数统一并入缺参数档(八栈逐字文案一致)。 门面 action 从此 47 个。
  • 修复(issues/137 A §3-4):ModelParser 没把流程根上的 expireTime 搬进 ProcessModel ⇒ 实例级 expire_time 在基准栈自己也断链(不是只有别的语言漏);补写点,实例到期时间按定义级表达式求值。
  • 修复(issues/137 D/E):相对档前缀判非负——-5h / -5d / -30s 此前落穿成 NULL, 只裁负不裁加号(+5h 仍合法);Java 基准侧 Integer.parseInt 前统一 text.trim()(E 档两端空白)。
  • 修复(issues/137-G):顶层与 bizData 两处出口不再裸拼内部异常文案——对外固定文案, 底层原文只进日志(判别式五条见 规范 06 §2.12)。
  • 变更(issues/137 §3-6):删除腿收口为**「原值 ∪ trim 值」两形并集**,一条 DELETE 两行都摘掉, 其余参与人不动(spec 06 语义 6 已改写)。
  • 测试:JDK8 mvn -B clean test -pl '!:jeeflow-demo-boot4'(demo-boot4 需 JDK21,发布集一贯排除) BUILD SUCCESS:core 277/repository-jdbc 63/persist 31 = 371 格,0 失败 0 跳过。 Java 侧 SQL 腿用 H2 MODE=MySQL(本栈无仓内真 MySQL 件,真库面由集成壳 L2 与镜像门禁覆盖)。

v1.8.36 — 2026-09-30 ​

  • 新增(issues/142 A 批 · 本栈为参考实现):snaker:custom 记录类与任务类分家—— Execution 新增 historyTasks 队列(addHistoryTask/addHistoryTasks/drainHistoryTasks,与 pendingEnds 同款"先登记、写库后 flush、drain 保证一次登记只写一次"), JeeflowEngineImpl.saveHistoryTasks 只 repository.saveTask、不 notifyTaskStart(码 3)、不套委托; 留痕行补写 operator 与 finish_time(spec 02 §6.2 第 1bis 条),expire_time 保持 NULL。 任务类零参与者必须建 DOING 行(不许跳过建行、不许兜底挂当前操作人)。
  • 修复(issues/143):出边指向未知档节点时落穿停住——TransitionModel 补 null-target 守卫, 记一条带 from/to 的 WARNING 后令牌停住,不再 NPE 打断办理(此前一次配置写错把整次办理打崩)。
  • 变更(issues/142 B 批 · 归属值写侧归一,spec 06 §2.11):StringUtils.normalizeCcActors → normalizeActors(String…)(旧名保留 @Deprecated 薄转发);新增 normalizeActorArg(Object) (集合/逗号串/标量/null 四档同一枚尺子:trim、空串/纯空白/null 元素丢弃、同次折叠、保序; 严禁 String.valueOf(null) 把 'null' 落进归属列)与 normalizeActor(String)。 addCandidate/surrogate/transfer/nextNodeOperator/两仓 addTaskActor 全链接同一枚; 主键档(processTaskId 缺失/空)响亮报错。
  • 测试:JDK8 mvn -o -pl jeeflow-core,jeeflow-repository-jdbc,jeeflow-persist -am clean test BUILD SUCCESS:core 222/0/0、repository-jdbc 54/0/0、persist 31/0/0(基线 206/46/31,只增不减)。

v1.8.35 — 2026-09-29 ​

  • 新增(issues/127 + 132 · 事件契约落地,本栈为参考实现):规范 11「事件契约」立章后补齐 A 套后五支 TASK_COMPLETE(5)/TASK_REJECT(6)/TASK_TRANSFER(7)/TASK_WITHDRAW(8)/INSTANCE_TERMINATED(9); 办理抄送腿 tf_ccActors 收进引擎路径并与流转同事务(§11.7 边界 1),覆盖面只算 executeProcessTask 一条腿(jump / rollback / 退发起人本轮不建 cc、不发 4)。
  • 修复(时机债,§11.2 原则 3):码 2 PROCESS_INSTANCE_END 原在 EndProcessHandler 里就地 fire, 而实例那一行要等 persistTasks 的 updateInstance 才落库 ⇒ 监听器反查读到旧 state, 且后续步骤抛异常回滚时事件已漏出。改成本栈基准形状:登记 → 级联上收 → 统一 flush 三段式 (新 event/PendingInstanceEnd + Execution.addPendingEnd/addPendingEnds/drainPendingEnds + JeeflowEngineImpl.flushInstanceEndEvents);子流程级联里被连带办结的父实例随待播队列上收, flush 时按登记的聚合根补一次 updateInstance 再播(漏那一行=父实例终态事件整支丢掉)。
  • 测试:EventContractRecorderTest 钉单条流逐位序列 [1,3,5,2,4,4](只断"出现过"不算过) + 逐码载荷键;InstanceEndEventTimingTest 用写序快照探针仓钉四档"回调时那一行已是终态" (含子流程父子两支、各只播一次)。读数:mvn -B test(排除 jeeflow-demo-boot4)BUILD SUCCESS, core 27 + repository-jdbc 31(真连 160 MySQL),0 失败。jeeflow-demo-boot4 要 JDK 21, 本机默认 mvn 不带 21 ⇒ 属环境而非代码缺陷。
  • 本栈不改名:PROCESS_INSTANCE_START / PROCESS_INSTANCE_END / PROCESS_TASK_START / CC_CREATE 早就是规范名 ⇒ §11.6「旧名保留一代别名」的义务对本栈不适用(无改名即无兼容债)。

v1.8.34 — 2026-09-29 ​

  • 修复(issues/134 · 撤回不校验实例状态):对已办结/非进行中的实例调撤回,改前会被静默改写—— 实例 state 被写成 30 且返回 code=0(症状现场:boot2 生产镜像 code=0 msg='成功',state 20→30)。 聚合根 withdraw 入口加实例态守卫:state != 10(进行中) 一律拒,内部码 20010009,被拒时 实例与任务行零改写、不落库;出口按 issues/121 口径透出 code=99999999 + 逐字文案 「流程实例非进行中,无法撤回」(内部码不进 msg)。任务行层面的既有保护(spec 06 的"20/40 任务行 不改写")原样保留,实例级守卫排在它之前。落点:WfErrEnum 加 20010009 + 聚合根 ProcessInstance.withdraw 守卫(排在任务行循环前)。 新增 T0 八格(负向 20/40 与正向对照 10 照旧落 30),mvn -o -pl jeeflow-core test 146 格全绿(基线 138); 摘守卫 ⇒ 5 红、守卫写反 ⇒ 正向一并红(两层变异对照都有牙)。java 栈 130 侧无需改动( Integer.valueOf(1).equals(enabled) 本就是严形状,静态类型存不进字符串)。

v1.8.33 — 2026-09-28 ​

  • 修复(issues/126 案 A · 任务行 expire_time 由建单路径真算):ProcessInstance.createTask 里那句占位 task.setExpireTime(LocalDateTime.now()); // will be overridden by util later 删除——注释承诺的 util 从来没跑过, 于是配了到期表达式的节点建单即逾期(同行差值≈0),而回退那支倒是真按表达式算 ⇒ "只有回退过的任务这一列有值"。 收成 applyExpireTime 一把尺子+五处调用(普通建单 / 串行会签首位 / 并行全员 / 回退新建 / 串行推进出的下一位成员,最后一处绕过 createTask 直建,故聚合根开公开入口 applyNodeExpireTime)。 节点没配(null 与空串两档)⇒ 该列保持 NULL,不造默认值(owner 拍板口径)。
  • 测试 ExpireTimeOnCreateTest 六格(2h⇒同行差值≈2h、表达式是变量名⇒取该变量的值、未配两档⇒NULL、 解析不出⇒NULL 而不是 now、并行全员正/负)+ JeeflowFacadeTest 两格(串行会签首成员∧推进第二成员都带到期; 同夹具去掉表达式⇒两行都空,且把"行没读到"与"值为空"分开断)。 mvn -o -pl jeeflow-core test 136 格全绿;T1 mvn -o -pl jeeflow-repository-jdbc -am clean test 27 格全绿。
  • 变异对照两层都有牙:helper 体内换回 LocalDateTime.now() ⇒ 新测试类 4 跑 3 红; 摘掉第五处写点 ⇒ 推进那格红在「第二成员必须带到期时间」;摘掉并行那处 ⇒ 红在「成员 [u1] 的行必须带到期时间」。 三次均按 sha256 还原核对后复跑全绿。
  • 一处量纲留痕:FlowUtil.toLocalDateTime(Date) 落秒级、行上 createTime 带毫秒 ⇒ 差值实测 7199.x s, 断言带宽取 [2h−5s, 2h+60s](写 >=7200 会假红)。
  • 跨栈一致性(同批八栈一起发,基准=boot2 内置版 ProcessTaskServiceImpl:213/386/524 三处写):普查发现写点其实是五处,第五处=串行会签推进出的下一位成员(boot2 的推进回调 createCountersignTask(:485,内含 :524 到期写)),各栈这一支普遍绕过本栈建单 helper 直建行,只看建单/回退两支会漏。另一处分叉在落地中被抓出来:回退新建的表达式该取 boot2 的 current=被回退掉的那个节点(:363 current = model.getNode(currentTask.getTaskName()) → :385 ((TaskModel)current).getExpireTime()),而不是落地行所属的 prev;java/php/csharp/rust/node/moon 取 current,go 与 python 头一轮取成了 prev,两栈当时的夹具只给一个节点配表达式 ⇒ 取错也全绿,是比对隔壁栈代码才发现。修完的判据改成双节点不同偏移(落地 1d ∧ 当前 3h ⇒ 断 ≈3h)+反向钉一档「当前未配 ⇒ 必须空」。

v1.8.32 — 2026-09-28 ​

  • 修复(issues/129 案 A · owner 拍板「空串=缺键,回落 user1」):{"operator":""} 此前与缺键不同档——门面 toStr(args.get("operator"), "user1") 只在 null 时兜缺省,空串原样落进 query.add("t.operator","EQ",""),再被 JdbcProcessRepository.buildWhere 那句"空值当作没填"的通用放行整条丢掉 ⇒ 「我的实例 / 我已办」读出全库。现按双层义务收:门面新增集中 operatorArg()(trim 后判空回落 user1)替换 12 处缺省点;buildWhere 在原有那句之前对归属列(t.operator / pi.operator / pta.actor_id / cc.actor_id)空值写 AND 1=0。⚠️ 只收 EQ 归属列——下面那句通用放行是 m_LIKE_* 等可选过滤的行为,照字面改成"空值即空页"会把可选过滤一起改坏(测试里用"空值非归属条件仍返回全库"这一格钉住改动面)。withdraw 的 issues/114 硬必填(空串必须报错)不属本条管辖,未动。
  • 判据(core JeeflowFacadeTest + jdbc JdbcRepositoryTest,H2 MODE=MySQL):四出口 × 三档(空串 / 全空白 / 缺键)逐行数相等且等于显式 user1 档,并先断 user1 档非空(否则"0==0"是自等假绿);仓储件绕过门面直喂空值三形 ⇒ 空页,另留"归属列真值命中""非归属列空值仍被忽略"两格对照。T0 mvn test core 128/128 + repository-jdbc 27/27(改前基线 127+26 与本栈其余用例全绿)。
  • 变异对照两发各自转红:只回退门面归一化 ⇒ processInstance/page 空串档应=缺键档 expected:<1> but was:<0>;只删仓储兜底 ⇒ H2 里原症状复现 空串归属条件不得读成全库实例 expected:<0> but was:<2>。两发之后按 sha256 字节级还原。
  • 线上复验:160 demo 部署 tag v1.8.32 后重打三路探针,四出口读数为 4 / 5 / 1 / 2(与 user1 档逐出口相同),__nobody__ 全 0;修前同一份库同一时刻是 25 / 46 / 24 / 31(全库)。
  • 发版核验:Maven Central 七模块 .pom 回 200(CI Release 的 publish→verify 全绿,排除 demo-boot4)。同批跨栈:Go 1.8.32 / Python 1.8.32 / Node 1.8.32 / PHP 1.3.15 / Rust 1.0.17 / MoonBit 0.1.15 / C# 1.0.9。

v1.8.31 — 2026-09-27 ​

  • 修复(issues/125 · SQL 侧数据库时钟,issues/120 的下半段):JdbcProcessRepository.statsPendingAndOverdueCount 的逾期判据原先在 SQL 里写 expire_time < NOW()——MySQL 的 NOW() 取的是 @@session.time_zone 的墙钟,而 expire_time 是引擎进程钟写进去的裸墙钟 ⇒ 同一件事两把钟,一个 SET time_zone(或换一台默认 UTC 的托管库)就把逾期计数整体平移一个时区偏移,且换仓储实现(内存仓用进程钟)数字会变。现改为新增受保护出口 statsNow()(默认 LocalDateTime.now(),与写 create_time / update_time 同一把钟),SQL 变成 expire_time < ? 绑参,方法内只取一次钟、pending / overdue 两半共用同一个瞬间。Python / Node / PHP 本来就是绑参数形状,本栈与它们对齐;SQL 文本里不再有任何时间函数。
  • 判据(新增 JdbcStatsOverdueClockTest,跑 H2 MODE=MySQL,不依赖外部数据库):正向注入基准钟 ⇒ (pending=4, overdue=1);负向边界 ⇒ expire_time IS NULL 的行钟拨到 +30 天仍不计入;有牙那条 ⇒ 注入钟前移 2 小时,逾期必须 1→2(只断"数对"而钟挪不动等于没测);回归 ⇒ 同注入值重复调用读数稳定。变异对照:把实现临时换回 NOW() 不绑参 ⇒ 红在 expected:<1> but was:<3>,还原后绿。
  • 修复(测试侧既存红两条,非本栈行为变更):JdbcRepositoryTest 的转办 / 台账用例还在读 v1.8.30(issues/124)已下线的 variable 原串出口 ⇒ NPE;按 core 侧口径改读 ext(断言一条没弱化),并补 assertFalse(row.containsKey("variable")) 把 124 的立法在 SQL 仓路径也钉住——上一轮只改了 core 用例,SQL 仓副本是"同一件事的第二个落点漏走一条腿"。
  • 测试 mvn clean test ⇒ jeeflow-core 127 例 + jeeflow-repository-jdbc 26 例 + jeeflow-persist 31 例全绿,Failures / Errors 归 0(jeeflow-demo-boot4 是演示模块、不参与 Central 发布通道)。
  • 发版核验 Maven Central com.mldong:jeeflow-* 七模块 1.8.31.pom 回拉全 200(Release workflow 的 verify 步 + 外部 curl 双证)。
  • 同批跨栈:Go v1.8.31、Rust 1.0.16、C# 1.0.7 同题同修(各栈落点见各自版本页);静态普查门禁 jeeflow-hub/scripts/dbclock_census.py 的基线已随四处核销清空,并改为每次实跑先过常驻 canary() 探针自检。

v1.8.30 — 2026-09-24 ​

  • 变更(issues/124 变量出口立法,本版为八语言同批基准):processInstance/detail 出口 variables 更名为 ext(同一份实例变量,键形态与列表行 ext 一致),variables 全集退出契约;任务行与 processTask/detail 的 variable / instanceVariable 原串出口同步摘除。变量唯一对外出口是 ext(实例侧)与 instanceExt(任务行侧);变量为空时 ext 出空对象 {} 不缺键;持久层 variable 列是存储不是出口,不受此限(立法见 规范 06 · 统一门面)。
  • 测试 JeeflowFacadeTest#testVariablesOnlyExitViaExt 正负两向(正向 detail ext 带 f_reasonType / u_realName / autoGenTitle 且出口无 variables / variable 键、行出口无 variable / instanceVariable;负向空变量 detail ext 出 {});存量断言改读 ext 后既有测试全绿。
  • 发版核验 Maven Central com.mldong:jeeflow-* 七模块 1.8.30.pom 回拉全 200。

v1.8.29 — 2026-09-23 ​

  • 修复(委托判据取行顺序):getSurrogate 改为「各作用域先取 id 最新一条,再交四判据裁决」,并明确禁止「先按判据过滤掉不生效的、再从剩下的取 id 最大」这种错误顺序(旧顺序会让一条历史有效委托永久生效,用户后续的停用 / 改期 / 改成自委托全被旧记录盖掉)。新顺序下精确作用域那条判否仍要兜底全流程作用域(空 processName),不得判否即止。SQL 形状钉死:WHERE operator = ? [AND process_name = ?] ORDER BY id DESC LIMIT 1——不带 enabled = 1 / 窗口 / surrogate <> operator 谓词,判据落在读出之后的单条裁决里(ProcessSurrogate.isEffective)。四判据:enabled 严格等于整数 1、被委托人非空且非本人、时间窗覆盖判定时刻(起止 NULL 该侧不限)、作用域回落先精确后全流程。
  • 修复(出口形状统一):退回上一步两格失败对外 msg 以 Java 逐字文案为基准统一(上一步任务ID为空,无法驳回至上一步处理 / 无法驳回至上一步处理,请确认上一步骤并非fork、join、suprocess以及会签任务),20010007 / 20010008 定位成引擎内部码——只用于区分两格语义,严禁出现在对外 msg;响应体不透传业务码(恒 99999999)。其余七栈(含 MoonBit)本轮按此删前缀,Java 本栈行为不变。
  • 新增(发布通道)scripts/verify-maven-central.sh 并接入 Release workflow 的 verify 步:轮询七个发布模块(jeeflow-demo-boot4 不参与)的 <模块>-<版本>.pom 全 200 才算发出去;可调 MAVEN_BASE / VERIFY_TIMEOUT(默认 1500s)/ VERIFY_INTERVAL(默认 30s)/ VERIFY_MODULES。本版为该步首次实跑,repo1.maven.org 七模块 .pom 全 200。
  • 测试 mvn clean test -pl jeeflow-core,jeeflow-repository-jdbc ⇒ core 126 例、jdbc 25 例全绿;SurrogateAutoApplyTest 新增 4 格钉住新语义(最新无效压过旧有效:窗外 / enabled=0 / 脏值 2 / 自委托)。
  • 变异对照 把内存仓选路改回「先滤后取」⇒ 恰好这 4 格红、其余 18 格绿(证明用例真在钉语义,非恒绿)。
  • 跨栈验证 13 个集成栈候选镜像门禁对拍:L2-17(委托自动生效:窗内并入 + 原人保留 + 窗外 / 停用 / 脏值 / 自委托四判据)13/13 全 PASS,上一代次的「9 栈无条件并入 + 4 栈一律不并」两营垒消除;L2-18 13/13 同形失败且逐字一致(同样两条:脏值 enabled=2 并入 + 自委托未过滤),归因在门禁夹具自身矛盾:该格逐条建委托却只在开头清场一次,于是前一条建的「活着的全流程委托」在后两格仍生效 ⇒ 按条款跨层兜底必然并入代理人,而格子期望的却是「代理人不得进」——没有任何正确实现能同时满足,与 Java 既有测试 JdbcProcessExtRepositoryTest#testSurrogateCrudAndGet(精确已过期 → 兜底全流程)的结论也冲突。非引擎缺陷(13 栈同形同错即归因证据),修法为夹具支间清场,待授权,本轮未改门禁。

v1.8.28 — 2026-09-22 ​

09-22 夜发版轮(issues/120 时钟基座 + issues/121 P1/P2 血缘回退)Java 侧代次;tag v1.8.28(19:24),bump commit 530dc4f。

  • 新增(121 P1):建单写 task_parent_id 与行级 isFirstTaskNode,门面读时"行上值优先、存量行才现算"(95d4360); 引擎控制键不再算「任务变量非空」,P1 不打断 ext 回退实例变量的契约(5f4a923)。
  • 变更(121 P2):退回上一步改血缘版——复活血缘前驱行、参与者取该行办结人(e7a8558),本栈即其余七栈的对齐参考。
  • 修复(issues/116 批次 D):委托条款 1.1 补 wf_process_define.name 回落 + 逐路径用例与乱序 id 夹具(8cd6e3c); 委托代理自动生效改为内置默认开启(03474fe,参考实现位)。
  • 发版核验:Maven Central 回拉以外部 curl …/1.8.28.pom 为凭(该仓 release workflow 的 verify 步在 1.8.29 那轮才补上)。

v1.8.27 — 2026-09-05 ​

  • 修复:stats 统计计数/时长被集成层 Long→String 序列化器字符串化(overview 13 字段中 9 个计数、trend started/finished、group count、JDBC define 维 avgDurationSeconds),与契约 §4.2「统计计数/时长为 int」不符。组装层统计计数一律 int 出参(Integer 不在 Long→String 序列化范围),id 字符串化规则不动;其余六语言同源实现天然走 int 不受影响。
  • 验证 Maven Central 七构件 200 + 公网 demo 实测全 number;七语言灌数据类型断言 84 项全 PASS。

v1.8.26 — 2026-09-05 ​

  • 修复「stats 三 action 登录放行」:DefaultActionPermissionProvider 的 NO_PERM_ACTIONS 补 processInstance/stats/overview|trend|group(契约 v1.1 冻结「登录即可、不配权限码」 归纳放行清单时 stats 尚不存在后补遗漏),boot2/3/4 走引擎默认 SPI,普通用户分析页不再 99990406。
  • 验证 三场景单测 DefaultActionPermissionProviderTest;Maven Central 全构件可解析。
  • 发版注 bump 需九文件同改(根 pom + 八子模块 parent version),首跑漏子模块被 Central 以「构件已存在」拒收(bundle 混入旧版本构件),补齐后强推重打 tag 收口。

v1.8.25 — 2026-09-04 ​

  • 新增 stats 三 action(processInstance/stats/overview|trend|group):overview / trend / group 全维度统计。
  • 修复 stats 契约对齐 A–E 验收(Java 为 wire 契约参考实现);publisher 单监听器异常兜底(P2,一个监听器异常不打断其余)。
  • 修复(发布通道)javadoc 插件关 doclint——历史注释债不应阻塞发布(v1.8.25 首次 CI 挂 javadoc)。

v1.8.21 — 2026-09-03 ​

  • 新增 CC_CREATE 抄送知会事件(六语言统一缺口 Java 栈)。

v1.8.20 — 2026-09-02 ​

  • 修复(引擎侧根因):TASK_CREATE 任务创建事件原在 CreateTaskHandler 落库前 fire(监听器按 taskId 反查时任务行尚未提交,findTask 落空 → 静默丢,「wf 流程消息写路径缺失 / messagePage 恒空」)。统一改到任务行落库之后 fire(sourceId=taskId 可反查处理人),对齐「事件→消息」职责边界契约(引擎只 fire、不保证消息落库)。

v1.8.19 — 2026-08-30 ​

  • 修复 批量入参契约:删除/启停类 action(processSurrogate/remove、processDefine/remove、processDesign/remove、processDefine/upAndDown)统一走 idListArgs 助手——{ids} 数组优先、单 {id} 兼容,两者皆缺失 / 空数组 / 含非法值一律 99999999,不再空值静默成功。
  • 票面偏差(如实记):无真库 T1——jeeflow-repository-jdbc 连的是 H2(MODE=MySQL),按 1.8.16–1.8.18 惯例发版;发布集(排除 jeeflow-demo-boot4)JDK 8 下 clean test BUILD SUCCESS。

v1.8.18 — 2026-08-24 ​

  • 语义修正 会签对齐内置引擎(boot2/3):submitType=20(COUNTERSIGN_DISAGREE)默认软拒绝(flag 记录、流程不阻断);仅节点 countersignCompletionCondition=ONE_VOTE_VETO 时一票否决推进;会签 merged(任意路径)后废弃该节点剩余 DOING 任务(taskState=99),不留孤儿待办。
  • 修复 串行会签「一次建全」回归,改回逐个创建:节点入口只建 actors[0] 一个 DOING 任务,全量成员 + 计数器存任务变量,每完成非最后一人建下一人;buildNodeProgress 会签成员清单改读任务变量 operatorList_{node}(逐个创建后不再漏显后续成员)。

v1.8.17 — 2026-08-23 ​

  • 修复–82 门面字段级契约与负向断言缺口:processSurrogate 补 update / detail;taskDetail taskVo 出口 performType/taskType 改数字 code;candidatePage 行键归一 {id,realName,userName?,deptName?};listByType items 补 processDefineState;id 精度守卫(float64 超 2^53 显性报错,toLong);taskDetail 补 ext.isFirstTaskNode + designPage remark/icon 回显 + 内存仓储 toTaskRow 补 finishTime/expireTime;委托(授权人=操作人、时间入参兼容空格、分页 m_IN/m_EQ、生效时间窗 + enabled 过滤);submitType 2/3/4/5/6/20 门面行为 + 抄送空 actors → 99999999 测试。
  • SPEC processSurrogate update/detail、candidatePage 行键、listByType processDefineState、taskDetail ext + m_pd_* 搜列映射、id 字符串契约。

v1.8.16 — 2026-08-13 ​

  • 修复:processTask/detail 的 taskModel 补全 ext / form 字段,用于字段权限下发(五语言)。

v1.8.15 — 2026-08-10 ​

  • 变更(发布通道)jeeflow-demo-boot4 从 Maven Central 发布集排除(该模块需 JDK 21)。

v1.8.14 — 2026-08-09 ​

  • 变更(CI)test job 移除、aliyun mirror;为 CI 发布流水线做准备,无引擎行为变更。

v1.8.13 — 2026-08-09 ​

  • 新增:PersistPostInterceptor 提供 registerMeta 注册助手,集成方一行调用同步字典项与实例。
  • 变更 流程定义声明 postInterceptors 但注册表无实例时,发起 / 办理改为显式报错(原为静默跳过)。
  • 修复 Java 8 兼容:Map.ofEntries 等 JDK 9+ API 改为 JDK 8 等价写法,修复 JDK 8 运行时 NoSuchMethodError。

v1.8.12 — 2026-08-08 ​

  • 修复:designRedeploy 替换分支未保留原 version,JDBC 仓储误写 1;显式保留 last.version。
  • 改进 updateDefine / save / deploy 的 content 字段支持 string 与 JSON 对象双形态(四语言同批)。

v1.8.11 — 2026-08-06 ​

  • 修复:办理时抄送 tf_ccActors 未创建抄送。
  • 修复:FormFieldAssigneeHandler 先匹配 f_ 前缀变量再回落裸名(Go/Python/Node 于 1.8.18 对齐)。

v1.8.10 — 2026-08-06 ​

  • 修复:串行会签完成判定缺陷——改为全部成员完成才流转后续节点,避免每次成员完成都重复创建审批任务。

v1.8.9 — 2026-08-05 ​

  • 新增 JeeflowFacade.highLight 新增 nodeProgress(成员进度回显),与 Node / Go / Python 对齐(、)。

v1.8.8 — 2026-08-05 ​

  • 无本语言行为变更(版本对齐;nodeProgress name 解析随 Node/Go/Python 批次,见其语言页)。

v1.8.7 — 2026-08-05 ​

  • 无本语言行为变更(版本对齐)。

v1.8.6 — 2026-08-05 ​

  • 无本语言行为变更(版本对齐)。

v1.8.5 — 2026-08-05 ​

  • 无本语言代码改动(闭环收口);联邦 E9「id 出口字符串化」以 Java 既有全局实现为基准。

v1.8.4 — 2026-08-05 ​

  • 无本语言行为变更(版本对齐;三门引擎– 对齐随版)。

v1.8.3 — 2026-08-04 ​

  • 新增:updateDefine 无 content 时兼容 boot3 顶层 JSON。
  • 新增:processDefine/remove、processDesign/remove 兼容 {ids} 批量;新增 processDesign/listByType 与 processInstance/bizData。
  • 新增:权限码 SPI IActionPermissionProvider 及内置默认实现,集成方可删除静态权限表。

v1.8.2 — 2026-08-04 ​

  • 修复:SYNC 字段权限不可绕过——任务完成入变量前按节点字段权限过滤,被拒字段不进变量,下游无法写入。

v1.8.1 — 2026-08-04 ​

  • 修复:SYNC 字段权限键兼容前端 PERMISSION_f_{字段名} 约定,恢复只读 / 隐藏字段防护。

v1.8.0 — 2026-08-04 ​

  • 新增:persistMode 双模式——缺省 ARCHIVE(结束归档)保持向后兼容;SYNC 模式实现「发起 INSERT → 节点 UPDATE → 结束定稿」的同步演进入库。
  • 新增 任务节点级字段权限:PERMISSION_{字段名} = 1 只读 / 2 可编辑 / 3 隐藏。
  • 新增 状态字段写入:列名优先 {节点ID}_{状态码},回落 {节点ID}。
  • 新增 tf_ 前缀变量去前缀冗余到业务表;writer.update 参数化 UPDATE。
  • 改进 幂等标记改为节点级;任务创建不触发节点拦截器(对齐 CreateTaskHandler),任务完成显式触发;结束节点按 submitType 定稿。
  • 修复 子表递归插入继承主表 apply_user_id;读侧 EXPAND 展开列不重复平铺。
  • 新增 MetaTableWriter.update 按元数据 storageType 组装 SET 列。

v1.7.0 — 2026-08-04 ​

  • 新增 元数据驱动的动态写入 / 读取:StorageType(NORMAL / EXPAND / JSON / ONE2ONE / ONE2MANY)、FieldMeta / TableMeta 模型;IDynamicMetaProvider SPI 与内置 JsonMetaProvider;MetaTableWriter(含子表递归)与 MetaTableReader。

v1.6.6 — 2026-08-04 ​

  • 修复:persist 表结构探测增加 schema 限定,避免多库同名表返回两套列。

v1.6.5 — 2026-08-04 ​

  • 新增:persist 主键生成支持——方言自增检测 + setPrimaryKeyGenerator,非自增主键未配置生成器时给出明确报错。

v1.6.4 — 2026-08-04 ​

  • 改进:persist 默认列匹配宽松化(驼峰 ↔ 下划线归一),可通过 setStrictColumnMatch(true) 恢复严格模式。

v1.6.3 — 2026-08-04 ​

  • 改进:persist 用户列默认取 operator(回落 apply_user_id);增加同执行链重复触发防护。

v1.6.2 — 2026-08-04 ​

  • 新增:业务数据通用入库——DynamicTableWriter 接口 + JdbcDynamicTableWriter;PersistPostInterceptor 模型级 postInterceptors 挂载,流程结束时把 f_ 字段 + 流程上下文 + 系统字段写入业务表,process_instance_id 幂等。

v1.6.1 — 2026-08-04 ​

  • 修复:starter 增加 IOrgUserProvider 装配。
  • 修复 processDesign/page 时间格式化为 yyyy-MM-dd HH:mm:ss。
  • 改进 HandlerRegistry 构造即内置 7 个通用 handler 元数据。

v1.6.0 — 2026-08-04 ​

  • 新增 表单数据契约:formData / taskFormData / 审批记录行 ext。
  • 新增 IOrgUserProvider SPI(部门领导 / 角色成员查询);7 个内置通用参与者处理器:发起人、表单字段分配、部门领导 / 分管领导、任务角色。
  • 新增 candidatePage 双源候选:candidateUsers + candidateGroups。
  • 改进 AssignmentHandler.assign 增加 operator 参数,区分「当前操作人」与「发起人」。

v1.5.1 — 2026-08-03 ​

  • 新增:processDesign/redeploy、updateDefine、update 三个 action,并同步 is_deployed 状态。

v1.5.0 — 2026-08-02 ​

  • 新增 详情 jsonObject:processInstance/detail、processDefine/detail、processTask/detail 直接返回定义解析结果。
  • 新增 列表字段契约:分页行输出 ext / instanceExt / displayName / version,时间统一 yyyy-MM-dd HH:mm:ss;m_ 前缀查询参数(MyBatis-Plus 约定),7 个分页列表白名单过滤。
  • 修复:highLight 决策节点输出边按表达式求值过滤;processDesign/detail 的 jsonObject 缺失基本信息时从设计表补齐。
  • 改进 依赖坐标版本号不写死——${jeeflow.version} 统一管理。

v1.4.0 — 2026-08-02 ​

  • 新增 引擎元数据能力:枚举字典注册表(7 个内置状态枚举字典,key 对齐 boot3);SPI 实现清单 HandlerRegistry 注册式元数据(type / className / displayName / order / group),供前端设计器字典使用。

v1.3.0 — 2026-08-02 ​

  • 新增 ccList 分页补齐:核心表分页 SPI pageCcInstances 加入各语言。
  • 修复:addTaskActor 追加语义——去重后仅插入新增,不清空原参与者。

v1.2.0 — 2026-08-02 ​

  • 新增:门面补齐 13 个视图端点(highLight / approvalRecord / candidatePage / taskSurrogate / addCandidate / latest 等)。
  • 新增 IUserSearchProvider 可选 SPI:candidatePage 无模型候选时的用户分页搜索钩子。

v1.1.0 — 2026-08-02 ​

  • 新增 管理扩展:wf_process_design / wf_process_design_his / wf_process_surrogate 三张表 + 扩展仓储 SPI IProcessExtRepository。
  • 新增 统一门面 JeeflowFacade.flow(action, map):27 个 action,统一返回 {code, msg, data};deploy / redeploy 版本管理(按流程编码自动 version+1)。
  • 修复 定义写操作 SPI;updateInstance 级联持久化;assignee 变量解析;系统代执行(flow.auto / flow.admin)。

v1.0.0 — 2026-08-01 ​

  • 引擎核心四语言同构实现(Java 为参考实现):5 张核心表(wf_process_define / wf_process_instance / wf_process_task / wf_process_task_actor / wf_process_cc_instance)。
  • 核心能力:启动 / 执行 / 驳回 / 跳转 / 退回发起人 / 会签(并行、串行、按比例)/ 抄送 / 委托扩展点。
  • SPI:IProcessRepository / UserProvider / IDGenerator / ExpressionEvaluator;多数据库适配 MySQL / PostgreSQL。
  • 发布通道:Maven Central;文档站上线。

jeeflow · 轻量级多语言工作流引擎