@nocobase/app-plugin-office-flows-example 0.0.0-stage → 0.1.0-beta.1
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 +76 -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 @@
|
|
|
1
|
+
{"version":3,"file":"office-flows.d.ts","sourceRoot":"","sources":["../../../server/services/office-flows.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,603 @@
|
|
|
1
|
+
import { isDate, normalizeDataRequest, } from '../../shared/data-request.js';
|
|
2
|
+
import { DATA_REQUEST_ROLES, INCOMING_ROLES, PEOPLE, } from '../../shared/people.js';
|
|
3
|
+
import { extractionDates, nextWorkday, nominalDates } from '../calendar.js';
|
|
4
|
+
import { formOf } from '../lifecycles/data-request.js';
|
|
5
|
+
import { COLLECTIONS } from '../scope.js';
|
|
6
|
+
import { idOf, people, TASK_COLLECTIONS, } from './store.js';
|
|
7
|
+
import { EXTRACTION_FIELDS, INCOMING_FIELDS, TASK_FIELDS, } from '../../shared/fields.js';
|
|
8
|
+
import { text } from '../../shared/text.js';
|
|
9
|
+
const TASK_LIFECYCLES = {
|
|
10
|
+
clerk: 'clerkTasks',
|
|
11
|
+
team: 'teamTasks',
|
|
12
|
+
executor: 'executorTasks',
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* A refusal the service makes itself, before any lifecycle is involved:
|
|
16
|
+
* `INVALID` is the request, `LOCKED` the record's state, `CONFLICT` a
|
|
17
|
+
* concurrent change.
|
|
18
|
+
*/
|
|
19
|
+
export class OfficeFlowsError extends Error {
|
|
20
|
+
code;
|
|
21
|
+
reason;
|
|
22
|
+
/** The body fields the refusal names; empty when it is about none. */
|
|
23
|
+
fields;
|
|
24
|
+
constructor(code,
|
|
25
|
+
/** Stable, UPPER_SNAKE_CASE: what a client branches on. */
|
|
26
|
+
reason, message, options = {}) {
|
|
27
|
+
super(message);
|
|
28
|
+
this.code = code;
|
|
29
|
+
this.reason = reason;
|
|
30
|
+
this.name = 'OfficeFlowsError';
|
|
31
|
+
const { field } = options;
|
|
32
|
+
this.fields =
|
|
33
|
+
field === undefined ? [] : typeof field === 'string' ? [field] : field;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const FIRST_PAGE = { page: 1, pageSize: 20 };
|
|
37
|
+
const DATA_REQUEST_FIELDS = [
|
|
38
|
+
'subject',
|
|
39
|
+
'reason',
|
|
40
|
+
'volume',
|
|
41
|
+
'frequency',
|
|
42
|
+
'deliveryDate',
|
|
43
|
+
'firstUseDate',
|
|
44
|
+
'lastDeliveryDate',
|
|
45
|
+
'quarterDay',
|
|
46
|
+
'monthDay',
|
|
47
|
+
'weekDay',
|
|
48
|
+
'frequencyNote',
|
|
49
|
+
'scope',
|
|
50
|
+
'consumers',
|
|
51
|
+
'fileShieldAccepted',
|
|
52
|
+
'fileShieldScope',
|
|
53
|
+
'fileShieldCopy',
|
|
54
|
+
'fileShieldValidUntil',
|
|
55
|
+
'ndaFiles',
|
|
56
|
+
'securityFiles',
|
|
57
|
+
];
|
|
58
|
+
/**
|
|
59
|
+
* How often an edit reads the record again after a concurrent change wrote
|
|
60
|
+
* first, before it answers `RECORD_CHANGED`.
|
|
61
|
+
*/
|
|
62
|
+
const EDIT_ATTEMPTS = 3;
|
|
63
|
+
/** Which state a record may be edited in, per kind. */
|
|
64
|
+
const EDITABLE_STATES = {
|
|
65
|
+
dataRequests: ['draft'],
|
|
66
|
+
incoming: ['draft'],
|
|
67
|
+
extractions: ['pending'],
|
|
68
|
+
clerkTasks: ['reviewing'],
|
|
69
|
+
teamTasks: ['processing'],
|
|
70
|
+
executorTasks: ['processing'],
|
|
71
|
+
};
|
|
72
|
+
function pick(values, fields) {
|
|
73
|
+
return Object.fromEntries(fields
|
|
74
|
+
.filter((field) => field in values)
|
|
75
|
+
.map((field) => [field, values[field]]));
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* The example's operations around the lifecycles. Every state change goes
|
|
79
|
+
* through `runtime.fire()`; the methods here create records, edit the
|
|
80
|
+
* fields a state allows, keep the distribution rows, and read what a page
|
|
81
|
+
* shows.
|
|
82
|
+
*/
|
|
83
|
+
export class OfficeFlowsService {
|
|
84
|
+
database;
|
|
85
|
+
runtime;
|
|
86
|
+
store;
|
|
87
|
+
constructor(database, runtime, store) {
|
|
88
|
+
this.database = database;
|
|
89
|
+
this.runtime = runtime;
|
|
90
|
+
this.store = store;
|
|
91
|
+
}
|
|
92
|
+
// ── Reference data ─────────────────────────────────────────────────────
|
|
93
|
+
async config() {
|
|
94
|
+
const all = async (collection) => (await this.database.repository(collection).findMany({})).map((row) => ({
|
|
95
|
+
...row,
|
|
96
|
+
}));
|
|
97
|
+
return {
|
|
98
|
+
people: PEOPLE,
|
|
99
|
+
roles: { dataRequest: DATA_REQUEST_ROLES, incoming: INCOMING_ROLES },
|
|
100
|
+
departments: await all(COLLECTIONS.departments),
|
|
101
|
+
managementGroups: await all(COLLECTIONS.managementGroups),
|
|
102
|
+
holidays: await all(COLLECTIONS.holidays),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/** The persona's reminders, newest first. */
|
|
106
|
+
async notices(actor, page = FIRST_PAGE) {
|
|
107
|
+
return this.newestFirst(COLLECTIONS.notices, page, { recipient: actor });
|
|
108
|
+
}
|
|
109
|
+
// ── Shared ─────────────────────────────────────────────────────────────
|
|
110
|
+
async fire(name, id, transition, input, actor, manual = true) {
|
|
111
|
+
await this.runtime.fire(name, id, transition, {
|
|
112
|
+
actor: { id: actor },
|
|
113
|
+
input,
|
|
114
|
+
manual,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
async view(name, collection, docKind, id, actor) {
|
|
118
|
+
const record = await this.require(collection, id);
|
|
119
|
+
return {
|
|
120
|
+
record,
|
|
121
|
+
description: this.runtime.describe(name),
|
|
122
|
+
available: await this.runtime.available(name, id, { id: actor }),
|
|
123
|
+
history: await this.runtime.history(name, id),
|
|
124
|
+
traces: await this.store.list(COLLECTIONS.traces, {
|
|
125
|
+
docKind,
|
|
126
|
+
docId: idOf(id),
|
|
127
|
+
}),
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
async require(collection, id) {
|
|
131
|
+
const record = await this.store.find(collection, id);
|
|
132
|
+
if (!record)
|
|
133
|
+
throw new OfficeFlowsError('NOT_FOUND', 'RECORD_NOT_FOUND', `Record "${text(id)}" does not exist.`);
|
|
134
|
+
return record;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Writes an edit against the record as read: the state check, the
|
|
138
|
+
* permission check and `change` all see that version, and the write
|
|
139
|
+
* applies only while the record is still at it. Every edit moves
|
|
140
|
+
* `lifecycleVersion` on, so of two edits read at the same version only one
|
|
141
|
+
* applies; the other reads again and is applied anew to what the first
|
|
142
|
+
* left, so neither overwrites the other with what it read before. A
|
|
143
|
+
* transition that read the record before an edit wrote is refused with
|
|
144
|
+
* `CONFLICT` when it commits, since it writes on the version it read. After
|
|
145
|
+
* `EDIT_ATTEMPTS` lost races the edit gives up with `RECORD_CHANGED`.
|
|
146
|
+
*/
|
|
147
|
+
async edit(name, collection, id,
|
|
148
|
+
/** The columns to write, or how to derive them from the record as read. */
|
|
149
|
+
change, allowed) {
|
|
150
|
+
for (let attempt = 1; attempt <= EDIT_ATTEMPTS; attempt += 1) {
|
|
151
|
+
const record = await this.require(collection, id);
|
|
152
|
+
if (!EDITABLE_STATES[name].includes(text(record.status)))
|
|
153
|
+
throw new OfficeFlowsError('LOCKED', 'RECORD_LOCKED', 'The record cannot be edited at this step.');
|
|
154
|
+
if (!allowed(record))
|
|
155
|
+
throw new OfficeFlowsError('FORBIDDEN', 'EDIT_NOT_ALLOWED', 'The current role cannot edit this record.');
|
|
156
|
+
const values = typeof change === 'function' ? change(record) : change;
|
|
157
|
+
if (!Object.keys(values).length)
|
|
158
|
+
return;
|
|
159
|
+
// The status and its timestamp are never in `values`: only fire()
|
|
160
|
+
// writes them. The version is the lifecycle's, and is moved from here
|
|
161
|
+
// for the reason `OfficeStore.createExtraction` moves it: a transition
|
|
162
|
+
// conditions its write on the version it decided on, so one that
|
|
163
|
+
// checked these fields — `submit` validates the form, `submitFeedback`
|
|
164
|
+
// the feedback — must not commit over values it did not see.
|
|
165
|
+
const { updatedCount } = await this.database
|
|
166
|
+
.repository(collection)
|
|
167
|
+
.updateMany({
|
|
168
|
+
filter: {
|
|
169
|
+
id: idOf(id),
|
|
170
|
+
status: text(record.status),
|
|
171
|
+
lifecycleVersion: Number(record.lifecycleVersion ?? 0),
|
|
172
|
+
},
|
|
173
|
+
values: {
|
|
174
|
+
...values,
|
|
175
|
+
lifecycleVersion: { increment: 1 },
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
if (updatedCount)
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
throw new OfficeFlowsError('CONFLICT', 'RECORD_CHANGED', 'Someone else kept changing the record; reload and try again.');
|
|
182
|
+
}
|
|
183
|
+
// ── Data usage requests ────────────────────────────────────────────────
|
|
184
|
+
async listDataRequests(page = FIRST_PAGE) {
|
|
185
|
+
return this.newestFirst(COLLECTIONS.dataRequests, page);
|
|
186
|
+
}
|
|
187
|
+
async createDataRequest(form, actor) {
|
|
188
|
+
if (actor !== DATA_REQUEST_ROLES.applicant)
|
|
189
|
+
throw new OfficeFlowsError('FORBIDDEN', 'APPLICANT_ONLY', 'Only the applicant can create a request.');
|
|
190
|
+
// Created through the lifecycle: the request's history starts here.
|
|
191
|
+
const number = await this.store.nextNumber('SJSY');
|
|
192
|
+
const { record } = await this.runtime.create('dataRequests', {
|
|
193
|
+
...normalizeDataRequest(form),
|
|
194
|
+
number,
|
|
195
|
+
applicantId: actor,
|
|
196
|
+
createdAt: this.store.now(),
|
|
197
|
+
}, { actor: { id: actor } });
|
|
198
|
+
return { ...record };
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Changes the fields `changes` names; the others keep their stored values.
|
|
202
|
+
* Which fields show depends on others, such as `frequency` and `scope`, so
|
|
203
|
+
* the change is merged into the stored form before it is normalized: a
|
|
204
|
+
* patch of `frequency` alone still clears the answers it hides.
|
|
205
|
+
*/
|
|
206
|
+
async updateDataRequest(id, changes, actor) {
|
|
207
|
+
await this.edit('dataRequests', COLLECTIONS.dataRequests, id,
|
|
208
|
+
// Merged into the record as `edit` read it, and merged again if a
|
|
209
|
+
// concurrent edit wrote first: a field this patch does not name keeps
|
|
210
|
+
// the other edit's value instead of the one read before it.
|
|
211
|
+
(record) => pick({ ...normalizeDataRequest({ ...formOf(record), ...changes }) }, DATA_REQUEST_FIELDS), (record) => record.applicantId === actor);
|
|
212
|
+
}
|
|
213
|
+
async dataRequestDetail(id, actor) {
|
|
214
|
+
const view = await this.view('dataRequests', COLLECTIONS.dataRequests, 'dataRequest', id, actor);
|
|
215
|
+
const extractions = await this.store.list(COLLECTIONS.extractions, {
|
|
216
|
+
requestId: idOf(id),
|
|
217
|
+
});
|
|
218
|
+
const form = formOf(view.record);
|
|
219
|
+
const calendar = await this.store.calendar();
|
|
220
|
+
const nominal = nominalDates(form);
|
|
221
|
+
return {
|
|
222
|
+
...view,
|
|
223
|
+
form,
|
|
224
|
+
extractions,
|
|
225
|
+
schedule: {
|
|
226
|
+
due: form.frequency === 'once' && form.deliveryDate
|
|
227
|
+
? [nextWorkday(form.deliveryDate, calendar)]
|
|
228
|
+
: extractionDates(form, calendar),
|
|
229
|
+
shifted: nominal
|
|
230
|
+
.map((date) => ({ date, workday: calendar.isWorkday(date) }))
|
|
231
|
+
.filter((item) => !item.workday)
|
|
232
|
+
.map((item) => ({
|
|
233
|
+
date: item.date,
|
|
234
|
+
to: nextWorkday(item.date, calendar),
|
|
235
|
+
})),
|
|
236
|
+
},
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
/** "创建抽数子流程" on the acceptance page. */
|
|
240
|
+
async createManualExtraction(id, values, actor) {
|
|
241
|
+
const request = await this.require(COLLECTIONS.dataRequests, id);
|
|
242
|
+
if (request.status !== 'accepting' || actor !== DATA_REQUEST_ROLES.acceptor)
|
|
243
|
+
throw new OfficeFlowsError('FORBIDDEN', 'ACCEPTOR_ONLY', 'Only the acceptor can create an extraction task, and only while the request is in acceptance.');
|
|
244
|
+
const missing = [
|
|
245
|
+
...(values.topic.trim() ? [] : ['topic']),
|
|
246
|
+
...(isDate(values.scheduledDate) ? [] : ['scheduledDate']),
|
|
247
|
+
];
|
|
248
|
+
if (missing.length)
|
|
249
|
+
throw new OfficeFlowsError('INVALID', 'EXTRACTION_FIELDS_REQUIRED', 'Give the extraction task a topic and a first extraction date.', { field: missing });
|
|
250
|
+
// A manual task has no period: its key is the number it is given, so
|
|
251
|
+
// two created at once cannot collide on a count read beforehand.
|
|
252
|
+
const created = await this.store.createExtraction({
|
|
253
|
+
requestId: idOf(id),
|
|
254
|
+
origin: 'manual',
|
|
255
|
+
scheduledDate: values.scheduledDate,
|
|
256
|
+
topic: values.topic.trim(),
|
|
257
|
+
requirement: values.requirement,
|
|
258
|
+
executorIds: values.executorIds.length
|
|
259
|
+
? values.executorIds
|
|
260
|
+
: DATA_REQUEST_ROLES.executors,
|
|
261
|
+
});
|
|
262
|
+
if (!created)
|
|
263
|
+
throw new OfficeFlowsError('CONFLICT', 'REQUEST_LEFT_ACCEPTANCE', 'The request left acceptance before the task was created; reload and try again.');
|
|
264
|
+
return created;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* The daily sweep: every request in acceptance gets the extraction tasks
|
|
268
|
+
* that are due by `today` and not yet created, counted from the day it was
|
|
269
|
+
* accepted. Safe to repeat — the (request, date) key is unique.
|
|
270
|
+
*/
|
|
271
|
+
async runSchedule(today = this.store.now().slice(0, 10)) {
|
|
272
|
+
const calendar = await this.store.calendar();
|
|
273
|
+
const requests = await this.database
|
|
274
|
+
.repository(COLLECTIONS.dataRequests)
|
|
275
|
+
.findMany({ filter: { status: 'accepting' } });
|
|
276
|
+
let created = 0;
|
|
277
|
+
for (const row of requests) {
|
|
278
|
+
const form = formOf({ ...row });
|
|
279
|
+
if (form.frequency === 'once' || form.frequency === 'other')
|
|
280
|
+
continue;
|
|
281
|
+
const acceptedOn = text(row.acceptedAt ?? row.statusChangedAt).slice(0, 10);
|
|
282
|
+
for (const date of extractionDates(form, calendar)) {
|
|
283
|
+
if (date < acceptedOn || date > today)
|
|
284
|
+
continue;
|
|
285
|
+
const task = await this.store.createExtraction({
|
|
286
|
+
requestId: idOf(row.id),
|
|
287
|
+
periodKey: date,
|
|
288
|
+
origin: 'scheduled',
|
|
289
|
+
scheduledDate: date,
|
|
290
|
+
topic: `${text(row.subject)}(${date})`,
|
|
291
|
+
requirement: '',
|
|
292
|
+
executorIds: DATA_REQUEST_ROLES.executors,
|
|
293
|
+
});
|
|
294
|
+
if (task)
|
|
295
|
+
created += 1;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
return created;
|
|
299
|
+
}
|
|
300
|
+
async extractionDetail(id, actor) {
|
|
301
|
+
const view = await this.view('extractions', COLLECTIONS.extractions, 'extraction', id, actor);
|
|
302
|
+
return {
|
|
303
|
+
...view,
|
|
304
|
+
request: await this.store.find(COLLECTIONS.dataRequests, view.record.requestId),
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
async updateExtraction(id, values, actor) {
|
|
308
|
+
await this.edit('extractions', COLLECTIONS.extractions, id, pick(values, EXTRACTION_FIELDS), (record) => people(record.executorIds).includes(actor) ||
|
|
309
|
+
actor === DATA_REQUEST_ROLES.acceptor);
|
|
310
|
+
}
|
|
311
|
+
// ── Incoming documents ─────────────────────────────────────────────────
|
|
312
|
+
async listIncoming(page = FIRST_PAGE) {
|
|
313
|
+
return this.newestFirst(COLLECTIONS.incoming, page);
|
|
314
|
+
}
|
|
315
|
+
async createIncoming(values, actor) {
|
|
316
|
+
if (actor !== INCOMING_ROLES.registrar)
|
|
317
|
+
throw new OfficeFlowsError('FORBIDDEN', 'REGISTRAR_ONLY', 'Only the office registrar can record an incoming document.');
|
|
318
|
+
// Created through the lifecycle: the document's history starts here.
|
|
319
|
+
const number = await this.store.nextNumber('SWSQ');
|
|
320
|
+
const { record } = await this.runtime.create('incoming', {
|
|
321
|
+
title: '',
|
|
322
|
+
code: '',
|
|
323
|
+
sender: '',
|
|
324
|
+
senderRef: '',
|
|
325
|
+
summary: '',
|
|
326
|
+
officeOpinion: '',
|
|
327
|
+
distributionType: '',
|
|
328
|
+
officeHeadId: INCOMING_ROLES.officeHead,
|
|
329
|
+
officeLeaderId: INCOMING_ROLES.officeLeader,
|
|
330
|
+
attachments: [],
|
|
331
|
+
...pick(values, INCOMING_FIELDS),
|
|
332
|
+
number,
|
|
333
|
+
registrarId: actor,
|
|
334
|
+
createdAt: this.store.now(),
|
|
335
|
+
}, { actor: { id: actor } });
|
|
336
|
+
return { ...record };
|
|
337
|
+
}
|
|
338
|
+
async updateIncoming(id, values, actor) {
|
|
339
|
+
await this.edit('incoming', COLLECTIONS.incoming, id, pick(values, INCOMING_FIELDS), (record) => record.registrarId === actor);
|
|
340
|
+
}
|
|
341
|
+
async incomingDetail(id, actor) {
|
|
342
|
+
const view = await this.view('incoming', COLLECTIONS.incoming, 'incoming', id, actor);
|
|
343
|
+
return {
|
|
344
|
+
...view,
|
|
345
|
+
rows: await this.store.list(COLLECTIONS.assignments, {
|
|
346
|
+
parentKind: 'incoming',
|
|
347
|
+
parentId: idOf(id),
|
|
348
|
+
}),
|
|
349
|
+
management: await this.store.list(COLLECTIONS.managementCc, {
|
|
350
|
+
incomingId: idOf(id),
|
|
351
|
+
}),
|
|
352
|
+
processing: [
|
|
353
|
+
await this.level('办事人员列表', '办公室意见', view.record.officeOpinion, 'clerk', id),
|
|
354
|
+
],
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
/** Adds a department row: its people come from the department configuration. */
|
|
358
|
+
async addRow(parentKind, parentId, input, actor) {
|
|
359
|
+
const parent = await this.rowParent(parentKind, parentId, actor);
|
|
360
|
+
if (!input.includeClerks)
|
|
361
|
+
throw new OfficeFlowsError('INVALID', 'ROW_CLERKS_REQUIRED', 'A row must include the clerks.', { field: 'includeClerks' });
|
|
362
|
+
const department = await this.database
|
|
363
|
+
.repository(COLLECTIONS.departments)
|
|
364
|
+
.findOne({ filter: { name: input.departmentName } });
|
|
365
|
+
if (!department)
|
|
366
|
+
throw new OfficeFlowsError('INVALID', 'DEPARTMENT_REQUIRED', 'Choose a department to distribute to.', { field: 'departmentName' });
|
|
367
|
+
// A clerk task's "派发其他部门协助" row goes to the root document's own
|
|
368
|
+
// rows, at the clerk level, rather than to this task's execution team.
|
|
369
|
+
const assist = parentKind === 'clerk' && input.assistOther === true;
|
|
370
|
+
const level = assist ? 1 : { incoming: 1, clerk: 2, team: 3 }[parentKind];
|
|
371
|
+
const created = await this.database
|
|
372
|
+
.repository(COLLECTIONS.assignments)
|
|
373
|
+
.createOne({
|
|
374
|
+
values: {
|
|
375
|
+
rootId: idOf(parent.rootId),
|
|
376
|
+
parentKind: assist ? 'incoming' : parentKind,
|
|
377
|
+
parentId: assist ? idOf(parent.rootId) : idOf(parentId),
|
|
378
|
+
level,
|
|
379
|
+
departmentName: input.departmentName,
|
|
380
|
+
includeClerks: input.includeClerks,
|
|
381
|
+
includeHeads: input.includeHeads,
|
|
382
|
+
includeLeaders: input.includeLeaders,
|
|
383
|
+
assignees: input.includeClerks ? people(department.clerks) : [],
|
|
384
|
+
ccHeads: input.includeHeads ? people(department.heads) : [],
|
|
385
|
+
ccLeaders: input.includeLeaders ? people(department.leaders) : [],
|
|
386
|
+
origin: assist ? `clerk:${parentId}` : null,
|
|
387
|
+
dispatched: false,
|
|
388
|
+
createdBy: actor,
|
|
389
|
+
createdAt: this.store.now(),
|
|
390
|
+
},
|
|
391
|
+
});
|
|
392
|
+
const rowId = idOf(created.record.id);
|
|
393
|
+
// Saving an assist row creates the sibling clerk task at once.
|
|
394
|
+
if (assist)
|
|
395
|
+
await this.fire('clerkTasks', parentId, 'requestAssist', { rowIds: [rowId] }, actor);
|
|
396
|
+
return rowId;
|
|
397
|
+
}
|
|
398
|
+
async removeRow(rowId, actor) {
|
|
399
|
+
const row = await this.require(COLLECTIONS.assignments, rowId);
|
|
400
|
+
if (row.dispatched)
|
|
401
|
+
throw new OfficeFlowsError('LOCKED', 'ROW_DISPATCHED', 'A row that has been dispatched cannot be removed.');
|
|
402
|
+
if (row.createdBy !== actor)
|
|
403
|
+
throw new OfficeFlowsError('FORBIDDEN', 'ROW_OWNER_ONLY', 'Only the person who added a row can remove it.');
|
|
404
|
+
await this.database
|
|
405
|
+
.repository(COLLECTIONS.assignments)
|
|
406
|
+
.deleteMany({ filter: { id: idOf(rowId), dispatched: false } });
|
|
407
|
+
}
|
|
408
|
+
async addManagement(incomingId, input, actor) {
|
|
409
|
+
const record = await this.require(COLLECTIONS.incoming, incomingId);
|
|
410
|
+
if (record.status !== 'dispatching' || record.registrarId !== actor)
|
|
411
|
+
throw new OfficeFlowsError('FORBIDDEN', 'MANAGEMENT_NOT_ALLOWED', 'Only the registrar can add management groups, and only while the document is being dispatched.');
|
|
412
|
+
let groupName = (input.groupName ?? '').trim();
|
|
413
|
+
let members = (input.members ?? []).filter((person) => PEOPLE.some((item) => item.id === person));
|
|
414
|
+
let fromConfig = false;
|
|
415
|
+
if (input.groupId !== undefined) {
|
|
416
|
+
// A group the body names that does not exist is a bad request, not a
|
|
417
|
+
// missing resource: the URL names the document, which does exist.
|
|
418
|
+
const group = await this.store.find(COLLECTIONS.managementGroups, input.groupId);
|
|
419
|
+
if (!group)
|
|
420
|
+
throw new OfficeFlowsError('INVALID', 'MANAGEMENT_GROUP_NOT_FOUND', `Management group "${input.groupId}" does not exist.`, { field: 'groupId' });
|
|
421
|
+
groupName = text(group.name);
|
|
422
|
+
members = people(group.members);
|
|
423
|
+
fromConfig = true;
|
|
424
|
+
}
|
|
425
|
+
if (!groupName || !members.length)
|
|
426
|
+
throw new OfficeFlowsError('INVALID', 'MANAGEMENT_GROUP_REQUIRED', 'Name the group and choose who to copy.', {
|
|
427
|
+
field: fromConfig
|
|
428
|
+
? 'groupId'
|
|
429
|
+
: [
|
|
430
|
+
...(groupName ? [] : ['groupName']),
|
|
431
|
+
...(members.length ? [] : ['members']),
|
|
432
|
+
],
|
|
433
|
+
});
|
|
434
|
+
const created = await this.database
|
|
435
|
+
.repository(COLLECTIONS.managementCc)
|
|
436
|
+
.createOne({
|
|
437
|
+
values: {
|
|
438
|
+
incomingId: idOf(incomingId),
|
|
439
|
+
groupName,
|
|
440
|
+
members,
|
|
441
|
+
fromConfig,
|
|
442
|
+
forwarded: false,
|
|
443
|
+
createdAt: this.store.now(),
|
|
444
|
+
},
|
|
445
|
+
});
|
|
446
|
+
return idOf(created.record.id);
|
|
447
|
+
}
|
|
448
|
+
async removeManagement(rowId, actor) {
|
|
449
|
+
const row = await this.require(COLLECTIONS.managementCc, rowId);
|
|
450
|
+
const record = await this.require(COLLECTIONS.incoming, row.incomingId);
|
|
451
|
+
if (row.forwarded)
|
|
452
|
+
throw new OfficeFlowsError('LOCKED', 'MANAGEMENT_ROW_FORWARDED', 'A row that has been forwarded cannot be removed.');
|
|
453
|
+
if (record.registrarId !== actor)
|
|
454
|
+
throw new OfficeFlowsError('FORBIDDEN', 'MANAGEMENT_ROW_NOT_ALLOWED', 'The current role cannot remove this row.');
|
|
455
|
+
await this.database
|
|
456
|
+
.repository(COLLECTIONS.managementCc)
|
|
457
|
+
.deleteMany({ filter: { id: idOf(rowId), forwarded: false } });
|
|
458
|
+
}
|
|
459
|
+
/** Dispatch transitions carry the rows pending now, so a retry sends the same ones. */
|
|
460
|
+
async fireIncoming(id, transition, input, actor) {
|
|
461
|
+
const extra = {};
|
|
462
|
+
if (transition === 'dispatchClerks')
|
|
463
|
+
extra.rowIds = await this.pendingRows('incoming', id);
|
|
464
|
+
if (transition === 'forwardManagement')
|
|
465
|
+
extra.rowIds = (await this.store.list(COLLECTIONS.managementCc, {
|
|
466
|
+
incomingId: idOf(id),
|
|
467
|
+
forwarded: false,
|
|
468
|
+
})).map((row) => idOf(row.id));
|
|
469
|
+
await this.fire('incoming', id, transition, { ...input, ...extra }, actor);
|
|
470
|
+
}
|
|
471
|
+
// ── Incoming-document tasks ────────────────────────────────────────────
|
|
472
|
+
/**
|
|
473
|
+
* The persona's tasks of every kind, clerk tasks first and each kind
|
|
474
|
+
* newest first. They span three collections, so the page is cut from the
|
|
475
|
+
* persona's own tasks in memory; a persona holds few.
|
|
476
|
+
*/
|
|
477
|
+
async myTasks(actor, page = FIRST_PAGE) {
|
|
478
|
+
const memberships = await this.database
|
|
479
|
+
.repository(COLLECTIONS.taskAssignees)
|
|
480
|
+
.findMany({ filter: { personId: actor } });
|
|
481
|
+
const tasks = [];
|
|
482
|
+
for (const kind of ['clerk', 'team', 'executor']) {
|
|
483
|
+
const ids = memberships
|
|
484
|
+
.filter((membership) => membership.kind === kind)
|
|
485
|
+
.map((membership) => idOf(membership.taskId));
|
|
486
|
+
if (ids.length === 0)
|
|
487
|
+
continue;
|
|
488
|
+
const rows = await this.database
|
|
489
|
+
.repository(TASK_COLLECTIONS[kind])
|
|
490
|
+
.findMany({
|
|
491
|
+
filter: (filter) => filter.or(ids.map((id) => filter.number('id').eq(id))),
|
|
492
|
+
sort: (sort) => sort.field('id').desc(),
|
|
493
|
+
});
|
|
494
|
+
tasks.push(...rows.map((row) => ({ ...row, kind })));
|
|
495
|
+
}
|
|
496
|
+
const start = (page.page - 1) * page.pageSize;
|
|
497
|
+
return {
|
|
498
|
+
records: tasks.slice(start, start + page.pageSize),
|
|
499
|
+
total: tasks.length,
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
async taskDetail(kind, id, actor) {
|
|
503
|
+
const view = await this.view(TASK_LIFECYCLES[kind], TASK_COLLECTIONS[kind], kind, id, actor);
|
|
504
|
+
const root = await this.store.find(COLLECTIONS.incoming, view.record.rootId);
|
|
505
|
+
return {
|
|
506
|
+
...view,
|
|
507
|
+
kind,
|
|
508
|
+
root,
|
|
509
|
+
rows: kind === 'executor'
|
|
510
|
+
? []
|
|
511
|
+
: await this.store.list(COLLECTIONS.assignments, {
|
|
512
|
+
parentKind: kind,
|
|
513
|
+
parentId: idOf(id),
|
|
514
|
+
}),
|
|
515
|
+
processing: await this.chain(kind, view.record),
|
|
516
|
+
};
|
|
517
|
+
}
|
|
518
|
+
async updateTask(kind, id, values, actor) {
|
|
519
|
+
await this.edit(TASK_LIFECYCLES[kind], TASK_COLLECTIONS[kind], id, pick(values, TASK_FIELDS[kind]), (record) => people(record.assignees).includes(actor));
|
|
520
|
+
}
|
|
521
|
+
async fireTask(kind, id, transition, input, actor) {
|
|
522
|
+
const extra = {};
|
|
523
|
+
if (transition === 'dispatchTeams' || transition === 'dispatchExecutors')
|
|
524
|
+
extra.rowIds = await this.pendingRows(kind, id);
|
|
525
|
+
await this.fire(TASK_LIFECYCLES[kind], id, transition, { ...input, ...extra }, actor);
|
|
526
|
+
}
|
|
527
|
+
// ── Helpers ────────────────────────────────────────────────────────────
|
|
528
|
+
async newestFirst(collection, page, filter) {
|
|
529
|
+
const repository = this.database.repository(collection);
|
|
530
|
+
const where = filter === undefined ? {} : { filter };
|
|
531
|
+
const rows = await repository.findMany({
|
|
532
|
+
...where,
|
|
533
|
+
sort: (sort) => sort.field('id').desc(),
|
|
534
|
+
limit: page.pageSize,
|
|
535
|
+
offset: (page.page - 1) * page.pageSize,
|
|
536
|
+
});
|
|
537
|
+
return {
|
|
538
|
+
records: rows.map((row) => ({ ...row })),
|
|
539
|
+
total: await repository.count(where),
|
|
540
|
+
};
|
|
541
|
+
}
|
|
542
|
+
async pendingRows(parentKind, parentId) {
|
|
543
|
+
return (await this.store.list(COLLECTIONS.assignments, {
|
|
544
|
+
parentKind,
|
|
545
|
+
parentId: idOf(parentId),
|
|
546
|
+
dispatched: false,
|
|
547
|
+
})).map((row) => idOf(row.id));
|
|
548
|
+
}
|
|
549
|
+
async rowParent(parentKind, parentId, actor) {
|
|
550
|
+
if (parentKind === 'incoming') {
|
|
551
|
+
const record = await this.require(COLLECTIONS.incoming, parentId);
|
|
552
|
+
if (record.status !== 'dispatching' || record.registrarId !== actor)
|
|
553
|
+
throw new OfficeFlowsError('FORBIDDEN', 'ROWS_NOT_ALLOWED', 'Only the registrar can add rows, and only while the document is being dispatched.');
|
|
554
|
+
return { ...record, rootId: record.id };
|
|
555
|
+
}
|
|
556
|
+
const record = await this.require(TASK_COLLECTIONS[parentKind], parentId);
|
|
557
|
+
const open = parentKind === 'clerk' ? 'reviewing' : 'processing';
|
|
558
|
+
if (record.status !== open || !people(record.assignees).includes(actor))
|
|
559
|
+
throw new OfficeFlowsError('FORBIDDEN', 'TASK_ROWS_NOT_ALLOWED', 'Only an assignee of a task in progress can add rows.');
|
|
560
|
+
return record;
|
|
561
|
+
}
|
|
562
|
+
async level(title, opinionLabel, opinion, kind, parentId) {
|
|
563
|
+
return {
|
|
564
|
+
title,
|
|
565
|
+
opinionLabel,
|
|
566
|
+
opinion: typeof opinion === 'string' ? opinion : '',
|
|
567
|
+
kind,
|
|
568
|
+
tasks: await this.store.list(TASK_COLLECTIONS[kind], {
|
|
569
|
+
parentId: idOf(parentId),
|
|
570
|
+
}),
|
|
571
|
+
};
|
|
572
|
+
}
|
|
573
|
+
/**
|
|
574
|
+
* The processing lists a task shows: its own children first, then each
|
|
575
|
+
* level above it with all of that level's tasks and the opinion they
|
|
576
|
+
* answered.
|
|
577
|
+
*/
|
|
578
|
+
async chain(kind, record) {
|
|
579
|
+
const root = await this.require(COLLECTIONS.incoming, record.rootId);
|
|
580
|
+
const clerkLevel = () => this.level('办事人员列表', '办公室意见', root.officeOpinion, 'clerk', root.id);
|
|
581
|
+
if (kind === 'clerk')
|
|
582
|
+
return [
|
|
583
|
+
await this.level('执行团队列表', '办事人员意见', record.opinion, 'team', record.id),
|
|
584
|
+
await clerkLevel(),
|
|
585
|
+
];
|
|
586
|
+
if (kind === 'team') {
|
|
587
|
+
const clerk = await this.require(COLLECTIONS.clerkTasks, record.parentId);
|
|
588
|
+
return [
|
|
589
|
+
await this.level('执行人列表', '执行团队意见', record.opinion, 'executor', record.id),
|
|
590
|
+
await this.level('执行团队列表', '办事人员意见', clerk.opinion, 'team', clerk.id),
|
|
591
|
+
await clerkLevel(),
|
|
592
|
+
];
|
|
593
|
+
}
|
|
594
|
+
const team = await this.require(COLLECTIONS.teamTasks, record.parentId);
|
|
595
|
+
const clerk = await this.require(COLLECTIONS.clerkTasks, team.parentId);
|
|
596
|
+
return [
|
|
597
|
+
await this.level('执行人列表', '执行团队意见', team.opinion, 'executor', team.id),
|
|
598
|
+
await this.level('执行团队列表', '办事人员意见', clerk.opinion, 'team', clerk.id),
|
|
599
|
+
await clerkLevel(),
|
|
600
|
+
];
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
//# sourceMappingURL=office-flows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"office-flows.js","sourceRoot":"","sources":["../../../server/services/office-flows.ts"],"names":[],"mappings":"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"}
|