@simitgroup/simpleapp-generator 1.1.15 → 1.1.16
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/framework.js +2 -2
- package/dist/framework.js.map +1 -1
- package/dist/processors/bpmnbuilder.d.ts.map +1 -1
- package/dist/processors/bpmnbuilder.js +56 -42
- package/dist/processors/bpmnbuilder.js.map +1 -1
- package/package.json +1 -1
- package/src/framework.ts +2 -2
- package/src/processors/bpmnbuilder.ts +60 -42
- package/templates/basic/nest/controller.ts.eta +2 -1
- package/templates/basic/nest/service.ts.eta +1 -1
- package/templates/nest/src/simpleapp/generate/processors/simpleapp.processor.ts.eta +1 -1
- package/templates/nest/src/simpleapp/generate/workflow/workflow.config.ts.eta +59 -43
- package/templates/nest/src/simpleapp/generate/workflow/workflow.delegate.ts.eta +80 -43
- package/templates/nest/src/simpleapp/generate/workflow/workflow.service.ts.eta +81 -11
- package/templates/nest/src/simpleapp/generate/workflow/workflow.type.ts.eta +23 -0
- package/templates/nest/src/simpleapp/generate/workflow/workflow.userservice.ts.eta +77 -0
- package/templates/nest/src/simpleapp/simpleapp.module.ts.eta +5 -4
- package/templates/nest/src/simpleapp/workflows/{delegates/simpleapp.delegate.ts._eta → listeners/simpleapp.listener.ts._eta} +1 -1
- package/templates/project/workflows/bpmn/suspendcustomer.bpmn._eta +38 -19
- package/templates/workflow/next/listener.ts.eta +76 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/templates/workflow/next/delegate.ts.eta +0 -31
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
Injectable,
|
|
3
|
+
InternalServerErrorException,
|
|
4
|
+
Logger,
|
|
5
|
+
} from '@nestjs/common';
|
|
2
6
|
import {
|
|
3
7
|
IExecution,
|
|
4
8
|
Item,
|
|
@@ -7,41 +11,37 @@ import {
|
|
|
7
11
|
IAppDelegate,
|
|
8
12
|
IDefinition,
|
|
9
13
|
BPMNServer,
|
|
14
|
+
Execution,
|
|
10
15
|
} from 'bpmn-server';
|
|
11
|
-
import { moddleOptions } from 'bpmn-server/
|
|
12
|
-
|
|
13
|
-
<%for(let i=0; i<it.allbpmn.length;i++){%><%let bpmn = it.allbpmn[i]%>
|
|
14
|
-
import { <%=capitalizeFirstLetter(bpmn)%>DelegateService } from 'src/simpleapp/workflows/delegates/<%=bpmn%>.delegate';
|
|
15
|
-
<%}%>
|
|
16
|
-
// import * as dservice from './delegates'
|
|
16
|
+
import { moddleOptions } from 'bpmn-server/dist/elements/js-bpmn-moddle';
|
|
17
|
+
let mydelegate: WorkflowDelegate;
|
|
17
18
|
@Injectable()
|
|
18
19
|
export class WorkflowDelegate implements IAppDelegate {
|
|
19
20
|
protected logger = new Logger();
|
|
20
21
|
server: BPMNServer;
|
|
21
|
-
servicesProvider: any;
|
|
22
|
-
constructor(
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
private <%=bpmn%>DelegateService: <%=capitalizeFirstLetter(bpmn)%>DelegateService,
|
|
26
|
-
<%}%>
|
|
27
|
-
) {
|
|
28
|
-
this.servicesProvider = {
|
|
29
|
-
<%for(let i=0; i<it.allbpmn.length;i++){%>
|
|
30
|
-
<%let bpmn = it.allbpmn[i]%>
|
|
31
|
-
<%= bpmn%>: this.<%=bpmn%>DelegateService,
|
|
32
|
-
<%}%>
|
|
33
|
-
}
|
|
34
|
-
}
|
|
22
|
+
servicesProvider: any = () => new Object();
|
|
23
|
+
constructor() {}
|
|
24
|
+
getServicesProvider = (execution: Execution) => this.servicesProvider;
|
|
25
|
+
|
|
35
26
|
//config will use setServer to define bpmnserver
|
|
36
27
|
setServer(server: BPMNServer) {
|
|
28
|
+
mydelegate = this;
|
|
37
29
|
this.server = server;
|
|
38
|
-
|
|
39
|
-
server.listener.on('all', async function ({ context, event }) {
|
|
40
|
-
await self.executionEvent(context, event);
|
|
41
|
-
});
|
|
30
|
+
return mydelegate;
|
|
42
31
|
}
|
|
43
32
|
|
|
44
|
-
startUp(options) {
|
|
33
|
+
async startUp(options) {
|
|
34
|
+
// mydelegate.startUp(options);
|
|
35
|
+
// if (options['cron'] == false) {
|
|
36
|
+
// return;
|
|
37
|
+
// }
|
|
38
|
+
// console.log('myserver started');
|
|
39
|
+
// var query = { "items.status": "start" };
|
|
40
|
+
// var list = await this.server.dataStore.findItems(query);
|
|
41
|
+
// if (list.length > 0) {
|
|
42
|
+
// this.server.logger.log("** There are " + list.length," items that seems to be hung");
|
|
43
|
+
// }
|
|
44
|
+
}
|
|
45
45
|
sendEmail(to, msg, body) {
|
|
46
46
|
throw Error('sendEmail must be implemented by AppDelegate');
|
|
47
47
|
}
|
|
@@ -90,24 +90,61 @@ export class WorkflowDelegate implements IAppDelegate {
|
|
|
90
90
|
);
|
|
91
91
|
} else await this.issueSignal(signalId, data);
|
|
92
92
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
const
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
}else{
|
|
108
|
-
this.logger.error(`Undefined delegate service "${processName}":"${delegateServiceName}"`,props)
|
|
93
|
+
|
|
94
|
+
consoleKeyTypes = (obj1) => {
|
|
95
|
+
const keys = Object.getOwnPropertyNames(obj1);
|
|
96
|
+
console.log('consoleKeyTypesconsoleKeyTypesconsoleKeyTypes', keys);
|
|
97
|
+
for (let k = 0; k < keys.length; k++) {
|
|
98
|
+
const key = keys[k];
|
|
99
|
+
|
|
100
|
+
if (!obj1[key]) {
|
|
101
|
+
console.log(key, 'empty ');
|
|
102
|
+
} else if (typeof obj1[key] == 'object') {
|
|
103
|
+
console.log(key, typeof obj1[key], Object.keys(obj1[key]));
|
|
104
|
+
} else {
|
|
105
|
+
console.log(key, typeof obj1[key], obj1[key]);
|
|
106
|
+
}
|
|
109
107
|
}
|
|
110
|
-
|
|
108
|
+
};
|
|
109
|
+
async serviceCalled(inputdata, item: Item) {
|
|
110
|
+
// try{
|
|
111
|
+
//server
|
|
112
|
+
//uids
|
|
113
|
+
//instance
|
|
114
|
+
//definition
|
|
115
|
+
//process =>[ '$type', 'id', 'isExecutable', 'flowElements' ]
|
|
116
|
+
//Item => cant get
|
|
117
|
+
//state
|
|
118
|
+
// this.logger.error('EXECUTING serviceCalled');
|
|
119
|
+
// const delegateServiceName = item['item']['element']['def']['delegateExpression']
|
|
120
|
+
// this.logger.error("EXECUTING serviceCalled",delegateServiceName)
|
|
121
|
+
// const processName = item['instance']['name'];
|
|
122
|
+
// const data = item['instance']['data'];
|
|
123
|
+
// const vars = item['instance']['vars'];
|
|
124
|
+
// const props = {
|
|
125
|
+
// processName: processName,
|
|
126
|
+
// delegateName: delegateServiceName,
|
|
127
|
+
// inputData: inputdata,
|
|
128
|
+
// vars: vars,
|
|
129
|
+
// data: data,
|
|
130
|
+
// };
|
|
131
|
+
// if (
|
|
132
|
+
// this.servicesProvider[processName] &&
|
|
133
|
+
// this.servicesProvider[processName][delegateServiceName]
|
|
134
|
+
// ) {
|
|
135
|
+
// this.servicesProvider[processName][delegateServiceName](props, item);
|
|
136
|
+
// } else {
|
|
137
|
+
// this.logger.error(
|
|
138
|
+
// `Undefined delegate service "${processName}":"${delegateServiceName}"`,
|
|
139
|
+
// props,
|
|
140
|
+
// );
|
|
141
|
+
// }
|
|
142
|
+
// }catch(e){
|
|
143
|
+
// this.logger.error(
|
|
144
|
+
// `Unknown error delegate service `,
|
|
145
|
+
// Object.keys(item)
|
|
146
|
+
// );
|
|
147
|
+
// }
|
|
111
148
|
}
|
|
112
149
|
|
|
113
150
|
scopeEval(scope, script) {
|
|
@@ -21,9 +21,13 @@ import {
|
|
|
21
21
|
WorkflowTask,
|
|
22
22
|
UserTaskActors,
|
|
23
23
|
UserTaskType,
|
|
24
|
+
ServiceTaskData,
|
|
25
|
+
UserTaskData,
|
|
26
|
+
UserTaskEventType,
|
|
27
|
+
ServiceTaskEventType
|
|
24
28
|
} from './workflow.type';
|
|
25
|
-
import { OnEvent } from '@nestjs/event-emitter';
|
|
26
|
-
import { BPMNServer, Logger as bpmnlogger } from 'bpmn-server';
|
|
29
|
+
import { EventEmitter2, OnEvent } from '@nestjs/event-emitter';
|
|
30
|
+
import { BPMNServer, Logger as bpmnlogger ,BPMN_TYPE, EXECUTION_EVENT} from 'bpmn-server';
|
|
27
31
|
// import { configuration } from './configuration';
|
|
28
32
|
import { UserContext } from '../commons/user.context';
|
|
29
33
|
//import * as formschemas from '../../workflow/formschema';
|
|
@@ -37,9 +41,11 @@ export class WorkflowService {
|
|
|
37
41
|
protected bpmnServer: BPMNServer;
|
|
38
42
|
private readonly logger = new Logger();
|
|
39
43
|
constructor(
|
|
40
|
-
private workflowconfig:
|
|
41
|
-
|
|
44
|
+
private workflowconfig: WorkflowConfig,
|
|
45
|
+
private eventEmitter: EventEmitter2
|
|
46
|
+
) {
|
|
42
47
|
this.bpmnServer = new BPMNServer(this.workflowconfig.getConfig());
|
|
48
|
+
this.bpmnServer.listener.on('all',async (event)=>await this.applyEventListener(event))
|
|
43
49
|
}
|
|
44
50
|
|
|
45
51
|
/**
|
|
@@ -48,6 +54,7 @@ export class WorkflowService {
|
|
|
48
54
|
* @returns array of usertask
|
|
49
55
|
*/
|
|
50
56
|
async getActorUserTask(appuser: UserContext, uid: string) {
|
|
57
|
+
|
|
51
58
|
const tmp: any[] = await this.bpmnServer.dataStore.findItems({
|
|
52
59
|
'items.status': 'wait',
|
|
53
60
|
'data.tenantId': appuser.getTenantId(),
|
|
@@ -204,7 +211,7 @@ export class WorkflowService {
|
|
|
204
211
|
appuser: UserContext,
|
|
205
212
|
id: string,
|
|
206
213
|
taskId: string,
|
|
207
|
-
|
|
214
|
+
assignmentdata: UserTaskActors,
|
|
208
215
|
) {
|
|
209
216
|
try {
|
|
210
217
|
const result = await this.bpmnServer.dataStore.findInstance(
|
|
@@ -216,9 +223,10 @@ export class WorkflowService {
|
|
|
216
223
|
if (usertask) {
|
|
217
224
|
const result = await this.bpmnServer.engine.assign(
|
|
218
225
|
{ id: id, 'items.id': taskId },
|
|
219
|
-
{ newData: 1 },
|
|
226
|
+
{ newData: 1 }, //some data want to put in
|
|
227
|
+
assignmentdata,
|
|
220
228
|
appuser.getUid(),
|
|
221
|
-
|
|
229
|
+
{}, //options
|
|
222
230
|
);
|
|
223
231
|
return 'OK'; //Object.keys(result)
|
|
224
232
|
} else {
|
|
@@ -290,7 +298,7 @@ export class WorkflowService {
|
|
|
290
298
|
@OnEvent('workflow.start')
|
|
291
299
|
async startWorkflow(appuser: UserContext, workflowName: string, data?: any) {
|
|
292
300
|
try {
|
|
293
|
-
console.log(
|
|
301
|
+
console.log('startWorkflow started: ', workflowName);
|
|
294
302
|
data.tenantId = appuser.getTenantId();
|
|
295
303
|
data.orgId = appuser.getOrgId();
|
|
296
304
|
data.branchId = appuser.getBranchId();
|
|
@@ -299,13 +307,15 @@ export class WorkflowService {
|
|
|
299
307
|
data,
|
|
300
308
|
undefined,
|
|
301
309
|
appuser.getUid(),
|
|
302
|
-
appuser.getBranchFilter(),
|
|
310
|
+
// appuser.getBranchFilter(),
|
|
303
311
|
);
|
|
312
|
+
|
|
313
|
+
// console.log("startWorkflowstartWorkflowstartWorkflow",result)
|
|
304
314
|
return {
|
|
305
315
|
id: result.id,
|
|
306
316
|
name: result.name,
|
|
307
317
|
status: result.status,
|
|
308
|
-
userId: result.
|
|
318
|
+
userId: result.userName,
|
|
309
319
|
startedAt: result.item.startedAt,
|
|
310
320
|
};
|
|
311
321
|
} catch (e) {
|
|
@@ -411,7 +421,67 @@ export class WorkflowService {
|
|
|
411
421
|
type: item.type,
|
|
412
422
|
})),
|
|
413
423
|
};
|
|
414
|
-
|
|
415
424
|
return result;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
|
|
428
|
+
/**
|
|
429
|
+
* listen all events in bpmn-server engine, inclduded task and execution instances
|
|
430
|
+
* @param event bpmn-server event instance
|
|
431
|
+
*/
|
|
432
|
+
async applyEventListener(event){
|
|
433
|
+
|
|
434
|
+
if(event.context.item){
|
|
435
|
+
const workflowName:string = event.context.instance.name
|
|
436
|
+
const eventType:EXECUTION_EVENT = event.event
|
|
437
|
+
const elementType:BPMN_TYPE = event.context.item.element.type
|
|
438
|
+
const elementId:string = event.context.item.element.id
|
|
439
|
+
const elementName:string = event.context.item.element.name
|
|
440
|
+
const elementProps = event.context.item.element.def
|
|
441
|
+
const usertaskinput = event.context.item.input ?? null
|
|
442
|
+
const data = event.context.instance.data
|
|
443
|
+
switch(elementType){
|
|
444
|
+
case BPMN_TYPE.UserTask:
|
|
445
|
+
let usertaskeventtype: UserTaskEventType
|
|
446
|
+
if(eventType==EXECUTION_EVENT.node_start) usertaskeventtype='start'
|
|
447
|
+
else if(eventType==EXECUTION_EVENT.node_assign) usertaskeventtype='assign'
|
|
448
|
+
else if(eventType==EXECUTION_EVENT.node_end) usertaskeventtype='end'
|
|
449
|
+
else if(eventType==EXECUTION_EVENT.transform_input) usertaskeventtype='invoke'
|
|
450
|
+
else if(eventType==EXECUTION_EVENT.node_wait) usertaskeventtype='wait'
|
|
451
|
+
if(usertaskeventtype){
|
|
452
|
+
const props:UserTaskData = {
|
|
453
|
+
workflowName: workflowName,
|
|
454
|
+
eventType: usertaskeventtype,
|
|
455
|
+
elementType:'bpmn:UserTask',
|
|
456
|
+
elementId: elementId,
|
|
457
|
+
elementName: elementName,
|
|
458
|
+
elementProps: elementProps,
|
|
459
|
+
usertaskinput: usertaskinput,
|
|
460
|
+
data: data,
|
|
461
|
+
}
|
|
462
|
+
this.eventEmitter.emit(`${workflowName}.${elementId}.${eventType}`,props)
|
|
463
|
+
}
|
|
464
|
+
break;
|
|
465
|
+
case BPMN_TYPE.ServiceTask:
|
|
466
|
+
let servicetaskeventtype: ServiceTaskEventType
|
|
467
|
+
if(eventType==EXECUTION_EVENT.node_start) servicetaskeventtype='start'
|
|
468
|
+
else if(eventType==EXECUTION_EVENT.node_end) servicetaskeventtype='end'
|
|
469
|
+
if(servicetaskeventtype){
|
|
470
|
+
const props:ServiceTaskData = {
|
|
471
|
+
workflowName: workflowName,
|
|
472
|
+
eventType: servicetaskeventtype,
|
|
473
|
+
elementType:'bpmn:ServiceTask',
|
|
474
|
+
elementId: elementId,
|
|
475
|
+
elementName: elementName,
|
|
476
|
+
elementProps: elementProps,
|
|
477
|
+
data: data,
|
|
478
|
+
}
|
|
479
|
+
this.eventEmitter.emit(`${workflowName}.${elementId}.${eventType}`,props)
|
|
480
|
+
}
|
|
481
|
+
break;
|
|
482
|
+
default://do nothing at the moment
|
|
483
|
+
break;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
416
486
|
}
|
|
417
487
|
}
|
|
@@ -58,3 +58,26 @@ export type UserTaskType = {
|
|
|
58
58
|
type: string;
|
|
59
59
|
userId: string;
|
|
60
60
|
};
|
|
61
|
+
|
|
62
|
+
export type UserTaskEventType = 'start'|'wait'|'invoke'|'end'|'assign'
|
|
63
|
+
export type UserTaskData ={
|
|
64
|
+
workflowName: string
|
|
65
|
+
eventType: 'start'|'wait'|'invoke'|'end'|'assign' //assign = modify properties but not change state
|
|
66
|
+
elementType: 'bpmn:UserTask'
|
|
67
|
+
elementId: string
|
|
68
|
+
elementName: string
|
|
69
|
+
elementProps: any
|
|
70
|
+
usertaskinput: any
|
|
71
|
+
data: any
|
|
72
|
+
}
|
|
73
|
+
export type ServiceTaskEventType = 'start'|'end'
|
|
74
|
+
export type ServiceTaskData ={
|
|
75
|
+
workflowName: string
|
|
76
|
+
eventType: 'start'|'end'
|
|
77
|
+
elementType: 'bpmn:ServiceTask'
|
|
78
|
+
elementId: string
|
|
79
|
+
elementName: string
|
|
80
|
+
elementProps: any,
|
|
81
|
+
data: any,
|
|
82
|
+
}
|
|
83
|
+
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { Inject, Injectable } from '@nestjs/common';
|
|
2
|
+
import { IUserService, BPMNServer } from 'bpmn-server';
|
|
3
|
+
const mongoose = require('mongoose');
|
|
4
|
+
|
|
5
|
+
let myuserservice;
|
|
6
|
+
@Injectable()
|
|
7
|
+
export class WorkflowUserService implements IUserService {
|
|
8
|
+
static initialized = false;
|
|
9
|
+
server: BPMNServer;
|
|
10
|
+
constructor() {
|
|
11
|
+
// if (UserService.initialized)
|
|
12
|
+
// return;
|
|
13
|
+
|
|
14
|
+
// UserService.initialized = true;
|
|
15
|
+
setImmediate(() => {
|
|
16
|
+
this.init();
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
setServer(server: BPMNServer) {
|
|
20
|
+
this.server = server;
|
|
21
|
+
myuserservice = this;
|
|
22
|
+
return myuserservice;
|
|
23
|
+
// this.server =server
|
|
24
|
+
}
|
|
25
|
+
async findUsers(query) {
|
|
26
|
+
// return await User.find(query);
|
|
27
|
+
}
|
|
28
|
+
async findUser(query) {
|
|
29
|
+
// return await User.findOne(query);
|
|
30
|
+
}
|
|
31
|
+
async addUser(userName, email, password, userGroups) {
|
|
32
|
+
// let exist = await User.findOne({ userName: userName });
|
|
33
|
+
// if (exist) {
|
|
34
|
+
// console.log(`user '${userName}' already exists`);
|
|
35
|
+
// return exist;
|
|
36
|
+
}
|
|
37
|
+
// exist = await User.findOne({ email: email });
|
|
38
|
+
// if (exist) {
|
|
39
|
+
// console.log("user already exists with this email", email);
|
|
40
|
+
// return exist;
|
|
41
|
+
// }
|
|
42
|
+
|
|
43
|
+
// const user = new User({
|
|
44
|
+
// userName, email, password, userGroups
|
|
45
|
+
// });
|
|
46
|
+
|
|
47
|
+
// await user.save();
|
|
48
|
+
// return user;
|
|
49
|
+
// }
|
|
50
|
+
async setPassword(userName, password) {
|
|
51
|
+
// let user = await User.findOne({ userName });
|
|
52
|
+
// if (!user) {
|
|
53
|
+
// console.log("User does not exist")
|
|
54
|
+
// return;
|
|
55
|
+
// }
|
|
56
|
+
// user.password = password;
|
|
57
|
+
// await user.save();
|
|
58
|
+
}
|
|
59
|
+
async install() {
|
|
60
|
+
// console.log(` adding new User for 'admin' password: 'admin'`);
|
|
61
|
+
// //await this.init();
|
|
62
|
+
// await this.addUser('admin', 'admin@mySite.com', 'admin', ['ADMIN']);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
init() {
|
|
66
|
+
console.log('UserService.init()');
|
|
67
|
+
// dotenv.config();
|
|
68
|
+
// console.log("MongoDB URL", process.env.MONGO_DB_URL)
|
|
69
|
+
// mongoose.set('strictQuery', false);
|
|
70
|
+
// mongoose.connect(process.env.MONGO_DB_URL);
|
|
71
|
+
// mongoose.connection.on('error', (err) => {
|
|
72
|
+
// console.error(err);
|
|
73
|
+
// console.log('%s MongoDB connection error. Please make sure MongoDB is running.');
|
|
74
|
+
// process.exit();
|
|
75
|
+
// });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -22,9 +22,10 @@ import { WorkflowController } from './generate/workflow/workflow.controller';
|
|
|
22
22
|
import { WorkflowDelegate } from './generate/workflow/workflow.delegate';
|
|
23
23
|
import { WorkflowConfig } from './generate/workflow/workflow.config';
|
|
24
24
|
import { WorkflowService } from './generate/workflow/workflow.service';
|
|
25
|
+
import { WorkflowUserService } from './generate/workflow/workflow.userservice';
|
|
25
26
|
<%for(let i=0; i<it.allbpmn.length;i++){%>
|
|
26
27
|
<%let bpmn = it.allbpmn[i]%>
|
|
27
|
-
import { <%=capitalizeFirstLetter(bpmn)%>
|
|
28
|
+
import { <%=capitalizeFirstLetter(bpmn)%>ListenerService } from 'src/simpleapp/workflows/listeners/<%=bpmn%>.listener';
|
|
28
29
|
<%}%>
|
|
29
30
|
// import {ServiceModule} from "../services/service.module"
|
|
30
31
|
//import { <%= it.typename %>Service } from '../../generate/<%= it.doctype %>/<%= it.doctype %>.service';
|
|
@@ -44,12 +45,12 @@ import { <%=capitalizeFirstLetter(bpmn)%>DelegateService } from 'src/simpleapp/w
|
|
|
44
45
|
],
|
|
45
46
|
controllers: [<% for(let i=0;i<it.modules.length; i++){ %><%= it.modules[i].docname %>Controller,<%}%> ProfileController,WorkflowController],
|
|
46
47
|
providers: [
|
|
47
|
-
AuditTrail,DocNumberFormatGenerator,<% for(let i=0;i<it.modules.length; i++){ %><%= it.modules[i].docname %>Service,<%}%> ProfileService,WorkflowDelegate,WorkflowConfig,WorkflowService,
|
|
48
|
+
AuditTrail,DocNumberFormatGenerator,<% for(let i=0;i<it.modules.length; i++){ %><%= it.modules[i].docname %>Service,<%}%> ProfileService,WorkflowDelegate,WorkflowConfig,WorkflowService,WorkflowUserService,
|
|
48
49
|
<%for(let i=0; i<it.allbpmn.length;i++){%>
|
|
49
50
|
<%let bpmn = it.allbpmn[i]%>
|
|
50
|
-
<%=capitalizeFirstLetter(bpmn)%>
|
|
51
|
+
<%=capitalizeFirstLetter(bpmn)%>ListenerService,
|
|
51
52
|
<%}%>
|
|
52
53
|
],
|
|
53
|
-
exports:[AuditTrail,DocNumberFormatGenerator,<% for(let i=0;i<it.modules.length; i++){ %><%= it.modules[i].docname %>Service,<%}%> ProfileService,WorkflowDelegate,WorkflowConfig,WorkflowService]
|
|
54
|
+
exports:[AuditTrail,DocNumberFormatGenerator,<% for(let i=0;i<it.modules.length; i++){ %><%= it.modules[i].docname %>Service,<%}%> ProfileService,WorkflowDelegate,WorkflowConfig,WorkflowService,WorkflowUserService,]
|
|
54
55
|
})
|
|
55
56
|
export class GenerateModule {}
|
|
@@ -13,7 +13,7 @@ import { User } from "src/simpleapp/services/user.service";
|
|
|
13
13
|
import { Permission } from "src/simpleapp/services/perm.service";
|
|
14
14
|
|
|
15
15
|
@Injectable()
|
|
16
|
-
export class
|
|
16
|
+
export class SimpleAppListenerService {
|
|
17
17
|
logger = new Logger()
|
|
18
18
|
@InjectModel('User') private readonly usermodel: Model<User>
|
|
19
19
|
@InjectModel('Permission') private readonly permmodel: Model<Permission>
|
|
@@ -6,19 +6,29 @@
|
|
|
6
6
|
<bpmn:outgoing>Flow_1a63g0z</bpmn:outgoing>
|
|
7
7
|
</bpmn:startEvent>
|
|
8
8
|
<bpmn:endEvent id="Event_0qpgd23">
|
|
9
|
-
<bpmn:incoming>
|
|
9
|
+
<bpmn:incoming>Flow_1oty8vq</bpmn:incoming>
|
|
10
10
|
</bpmn:endEvent>
|
|
11
|
-
<bpmn:sequenceFlow id="
|
|
12
|
-
<bpmn:sequenceFlow id="
|
|
13
|
-
<bpmn:
|
|
14
|
-
<bpmn:
|
|
11
|
+
<bpmn:sequenceFlow id="Flow_1a63g0z" sourceRef="StartEvent_1" targetRef="hello1" />
|
|
12
|
+
<bpmn:sequenceFlow id="Flow_1rspxq4" sourceRef="hello1" targetRef="approve1" />
|
|
13
|
+
<bpmn:serviceTask id="hello1" name="hello1">
|
|
14
|
+
<bpmn:documentation>hello1 doc
|
|
15
|
+
bbb</bpmn:documentation>
|
|
15
16
|
<bpmn:incoming>Flow_1a63g0z</bpmn:incoming>
|
|
16
|
-
<bpmn:outgoing>
|
|
17
|
+
<bpmn:outgoing>Flow_1rspxq4</bpmn:outgoing>
|
|
18
|
+
</bpmn:serviceTask>
|
|
19
|
+
<bpmn:sequenceFlow id="Flow_1khvymz" sourceRef="approve1" targetRef="hello2" />
|
|
20
|
+
<bpmn:userTask id="approve1" name="approve1" camunda:formKey="simpleapprove" camunda:assignee="kstan">
|
|
21
|
+
<bpmn:documentation>approve1 doc
|
|
22
|
+
abc</bpmn:documentation>
|
|
23
|
+
<bpmn:incoming>Flow_1rspxq4</bpmn:incoming>
|
|
24
|
+
<bpmn:outgoing>Flow_1khvymz</bpmn:outgoing>
|
|
17
25
|
</bpmn:userTask>
|
|
18
|
-
<bpmn:sequenceFlow id="
|
|
19
|
-
<bpmn:serviceTask id="
|
|
20
|
-
<bpmn:
|
|
21
|
-
|
|
26
|
+
<bpmn:sequenceFlow id="Flow_1oty8vq" sourceRef="hello2" targetRef="Event_0qpgd23" />
|
|
27
|
+
<bpmn:serviceTask id="hello2" name="hello2">
|
|
28
|
+
<bpmn:documentation>hello2 doc
|
|
29
|
+
ccc</bpmn:documentation>
|
|
30
|
+
<bpmn:incoming>Flow_1khvymz</bpmn:incoming>
|
|
31
|
+
<bpmn:outgoing>Flow_1oty8vq</bpmn:outgoing>
|
|
22
32
|
</bpmn:serviceTask>
|
|
23
33
|
</bpmn:process>
|
|
24
34
|
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
|
|
@@ -29,23 +39,32 @@
|
|
|
29
39
|
<bpmndi:BPMNShape id="Event_0qpgd23_di" bpmnElement="Event_0qpgd23">
|
|
30
40
|
<dc:Bounds x="672" y="202" width="36" height="36" />
|
|
31
41
|
</bpmndi:BPMNShape>
|
|
32
|
-
<bpmndi:BPMNShape id="
|
|
42
|
+
<bpmndi:BPMNShape id="Activity_1trhs2m_di" bpmnElement="hello1">
|
|
33
43
|
<dc:Bounds x="200" y="180" width="100" height="80" />
|
|
34
44
|
<bpmndi:BPMNLabel />
|
|
35
45
|
</bpmndi:BPMNShape>
|
|
36
|
-
<bpmndi:BPMNShape id="
|
|
37
|
-
<dc:Bounds x="
|
|
46
|
+
<bpmndi:BPMNShape id="Activity_0l36sc9_di" bpmnElement="approve1">
|
|
47
|
+
<dc:Bounds x="370" y="180" width="100" height="80" />
|
|
48
|
+
<bpmndi:BPMNLabel />
|
|
49
|
+
</bpmndi:BPMNShape>
|
|
50
|
+
<bpmndi:BPMNShape id="Activity_1mg3y6c_di" bpmnElement="hello2">
|
|
51
|
+
<dc:Bounds x="510" y="180" width="100" height="80" />
|
|
52
|
+
<bpmndi:BPMNLabel />
|
|
38
53
|
</bpmndi:BPMNShape>
|
|
39
|
-
<bpmndi:BPMNEdge id="Flow_1x9zeai_di" bpmnElement="Flow_1x9zeai">
|
|
40
|
-
<di:waypoint x="300" y="220" />
|
|
41
|
-
<di:waypoint x="520" y="220" />
|
|
42
|
-
</bpmndi:BPMNEdge>
|
|
43
54
|
<bpmndi:BPMNEdge id="Flow_1a63g0z_di" bpmnElement="Flow_1a63g0z">
|
|
44
55
|
<di:waypoint x="158" y="220" />
|
|
45
56
|
<di:waypoint x="200" y="220" />
|
|
46
57
|
</bpmndi:BPMNEdge>
|
|
47
|
-
<bpmndi:BPMNEdge id="
|
|
48
|
-
<di:waypoint x="
|
|
58
|
+
<bpmndi:BPMNEdge id="Flow_1rspxq4_di" bpmnElement="Flow_1rspxq4">
|
|
59
|
+
<di:waypoint x="300" y="220" />
|
|
60
|
+
<di:waypoint x="370" y="220" />
|
|
61
|
+
</bpmndi:BPMNEdge>
|
|
62
|
+
<bpmndi:BPMNEdge id="Flow_1khvymz_di" bpmnElement="Flow_1khvymz">
|
|
63
|
+
<di:waypoint x="470" y="220" />
|
|
64
|
+
<di:waypoint x="510" y="220" />
|
|
65
|
+
</bpmndi:BPMNEdge>
|
|
66
|
+
<bpmndi:BPMNEdge id="Flow_1oty8vq_di" bpmnElement="Flow_1oty8vq">
|
|
67
|
+
<di:waypoint x="610" y="220" />
|
|
49
68
|
<di:waypoint x="672" y="220" />
|
|
50
69
|
</bpmndi:BPMNEdge>
|
|
51
70
|
</bpmndi:BPMNPlane>
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file was automatically generated by simpleapp generator.
|
|
3
|
+
* --remove-this-line-to-prevent-override--
|
|
4
|
+
* last change 2023-09-23
|
|
5
|
+
* Author: Ks Tan
|
|
6
|
+
*/
|
|
7
|
+
import { Injectable,Logger } from "@nestjs/common";
|
|
8
|
+
import { EventEmitter2, OnEvent } from '@nestjs/event-emitter';
|
|
9
|
+
import { InjectModel } from "@nestjs/mongoose";
|
|
10
|
+
import { Model } from "mongoose";
|
|
11
|
+
import { UserContext } from "../../generate/commons/user.context";
|
|
12
|
+
import { User } from "../../services/user.service";
|
|
13
|
+
import { Permission } from "../../services/perm.service";
|
|
14
|
+
import {SimpleAppListenerService} from './simpleapp.listener'
|
|
15
|
+
import {
|
|
16
|
+
WorkflowSettingApiSchema,
|
|
17
|
+
WorkflowDataApiSchema,
|
|
18
|
+
WorkflowProcess,
|
|
19
|
+
WorkflowTask,
|
|
20
|
+
UserTaskActors,
|
|
21
|
+
UserTaskType,
|
|
22
|
+
ServiceTaskData,
|
|
23
|
+
UserTaskData,
|
|
24
|
+
UserTaskEventType,
|
|
25
|
+
ServiceTaskEventType
|
|
26
|
+
} from '../../generate/workflow/workflow.type';
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@Injectable()
|
|
30
|
+
export class <%=it.processName%>ListenerService extends SimpleAppListenerService{
|
|
31
|
+
logger = new Logger()
|
|
32
|
+
constructor(){
|
|
33
|
+
super()
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
<%for(let i=0; i<it.elements.length;i++){%>
|
|
37
|
+
<%let e=it.elements[i]%>
|
|
38
|
+
<%let datatype = e.type == "bpmn:UserTask" ? "UserTaskData" : "ServiceTaskData" %>
|
|
39
|
+
|
|
40
|
+
<%if(datatype=='UserTaskData'){%>
|
|
41
|
+
/**
|
|
42
|
+
* Execute while user task <%= e.name%> invoked (triggered by actor to next step)
|
|
43
|
+
* bpmn: <%=it.name%>, elementId: <%= e.id%>, taskName: <%= e.name%>, event: invoke
|
|
44
|
+
* documentation: <%~e.documentation%>
|
|
45
|
+
* @param props
|
|
46
|
+
*/
|
|
47
|
+
@OnEvent('<%=it.name%>.<%= e.id%>.invoke')
|
|
48
|
+
async <%=`watch_${e.id}_invoke`%>(props:<%=datatype%>){
|
|
49
|
+
console.log("Running listener <%=it.name%>.<%= e.id%>.invoke",props)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Execute while user task <%= e.name%> reach wait stage (pending actor input)
|
|
54
|
+
* bpmn: <%=it.name%>, elementId: <%= e.id%>, taskName: <%= e.name%>, event: wait
|
|
55
|
+
* documentation: <%= e.documentation %>
|
|
56
|
+
* @param props
|
|
57
|
+
*/
|
|
58
|
+
@OnEvent('<%=it.name%>.<%= e.id%>.wait')
|
|
59
|
+
async <%=`watch_${e.id}_wait`%>(props:<%=datatype%>){
|
|
60
|
+
console.log("Running listener <%=it.name%>.<%= e.id%>.wait",props)
|
|
61
|
+
}
|
|
62
|
+
<%}else if( datatype=='ServiceTaskData'){ %>
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Execute ServiceTask event <%= e.name%> (start)
|
|
66
|
+
* bpmn: <%=it.name%>, elementId: <%= e.id%>, taskName: <%= e.name%>, event: start
|
|
67
|
+
* documentation: <%=e.documentation%>
|
|
68
|
+
* @param props
|
|
69
|
+
*/
|
|
70
|
+
@OnEvent('<%=it.name%>.<%= e.id%>.start')
|
|
71
|
+
async <%=`watch_${e.id}_start`%>(props:<%=datatype%>){
|
|
72
|
+
console.log("Running listener <%=it.name%>.<%= e.id%>.start",props)
|
|
73
|
+
}
|
|
74
|
+
<%}%>
|
|
75
|
+
<%}%>
|
|
76
|
+
}
|