@mldong/jeeflow 1.6.2 → 1.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/persist.d.ts CHANGED
@@ -32,12 +32,18 @@ export declare class SqliteDynamicTableWriter implements DynamicTableWriter {
32
32
  updateTimeColumn?: string | null;
33
33
  updateUserColumn?: string | null;
34
34
  isDeletedColumn?: string | null;
35
+ /** 用户列默认值(issues/19):优先取 data 中已注入的 apply_user_id=流程 operator,
36
+ * 否则用此配置值,缺省 "system"——多数框架业务表 create_user/update_user 为 BIGINT 存 userId */
37
+ defaultUserValue: unknown;
35
38
  constructor(db: DatabaseSync);
36
39
  private tableColumns;
37
40
  filterColumns(tableName: string, columns: string[]): string[];
38
41
  insert(tableName: string, data: Record<string, unknown>): unknown;
39
42
  exists(tableName: string, bizKey: string, bizKeyValue: unknown): boolean;
40
43
  fillSystemFields(data: Record<string, unknown>, isInsert: boolean): void;
44
+ /** 默认用户值(issues/19):优先取 data 中已注入的 apply_user_id
45
+ * (拦截器场景 = 流程 operator,BIGINT 用户列表开箱即用),否则回落配置默认值 */
46
+ private resolveDefaultUser;
41
47
  }
42
48
  /** 流程定义加载器(用于解析 relTableName / 流程 name),通常透传仓库 findDefineById */
43
49
  export type DefineLoader = (defineId: number) => Promise<ProcessDefine | null>;
package/dist/persist.js CHANGED
@@ -31,6 +31,9 @@ export class SqliteDynamicTableWriter {
31
31
  updateTimeColumn = 'update_time';
32
32
  updateUserColumn = 'update_user';
33
33
  isDeletedColumn = 'is_deleted';
34
+ /** 用户列默认值(issues/19):优先取 data 中已注入的 apply_user_id=流程 operator,
35
+ * 否则用此配置值,缺省 "system"——多数框架业务表 create_user/update_user 为 BIGINT 存 userId */
36
+ defaultUserValue = 'system';
34
37
  constructor(db) {
35
38
  this.db = db;
36
39
  }
@@ -89,11 +92,11 @@ export class SqliteDynamicTableWriter {
89
92
  if (this.createTimeColumn)
90
93
  data[this.createTimeColumn] ??= now;
91
94
  if (this.createUserColumn)
92
- data[this.createUserColumn] ??= 'system';
95
+ data[this.createUserColumn] ??= this.resolveDefaultUser(data);
93
96
  if (this.updateTimeColumn)
94
97
  data[this.updateTimeColumn] ??= now;
95
98
  if (this.updateUserColumn)
96
- data[this.updateUserColumn] ??= 'system';
99
+ data[this.updateUserColumn] ??= this.resolveDefaultUser(data);
97
100
  if (this.isDeletedColumn)
98
101
  data[this.isDeletedColumn] ??= 0;
99
102
  }
@@ -101,9 +104,14 @@ export class SqliteDynamicTableWriter {
101
104
  if (this.updateTimeColumn)
102
105
  data[this.updateTimeColumn] = now;
103
106
  if (this.updateUserColumn)
104
- data[this.updateUserColumn] ??= 'system';
107
+ data[this.updateUserColumn] ??= this.resolveDefaultUser(data);
105
108
  }
106
109
  }
110
+ /** 默认用户值(issues/19):优先取 data 中已注入的 apply_user_id
111
+ * (拦截器场景 = 流程 operator,BIGINT 用户列表开箱即用),否则回落配置默认值 */
112
+ resolveDefaultUser(data) {
113
+ return data['apply_user_id'] ?? this.defaultUserValue;
114
+ }
107
115
  }
108
116
  /**
109
117
  * 工作流业务数据入库适配拦截器——流程结束同意后,f_ 表单数据写入业务表。
@@ -141,6 +149,14 @@ export class PersistPostInterceptor {
141
149
  const submitType = Number(inst.variables[KeySubmitType]);
142
150
  if (submitType !== SubmitType.Agree)
143
151
  return;
152
+ // 同链重复触发防护(issues/19):最后任务节点与结束节点都会触发后置拦截器,
153
+ // 同一执行链(共享 inst.variables)只插一次。标记写入时实例已完成持久化
154
+ // (引擎 executeNode 先 updateInstance 后触发拦截器,repo 存副本)不会落库;
155
+ // exists 保留作为跨请求/重启的幂等兜底(先查后插语义不变)。
156
+ const chainKey = `__persist_executed_${inst.id}`;
157
+ if (inst.variables[chainKey] === true)
158
+ return;
159
+ inst.variables[chainKey] = true;
144
160
  // 表名:流程定义顶层 relTableName,缺省回落流程 name
145
161
  const tableName = await this.resolveTableName(inst);
146
162
  if (!tableName)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mldong/jeeflow",
3
- "version": "1.6.2",
3
+ "version": "1.6.3",
4
4
  "description": "jeeflow workflow engine — Node.js / TypeScript implementation",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",