@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.
Files changed (189) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +55 -2
  3. package/dist/client/components/flow-ui.d.ts +111 -0
  4. package/dist/client/components/flow-ui.d.ts.map +1 -0
  5. package/dist/client/components/flow-ui.js +175 -0
  6. package/dist/client/components/flow-ui.js.map +1 -0
  7. package/dist/client/components/page-container.d.ts +4 -0
  8. package/dist/client/components/page-container.d.ts.map +1 -0
  9. package/dist/client/components/page-container.js +6 -0
  10. package/dist/client/components/page-container.js.map +1 -0
  11. package/dist/client/components/page-header.d.ts +8 -0
  12. package/dist/client/components/page-header.d.ts.map +1 -0
  13. package/dist/client/components/page-header.js +5 -0
  14. package/dist/client/components/page-header.js.map +1 -0
  15. package/dist/client/components/ui/badge.d.ts +7 -0
  16. package/dist/client/components/ui/badge.d.ts.map +1 -0
  17. package/dist/client/components/ui/badge.js +19 -0
  18. package/dist/client/components/ui/badge.js.map +1 -0
  19. package/dist/client/components/ui/button.d.ts +8 -0
  20. package/dist/client/components/ui/button.d.ts.map +1 -0
  21. package/dist/client/components/ui/button.js +25 -0
  22. package/dist/client/components/ui/button.js.map +1 -0
  23. package/dist/client/components/ui/card.d.ts +11 -0
  24. package/dist/client/components/ui/card.d.ts.map +1 -0
  25. package/dist/client/components/ui/card.js +19 -0
  26. package/dist/client/components/ui/card.js.map +1 -0
  27. package/dist/client/components/ui/input.d.ts +4 -0
  28. package/dist/client/components/ui/input.d.ts.map +1 -0
  29. package/dist/client/components/ui/input.js +8 -0
  30. package/dist/client/components/ui/input.js.map +1 -0
  31. package/dist/client/components/ui/select.d.ts +16 -0
  32. package/dist/client/components/ui/select.d.ts.map +1 -0
  33. package/dist/client/components/ui/select.js +36 -0
  34. package/dist/client/components/ui/select.js.map +1 -0
  35. package/dist/client/index.d.ts +2 -0
  36. package/dist/client/index.d.ts.map +1 -0
  37. package/dist/client/index.js +4 -0
  38. package/dist/client/index.js.map +1 -0
  39. package/dist/client/lib/api.d.ts +93 -0
  40. package/dist/client/lib/api.d.ts.map +1 -0
  41. package/dist/client/lib/api.js +67 -0
  42. package/dist/client/lib/api.js.map +1 -0
  43. package/dist/client/lib/format.d.ts +4 -0
  44. package/dist/client/lib/format.d.ts.map +1 -0
  45. package/dist/client/lib/format.js +8 -0
  46. package/dist/client/lib/format.js.map +1 -0
  47. package/dist/client/lib/labels.d.ts +5 -0
  48. package/dist/client/lib/labels.d.ts.map +1 -0
  49. package/dist/client/lib/labels.js +38 -0
  50. package/dist/client/lib/labels.js.map +1 -0
  51. package/dist/client/lib/use-loader.d.ts +10 -0
  52. package/dist/client/lib/use-loader.d.ts.map +1 -0
  53. package/dist/client/lib/use-loader.js +43 -0
  54. package/dist/client/lib/use-loader.js.map +1 -0
  55. package/dist/client/lib/utils.d.ts +2 -0
  56. package/dist/client/lib/utils.d.ts.map +1 -0
  57. package/dist/client/lib/utils.js +2 -0
  58. package/dist/client/lib/utils.js.map +1 -0
  59. package/dist/client/locales/en-US.d.ts +99 -0
  60. package/dist/client/locales/en-US.d.ts.map +1 -0
  61. package/dist/client/locales/en-US.js +92 -0
  62. package/dist/client/locales/en-US.js.map +1 -0
  63. package/dist/client/locales/index.d.ts +4 -0
  64. package/dist/client/locales/index.d.ts.map +1 -0
  65. package/dist/client/locales/index.js +7 -0
  66. package/dist/client/locales/index.js.map +1 -0
  67. package/dist/client/locales/zh-CN.d.ts +4 -0
  68. package/dist/client/locales/zh-CN.d.ts.map +1 -0
  69. package/dist/client/locales/zh-CN.js +92 -0
  70. package/dist/client/locales/zh-CN.js.map +1 -0
  71. package/dist/client/pages/configuration.d.ts +4 -0
  72. package/dist/client/pages/configuration.d.ts.map +1 -0
  73. package/dist/client/pages/configuration.js +34 -0
  74. package/dist/client/pages/configuration.js.map +1 -0
  75. package/dist/client/pages/data-requests.d.ts +3 -0
  76. package/dist/client/pages/data-requests.d.ts.map +1 -0
  77. package/dist/client/pages/data-requests.js +216 -0
  78. package/dist/client/pages/data-requests.js.map +1 -0
  79. package/dist/client/pages/incoming.d.ts +3 -0
  80. package/dist/client/pages/incoming.d.ts.map +1 -0
  81. package/dist/client/pages/incoming.js +128 -0
  82. package/dist/client/pages/incoming.js.map +1 -0
  83. package/dist/client/pages/tasks.d.ts +3 -0
  84. package/dist/client/pages/tasks.d.ts.map +1 -0
  85. package/dist/client/pages/tasks.js +116 -0
  86. package/dist/client/pages/tasks.js.map +1 -0
  87. package/dist/client/plugin.d.ts +4 -0
  88. package/dist/client/plugin.d.ts.map +1 -0
  89. package/dist/client/plugin.js +10 -0
  90. package/dist/client/plugin.js.map +1 -0
  91. package/dist/client/routes.d.ts +4 -0
  92. package/dist/client/routes.d.ts.map +1 -0
  93. package/dist/client/routes.js +51 -0
  94. package/dist/client/routes.js.map +1 -0
  95. package/dist/database/migrations/.manifest.json +9 -0
  96. package/dist/database/migrations/202610010001_office_flows_example_create_collections.d.ts +4 -0
  97. package/dist/database/migrations/202610010001_office_flows_example_create_collections.d.ts.map +1 -0
  98. package/dist/database/migrations/202610010001_office_flows_example_create_collections.js +280 -0
  99. package/dist/database/migrations/202610010001_office_flows_example_create_collections.js.map +1 -0
  100. package/dist/database/seeds/.manifest.json +9 -0
  101. package/dist/database/seeds/202610010002_office_flows_example_seed_configuration.d.ts +10 -0
  102. package/dist/database/seeds/202610010002_office_flows_example_seed_configuration.d.ts.map +1 -0
  103. package/dist/database/seeds/202610010002_office_flows_example_seed_configuration.js +104 -0
  104. package/dist/database/seeds/202610010002_office_flows_example_seed_configuration.js.map +1 -0
  105. package/dist/server/calendar.d.ts +35 -0
  106. package/dist/server/calendar.d.ts.map +1 -0
  107. package/dist/server/calendar.js +103 -0
  108. package/dist/server/calendar.js.map +1 -0
  109. package/dist/server/index.d.ts +2 -0
  110. package/dist/server/index.d.ts.map +1 -0
  111. package/dist/server/index.js +2 -0
  112. package/dist/server/index.js.map +1 -0
  113. package/dist/server/lifecycles/data-request.d.ts +36 -0
  114. package/dist/server/lifecycles/data-request.d.ts.map +1 -0
  115. package/dist/server/lifecycles/data-request.js +182 -0
  116. package/dist/server/lifecycles/data-request.js.map +1 -0
  117. package/dist/server/lifecycles/extraction.d.ts +21 -0
  118. package/dist/server/lifecycles/extraction.d.ts.map +1 -0
  119. package/dist/server/lifecycles/extraction.js +60 -0
  120. package/dist/server/lifecycles/extraction.js.map +1 -0
  121. package/dist/server/lifecycles/incoming.d.ts +27 -0
  122. package/dist/server/lifecycles/incoming.d.ts.map +1 -0
  123. package/dist/server/lifecycles/incoming.js +177 -0
  124. package/dist/server/lifecycles/incoming.js.map +1 -0
  125. package/dist/server/lifecycles/index.d.ts +8 -0
  126. package/dist/server/lifecycles/index.d.ts.map +1 -0
  127. package/dist/server/lifecycles/index.js +20 -0
  128. package/dist/server/lifecycles/index.js.map +1 -0
  129. package/dist/server/lifecycles/tasks.d.ts +63 -0
  130. package/dist/server/lifecycles/tasks.d.ts.map +1 -0
  131. package/dist/server/lifecycles/tasks.js +259 -0
  132. package/dist/server/lifecycles/tasks.js.map +1 -0
  133. package/dist/server/plugin.d.ts +4 -0
  134. package/dist/server/plugin.d.ts.map +1 -0
  135. package/dist/server/plugin.js +16 -0
  136. package/dist/server/plugin.js.map +1 -0
  137. package/dist/server/providers/index.d.ts +4 -0
  138. package/dist/server/providers/index.d.ts.map +1 -0
  139. package/dist/server/providers/index.js +6 -0
  140. package/dist/server/providers/index.js.map +1 -0
  141. package/dist/server/providers/office-flows.d.ts +23 -0
  142. package/dist/server/providers/office-flows.d.ts.map +1 -0
  143. package/dist/server/providers/office-flows.js +90 -0
  144. package/dist/server/providers/office-flows.js.map +1 -0
  145. package/dist/server/routes/index.d.ts +8 -0
  146. package/dist/server/routes/index.d.ts.map +1 -0
  147. package/dist/server/routes/index.js +553 -0
  148. package/dist/server/routes/index.js.map +1 -0
  149. package/dist/server/routes/schemas.d.ts +157 -0
  150. package/dist/server/routes/schemas.d.ts.map +1 -0
  151. package/dist/server/routes/schemas.js +188 -0
  152. package/dist/server/routes/schemas.js.map +1 -0
  153. package/dist/server/scope.d.ts +23 -0
  154. package/dist/server/scope.d.ts.map +1 -0
  155. package/dist/server/scope.js +23 -0
  156. package/dist/server/scope.js.map +1 -0
  157. package/dist/server/services/office-flows.d.ts +151 -0
  158. package/dist/server/services/office-flows.d.ts.map +1 -0
  159. package/dist/server/services/office-flows.js +603 -0
  160. package/dist/server/services/office-flows.js.map +1 -0
  161. package/dist/server/services/store.d.ts +119 -0
  162. package/dist/server/services/store.d.ts.map +1 -0
  163. package/dist/server/services/store.js +389 -0
  164. package/dist/server/services/store.js.map +1 -0
  165. package/dist/server/tokens.d.ts +4 -0
  166. package/dist/server/tokens.d.ts.map +1 -0
  167. package/dist/server/tokens.js +3 -0
  168. package/dist/server/tokens.js.map +1 -0
  169. package/dist/shared/data-request.d.ts +73 -0
  170. package/dist/shared/data-request.d.ts.map +1 -0
  171. package/dist/shared/data-request.js +182 -0
  172. package/dist/shared/data-request.js.map +1 -0
  173. package/dist/shared/fields.d.ts +12 -0
  174. package/dist/shared/fields.d.ts.map +1 -0
  175. package/dist/shared/fields.js +48 -0
  176. package/dist/shared/fields.js.map +1 -0
  177. package/dist/shared/people.d.ts +29 -0
  178. package/dist/shared/people.d.ts.map +1 -0
  179. package/dist/shared/people.js +54 -0
  180. package/dist/shared/people.js.map +1 -0
  181. package/dist/shared/routes.d.ts +7 -0
  182. package/dist/shared/routes.d.ts.map +1 -0
  183. package/dist/shared/routes.js +7 -0
  184. package/dist/shared/routes.js.map +1 -0
  185. package/dist/shared/text.d.ts +3 -0
  186. package/dist/shared/text.d.ts.map +1 -0
  187. package/dist/shared/text.js +9 -0
  188. package/dist/shared/text.js.map +1 -0
  189. 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,4 @@
1
+ import { type AppServerPlugin } from '@nocobase/app-server/plugins';
2
+ declare const officeFlowsExamplePlugin: AppServerPlugin;
3
+ export default officeFlowsExamplePlugin;
4
+ //# sourceMappingURL=plugin.d.ts.map
@@ -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,4 @@
1
+ import type { AppPluginProviderConstructor } from '@nocobase/app-server/plugins';
2
+ declare const serviceProviders: readonly AppPluginProviderConstructor[];
3
+ export default serviceProviders;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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,6 @@
1
+ import { OfficeFlowsProvider } from './office-flows.js';
2
+ const serviceProviders = [
3
+ OfficeFlowsProvider,
4
+ ];
5
+ export default serviceProviders;
6
+ //# sourceMappingURL=index.js.map
@@ -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