@mldong/jeeflow 1.2.0 → 1.4.0
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/facade.d.ts +1 -0
- package/dist/facade.js +9 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +1 -0
- package/dist/jdbc/shared.d.ts +6 -1
- package/dist/jdbc/shared.js +51 -1
- package/dist/memory.d.ts +8 -3
- package/dist/memory.js +37 -2
- package/dist/metadata.d.ts +9 -0
- package/dist/metadata.js +41 -0
- package/dist/model.d.ts +58 -1
- package/dist/model.js +45 -0
- package/dist/registry.d.ts +21 -3
- package/dist/registry.js +26 -3
- package/dist/spi.d.ts +5 -1
- package/package.json +45 -45
package/dist/facade.d.ts
CHANGED
package/dist/facade.js
CHANGED
|
@@ -80,7 +80,7 @@ export class JeeflowFacade {
|
|
|
80
80
|
case 'processInstance/updateCCStatus':
|
|
81
81
|
return this.updateCCStatus(args);
|
|
82
82
|
case 'processInstance/ccList':
|
|
83
|
-
|
|
83
|
+
return this.ccList(args);
|
|
84
84
|
case 'processTask/detail':
|
|
85
85
|
return this.taskDetail(args);
|
|
86
86
|
case 'processTask/jumpAbleTaskNameList':
|
|
@@ -419,6 +419,14 @@ export class JeeflowFacade {
|
|
|
419
419
|
const operator = String(args.operator ?? 'user1');
|
|
420
420
|
await this.repo.updateCcStatus(instanceId, operator);
|
|
421
421
|
}
|
|
422
|
+
// ccList 我的抄送分页(v1.3.0):operator 作为抄送人过滤
|
|
423
|
+
async ccList(args) {
|
|
424
|
+
const pageNum = toInt(args.pageNum ?? 1);
|
|
425
|
+
const pageSize = toInt(args.pageSize ?? 10);
|
|
426
|
+
const actorId = String(args.operator ?? 'user1');
|
|
427
|
+
const { rows, total } = await this.repo.pageCcInstances(pageNum, pageSize, actorId);
|
|
428
|
+
return { rows, recordCount: total };
|
|
429
|
+
}
|
|
422
430
|
async taskDetail(args) {
|
|
423
431
|
const taskId = toId(args.id);
|
|
424
432
|
const operator = String(args.operator ?? 'user1');
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { EngineImpl, type Engine } from './engine.js';
|
|
2
2
|
export { MemoryRepository } from './memory.js';
|
|
3
|
-
export { HandlerRegistry, type IAssignmentHandler, type IDecisionHandler } from './registry.js';
|
|
3
|
+
export { HandlerRegistry, type IAssignmentHandler, type IDecisionHandler, type HandlerMeta } from './registry.js';
|
|
4
|
+
export { enumDict, enumDictKeys, type DictItem } from './metadata.js';
|
|
4
5
|
export * from './model.js';
|
|
5
6
|
export type { ProcessRepository, UserProvider, IDGenerator, ExpressionEvaluator } from './spi.js';
|
package/dist/index.js
CHANGED
package/dist/jdbc/shared.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ProcessInstance, ProcessTask, type ProcessDefine } from '../model.js';
|
|
1
|
+
import { ProcessInstance, ProcessTask, type ProcessDefine, type CcInstanceRow } from '../model.js';
|
|
2
2
|
import type { IDGenerator, ProcessRepository } from '../spi.js';
|
|
3
3
|
/** 默认 ID 生成器:时间戳毫秒 + 同毫秒递增序号(对齐 Java nextId 默认实现) */
|
|
4
4
|
export declare class TsIDGenerator implements IDGenerator {
|
|
@@ -63,4 +63,9 @@ export declare class JdbcRepository implements ProcessRepository {
|
|
|
63
63
|
removeTaskActor(taskId: number, actors: string[]): Promise<void>;
|
|
64
64
|
createCcInstance(instanceId: number, creator: string, ...actorIds: string[]): Promise<void>;
|
|
65
65
|
updateCcStatus(instanceId: number, actorId: string): Promise<void>;
|
|
66
|
+
pageCcInstances(pageNum: number, pageSize: number, actorId: string): Promise<{
|
|
67
|
+
rows: CcInstanceRow[];
|
|
68
|
+
total: number;
|
|
69
|
+
}>;
|
|
70
|
+
private mapCcRow;
|
|
66
71
|
}
|
package/dist/jdbc/shared.js
CHANGED
|
@@ -349,9 +349,17 @@ export class JdbcRepository {
|
|
|
349
349
|
}
|
|
350
350
|
}
|
|
351
351
|
async addTaskActor(taskId, actors) {
|
|
352
|
+
if (actors.length === 0)
|
|
353
|
+
return;
|
|
354
|
+
// 追加语义(对齐 boot2/boot3,issues/03):查已有参与者,去重后仅插入新增,不清空原参与者
|
|
355
|
+
const existing = await this.findTaskActors(taskId);
|
|
356
|
+
const seen = new Set(existing);
|
|
357
|
+
const toAdd = actors.filter(a => !seen.has(a));
|
|
358
|
+
if (toAdd.length === 0)
|
|
359
|
+
return;
|
|
352
360
|
const conn = await this.c();
|
|
353
361
|
try {
|
|
354
|
-
await this.insertTaskActors(conn, taskId,
|
|
362
|
+
await this.insertTaskActors(conn, taskId, toAdd);
|
|
355
363
|
}
|
|
356
364
|
finally {
|
|
357
365
|
await this.done(conn);
|
|
@@ -391,4 +399,46 @@ export class JdbcRepository {
|
|
|
391
399
|
await this.done(conn);
|
|
392
400
|
}
|
|
393
401
|
}
|
|
402
|
+
// pageCcInstances 我的抄送分页(v1.3.0):cc 表 join 实例 + 定义,按抄送人过滤(对齐 Java pageCcInstances)
|
|
403
|
+
async pageCcInstances(pageNum, pageSize, actorId) {
|
|
404
|
+
const where = ' FROM wf_process_instance t' +
|
|
405
|
+
' LEFT JOIN wf_process_define pd ON t.process_define_id = pd.id' +
|
|
406
|
+
' LEFT JOIN wf_process_cc_instance cc ON t.id = cc.process_instance_id' +
|
|
407
|
+
' WHERE cc.actor_id = ?';
|
|
408
|
+
const cols = 't.id, t.parent_id, t.process_define_id, t.state, t.parent_node_name, t.business_no,' +
|
|
409
|
+
' t.operator, t.expire_time, t.variable, t.create_time, t.create_user, t.update_time, t.update_user,' +
|
|
410
|
+
' pd.name, pd.display_name, pd.version';
|
|
411
|
+
const conn = await this.c();
|
|
412
|
+
try {
|
|
413
|
+
const countRow = await conn.fetchOne(this.sql('SELECT COUNT(*) ' + where), [actorId]);
|
|
414
|
+
const total = Number(Object.values(countRow)[0] ?? 0);
|
|
415
|
+
const rows = await conn.fetchAll(this.sql(`SELECT ${cols}${where} ORDER BY t.id ASC LIMIT ? OFFSET ?`), [actorId, pageSize, (pageNum - 1) * pageSize]);
|
|
416
|
+
return {
|
|
417
|
+
rows: rows.map(r => this.mapCcRow(r)),
|
|
418
|
+
total,
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
finally {
|
|
422
|
+
await this.done(conn);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
mapCcRow(r) {
|
|
426
|
+
let variables = {};
|
|
427
|
+
if (r.variable) {
|
|
428
|
+
try {
|
|
429
|
+
variables = JSON.parse(r.variable);
|
|
430
|
+
}
|
|
431
|
+
catch { /* 忽略坏 JSON */ }
|
|
432
|
+
}
|
|
433
|
+
return {
|
|
434
|
+
id: Number(r.id), parentId: r.parent_id != null ? Number(r.parent_id) : undefined,
|
|
435
|
+
defineId: Number(r.process_define_id), state: r.state,
|
|
436
|
+
parentNodeName: r.parent_node_name ?? '', businessNo: r.business_no ?? '', operator: r.operator ?? '',
|
|
437
|
+
expireTime: r.expire_time ?? undefined, variables,
|
|
438
|
+
createTime: r.create_time, createUser: r.create_user ?? '',
|
|
439
|
+
updateTime: r.update_time, updateUser: r.update_user ?? '',
|
|
440
|
+
defineName: r.name ?? '', defineDisplayName: r.display_name ?? '',
|
|
441
|
+
defineVersion: Number(r.version ?? 0),
|
|
442
|
+
};
|
|
443
|
+
}
|
|
394
444
|
}
|
package/dist/memory.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ProcessDefine } from './model.js';
|
|
1
|
+
import type { CcInstanceRow, ProcessDefine } from './model.js';
|
|
2
2
|
import { type ProcessInstance, type ProcessTask } from './model.js';
|
|
3
3
|
import type { ProcessRepository } from './spi.js';
|
|
4
4
|
export declare class MemoryRepository implements ProcessRepository {
|
|
@@ -6,6 +6,7 @@ export declare class MemoryRepository implements ProcessRepository {
|
|
|
6
6
|
private instances;
|
|
7
7
|
private tasks;
|
|
8
8
|
private actors;
|
|
9
|
+
private ccInstances;
|
|
9
10
|
private seq;
|
|
10
11
|
addDefine(def: ProcessDefine): void;
|
|
11
12
|
findDefineById(id: number): Promise<ProcessDefine | null>;
|
|
@@ -26,8 +27,12 @@ export declare class MemoryRepository implements ProcessRepository {
|
|
|
26
27
|
findTaskActors(taskId: number): Promise<string[]>;
|
|
27
28
|
addTaskActor(taskId: number, actors: string[]): Promise<void>;
|
|
28
29
|
removeTaskActor(taskId: number, actors: string[]): Promise<void>;
|
|
29
|
-
createCcInstance(...
|
|
30
|
-
updateCcStatus(
|
|
30
|
+
createCcInstance(instanceId: number, _creator: string, ...actorIds: string[]): Promise<void>;
|
|
31
|
+
updateCcStatus(_instanceId: number, _actorId: string): Promise<void>;
|
|
32
|
+
pageCcInstances(pageNum: number | undefined, pageSize: number | undefined, actorId: string): Promise<{
|
|
33
|
+
rows: CcInstanceRow[];
|
|
34
|
+
total: number;
|
|
35
|
+
}>;
|
|
31
36
|
allDefines(): ProcessDefine[];
|
|
32
37
|
allInstances(): ProcessInstance[];
|
|
33
38
|
allTasks(): ProcessTask[];
|
package/dist/memory.js
CHANGED
|
@@ -4,6 +4,7 @@ export class MemoryRepository {
|
|
|
4
4
|
instances = new Map();
|
|
5
5
|
tasks = new Map();
|
|
6
6
|
actors = new Map();
|
|
7
|
+
ccInstances = new Map();
|
|
7
8
|
seq = 1;
|
|
8
9
|
addDefine(def) {
|
|
9
10
|
if (!def.id)
|
|
@@ -149,8 +150,42 @@ export class MemoryRepository {
|
|
|
149
150
|
const remove = new Set(actors);
|
|
150
151
|
this.actors.set(taskId, (this.actors.get(taskId) ?? []).filter(a => !remove.has(a)));
|
|
151
152
|
}
|
|
152
|
-
async createCcInstance(...
|
|
153
|
-
|
|
153
|
+
async createCcInstance(instanceId, _creator, ...actorIds) {
|
|
154
|
+
const existing = this.ccInstances.get(instanceId) ?? [];
|
|
155
|
+
const seen = new Set(existing);
|
|
156
|
+
for (const a of actorIds) {
|
|
157
|
+
if (!seen.has(a)) {
|
|
158
|
+
existing.push(a);
|
|
159
|
+
seen.add(a);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
this.ccInstances.set(instanceId, existing);
|
|
163
|
+
}
|
|
164
|
+
async updateCcStatus(_instanceId, _actorId) { }
|
|
165
|
+
// pageCcInstances 我的抄送分页(v1.3.0):按抄送人 actorId 过滤,join 实例 + 定义
|
|
166
|
+
async pageCcInstances(pageNum = 1, pageSize = 10, actorId) {
|
|
167
|
+
const rows = [];
|
|
168
|
+
for (const [instId, actors] of this.ccInstances) {
|
|
169
|
+
if (actorId && !actors.includes(actorId))
|
|
170
|
+
continue;
|
|
171
|
+
const inst = this.instances.get(instId);
|
|
172
|
+
if (!inst)
|
|
173
|
+
continue;
|
|
174
|
+
const def = this.defines.get(inst.defineId);
|
|
175
|
+
rows.push({
|
|
176
|
+
id: inst.id, parentId: inst.parentId, defineId: inst.defineId, state: inst.state,
|
|
177
|
+
parentNodeName: inst.parentNodeName, businessNo: inst.businessNo, operator: inst.operator,
|
|
178
|
+
expireTime: inst.expireTime, variables: { ...inst.variables },
|
|
179
|
+
createTime: inst.createTime, createUser: inst.createUser,
|
|
180
|
+
updateTime: inst.updateTime, updateUser: inst.updateUser,
|
|
181
|
+
defineName: def?.name ?? '', defineDisplayName: def?.displayName ?? '',
|
|
182
|
+
defineVersion: def?.version ?? 0,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
const total = rows.length;
|
|
186
|
+
const start = (pageNum - 1) * pageSize;
|
|
187
|
+
return { rows: rows.slice(start, start + pageSize), total };
|
|
188
|
+
}
|
|
154
189
|
allDefines() { return [...this.defines.values()]; }
|
|
155
190
|
allInstances() { return [...this.instances.values()]; }
|
|
156
191
|
allTasks() {
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** 单个字典项 */
|
|
2
|
+
export interface DictItem {
|
|
3
|
+
value: string;
|
|
4
|
+
label: string;
|
|
5
|
+
}
|
|
6
|
+
/** 内置枚举字典 key 清单(对齐 boot3 字典 key,存量前端零改动) */
|
|
7
|
+
export declare function enumDictKeys(): string[];
|
|
8
|
+
/** 按 key 取字典([{value, label}]),未知 key 返回空列表 */
|
|
9
|
+
export declare function enumDict(key: string): DictItem[];
|
package/dist/metadata.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// 引擎元数据能力(v1.4.0,issues/04)——内置状态枚举字典
|
|
2
|
+
//
|
|
3
|
+
// key 对齐 boot3 字典(wf_process_define_state 等),value/label 与 Java enums 完全一致,
|
|
4
|
+
// 杜绝集成方重复定义导致的值漂移。
|
|
5
|
+
// 内置字典表(值顺序与 Java enums 声明顺序一致)
|
|
6
|
+
const DICTS = {
|
|
7
|
+
wf_process_define_state: [
|
|
8
|
+
{ value: '0', label: '禁用' }, { value: '1', label: '启用' },
|
|
9
|
+
],
|
|
10
|
+
wf_process_instance_state: [
|
|
11
|
+
{ value: '10', label: '进行中' }, { value: '20', label: '已完成' }, { value: '30', label: '已撤回' },
|
|
12
|
+
{ value: '40', label: '强行终止' }, { value: '45', label: '已拒绝' }, { value: '50', label: '挂起' },
|
|
13
|
+
{ value: '99', label: '已废弃' },
|
|
14
|
+
],
|
|
15
|
+
wf_process_submit_type: [
|
|
16
|
+
{ value: '0', label: '发起申请' }, { value: '1', label: '同意申请' }, { value: '2', label: '拒绝申请' },
|
|
17
|
+
{ value: '3', label: '退回上一步' }, { value: '4', label: '跳转' }, { value: '5', label: '重新提交' },
|
|
18
|
+
{ value: '6', label: '退回发起人' }, { value: '20', label: '拒绝申请' },
|
|
19
|
+
],
|
|
20
|
+
wf_process_task_state: [
|
|
21
|
+
{ value: '10', label: '进行中' }, { value: '20', label: '已完成' }, { value: '30', label: '已撤回' },
|
|
22
|
+
{ value: '40', label: '强行终止' }, { value: '50', label: '挂起' }, { value: '99', label: '已废弃' },
|
|
23
|
+
],
|
|
24
|
+
wf_process_task_type: [
|
|
25
|
+
{ value: '0', label: '主办' }, { value: '1', label: '协办' }, { value: '2', label: '记录' },
|
|
26
|
+
],
|
|
27
|
+
wf_process_task_perform_type: [
|
|
28
|
+
{ value: '0', label: '普通参与' }, { value: '1', label: '会签参与' },
|
|
29
|
+
],
|
|
30
|
+
wf_countersign_type: [
|
|
31
|
+
{ value: '0', label: '并行会签' }, { value: '1', label: '串行会签' },
|
|
32
|
+
],
|
|
33
|
+
};
|
|
34
|
+
/** 内置枚举字典 key 清单(对齐 boot3 字典 key,存量前端零改动) */
|
|
35
|
+
export function enumDictKeys() {
|
|
36
|
+
return Object.keys(DICTS);
|
|
37
|
+
}
|
|
38
|
+
/** 按 key 取字典([{value, label}]),未知 key 返回空列表 */
|
|
39
|
+
export function enumDict(key) {
|
|
40
|
+
return [...(DICTS[key] ?? [])];
|
|
41
|
+
}
|
package/dist/model.d.ts
CHANGED
|
@@ -80,13 +80,52 @@ export interface ProcessSurrogate {
|
|
|
80
80
|
export declare enum InstanceState {
|
|
81
81
|
Doing = 10,
|
|
82
82
|
Done = 20,
|
|
83
|
-
|
|
83
|
+
Withdraw = 30,
|
|
84
|
+
Interrupt = 40,
|
|
85
|
+
Reject = 45,
|
|
86
|
+
Pending = 50,
|
|
87
|
+
Abandon = 99
|
|
84
88
|
}
|
|
85
89
|
export declare enum TaskState {
|
|
86
90
|
Doing = 10,
|
|
87
91
|
Done = 20,
|
|
92
|
+
Withdraw = 30,
|
|
93
|
+
Interrupt = 40,
|
|
94
|
+
Pending = 50,
|
|
88
95
|
Abandoned = 99
|
|
89
96
|
}
|
|
97
|
+
/** 流程定义状态(wf_process_define_state) */
|
|
98
|
+
export declare enum DefineState {
|
|
99
|
+
Disable = 0,
|
|
100
|
+
Enable = 1
|
|
101
|
+
}
|
|
102
|
+
/** 流程提交类型(wf_process_submit_type) */
|
|
103
|
+
export declare enum SubmitType {
|
|
104
|
+
Apply = 0,
|
|
105
|
+
Agree = 1,
|
|
106
|
+
Reject = 2,
|
|
107
|
+
Rollback = 3,
|
|
108
|
+
Jump = 4,
|
|
109
|
+
ReApply = 5,
|
|
110
|
+
RollbackToOperator = 6,
|
|
111
|
+
CountersignDisagree = 20
|
|
112
|
+
}
|
|
113
|
+
/** 任务类型(wf_process_task_type) */
|
|
114
|
+
export declare enum TaskType {
|
|
115
|
+
Major = 0,
|
|
116
|
+
Secondary = 1,
|
|
117
|
+
Record = 2
|
|
118
|
+
}
|
|
119
|
+
/** 任务参与方式(wf_process_task_perform_type) */
|
|
120
|
+
export declare enum PerformType {
|
|
121
|
+
Normal = 0,
|
|
122
|
+
Countersign = 1
|
|
123
|
+
}
|
|
124
|
+
/** 会签类型(wf_countersign_type) */
|
|
125
|
+
export declare enum CountersignType {
|
|
126
|
+
Parallel = 0,
|
|
127
|
+
Sequential = 1
|
|
128
|
+
}
|
|
90
129
|
export declare const BusinessNoKey = "BUSINESS_NO";
|
|
91
130
|
export declare class ProcessInstance {
|
|
92
131
|
id: number;
|
|
@@ -168,3 +207,21 @@ export interface UserInfo {
|
|
|
168
207
|
postId?: string;
|
|
169
208
|
postName?: string;
|
|
170
209
|
}
|
|
210
|
+
export interface CcInstanceRow {
|
|
211
|
+
id: number;
|
|
212
|
+
parentId?: number;
|
|
213
|
+
defineId: number;
|
|
214
|
+
state: InstanceState;
|
|
215
|
+
parentNodeName: string;
|
|
216
|
+
businessNo: string;
|
|
217
|
+
operator: string;
|
|
218
|
+
expireTime?: Date;
|
|
219
|
+
variables: Record<string, any>;
|
|
220
|
+
createTime: Date;
|
|
221
|
+
createUser: string;
|
|
222
|
+
updateTime: Date;
|
|
223
|
+
updateUser: string;
|
|
224
|
+
defineName: string;
|
|
225
|
+
defineDisplayName: string;
|
|
226
|
+
defineVersion: number;
|
|
227
|
+
}
|
package/dist/model.js
CHANGED
|
@@ -11,14 +11,59 @@ export var InstanceState;
|
|
|
11
11
|
(function (InstanceState) {
|
|
12
12
|
InstanceState[InstanceState["Doing"] = 10] = "Doing";
|
|
13
13
|
InstanceState[InstanceState["Done"] = 20] = "Done";
|
|
14
|
+
InstanceState[InstanceState["Withdraw"] = 30] = "Withdraw";
|
|
15
|
+
InstanceState[InstanceState["Interrupt"] = 40] = "Interrupt";
|
|
14
16
|
InstanceState[InstanceState["Reject"] = 45] = "Reject";
|
|
17
|
+
InstanceState[InstanceState["Pending"] = 50] = "Pending";
|
|
18
|
+
InstanceState[InstanceState["Abandon"] = 99] = "Abandon";
|
|
15
19
|
})(InstanceState || (InstanceState = {}));
|
|
16
20
|
export var TaskState;
|
|
17
21
|
(function (TaskState) {
|
|
18
22
|
TaskState[TaskState["Doing"] = 10] = "Doing";
|
|
19
23
|
TaskState[TaskState["Done"] = 20] = "Done";
|
|
24
|
+
TaskState[TaskState["Withdraw"] = 30] = "Withdraw";
|
|
25
|
+
TaskState[TaskState["Interrupt"] = 40] = "Interrupt";
|
|
26
|
+
TaskState[TaskState["Pending"] = 50] = "Pending";
|
|
20
27
|
TaskState[TaskState["Abandoned"] = 99] = "Abandoned";
|
|
21
28
|
})(TaskState || (TaskState = {}));
|
|
29
|
+
// ─── 字典枚举(v1.4.0,对齐 Java enums,值与 boot3 字典一致) ───────────────
|
|
30
|
+
/** 流程定义状态(wf_process_define_state) */
|
|
31
|
+
export var DefineState;
|
|
32
|
+
(function (DefineState) {
|
|
33
|
+
DefineState[DefineState["Disable"] = 0] = "Disable";
|
|
34
|
+
DefineState[DefineState["Enable"] = 1] = "Enable";
|
|
35
|
+
})(DefineState || (DefineState = {}));
|
|
36
|
+
/** 流程提交类型(wf_process_submit_type) */
|
|
37
|
+
export var SubmitType;
|
|
38
|
+
(function (SubmitType) {
|
|
39
|
+
SubmitType[SubmitType["Apply"] = 0] = "Apply";
|
|
40
|
+
SubmitType[SubmitType["Agree"] = 1] = "Agree";
|
|
41
|
+
SubmitType[SubmitType["Reject"] = 2] = "Reject";
|
|
42
|
+
SubmitType[SubmitType["Rollback"] = 3] = "Rollback";
|
|
43
|
+
SubmitType[SubmitType["Jump"] = 4] = "Jump";
|
|
44
|
+
SubmitType[SubmitType["ReApply"] = 5] = "ReApply";
|
|
45
|
+
SubmitType[SubmitType["RollbackToOperator"] = 6] = "RollbackToOperator";
|
|
46
|
+
SubmitType[SubmitType["CountersignDisagree"] = 20] = "CountersignDisagree";
|
|
47
|
+
})(SubmitType || (SubmitType = {}));
|
|
48
|
+
/** 任务类型(wf_process_task_type) */
|
|
49
|
+
export var TaskType;
|
|
50
|
+
(function (TaskType) {
|
|
51
|
+
TaskType[TaskType["Major"] = 0] = "Major";
|
|
52
|
+
TaskType[TaskType["Secondary"] = 1] = "Secondary";
|
|
53
|
+
TaskType[TaskType["Record"] = 2] = "Record";
|
|
54
|
+
})(TaskType || (TaskType = {}));
|
|
55
|
+
/** 任务参与方式(wf_process_task_perform_type) */
|
|
56
|
+
export var PerformType;
|
|
57
|
+
(function (PerformType) {
|
|
58
|
+
PerformType[PerformType["Normal"] = 0] = "Normal";
|
|
59
|
+
PerformType[PerformType["Countersign"] = 1] = "Countersign";
|
|
60
|
+
})(PerformType || (PerformType = {}));
|
|
61
|
+
/** 会签类型(wf_countersign_type) */
|
|
62
|
+
export var CountersignType;
|
|
63
|
+
(function (CountersignType) {
|
|
64
|
+
CountersignType[CountersignType["Parallel"] = 0] = "Parallel";
|
|
65
|
+
CountersignType[CountersignType["Sequential"] = 1] = "Sequential";
|
|
66
|
+
})(CountersignType || (CountersignType = {}));
|
|
22
67
|
export const BusinessNoKey = 'BUSINESS_NO';
|
|
23
68
|
// ─── 聚合根:ProcessInstance ───────────────────────────────────────────────────
|
|
24
69
|
export class ProcessInstance {
|
package/dist/registry.d.ts
CHANGED
|
@@ -7,12 +7,30 @@ export interface IAssignmentHandler {
|
|
|
7
7
|
export interface IDecisionHandler {
|
|
8
8
|
decide(node: FlowNode, inst: ProcessInstance, vars: Record<string, any>): string | Promise<string>;
|
|
9
9
|
}
|
|
10
|
-
/**
|
|
10
|
+
/** 处理器元数据(v1.4.0,SPI 实现清单字典源) */
|
|
11
|
+
export interface HandlerMeta {
|
|
12
|
+
/** 处理器标识:节点配置的 handlerName(与字典 value 一致) */
|
|
13
|
+
name: string;
|
|
14
|
+
/** 显示名(字典 label) */
|
|
15
|
+
displayName?: string;
|
|
16
|
+
/** 排序(小在前) */
|
|
17
|
+
order?: number;
|
|
18
|
+
/** 分组(拦截器 pre/post 显式声明;其余可为空) */
|
|
19
|
+
group?: string;
|
|
20
|
+
}
|
|
21
|
+
/** 处理器注册表——按名称注册/解析 + 元数据清单(对标 Spring IoC / Java HandlerRegistry) */
|
|
11
22
|
export declare class HandlerRegistry {
|
|
12
23
|
private assignments;
|
|
13
24
|
private decisions;
|
|
14
|
-
|
|
15
|
-
|
|
25
|
+
private metas;
|
|
26
|
+
registerAssignment(name: string, handler: IAssignmentHandler, meta?: Omit<HandlerMeta, 'name'>): void;
|
|
27
|
+
registerDecision(name: string, handler: IDecisionHandler, meta?: Omit<HandlerMeta, 'name'>): void;
|
|
16
28
|
resolveAssignment(name: string): IAssignmentHandler | undefined;
|
|
17
29
|
resolveDecision(name: string): IDecisionHandler | undefined;
|
|
30
|
+
/** 按处理器类型列出可用实现的元数据(typeName: AssignmentHandler / DecisionHandler,按 order 升序) */
|
|
31
|
+
listHandlers(typeName: 'AssignmentHandler' | 'DecisionHandler'): HandlerMeta[];
|
|
32
|
+
/** 按处理器类型 + 分组列出(拦截器 pre/post) */
|
|
33
|
+
listHandlersGroup(typeName: 'AssignmentHandler' | 'DecisionHandler', group: string): HandlerMeta[];
|
|
34
|
+
/** 已注册的处理器名称清单(含未带元数据的) */
|
|
35
|
+
listHandlerNames(): string[];
|
|
18
36
|
}
|
package/dist/registry.js
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/** 处理器注册表——按名称注册/解析 + 元数据清单(对标 Spring IoC / Java HandlerRegistry) */
|
|
2
2
|
export class HandlerRegistry {
|
|
3
3
|
assignments = new Map();
|
|
4
4
|
decisions = new Map();
|
|
5
|
-
|
|
5
|
+
metas = new Map();
|
|
6
|
+
registerAssignment(name, handler, meta) {
|
|
6
7
|
this.assignments.set(name, handler);
|
|
8
|
+
if (meta)
|
|
9
|
+
this.metas.set(name, { name, ...meta });
|
|
7
10
|
}
|
|
8
|
-
registerDecision(name, handler) {
|
|
11
|
+
registerDecision(name, handler, meta) {
|
|
9
12
|
this.decisions.set(name, handler);
|
|
13
|
+
if (meta)
|
|
14
|
+
this.metas.set(name, { name, ...meta });
|
|
10
15
|
}
|
|
11
16
|
resolveAssignment(name) {
|
|
12
17
|
return this.assignments.get(name);
|
|
@@ -14,4 +19,22 @@ export class HandlerRegistry {
|
|
|
14
19
|
resolveDecision(name) {
|
|
15
20
|
return this.decisions.get(name);
|
|
16
21
|
}
|
|
22
|
+
// ── SPI 实现清单(v1.4.0)──
|
|
23
|
+
/** 按处理器类型列出可用实现的元数据(typeName: AssignmentHandler / DecisionHandler,按 order 升序) */
|
|
24
|
+
listHandlers(typeName) {
|
|
25
|
+
const names = typeName === 'AssignmentHandler'
|
|
26
|
+
? [...this.assignments.keys()]
|
|
27
|
+
: [...this.decisions.keys()];
|
|
28
|
+
return names
|
|
29
|
+
.map(n => this.metas.get(n) ?? { name: n })
|
|
30
|
+
.sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
|
|
31
|
+
}
|
|
32
|
+
/** 按处理器类型 + 分组列出(拦截器 pre/post) */
|
|
33
|
+
listHandlersGroup(typeName, group) {
|
|
34
|
+
return this.listHandlers(typeName).filter(m => m.group === group);
|
|
35
|
+
}
|
|
36
|
+
/** 已注册的处理器名称清单(含未带元数据的) */
|
|
37
|
+
listHandlerNames() {
|
|
38
|
+
return [...this.assignments.keys(), ...this.decisions.keys()];
|
|
39
|
+
}
|
|
17
40
|
}
|
package/dist/spi.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ProcessDefine, ProcessDesign, ProcessDesignHis, ProcessInstance, ProcessSurrogate, ProcessTask, UserInfo } from './model.js';
|
|
1
|
+
import type { CcInstanceRow, ProcessDefine, ProcessDesign, ProcessDesignHis, ProcessInstance, ProcessSurrogate, ProcessTask, UserInfo } from './model.js';
|
|
2
2
|
export interface ProcessRepository {
|
|
3
3
|
findDefineById(id: number): Promise<ProcessDefine | null>;
|
|
4
4
|
findDefineByName(name: string): Promise<ProcessDefine | null>;
|
|
@@ -20,6 +20,10 @@ export interface ProcessRepository {
|
|
|
20
20
|
removeTaskActor(taskId: number, actors: string[]): Promise<void>;
|
|
21
21
|
createCcInstance(instanceId: number, creator: string, ...actorIds: string[]): Promise<void>;
|
|
22
22
|
updateCcStatus(instanceId: number, actorId: string): Promise<void>;
|
|
23
|
+
pageCcInstances(pageNum: number, pageSize: number, actorId: string): Promise<{
|
|
24
|
+
rows: CcInstanceRow[];
|
|
25
|
+
total: number;
|
|
26
|
+
}>;
|
|
23
27
|
}
|
|
24
28
|
export interface UserProvider {
|
|
25
29
|
getUser(userId: string): Promise<UserInfo | null>;
|
package/package.json
CHANGED
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@mldong/jeeflow",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "jeeflow workflow engine — Node.js / TypeScript implementation",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "./dist/index.js",
|
|
7
|
-
"types": "./dist/index.d.ts",
|
|
8
|
-
"exports": {
|
|
9
|
-
".": "./dist/index.js",
|
|
10
|
-
"./engine": "./dist/engine.js",
|
|
11
|
-
"./model": "./dist/model.js",
|
|
12
|
-
"./spi": "./dist/spi.js",
|
|
13
|
-
"./memory": "./dist/memory.js",
|
|
14
|
-
"./jdbc": "./dist/jdbc/index.js",
|
|
15
|
-
"./mysql": "./dist/jdbc/mysql.js",
|
|
16
|
-
"./postgres": "./dist/jdbc/postgres.js"
|
|
17
|
-
},
|
|
18
|
-
"scripts": {
|
|
19
|
-
"build": "tsc",
|
|
20
|
-
"test": "node --import tsx __tests__/spec.test.ts",
|
|
21
|
-
"demo": "node --import tsx demo/main.ts",
|
|
22
|
-
"prepublishOnly": "npm run build"
|
|
23
|
-
},
|
|
24
|
-
"keywords": [
|
|
25
|
-
"workflow",
|
|
26
|
-
"engine",
|
|
27
|
-
"jeeflow",
|
|
28
|
-
"typescript"
|
|
29
|
-
],
|
|
30
|
-
"license": "Apache-2.0",
|
|
31
|
-
"devDependencies": {
|
|
32
|
-
"@types/pg": "^8.20.3",
|
|
33
|
-
"tsx": "^4.19.0",
|
|
34
|
-
"typescript": "^5.5.0"
|
|
35
|
-
},
|
|
36
|
-
"optionalDependencies": {
|
|
37
|
-
"mysql2": "^3.11.0",
|
|
38
|
-
"pg": "^8.13.0"
|
|
39
|
-
},
|
|
40
|
-
"files": [
|
|
41
|
-
"dist",
|
|
42
|
-
"LICENSE",
|
|
43
|
-
"README.md"
|
|
44
|
-
]
|
|
45
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@mldong/jeeflow",
|
|
3
|
+
"version": "1.4.0",
|
|
4
|
+
"description": "jeeflow workflow engine — Node.js / TypeScript implementation",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": "./dist/index.js",
|
|
10
|
+
"./engine": "./dist/engine.js",
|
|
11
|
+
"./model": "./dist/model.js",
|
|
12
|
+
"./spi": "./dist/spi.js",
|
|
13
|
+
"./memory": "./dist/memory.js",
|
|
14
|
+
"./jdbc": "./dist/jdbc/index.js",
|
|
15
|
+
"./mysql": "./dist/jdbc/mysql.js",
|
|
16
|
+
"./postgres": "./dist/jdbc/postgres.js"
|
|
17
|
+
},
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc",
|
|
20
|
+
"test": "node --import tsx __tests__/spec.test.ts",
|
|
21
|
+
"demo": "node --import tsx demo/main.ts",
|
|
22
|
+
"prepublishOnly": "npm run build"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"workflow",
|
|
26
|
+
"engine",
|
|
27
|
+
"jeeflow",
|
|
28
|
+
"typescript"
|
|
29
|
+
],
|
|
30
|
+
"license": "Apache-2.0",
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@types/pg": "^8.20.3",
|
|
33
|
+
"tsx": "^4.19.0",
|
|
34
|
+
"typescript": "^5.5.0"
|
|
35
|
+
},
|
|
36
|
+
"optionalDependencies": {
|
|
37
|
+
"mysql2": "^3.11.0",
|
|
38
|
+
"pg": "^8.13.0"
|
|
39
|
+
},
|
|
40
|
+
"files": [
|
|
41
|
+
"dist",
|
|
42
|
+
"LICENSE",
|
|
43
|
+
"README.md"
|
|
44
|
+
]
|
|
45
|
+
}
|