@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.
@@ -1,4 +1,8 @@
1
- import { Injectable,Logger } from '@nestjs/common';
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/src/elements/js-bpmn-moddle';
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
- <%for(let i=0; i<it.allbpmn.length;i++){%>
24
- <%let bpmn = it.allbpmn[i]%>
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
- let self = this;
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
- async serviceCalled(delegateServiceName:string, inputdata, item: Item) {
95
- const processName = item['instance']['name']
96
- const data = item['instance']['data']
97
- const vars = item['instance']['vars']
98
- const props = {
99
- processName: processName,
100
- delegateName: delegateServiceName,
101
- inputData: inputdata,
102
- vars: vars,
103
- data: data
104
- }
105
- if (this.servicesProvider[processName] && this.servicesProvider[processName][delegateServiceName]) {
106
- this.servicesProvider[processName][delegateServiceName](props,item);
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: 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
- data: UserTaskActors,
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
- data,
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("startWorkflow started: " ,workflowName)
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.userId,
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)%>DelegateService } from 'src/simpleapp/workflows/delegates/<%=bpmn%>.delegate';
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)%>DelegateService,
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 SimpleAppDelegateService {
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>Flow_1g3iygg</bpmn:incoming>
9
+ <bpmn:incoming>Flow_1oty8vq</bpmn:incoming>
10
10
  </bpmn:endEvent>
11
- <bpmn:sequenceFlow id="Flow_1x9zeai" sourceRef="approve1" targetRef="Activity_0pu51x5" />
12
- <bpmn:sequenceFlow id="Flow_1a63g0z" sourceRef="StartEvent_1" targetRef="approve1" />
13
- <bpmn:userTask id="approve1" name="approve by supervisor" camunda:formKey="form://simpleapprove" camunda:assignee="kstan">
14
- <bpmn:extensionElements />
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>Flow_1x9zeai</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="Flow_1g3iygg" sourceRef="Activity_0pu51x5" targetRef="Event_0qpgd23" />
19
- <bpmn:serviceTask id="Activity_0pu51x5" name="hello" camunda:delegateExpression="system.hello">
20
- <bpmn:incoming>Flow_1x9zeai</bpmn:incoming>
21
- <bpmn:outgoing>Flow_1g3iygg</bpmn:outgoing>
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="Activity_1odv9ki_di" bpmnElement="approve1">
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="Activity_1tksj2t_di" bpmnElement="Activity_0pu51x5">
37
- <dc:Bounds x="520" y="180" width="100" height="80" />
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="Flow_1g3iygg_di" bpmnElement="Flow_1g3iygg">
48
- <di:waypoint x="620" y="220" />
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
+ }