@nocobase/app-plugin-office-flows-example 0.0.0-stage → 0.1.0-beta.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/CHANGELOG.md +44 -0
- package/README.md +55 -2
- package/dist/client/components/flow-ui.d.ts +111 -0
- package/dist/client/components/flow-ui.d.ts.map +1 -0
- package/dist/client/components/flow-ui.js +175 -0
- package/dist/client/components/flow-ui.js.map +1 -0
- package/dist/client/components/page-container.d.ts +4 -0
- package/dist/client/components/page-container.d.ts.map +1 -0
- package/dist/client/components/page-container.js +6 -0
- package/dist/client/components/page-container.js.map +1 -0
- package/dist/client/components/page-header.d.ts +8 -0
- package/dist/client/components/page-header.d.ts.map +1 -0
- package/dist/client/components/page-header.js +5 -0
- package/dist/client/components/page-header.js.map +1 -0
- package/dist/client/components/ui/badge.d.ts +7 -0
- package/dist/client/components/ui/badge.d.ts.map +1 -0
- package/dist/client/components/ui/badge.js +19 -0
- package/dist/client/components/ui/badge.js.map +1 -0
- package/dist/client/components/ui/button.d.ts +8 -0
- package/dist/client/components/ui/button.d.ts.map +1 -0
- package/dist/client/components/ui/button.js +25 -0
- package/dist/client/components/ui/button.js.map +1 -0
- package/dist/client/components/ui/card.d.ts +11 -0
- package/dist/client/components/ui/card.d.ts.map +1 -0
- package/dist/client/components/ui/card.js +19 -0
- package/dist/client/components/ui/card.js.map +1 -0
- package/dist/client/components/ui/input.d.ts +4 -0
- package/dist/client/components/ui/input.d.ts.map +1 -0
- package/dist/client/components/ui/input.js +8 -0
- package/dist/client/components/ui/input.js.map +1 -0
- package/dist/client/components/ui/select.d.ts +16 -0
- package/dist/client/components/ui/select.d.ts.map +1 -0
- package/dist/client/components/ui/select.js +36 -0
- package/dist/client/components/ui/select.js.map +1 -0
- package/dist/client/index.d.ts +2 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +4 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/lib/api.d.ts +93 -0
- package/dist/client/lib/api.d.ts.map +1 -0
- package/dist/client/lib/api.js +67 -0
- package/dist/client/lib/api.js.map +1 -0
- package/dist/client/lib/format.d.ts +4 -0
- package/dist/client/lib/format.d.ts.map +1 -0
- package/dist/client/lib/format.js +8 -0
- package/dist/client/lib/format.js.map +1 -0
- package/dist/client/lib/labels.d.ts +5 -0
- package/dist/client/lib/labels.d.ts.map +1 -0
- package/dist/client/lib/labels.js +38 -0
- package/dist/client/lib/labels.js.map +1 -0
- package/dist/client/lib/use-loader.d.ts +10 -0
- package/dist/client/lib/use-loader.d.ts.map +1 -0
- package/dist/client/lib/use-loader.js +43 -0
- package/dist/client/lib/use-loader.js.map +1 -0
- package/dist/client/lib/utils.d.ts +2 -0
- package/dist/client/lib/utils.d.ts.map +1 -0
- package/dist/client/lib/utils.js +2 -0
- package/dist/client/lib/utils.js.map +1 -0
- package/dist/client/locales/en-US.d.ts +99 -0
- package/dist/client/locales/en-US.d.ts.map +1 -0
- package/dist/client/locales/en-US.js +92 -0
- package/dist/client/locales/en-US.js.map +1 -0
- package/dist/client/locales/index.d.ts +4 -0
- package/dist/client/locales/index.d.ts.map +1 -0
- package/dist/client/locales/index.js +7 -0
- package/dist/client/locales/index.js.map +1 -0
- package/dist/client/locales/zh-CN.d.ts +4 -0
- package/dist/client/locales/zh-CN.d.ts.map +1 -0
- package/dist/client/locales/zh-CN.js +92 -0
- package/dist/client/locales/zh-CN.js.map +1 -0
- package/dist/client/pages/configuration.d.ts +4 -0
- package/dist/client/pages/configuration.d.ts.map +1 -0
- package/dist/client/pages/configuration.js +34 -0
- package/dist/client/pages/configuration.js.map +1 -0
- package/dist/client/pages/data-requests.d.ts +3 -0
- package/dist/client/pages/data-requests.d.ts.map +1 -0
- package/dist/client/pages/data-requests.js +216 -0
- package/dist/client/pages/data-requests.js.map +1 -0
- package/dist/client/pages/incoming.d.ts +3 -0
- package/dist/client/pages/incoming.d.ts.map +1 -0
- package/dist/client/pages/incoming.js +128 -0
- package/dist/client/pages/incoming.js.map +1 -0
- package/dist/client/pages/tasks.d.ts +3 -0
- package/dist/client/pages/tasks.d.ts.map +1 -0
- package/dist/client/pages/tasks.js +116 -0
- package/dist/client/pages/tasks.js.map +1 -0
- package/dist/client/plugin.d.ts +4 -0
- package/dist/client/plugin.d.ts.map +1 -0
- package/dist/client/plugin.js +10 -0
- package/dist/client/plugin.js.map +1 -0
- package/dist/client/routes.d.ts +4 -0
- package/dist/client/routes.d.ts.map +1 -0
- package/dist/client/routes.js +51 -0
- package/dist/client/routes.js.map +1 -0
- package/dist/database/migrations/.manifest.json +9 -0
- package/dist/database/migrations/202610010001_office_flows_example_create_collections.d.ts +4 -0
- package/dist/database/migrations/202610010001_office_flows_example_create_collections.d.ts.map +1 -0
- package/dist/database/migrations/202610010001_office_flows_example_create_collections.js +280 -0
- package/dist/database/migrations/202610010001_office_flows_example_create_collections.js.map +1 -0
- package/dist/database/seeds/.manifest.json +9 -0
- package/dist/database/seeds/202610010002_office_flows_example_seed_configuration.d.ts +10 -0
- package/dist/database/seeds/202610010002_office_flows_example_seed_configuration.d.ts.map +1 -0
- package/dist/database/seeds/202610010002_office_flows_example_seed_configuration.js +104 -0
- package/dist/database/seeds/202610010002_office_flows_example_seed_configuration.js.map +1 -0
- package/dist/server/calendar.d.ts +35 -0
- package/dist/server/calendar.d.ts.map +1 -0
- package/dist/server/calendar.js +103 -0
- package/dist/server/calendar.js.map +1 -0
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +2 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/lifecycles/data-request.d.ts +36 -0
- package/dist/server/lifecycles/data-request.d.ts.map +1 -0
- package/dist/server/lifecycles/data-request.js +182 -0
- package/dist/server/lifecycles/data-request.js.map +1 -0
- package/dist/server/lifecycles/extraction.d.ts +21 -0
- package/dist/server/lifecycles/extraction.d.ts.map +1 -0
- package/dist/server/lifecycles/extraction.js +60 -0
- package/dist/server/lifecycles/extraction.js.map +1 -0
- package/dist/server/lifecycles/incoming.d.ts +27 -0
- package/dist/server/lifecycles/incoming.d.ts.map +1 -0
- package/dist/server/lifecycles/incoming.js +177 -0
- package/dist/server/lifecycles/incoming.js.map +1 -0
- package/dist/server/lifecycles/index.d.ts +8 -0
- package/dist/server/lifecycles/index.d.ts.map +1 -0
- package/dist/server/lifecycles/index.js +20 -0
- package/dist/server/lifecycles/index.js.map +1 -0
- package/dist/server/lifecycles/tasks.d.ts +63 -0
- package/dist/server/lifecycles/tasks.d.ts.map +1 -0
- package/dist/server/lifecycles/tasks.js +259 -0
- package/dist/server/lifecycles/tasks.js.map +1 -0
- package/dist/server/plugin.d.ts +4 -0
- package/dist/server/plugin.d.ts.map +1 -0
- package/dist/server/plugin.js +16 -0
- package/dist/server/plugin.js.map +1 -0
- package/dist/server/providers/index.d.ts +4 -0
- package/dist/server/providers/index.d.ts.map +1 -0
- package/dist/server/providers/index.js +6 -0
- package/dist/server/providers/index.js.map +1 -0
- package/dist/server/providers/office-flows.d.ts +23 -0
- package/dist/server/providers/office-flows.d.ts.map +1 -0
- package/dist/server/providers/office-flows.js +90 -0
- package/dist/server/providers/office-flows.js.map +1 -0
- package/dist/server/routes/index.d.ts +8 -0
- package/dist/server/routes/index.d.ts.map +1 -0
- package/dist/server/routes/index.js +553 -0
- package/dist/server/routes/index.js.map +1 -0
- package/dist/server/routes/schemas.d.ts +157 -0
- package/dist/server/routes/schemas.d.ts.map +1 -0
- package/dist/server/routes/schemas.js +188 -0
- package/dist/server/routes/schemas.js.map +1 -0
- package/dist/server/scope.d.ts +23 -0
- package/dist/server/scope.d.ts.map +1 -0
- package/dist/server/scope.js +23 -0
- package/dist/server/scope.js.map +1 -0
- package/dist/server/services/office-flows.d.ts +151 -0
- package/dist/server/services/office-flows.d.ts.map +1 -0
- package/dist/server/services/office-flows.js +603 -0
- package/dist/server/services/office-flows.js.map +1 -0
- package/dist/server/services/store.d.ts +119 -0
- package/dist/server/services/store.d.ts.map +1 -0
- package/dist/server/services/store.js +389 -0
- package/dist/server/services/store.js.map +1 -0
- package/dist/server/tokens.d.ts +4 -0
- package/dist/server/tokens.d.ts.map +1 -0
- package/dist/server/tokens.js +3 -0
- package/dist/server/tokens.js.map +1 -0
- package/dist/shared/data-request.d.ts +73 -0
- package/dist/shared/data-request.d.ts.map +1 -0
- package/dist/shared/data-request.js +182 -0
- package/dist/shared/data-request.js.map +1 -0
- package/dist/shared/fields.d.ts +12 -0
- package/dist/shared/fields.d.ts.map +1 -0
- package/dist/shared/fields.js +48 -0
- package/dist/shared/fields.js.map +1 -0
- package/dist/shared/people.d.ts +29 -0
- package/dist/shared/people.d.ts.map +1 -0
- package/dist/shared/people.js +54 -0
- package/dist/shared/people.js.map +1 -0
- package/dist/shared/routes.d.ts +7 -0
- package/dist/shared/routes.d.ts.map +1 -0
- package/dist/shared/routes.js +7 -0
- package/dist/shared/routes.js.map +1 -0
- package/dist/shared/text.d.ts +3 -0
- package/dist/shared/text.d.ts.map +1 -0
- package/dist/shared/text.js +9 -0
- package/dist/shared/text.js.map +1 -0
- package/package.json +72 -3
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { defineEffect, defineLifecycle, LifecycleError, } from '@nocobase/lifecycle';
|
|
2
|
+
import { COLLECTIONS } from '../scope.js';
|
|
3
|
+
import { idOf, people } from '../services/store.js';
|
|
4
|
+
import { text } from '../../shared/text.js';
|
|
5
|
+
export const INCOMING_REQUIRED = [
|
|
6
|
+
['title', 'title'],
|
|
7
|
+
['code', 'document code'],
|
|
8
|
+
['sender', 'sender'],
|
|
9
|
+
['senderRef', "sender's reference"],
|
|
10
|
+
['summary', 'summary'],
|
|
11
|
+
['officeOpinion', 'office opinion'],
|
|
12
|
+
['distributionType', 'distribution type'],
|
|
13
|
+
['officeHeadId', 'office head'],
|
|
14
|
+
['officeLeaderId', 'office leader'],
|
|
15
|
+
];
|
|
16
|
+
function isRegistrar({ record, actor }) {
|
|
17
|
+
return actor.id === record.registrarId;
|
|
18
|
+
}
|
|
19
|
+
function rowIds(input) {
|
|
20
|
+
return Array.isArray(input.rowIds) ? input.rowIds.map(idOf) : [];
|
|
21
|
+
}
|
|
22
|
+
function rowsRequired(input) {
|
|
23
|
+
return rowIds(input).length ? null : 'There are no rows to dispatch.';
|
|
24
|
+
}
|
|
25
|
+
/** Each pending department row becomes a task; its people are reminded once. */
|
|
26
|
+
export const dispatchClerks = defineEffect({
|
|
27
|
+
name: 'incoming.dispatchClerks',
|
|
28
|
+
retry: { attempts: 3, backoffMs: 1_000 },
|
|
29
|
+
async run({ record, input, services, transition, idempotencyKey }) {
|
|
30
|
+
const result = await services.store.dispatch(1, rowIds(input));
|
|
31
|
+
if (result.created.length)
|
|
32
|
+
await services.store.trace({
|
|
33
|
+
key: idempotencyKey,
|
|
34
|
+
docKind: 'incoming',
|
|
35
|
+
docId: idOf(record.id),
|
|
36
|
+
actorId: record.registrarId,
|
|
37
|
+
action: transition === 'dispatchClerks' ? '派发办事人员' : transition,
|
|
38
|
+
detail: {
|
|
39
|
+
departments: result.created.map((item) => item.departmentName),
|
|
40
|
+
numbers: result.created.map((item) => item.number),
|
|
41
|
+
notified: result.notified,
|
|
42
|
+
skipped: result.skipped,
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
return { created: result.created.length, notified: result.notified };
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
/** Pending management rows are forwarded; their members are reminded once. */
|
|
49
|
+
export const forwardManagement = defineEffect({
|
|
50
|
+
name: 'incoming.forwardManagement',
|
|
51
|
+
retry: { attempts: 3, backoffMs: 1_000 },
|
|
52
|
+
async run({ record, input, services, idempotencyKey }) {
|
|
53
|
+
const recipients = [];
|
|
54
|
+
const groups = [];
|
|
55
|
+
for (const id of rowIds(input)) {
|
|
56
|
+
await services.store.repository(COLLECTIONS.managementCc).updateMany({
|
|
57
|
+
filter: { id, forwarded: false },
|
|
58
|
+
values: { forwarded: true },
|
|
59
|
+
});
|
|
60
|
+
// A row an earlier attempt forwarded counts too: if that attempt
|
|
61
|
+
// stopped before reminding, this one reminds; the reminders and the
|
|
62
|
+
// trace each happen once however many attempts run.
|
|
63
|
+
const row = await services.store.find(COLLECTIONS.managementCc, id);
|
|
64
|
+
if (row?.forwarded !== true)
|
|
65
|
+
continue;
|
|
66
|
+
groups.push(text(row.groupName));
|
|
67
|
+
recipients.push(...people(row.members));
|
|
68
|
+
}
|
|
69
|
+
const notified = await services.store.notify({
|
|
70
|
+
rootKind: 'incoming',
|
|
71
|
+
rootId: idOf(record.id),
|
|
72
|
+
level: '1',
|
|
73
|
+
recipients,
|
|
74
|
+
message: `收文《${record.title}》已转发公司管理层(${groups.join('、')})`,
|
|
75
|
+
sourceKind: 'incoming',
|
|
76
|
+
sourceId: idOf(record.id),
|
|
77
|
+
});
|
|
78
|
+
if (groups.length)
|
|
79
|
+
await services.store.trace({
|
|
80
|
+
key: idempotencyKey,
|
|
81
|
+
docKind: 'incoming',
|
|
82
|
+
docId: idOf(record.id),
|
|
83
|
+
actorId: record.registrarId,
|
|
84
|
+
action: '转发管理人员',
|
|
85
|
+
detail: {
|
|
86
|
+
groups,
|
|
87
|
+
notified,
|
|
88
|
+
skipped: [...new Set(recipients)].filter((person) => !notified.includes(person)),
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
return { notified };
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
/**
|
|
95
|
+
* An incoming document: the office records it, its head and its leader
|
|
96
|
+
* approve it, and its registrar distributes it to departments. Re-approval
|
|
97
|
+
* sends it back to the head; reminders already sent are not sent again.
|
|
98
|
+
*/
|
|
99
|
+
export const incomingLifecycle = defineLifecycle({
|
|
100
|
+
name: 'incoming',
|
|
101
|
+
collection: COLLECTIONS.incoming,
|
|
102
|
+
initial: 'draft',
|
|
103
|
+
states: [
|
|
104
|
+
'draft',
|
|
105
|
+
'headReview',
|
|
106
|
+
'leaderReview',
|
|
107
|
+
'dispatching',
|
|
108
|
+
{ name: 'closed', final: true },
|
|
109
|
+
],
|
|
110
|
+
transitions: {
|
|
111
|
+
submit: {
|
|
112
|
+
title: '提交',
|
|
113
|
+
from: 'draft',
|
|
114
|
+
to: 'headReview',
|
|
115
|
+
guard: isRegistrar,
|
|
116
|
+
set: ({ record }) => {
|
|
117
|
+
const missing = INCOMING_REQUIRED.filter(([field]) => !record[field]).map(([, label]) => label);
|
|
118
|
+
// Unfilled fields are the document's state: 400 FAILED_PRECONDITION.
|
|
119
|
+
if (missing.length)
|
|
120
|
+
throw new LifecycleError('INVALID_STATE', `Fill in before submitting: ${missing.join(', ')}.`);
|
|
121
|
+
return { returnReason: null };
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
approve: {
|
|
125
|
+
title: '同意',
|
|
126
|
+
from: ['headReview', 'leaderReview'],
|
|
127
|
+
to: ['leaderReview', 'dispatching'],
|
|
128
|
+
route: ({ record }) => record.status === 'headReview' ? 'leaderReview' : 'dispatching',
|
|
129
|
+
guard: ({ record, actor }) => actor.id ===
|
|
130
|
+
(record.status === 'headReview'
|
|
131
|
+
? record.officeHeadId
|
|
132
|
+
: record.officeLeaderId),
|
|
133
|
+
},
|
|
134
|
+
returnToRegistrar: {
|
|
135
|
+
title: '退回',
|
|
136
|
+
from: ['headReview', 'leaderReview'],
|
|
137
|
+
to: 'draft',
|
|
138
|
+
guard: ({ record, actor }) => actor.id ===
|
|
139
|
+
(record.status === 'headReview'
|
|
140
|
+
? record.officeHeadId
|
|
141
|
+
: record.officeLeaderId),
|
|
142
|
+
validate: (input) => typeof input.reason === 'string' && input.reason.trim()
|
|
143
|
+
? null
|
|
144
|
+
: 'Give a reason for returning the document.',
|
|
145
|
+
set: ({ input }) => ({ returnReason: text(input.reason) }),
|
|
146
|
+
},
|
|
147
|
+
dispatchClerks: {
|
|
148
|
+
title: '派发办事人员',
|
|
149
|
+
from: 'dispatching',
|
|
150
|
+
to: 'dispatching',
|
|
151
|
+
guard: isRegistrar,
|
|
152
|
+
validate: rowsRequired,
|
|
153
|
+
effects: [dispatchClerks],
|
|
154
|
+
},
|
|
155
|
+
forwardManagement: {
|
|
156
|
+
title: '转发管理人员',
|
|
157
|
+
from: 'dispatching',
|
|
158
|
+
to: 'dispatching',
|
|
159
|
+
guard: isRegistrar,
|
|
160
|
+
validate: rowsRequired,
|
|
161
|
+
effects: [forwardManagement],
|
|
162
|
+
},
|
|
163
|
+
reapprove: {
|
|
164
|
+
title: '[N] 重新审批分派',
|
|
165
|
+
from: 'dispatching',
|
|
166
|
+
to: 'headReview',
|
|
167
|
+
guard: isRegistrar,
|
|
168
|
+
},
|
|
169
|
+
close: {
|
|
170
|
+
title: '办结',
|
|
171
|
+
from: 'dispatching',
|
|
172
|
+
to: 'closed',
|
|
173
|
+
guard: isRegistrar,
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
});
|
|
177
|
+
//# sourceMappingURL=incoming.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incoming.js","sourceRoot":"","sources":["../../../server/lifecycles/incoming.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { LifecycleRuntime } from '@nocobase/lifecycle';
|
|
2
|
+
import type { OfficeStore } from '../services/store.js';
|
|
3
|
+
/**
|
|
4
|
+
* Registers the six lifecycles. Their services are bound to the transition's
|
|
5
|
+
* transaction while a guard runs, and to the database otherwise.
|
|
6
|
+
*/
|
|
7
|
+
export declare function registerLifecycles(runtime: LifecycleRuntime, store: OfficeStore): void;
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../server/lifecycles/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAUxD;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,WAAW,GACjB,IAAI,CAUN"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { dataRequestLifecycle } from './data-request.js';
|
|
2
|
+
import { extractionLifecycle } from './extraction.js';
|
|
3
|
+
import { incomingLifecycle } from './incoming.js';
|
|
4
|
+
import { clerkTaskLifecycle, executorTaskLifecycle, teamTaskLifecycle, } from './tasks.js';
|
|
5
|
+
/**
|
|
6
|
+
* Registers the six lifecycles. Their services are bound to the transition's
|
|
7
|
+
* transaction while a guard runs, and to the database otherwise.
|
|
8
|
+
*/
|
|
9
|
+
export function registerLifecycles(runtime, store) {
|
|
10
|
+
const services = (handle) => ({
|
|
11
|
+
store: store.bound(handle),
|
|
12
|
+
});
|
|
13
|
+
runtime.register(dataRequestLifecycle, { services });
|
|
14
|
+
runtime.register(extractionLifecycle, { services });
|
|
15
|
+
runtime.register(incomingLifecycle, { services });
|
|
16
|
+
runtime.register(clerkTaskLifecycle, { services });
|
|
17
|
+
runtime.register(teamTaskLifecycle, { services });
|
|
18
|
+
runtime.register(executorTaskLifecycle, { services });
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/lifecycles/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAEpB;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAyB,EACzB,KAAkB;IAElB,MAAM,QAAQ,GAAG,CAAC,MAAe,EAA0B,EAAE,CAAC,CAAC;QAC7D,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;KAC3B,CAAC,CAAC;IACH,OAAO,CAAC,QAAQ,CAAC,oBAAoB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { type EffectDefinition, type Lifecycle, type LifecycleRecord } from '@nocobase/lifecycle';
|
|
2
|
+
import type { OfficeServices } from './data-request.js';
|
|
3
|
+
/** The fields every incoming-document task carries. */
|
|
4
|
+
export interface Task extends LifecycleRecord {
|
|
5
|
+
readonly number: string;
|
|
6
|
+
readonly rootId: number | string;
|
|
7
|
+
readonly parentId: number | string;
|
|
8
|
+
readonly departmentName: string;
|
|
9
|
+
readonly assignees: unknown;
|
|
10
|
+
readonly signedBy: unknown;
|
|
11
|
+
}
|
|
12
|
+
export type ClerkState = 'signing' | 'reviewing' | 'accepted' | 'objected' | 'done';
|
|
13
|
+
export type TeamState = 'processing' | 'done';
|
|
14
|
+
export type ExecutorState = 'processing' | 'done';
|
|
15
|
+
export interface ClerkTypes {
|
|
16
|
+
record: Task & {
|
|
17
|
+
readonly status: ClerkState;
|
|
18
|
+
};
|
|
19
|
+
state: ClerkState;
|
|
20
|
+
services: OfficeServices;
|
|
21
|
+
}
|
|
22
|
+
export interface TeamTypes {
|
|
23
|
+
record: Task & {
|
|
24
|
+
readonly status: TeamState;
|
|
25
|
+
};
|
|
26
|
+
state: TeamState;
|
|
27
|
+
services: OfficeServices;
|
|
28
|
+
}
|
|
29
|
+
export interface ExecutorTypes {
|
|
30
|
+
record: Task & {
|
|
31
|
+
readonly status: ExecutorState;
|
|
32
|
+
};
|
|
33
|
+
state: ExecutorState;
|
|
34
|
+
services: OfficeServices;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* A clerk task sends execution-team rows down a level. The root document
|
|
38
|
+
* keeps a trace of it — which departments the coordinating department
|
|
39
|
+
* handed the work to, and who was reminded — as the distribution record
|
|
40
|
+
* requires; the team tasks' own feedback stays out of the root.
|
|
41
|
+
*/
|
|
42
|
+
export declare const dispatchTeams: EffectDefinition<ClerkTypes>;
|
|
43
|
+
/**
|
|
44
|
+
* "派发其他部门协助": the new row becomes a clerk task at the same level as
|
|
45
|
+
* this one, under the root document, and the root records who asked.
|
|
46
|
+
*/
|
|
47
|
+
export declare const dispatchAssist: EffectDefinition<ClerkTypes>;
|
|
48
|
+
/** "[B] 有异议与办公室联系": the office is told who objects. */
|
|
49
|
+
export declare const notifyObjection: EffectDefinition<ClerkTypes>;
|
|
50
|
+
/** Execution-team tasks send executor rows down the last level. */
|
|
51
|
+
export declare const dispatchExecutors: EffectDefinition<TeamTypes>;
|
|
52
|
+
export declare const SIGN_DECISIONS: Readonly<Record<string, string>>;
|
|
53
|
+
/**
|
|
54
|
+
* 办事人员子流程: 开始 → 办事人员会签 → 办事人员审批 → 结束. In the
|
|
55
|
+
* countersign every clerk of the department answers; [Y] and [B] end the
|
|
56
|
+
* task at once, and [C] moves it on once every clerk has answered [C].
|
|
57
|
+
*/
|
|
58
|
+
export declare const clerkTaskLifecycle: Lifecycle<ClerkTypes>;
|
|
59
|
+
/** 执行团队处理流程: 开始 → 执行团队处理 → 结束. */
|
|
60
|
+
export declare const teamTaskLifecycle: Lifecycle<TeamTypes>;
|
|
61
|
+
/** 执行人处理流程: 开始 → 执行人处理 → 结束. */
|
|
62
|
+
export declare const executorTaskLifecycle: Lifecycle<ExecutorTypes>;
|
|
63
|
+
//# sourceMappingURL=tasks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../../server/lifecycles/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,eAAe,EAErB,MAAM,qBAAqB,CAAC;AAK7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGxD,uDAAuD;AACvD,MAAM,WAAW,IAAK,SAAQ,eAAe;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;IACnC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,MAAM,UAAU,GACpB,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;AAC7D,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,MAAM,CAAC;AAC9C,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,MAAM,CAAC;AAElD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,IAAI,GAAG;QAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;KAAE,CAAC;IAC/C,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,cAAc,CAAC;CAC1B;AACD,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,IAAI,GAAG;QAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;KAAE,CAAC;IAC9C,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,cAAc,CAAC;CAC1B;AACD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,IAAI,GAAG;QAAE,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;KAAE,CAAC;IAClD,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,cAAc,CAAC;CAC1B;AA4CD;;;;;GAKG;AACH,eAAO,MAAM,aAAa,EAAE,gBAAgB,CAAC,UAAU,CAiCnD,CAAC;AAEL;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,gBAAgB,CAAC,UAAU,CAuBpD,CAAC;AAEL,uDAAuD;AACvD,eAAO,MAAM,eAAe,EAAE,gBAAgB,CAAC,UAAU,CAmBrD,CAAC;AAEL,mEAAmE;AACnE,eAAO,MAAM,iBAAiB,EAAE,gBAAgB,CAAC,SAAS,CAsBtD,CAAC;AAEL,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAI3D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,CAAC,UAAU,CAuEjD,CAAC;AAEL,kCAAkC;AAClC,eAAO,MAAM,iBAAiB,EAAE,SAAS,CAAC,SAAS,CAwB/C,CAAC;AAEL,gCAAgC;AAChC,eAAO,MAAM,qBAAqB,EAAE,SAAS,CAAC,aAAa,CAgBvD,CAAC"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { defineEffect, defineLifecycle, LifecycleError, } from '@nocobase/lifecycle';
|
|
2
|
+
import { INCOMING_ROLES } from '../../shared/people.js';
|
|
3
|
+
import { COLLECTIONS } from '../scope.js';
|
|
4
|
+
import { idOf, people } from '../services/store.js';
|
|
5
|
+
import { text } from '../../shared/text.js';
|
|
6
|
+
function isAssignee({ record, actor }) {
|
|
7
|
+
return people(record.assignees).includes(actor.id);
|
|
8
|
+
}
|
|
9
|
+
function rowIds(input) {
|
|
10
|
+
return Array.isArray(input.rowIds) ? input.rowIds.map(idOf) : [];
|
|
11
|
+
}
|
|
12
|
+
function rowsRequired(input) {
|
|
13
|
+
return rowIds(input).length ? null : 'There are no rows to dispatch.';
|
|
14
|
+
}
|
|
15
|
+
/** What a task needs before its feedback can be submitted. */
|
|
16
|
+
function feedbackSet(record, options) {
|
|
17
|
+
const missing = [];
|
|
18
|
+
if (options.opinion && !record.opinion)
|
|
19
|
+
missing.push('opinion');
|
|
20
|
+
if (record.redHeadFeedback === null || record.redHeadFeedback === undefined)
|
|
21
|
+
missing.push('whether an official document is fed back');
|
|
22
|
+
if (options.outgoingRef &&
|
|
23
|
+
record.redHeadFeedback === true &&
|
|
24
|
+
!record.outgoingRef)
|
|
25
|
+
missing.push('outgoing document number');
|
|
26
|
+
if (!record.feedback)
|
|
27
|
+
missing.push('feedback');
|
|
28
|
+
// Unfilled fields are the task's state: 400 FAILED_PRECONDITION.
|
|
29
|
+
if (missing.length)
|
|
30
|
+
throw new LifecycleError('INVALID_STATE', `Fill in before submitting: ${missing.join(', ')}.`);
|
|
31
|
+
return {};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* A clerk task sends execution-team rows down a level. The root document
|
|
35
|
+
* keeps a trace of it — which departments the coordinating department
|
|
36
|
+
* handed the work to, and who was reminded — as the distribution record
|
|
37
|
+
* requires; the team tasks' own feedback stays out of the root.
|
|
38
|
+
*/
|
|
39
|
+
export const dispatchTeams = defineEffect({
|
|
40
|
+
name: 'clerkTasks.dispatchTeams',
|
|
41
|
+
retry: { attempts: 3, backoffMs: 1_000 },
|
|
42
|
+
async run({ record, input, services, idempotencyKey }) {
|
|
43
|
+
const result = await services.store.dispatch(2, rowIds(input));
|
|
44
|
+
if (result.created.length) {
|
|
45
|
+
const detail = {
|
|
46
|
+
from: record.departmentName,
|
|
47
|
+
departments: result.created.map((item) => item.departmentName),
|
|
48
|
+
numbers: result.created.map((item) => item.number),
|
|
49
|
+
notified: result.notified,
|
|
50
|
+
skipped: result.skipped,
|
|
51
|
+
};
|
|
52
|
+
await services.store.trace({
|
|
53
|
+
key: `${idempotencyKey}:root`,
|
|
54
|
+
docKind: 'incoming',
|
|
55
|
+
docId: idOf(record.rootId),
|
|
56
|
+
actorId: people(record.assignees)[0] ?? '',
|
|
57
|
+
action: `${record.departmentName}派发执行团队`,
|
|
58
|
+
detail,
|
|
59
|
+
});
|
|
60
|
+
await services.store.trace({
|
|
61
|
+
key: `${idempotencyKey}:clerk`,
|
|
62
|
+
docKind: 'clerk',
|
|
63
|
+
docId: idOf(record.id),
|
|
64
|
+
actorId: people(record.assignees)[0] ?? '',
|
|
65
|
+
action: '派发执行团队',
|
|
66
|
+
detail,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return { created: result.created.length, notified: result.notified };
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
/**
|
|
73
|
+
* "派发其他部门协助": the new row becomes a clerk task at the same level as
|
|
74
|
+
* this one, under the root document, and the root records who asked.
|
|
75
|
+
*/
|
|
76
|
+
export const dispatchAssist = defineEffect({
|
|
77
|
+
name: 'clerkTasks.dispatchAssist',
|
|
78
|
+
retry: { attempts: 3, backoffMs: 1_000 },
|
|
79
|
+
async run({ record, input, services, idempotencyKey }) {
|
|
80
|
+
const result = await services.store.dispatch(1, rowIds(input));
|
|
81
|
+
if (result.created.length)
|
|
82
|
+
await services.store.trace({
|
|
83
|
+
key: idempotencyKey,
|
|
84
|
+
docKind: 'incoming',
|
|
85
|
+
docId: idOf(record.rootId),
|
|
86
|
+
actorId: people(record.assignees)[0] ?? '',
|
|
87
|
+
action: `${record.departmentName}派发其他部门协助`,
|
|
88
|
+
detail: {
|
|
89
|
+
from: record.departmentName,
|
|
90
|
+
departments: result.created.map((item) => item.departmentName),
|
|
91
|
+
numbers: result.created.map((item) => item.number),
|
|
92
|
+
notified: result.notified,
|
|
93
|
+
skipped: result.skipped,
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
return { created: result.created.length, notified: result.notified };
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
/** "[B] 有异议与办公室联系": the office is told who objects. */
|
|
100
|
+
export const notifyObjection = defineEffect({
|
|
101
|
+
name: 'clerkTasks.notifyObjection',
|
|
102
|
+
async run({ record, services }) {
|
|
103
|
+
const root = await services.store.find(COLLECTIONS.incoming, record.rootId);
|
|
104
|
+
const notified = await services.store.notify({
|
|
105
|
+
rootKind: 'incoming',
|
|
106
|
+
rootId: idOf(record.rootId),
|
|
107
|
+
level: `objection-${text(record.id)}`,
|
|
108
|
+
recipients: [text(root?.registrarId ?? INCOMING_ROLES.registrar)],
|
|
109
|
+
message: `${record.departmentName}对收文《${text(root?.title ?? '')}》有异议,请联系`,
|
|
110
|
+
sourceKind: 'clerk',
|
|
111
|
+
sourceId: idOf(record.id),
|
|
112
|
+
});
|
|
113
|
+
return { notified };
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
/** Execution-team tasks send executor rows down the last level. */
|
|
117
|
+
export const dispatchExecutors = defineEffect({
|
|
118
|
+
name: 'teamTasks.dispatchExecutors',
|
|
119
|
+
retry: { attempts: 3, backoffMs: 1_000 },
|
|
120
|
+
async run({ record, input, services, idempotencyKey }) {
|
|
121
|
+
const result = await services.store.dispatch(3, rowIds(input));
|
|
122
|
+
if (result.created.length)
|
|
123
|
+
await services.store.trace({
|
|
124
|
+
key: idempotencyKey,
|
|
125
|
+
docKind: 'team',
|
|
126
|
+
docId: idOf(record.id),
|
|
127
|
+
actorId: people(record.assignees)[0] ?? '',
|
|
128
|
+
action: '派发执行人',
|
|
129
|
+
detail: {
|
|
130
|
+
departments: result.created.map((item) => item.departmentName),
|
|
131
|
+
numbers: result.created.map((item) => item.number),
|
|
132
|
+
notified: result.notified,
|
|
133
|
+
skipped: result.skipped,
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
return { created: result.created.length, notified: result.notified };
|
|
137
|
+
},
|
|
138
|
+
});
|
|
139
|
+
export const SIGN_DECISIONS = {
|
|
140
|
+
Y: '[Y] 已接收',
|
|
141
|
+
B: '[B] 有异议与办公室联系',
|
|
142
|
+
C: '[C] 已接收,待反馈',
|
|
143
|
+
};
|
|
144
|
+
/**
|
|
145
|
+
* 办事人员子流程: 开始 → 办事人员会签 → 办事人员审批 → 结束. In the
|
|
146
|
+
* countersign every clerk of the department answers; [Y] and [B] end the
|
|
147
|
+
* task at once, and [C] moves it on once every clerk has answered [C].
|
|
148
|
+
*/
|
|
149
|
+
export const clerkTaskLifecycle = defineLifecycle({
|
|
150
|
+
name: 'clerkTasks',
|
|
151
|
+
collection: COLLECTIONS.clerkTasks,
|
|
152
|
+
initial: 'signing',
|
|
153
|
+
states: [
|
|
154
|
+
'signing',
|
|
155
|
+
'reviewing',
|
|
156
|
+
{ name: 'accepted', final: true },
|
|
157
|
+
{ name: 'objected', final: true },
|
|
158
|
+
{ name: 'done', final: true },
|
|
159
|
+
],
|
|
160
|
+
transitions: {
|
|
161
|
+
sign: {
|
|
162
|
+
title: '会签',
|
|
163
|
+
from: 'signing',
|
|
164
|
+
to: ['signing', 'reviewing', 'accepted', 'objected'],
|
|
165
|
+
// An assignee may countersign, once. Having signed already refuses
|
|
166
|
+
// this person only — the other clerks can still sign — so it is a
|
|
167
|
+
// permission (403), not a precondition nobody could get past.
|
|
168
|
+
guard: (context) => !isAssignee(context)
|
|
169
|
+
? false
|
|
170
|
+
: !people(context.record.signedBy).includes(context.actor.id) || {
|
|
171
|
+
code: 'alreadySigned',
|
|
172
|
+
message: 'You have already countersigned this task.',
|
|
173
|
+
kind: 'permission',
|
|
174
|
+
},
|
|
175
|
+
validate: (input) => typeof input.decision === 'string' && input.decision in SIGN_DECISIONS
|
|
176
|
+
? null
|
|
177
|
+
: 'Choose a countersign decision.',
|
|
178
|
+
route: ({ record, actor, input }) => {
|
|
179
|
+
if (input.decision === 'Y')
|
|
180
|
+
return 'accepted';
|
|
181
|
+
if (input.decision === 'B')
|
|
182
|
+
return 'objected';
|
|
183
|
+
const signed = new Set([...people(record.signedBy), actor.id]);
|
|
184
|
+
return people(record.assignees).every((person) => signed.has(person))
|
|
185
|
+
? 'reviewing'
|
|
186
|
+
: 'signing';
|
|
187
|
+
},
|
|
188
|
+
set: ({ record, actor, input }) => ({
|
|
189
|
+
signedBy: [...people(record.signedBy), actor.id],
|
|
190
|
+
decision: text(input.decision),
|
|
191
|
+
}),
|
|
192
|
+
},
|
|
193
|
+
dispatchTeams: {
|
|
194
|
+
title: '派发执行团队信息',
|
|
195
|
+
from: 'reviewing',
|
|
196
|
+
to: 'reviewing',
|
|
197
|
+
guard: isAssignee,
|
|
198
|
+
validate: rowsRequired,
|
|
199
|
+
effects: [dispatchTeams],
|
|
200
|
+
},
|
|
201
|
+
requestAssist: {
|
|
202
|
+
title: '派发其他部门协助',
|
|
203
|
+
from: 'reviewing',
|
|
204
|
+
to: 'reviewing',
|
|
205
|
+
guard: isAssignee,
|
|
206
|
+
validate: rowsRequired,
|
|
207
|
+
effects: [dispatchAssist],
|
|
208
|
+
},
|
|
209
|
+
submitFeedback: {
|
|
210
|
+
title: '提交反馈',
|
|
211
|
+
from: 'reviewing',
|
|
212
|
+
to: 'done',
|
|
213
|
+
guard: isAssignee,
|
|
214
|
+
set: ({ record }) => feedbackSet(record, { opinion: true, outgoingRef: true }),
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
onEnter: { objected: [notifyObjection] },
|
|
218
|
+
});
|
|
219
|
+
/** 执行团队处理流程: 开始 → 执行团队处理 → 结束. */
|
|
220
|
+
export const teamTaskLifecycle = defineLifecycle({
|
|
221
|
+
name: 'teamTasks',
|
|
222
|
+
collection: COLLECTIONS.teamTasks,
|
|
223
|
+
initial: 'processing',
|
|
224
|
+
states: ['processing', { name: 'done', final: true }],
|
|
225
|
+
transitions: {
|
|
226
|
+
dispatchExecutors: {
|
|
227
|
+
title: '派发执行人',
|
|
228
|
+
from: 'processing',
|
|
229
|
+
to: 'processing',
|
|
230
|
+
guard: isAssignee,
|
|
231
|
+
validate: rowsRequired,
|
|
232
|
+
effects: [dispatchExecutors],
|
|
233
|
+
},
|
|
234
|
+
submitFeedback: {
|
|
235
|
+
title: '提交反馈',
|
|
236
|
+
from: 'processing',
|
|
237
|
+
to: 'done',
|
|
238
|
+
guard: isAssignee,
|
|
239
|
+
set: ({ record }) => feedbackSet(record, { opinion: true, outgoingRef: false }),
|
|
240
|
+
},
|
|
241
|
+
},
|
|
242
|
+
});
|
|
243
|
+
/** 执行人处理流程: 开始 → 执行人处理 → 结束. */
|
|
244
|
+
export const executorTaskLifecycle = defineLifecycle({
|
|
245
|
+
name: 'executorTasks',
|
|
246
|
+
collection: COLLECTIONS.executorTasks,
|
|
247
|
+
initial: 'processing',
|
|
248
|
+
states: ['processing', { name: 'done', final: true }],
|
|
249
|
+
transitions: {
|
|
250
|
+
submitFeedback: {
|
|
251
|
+
title: '提交反馈',
|
|
252
|
+
from: 'processing',
|
|
253
|
+
to: 'done',
|
|
254
|
+
guard: isAssignee,
|
|
255
|
+
set: ({ record }) => feedbackSet(record, { opinion: false, outgoingRef: false }),
|
|
256
|
+
},
|
|
257
|
+
},
|
|
258
|
+
});
|
|
259
|
+
//# sourceMappingURL=tasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../../server/lifecycles/tasks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../server/plugin.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,8BAA8B,CAAC;AAKtC,QAAA,MAAM,wBAAwB,EAAE,eAS9B,CAAC;AAEH,eAAe,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { defineServerPlugin, } from '@nocobase/app-server/plugins';
|
|
3
|
+
import serviceProviders from './providers/index.js';
|
|
4
|
+
import routes from './routes/index.js';
|
|
5
|
+
const officeFlowsExamplePlugin = defineServerPlugin({
|
|
6
|
+
baseDir: path.resolve(import.meta.dirname, '..'),
|
|
7
|
+
packageName: '@nocobase/app-plugin-office-flows-example',
|
|
8
|
+
serviceProviders,
|
|
9
|
+
routes,
|
|
10
|
+
database: {
|
|
11
|
+
migrations: './database/migrations',
|
|
12
|
+
seeds: './database/seeds',
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
export default officeFlowsExamplePlugin;
|
|
16
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../server/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EACL,kBAAkB,GAEnB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,gBAAgB,MAAM,sBAAsB,CAAC;AACpD,OAAO,MAAM,MAAM,mBAAmB,CAAC;AAEvC,MAAM,wBAAwB,GAAoB,kBAAkB,CAAC;IACnE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC;IAChD,WAAW,EAAE,2CAA2C;IACxD,gBAAgB;IAChB,MAAM;IACN,QAAQ,EAAE;QACR,UAAU,EAAE,uBAAuB;QACnC,KAAK,EAAE,kBAAkB;KAC1B;CACF,CAAC,CAAC;AAEH,eAAe,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../server/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAIjF,QAAA,MAAM,gBAAgB,EAAE,SAAS,4BAA4B,EAE5D,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/providers/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,gBAAgB,GAA4C;IAChE,mBAAmB;CACpB,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { AppPluginApplication } from '@nocobase/app-server/plugins';
|
|
2
|
+
import { ServiceProvider } from '@nocobase/service-provider';
|
|
3
|
+
/** How often idle records are checked and due extraction tasks created. */
|
|
4
|
+
export declare const SWEEP_MS: number;
|
|
5
|
+
/**
|
|
6
|
+
* Wires the six lifecycles to the application through `createLifecycleJobs()`:
|
|
7
|
+
* effects as jobs on a JobExecutor, and one ScheduleExecutor rule that sweeps
|
|
8
|
+
* the triggers and creates the extraction tasks falling due. A real
|
|
9
|
+
* deployment would sweep once a day; the example sweeps every minute so a new
|
|
10
|
+
* request shows its first task without waiting.
|
|
11
|
+
*/
|
|
12
|
+
export declare class OfficeFlowsProvider extends ServiceProvider<AppPluginApplication> {
|
|
13
|
+
readonly name: string;
|
|
14
|
+
private jobs;
|
|
15
|
+
private runtime;
|
|
16
|
+
register(): void;
|
|
17
|
+
start(): Promise<void>;
|
|
18
|
+
shutdown(): Promise<void>;
|
|
19
|
+
private lifecycleRuntime;
|
|
20
|
+
/** The dispatcher, created before the runtime that uses it. */
|
|
21
|
+
private effectJobs;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=office-flows.d.ts.map
|