@gadmin2n/schematics 0.0.72 → 0.0.75

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 (173) hide show
  1. package/dist/index.d.ts +2 -0
  2. package/dist/index.js +2 -0
  3. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/job.prisma +62 -0
  4. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/system.prisma +0 -21
  5. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/workflow.prisma +171 -0
  6. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/AgendaJob.ts +60 -0
  7. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Event.ts +1 -1
  8. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/WorkflowEventOutbox.ts +62 -0
  9. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/WorkflowNodeInstance.ts +62 -0
  10. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/WorkflowNodeType.ts +62 -0
  11. package/dist/lib/application/files/gadmin2-game-angle-demo/server/.env +5 -0
  12. package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +5 -4
  13. package/dist/lib/application/files/gadmin2-game-angle-demo/server/prisma.config.ts +14 -7
  14. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/index.ts +4 -0
  15. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/permissions.ts +49 -3
  16. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-node-types.ts +746 -0
  17. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflows.ts +786 -0
  18. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agenda/agenda.controller.ts +6 -0
  19. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agenda/agenda.service.ts +79 -0
  20. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agendaJob/agendaJob.controller.spec.ts +20 -0
  21. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agendaJob/agendaJob.controller.ts +145 -0
  22. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agendaJob/agendaJob.module.ts +10 -0
  23. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/{canvas/canvas.service.spec.ts → agendaJob/agendaJob.service.spec.ts} +71 -65
  24. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agendaJob/agendaJob.service.ts +83 -0
  25. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/index.ts +2 -1
  26. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.module.ts +9 -0
  27. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.service.ts +100 -0
  28. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-execution.dto.ts +19 -0
  29. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.dto.ts +43 -0
  30. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.service.ts +317 -0
  31. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-node-type.controller.ts +16 -0
  32. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-node-type.service.ts +13 -0
  33. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.ts +220 -0
  34. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.dto.ts +82 -0
  35. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.module.ts +16 -0
  36. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.ts +505 -0
  37. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.controller.spec.ts +22 -0
  38. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.controller.ts +147 -0
  39. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.module.ts +10 -0
  40. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.service.spec.ts +356 -0
  41. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.service.ts +110 -0
  42. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.controller.spec.ts +22 -0
  43. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.controller.ts +216 -0
  44. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.module.ts +10 -0
  45. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.spec.ts +356 -0
  46. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.ts +168 -0
  47. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeType/workflowNodeType.controller.spec.ts +22 -0
  48. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeType/workflowNodeType.controller.ts +199 -0
  49. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeType/workflowNodeType.module.ts +10 -0
  50. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeType/workflowNodeType.service.spec.ts +348 -0
  51. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeType/workflowNodeType.service.ts +106 -0
  52. package/dist/lib/application/files/gadmin2-game-angle-demo/server/yarn.lock +579 -1082
  53. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/README.md +278 -0
  54. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/config/development-sql.yaml +5 -0
  55. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/docker-compose.yml +25 -0
  56. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/package.json +13 -0
  57. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/sql/create-event-trigger.sql +87 -0
  58. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/.env +7 -0
  59. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/SANDBOX.md +122 -0
  60. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/package-lock.json +4285 -0
  61. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/package.json +28 -0
  62. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/__tests__/activities/code-execute.test.ts +44 -0
  63. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/__tests__/activities/http-request.test.ts +87 -0
  64. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/__tests__/helpers.test.ts +225 -0
  65. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/__tests__/node-type-consistency.test.ts +101 -0
  66. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/code-execute.ts +51 -0
  67. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/db-execute.ts +85 -0
  68. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/db-query.ts +35 -0
  69. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/http-request.ts +54 -0
  70. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/index.ts +6 -0
  71. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/reporting.ts +62 -0
  72. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/send-notification.ts +47 -0
  73. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/config.ts +13 -0
  74. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/condition.ts +101 -0
  75. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/context.ts +58 -0
  76. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/graph.ts +184 -0
  77. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/helpers.ts +133 -0
  78. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/node-types.ts +57 -0
  79. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/types.ts +77 -0
  80. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/index.ts +36 -0
  81. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/outbox-poller.ts +226 -0
  82. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/workflows/dsl-workflow.ts +411 -0
  83. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/tsconfig.json +19 -0
  84. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/vitest.config.ts +8 -0
  85. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/yarn.lock +1905 -0
  86. package/dist/lib/application/files/gadmin2-game-angle-demo/web/package-lock.json +17555 -0
  87. package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +5 -2
  88. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/App.tsx +1 -0
  89. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/sider.tsx +5 -1
  90. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/title.tsx +1 -1
  91. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +63 -0
  92. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DevShell.tsx +91 -2
  93. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/list.tsx +48 -2
  94. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/show.tsx +43 -2
  95. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/common.json +14 -9
  96. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/common.json +14 -9
  97. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/index.tsx +309 -56
  98. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/show.tsx +1 -3
  99. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/create.tsx +108 -0
  100. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/edit.tsx +124 -0
  101. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/index.tsx +4 -0
  102. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/list.tsx +245 -0
  103. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/show.tsx +70 -0
  104. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasListPage.tsx +0 -1
  105. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasPage.tsx +160 -2
  106. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasToolbar.tsx +120 -148
  107. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CodeFloatWindow.tsx +74 -181
  108. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/LivePreview.tsx +15 -13
  109. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasConfigRegistry.tsx +2 -2
  110. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasContextMenuRegistry.tsx +338 -3
  111. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasDefaults.ts +18 -17
  112. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/BarChartDataSourceModal.tsx +10 -4
  113. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/LineChartDataSourceModal.tsx +10 -4
  114. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/{ChartViewerConfigModal.tsx → MultiChartConfigModal.tsx} +30 -18
  115. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/MultiChartDataSourceModal.tsx +427 -0
  116. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/NumCardDataSourceModal.tsx +10 -4
  117. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/PromptModal.tsx +6 -14
  118. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/RadarChartDataSourceModal.tsx +10 -4
  119. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/TableDataSourceModal.tsx +10 -4
  120. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/canvasModalProps.ts +24 -0
  121. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/demos.ts +45 -63
  122. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CustomNode.tsx +99 -0
  123. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExportModal.tsx +87 -0
  124. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/FlowRenderer.tsx +322 -0
  125. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ImportModal.tsx +175 -0
  126. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeEditModal.tsx +60 -0
  127. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.tsx +1150 -0
  128. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/RunWorkflowModal.tsx +101 -0
  129. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/StatusCards.tsx +198 -0
  130. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/VersionPanel.tsx +81 -0
  131. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/editor.tsx +566 -0
  132. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useWorkflowAgent.ts +224 -0
  133. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/index.tsx +524 -0
  134. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instance-detail.tsx +343 -0
  135. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instances.tsx +243 -0
  136. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/CreateNodeInstanceModal.tsx +363 -0
  137. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/DynamicConfigForm.tsx +154 -0
  138. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/NodeInstanceForm.tsx +176 -0
  139. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/create.tsx +77 -0
  140. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/edit.tsx +112 -0
  141. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/index.tsx +305 -0
  142. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/show.tsx +282 -0
  143. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/show.tsx +469 -0
  144. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types.ts +92 -0
  145. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/create.tsx +111 -0
  146. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/edit.tsx +127 -0
  147. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/index.tsx +4 -0
  148. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/list.tsx +254 -0
  149. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/show.tsx +74 -0
  150. package/dist/lib/application/files/gadmin2-game-angle-demo/web/yarn.lock +1501 -1199
  151. package/package.json +1 -1
  152. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/app.controller.spec.ts +0 -22
  153. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/BarChart/index.tsx +0 -896
  154. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/ChartSwitcher/index.tsx +0 -219
  155. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/ChartViewer/index.tsx +0 -159
  156. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/Filter/index.tsx +0 -192
  157. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/LineChart/index.tsx +0 -1034
  158. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumCard/NumCard.module.css +0 -8
  159. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumCard/index.tsx +0 -509
  160. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumLineCard/index.tsx +0 -66
  161. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/PieChart/index.tsx +0 -552
  162. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/RadarChart/index.tsx +0 -263
  163. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/Section/index.tsx +0 -35
  164. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/Table/index.tsx +0 -207
  165. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/TreemapChart/index.tsx +0 -382
  166. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/WorldMap/index.tsx +0 -135
  167. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/chart-constants.ts +0 -53
  168. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/icon/InfoIcon.tsx +0 -8
  169. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/icon/index.ts +0 -1
  170. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/map/config.ts +0 -31
  171. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/map/nameMap.json +0 -9
  172. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/map/world.geo.json +0 -39349
  173. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/metric-info-tooltip/index.tsx +0 -19
package/dist/index.d.ts CHANGED
@@ -1,2 +1,4 @@
1
1
  export * from './utils';
2
+ export * from './utils/dependencies.utils';
3
+ export * from './utils/json-file.util';
2
4
  export * from './lib/defaults';
package/dist/index.js CHANGED
@@ -15,4 +15,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./utils"), exports);
18
+ __exportStar(require("./utils/dependencies.utils"), exports);
19
+ __exportStar(require("./utils/json-file.util"), exports);
18
20
  __exportStar(require("./lib/defaults"), exports);
@@ -0,0 +1,62 @@
1
+ /// @IgnoreReactCode
2
+ /// @IgnoreNestCode
3
+ /// @IgnoreAutoField
4
+ model JobLog {
5
+ id BigInt @id @default(autoincrement())
6
+ jobName String @map("job_name") @db.VarChar(128) // 任务名称,对应 agenda.define() 的 name
7
+ status String @map("status") @db.VarChar(16) // 执行结果: success | failed
8
+ data Json? @map("data") // 触发时传入的 job data
9
+ error String? @map("error") @db.Text // 失败原因,status=failed 时存在
10
+ logs String? @map("logs") @db.Text // handler 执行过程中收集的详细日志
11
+ startAt DateTime @map("start_at") // 任务开始时间
12
+ endAt DateTime @map("end_at") // 任务结束时间
13
+ durationMs Int @map("duration_ms") // 执行耗时(毫秒)
14
+ createdAt DateTime @default(now()) @map("created_at")
15
+
16
+ @@index([jobName], map: "idx_job_log_job_name")
17
+ @@index([status], map: "idx_job_log_status")
18
+ @@index([startAt], map: "idx_job_log_start_at")
19
+ @@map("t_job_log")
20
+ }
21
+
22
+ // ─── Agenda Jobs ─────────────────────────────────────────────────────────────
23
+ // agenda_jobs 表由 @agendajs/postgres-backend 在服务启动时通过 CREATE TABLE IF NOT EXISTS
24
+ // 自动创建。在此纳入 Prisma schema 仅为:
25
+ // 1) 避免 prisma db push 反复提示「将删除 agenda_jobs 表」;
26
+ // 2) 支持后台 UI 列表查看任务状态。
27
+ // 注意:
28
+ // - 表名固定为 agenda_jobs(库内置默认值),不遵循项目 t_xxx 规范;
29
+ // - 字段类型 / 可空性必须与库 dist/schema.js 中的 SQL 完全一致,否则 db push 会产生 drift;
30
+ // - 库会额外创建 4 个 partial index(含 WHERE 子句),Prisma 无法表达,由库在启动时
31
+ // 通过 CREATE INDEX IF NOT EXISTS 自行管理,本文件只声明非 partial 版本占位;
32
+ // - updated_at 由库创建的 PG trigger 在 BEFORE UPDATE 时自动刷新,故此处不使用 @updatedAt。
33
+ /// @IgnoreAutoField
34
+ model AgendaJob {
35
+ id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
36
+ name String @db.VarChar(255) // 任务名称(对应 agenda.define())
37
+ priority Int @default(0) // 任务优先级,数值越大越优先
38
+ nextRunAt DateTime? @map("next_run_at") @db.Timestamptz // 下次执行时间
39
+ type String @default("normal") @db.VarChar(10) // 任务类型: normal | single
40
+ lockedAt DateTime? @map("locked_at") @db.Timestamptz // 加锁时间,非空表示执行中
41
+ lastFinishedAt DateTime? @map("last_finished_at") @db.Timestamptz // 上次完成时间
42
+ failedAt DateTime? @map("failed_at") @db.Timestamptz // 上次失败时间
43
+ failCount Int? @map("fail_count") // 累计失败次数
44
+ failReason String? @map("fail_reason") @db.Text // 上次失败原因
45
+ repeatTimezone String? @map("repeat_timezone") @db.VarChar(100) // 重复任务时区
46
+ lastRunAt DateTime? @map("last_run_at") @db.Timestamptz // 上次执行时间
47
+ repeatInterval String? @map("repeat_interval") @db.VarChar(255) // 重复间隔(cron 或时间字符串)
48
+ data Json? @default("{}") // 任务运行参数
49
+ repeatAt String? @map("repeat_at") @db.VarChar(255) // 在指定时间重复执行
50
+ disabled Boolean? @default(false) // 是否已禁用
51
+ progress Float? @db.Real // 执行进度,范围 0-1
52
+ fork Boolean? @default(false) // 是否 fork 子进程执行
53
+ lastModifiedBy String? @map("last_modified_by") @db.VarChar(255) // 最后修改人
54
+ debounceStartedAt DateTime? @map("debounce_started_at") @db.Timestamptz // 去抖动开始时间
55
+ createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz // 创建时间
56
+ updatedAt DateTime? @default(now()) @map("updated_at") @db.Timestamptz // 更新时间,由 PG trigger 维护
57
+
58
+ @@index([name, nextRunAt, priority(sort: Desc), lockedAt, disabled], map: "agenda_jobs_find_and_lock_idx")
59
+ @@index([lockedAt], map: "agenda_jobs_locked_at_idx")
60
+ @@index([nextRunAt], map: "agenda_jobs_next_run_at_idx")
61
+ @@map("agenda_jobs")
62
+ }
@@ -1,24 +1,3 @@
1
- /// @IgnoreReactCode
2
- /// @IgnoreNestCode
3
- /// @IgnoreAutoField
4
- model JobLog {
5
- id BigInt @id @default(autoincrement())
6
- jobName String @map("job_name") @db.VarChar(128) // 任务名称,对应 agenda.define() 的 name
7
- status String @map("status") @db.VarChar(16) // 执行结果: success | failed
8
- data Json? @map("data") // 触发时传入的 job data
9
- error String? @map("error") @db.Text // 失败原因,status=failed 时存在
10
- logs String? @map("logs") @db.Text // handler 执行过程中收集的详细日志
11
- startAt DateTime @map("start_at") // 任务开始时间
12
- endAt DateTime @map("end_at") // 任务结束时间
13
- durationMs Int @map("duration_ms") // 执行耗时(毫秒)
14
- createdAt DateTime @default(now()) @map("created_at")
15
-
16
- @@index([jobName], map: "idx_job_log_job_name")
17
- @@index([status], map: "idx_job_log_status")
18
- @@index([startAt], map: "idx_job_log_start_at")
19
- @@map("t_job_log")
20
- }
21
-
22
1
  model Game {
23
2
  unified_editionid String @map("unified_editionid") @db.VarChar(128)
24
3
  name String @map("name") @db.VarChar(64)
@@ -0,0 +1,171 @@
1
+ // ─── Workflow ────────────────────────────────────────────────────────────────
2
+
3
+ enum WorkflowStatus {
4
+ DRAFT
5
+ PUBLISHED
6
+ }
7
+
8
+ enum WorkflowInstanceStatus {
9
+ PENDING
10
+ RUNNING
11
+ COMPLETED
12
+ FAILED
13
+ CANCELLED
14
+ }
15
+
16
+ enum WorkflowNodeCategory {
17
+ TRIGGER
18
+ ACTION
19
+ CONDITION
20
+ LOOP
21
+ FLOW_CONTROL
22
+ APPROVAL
23
+ SUB_WORKFLOW
24
+ }
25
+
26
+ /// @IgnoreNestCode
27
+ /// @IgnoreReactCode
28
+ /// @IgnoreAutoField
29
+ model Workflow {
30
+ id BigInt @id @default(autoincrement())
31
+ code String @unique @default(nanoid()) @db.VarChar(21) @map("code")
32
+ name String @db.VarChar(128)
33
+ description String? @db.Text
34
+ status WorkflowStatus @default(DRAFT)
35
+ isEnabled Boolean @default(true) @map("is_enabled")
36
+ dsl Json?
37
+ creator String @default("") @db.VarChar(128) @map("creator")
38
+ createdAt DateTime @default(now()) @map("created_at")
39
+ updatedAt DateTime @updatedAt @map("updated_at")
40
+
41
+ versions WorkflowVersion[]
42
+ instances WorkflowInstance[]
43
+
44
+ @@map("t_workflow")
45
+ }
46
+
47
+ /// @IgnoreNestCode
48
+ /// @IgnoreReactCode
49
+ /// @IgnoreAutoField
50
+ model WorkflowVersion {
51
+ id BigInt @id @default(autoincrement())
52
+ workflowId BigInt @map("workflow_id")
53
+ version Int
54
+ dsl Json
55
+ prompt String @db.Text
56
+ changeSummary String? @db.VarChar(512) @map("change_summary")
57
+ creator String @default("") @db.VarChar(128) @map("creator")
58
+ createdAt DateTime @default(now()) @map("created_at")
59
+
60
+ workflow Workflow @relation(fields: [workflowId], references: [id], onDelete: Cascade)
61
+
62
+ @@unique([workflowId, version], map: "uk_workflow_version")
63
+ @@index([workflowId], map: "idx_wv_workflow_id")
64
+ @@map("t_workflow_version")
65
+ }
66
+
67
+ // 每次 workflow 跑一次就生成一个 WorkflowInstance(记录输入、状态、结果),用于追踪执行历史
68
+ /// @IgnoreNestCode
69
+ /// @IgnoreReactCode
70
+ /// @IgnoreAutoField
71
+ model WorkflowInstance {
72
+ id BigInt @id @default(autoincrement())
73
+ workflowId BigInt @map("workflow_id")
74
+ versionId BigInt @map("version_id")
75
+ status WorkflowInstanceStatus @default(PENDING)
76
+ context Json?
77
+ result Json?
78
+ temporalRunId String? @db.VarChar(128) @map("temporal_run_id") // Temporal workflow run ID
79
+ startedAt DateTime? @map("started_at")
80
+ finishedAt DateTime? @map("finished_at")
81
+ creator String @default("") @db.VarChar(128) @map("creator")
82
+ createdAt DateTime @default(now()) @map("created_at")
83
+ updatedAt DateTime @updatedAt @map("updated_at")
84
+
85
+ workflow Workflow @relation(fields: [workflowId], references: [id], onDelete: Cascade)
86
+ nodeExecutions WorkflowNodeExecution[]
87
+
88
+ @@index([workflowId], map: "idx_wi_workflow_id")
89
+ @@index([status], map: "idx_wi_status")
90
+ @@map("t_workflow_instance")
91
+ }
92
+
93
+ // 跟踪 workflow 执行过程中每个节点的执行状态
94
+ /// @IgnoreNestCode
95
+ /// @IgnoreReactCode
96
+ /// @IgnoreAutoField
97
+ model WorkflowNodeExecution {
98
+ id BigInt @id @default(autoincrement())
99
+ instanceId BigInt @map("instance_id")
100
+ nodeId String @db.VarChar(64) // DSL node.id
101
+ nodeType String @db.VarChar(64) // e.g. "http_request"
102
+ nodeLabel String? @db.VarChar(128) // human-readable label
103
+ status WorkflowInstanceStatus @default(PENDING)
104
+ input Json?
105
+ output Json?
106
+ error Json?
107
+ startedAt DateTime? @map("started_at")
108
+ finishedAt DateTime? @map("finished_at")
109
+ createdAt DateTime @default(now()) @map("created_at")
110
+ updatedAt DateTime @updatedAt @map("updated_at")
111
+
112
+ instance WorkflowInstance @relation(fields: [instanceId], references: [id], onDelete: Cascade)
113
+
114
+ @@unique([instanceId, nodeId], map: "uk_wne_instance_node")
115
+ @@index([instanceId], map: "idx_wne_instance_id")
116
+ @@map("t_workflow_node_execution")
117
+ }
118
+
119
+ /// @IgnoreReactCode
120
+ /// @IgnoreAutoField
121
+ model WorkflowNodeType {
122
+ id BigInt @id @default(autoincrement())
123
+ type String @unique @db.VarChar(64)
124
+ category WorkflowNodeCategory
125
+ label String @db.VarChar(128)
126
+ icon String @db.VarChar(64)
127
+ description String? @db.VarChar(512)
128
+ configSchema Json @map("config_schema")
129
+ inputSchema Json @map("input_schema")
130
+ outputSchema Json @map("output_schema")
131
+ isBuiltin Boolean @default(true) @map("is_builtin")
132
+ creator String @default("") @db.VarChar(128) @map("creator")
133
+ createdAt DateTime @default(now()) @map("created_at")
134
+ updatedAt DateTime @updatedAt @map("updated_at")
135
+
136
+ instances WorkflowNodeInstance[]
137
+
138
+ @@map("t_workflow_node_type")
139
+ }
140
+
141
+ /// @IgnoreReactCode
142
+ model WorkflowNodeInstance {
143
+ code String @unique @default(nanoid()) @db.VarChar(21) @map("code")
144
+ nodeTypeId BigInt @map("node_type_id") // 关联的 NodeType ID
145
+ name String @db.VarChar(128) // 实例名称
146
+ description String? @db.VarChar(512) // 描述
147
+ config Json // 已配置的具体参数值
148
+ isEnabled Boolean @default(true) @map("is_enabled") // 是否启用
149
+
150
+ nodeType WorkflowNodeType @relation(fields: [nodeTypeId], references: [id])
151
+
152
+ @@index([nodeTypeId], map: "idx_wni_node_type_id")
153
+ @@map("t_workflow_node_instance")
154
+ }
155
+
156
+ // Outbox Pattern:业务表触发器将事件写入此表,outbox-poller 定时扫描并触发 workflow
157
+ /// @IgnoreAutoField
158
+ model WorkflowEventOutbox {
159
+ id BigInt @id @default(autoincrement())
160
+ eventName String @db.VarChar(128) @map("event_name") // 事件名, e.g. "t_order.insert"
161
+ /// @FormItem(JSON)
162
+ payload Json // 触发事件的行数据
163
+ processed Boolean @default(false) // 是否已处理
164
+ createdAt DateTime @default(now()) @map("created_at") // 事件产生时间
165
+ processedAt DateTime? @map("processed_at") // 处理完成时间
166
+ retryCount Int @default(0) @map("retry_count") // 处理失败重试次数
167
+ lastError String? @db.Text @map("last_error") // 最近一次失败的错误信息
168
+
169
+ @@index([createdAt], map: "idx_outbox_created_at")
170
+ @@map("t_workflow_event_outbox")
171
+ }
@@ -0,0 +1,60 @@
1
+ import { ModelConfig } from "../.types";
2
+ import { pageActions, PAGE_SIZE } from "./_common";
3
+
4
+ export const AgendaJob: ModelConfig =
5
+ {
6
+ metadata: {
7
+ nameKeys: ["name"],
8
+ pageActions,
9
+ },
10
+ table: {
11
+ toolbar: {
12
+ searchBar: {
13
+ fields: ["id","name"],
14
+ containsFields: ["name"],
15
+ placeholder: "id,name",
16
+ },
17
+ actions: [
18
+ {action: 'REFRESH', desc: 'Refresh'},
19
+ {action: 'SETTING', desc: 'Setting'},
20
+ {
21
+ action: "EXPORT",
22
+ desc: 'export',
23
+ fields: ["*","!createdAt","!created_at"]
24
+ },
25
+ ],
26
+ },
27
+ header: {
28
+ filter: [],
29
+ sorter: ["id"],
30
+ },
31
+ fields: ["*","!createdAt","!created_at"],
32
+ rowSelection: {
33
+ actions: [
34
+ {action: 'EXPORT', desc: 'Export'},
35
+ ],
36
+ },
37
+ rowActions: {
38
+ visibleNum: 1,
39
+ actions: [],
40
+ },
41
+ params: {
42
+ pageSize: PAGE_SIZE,
43
+ },
44
+ },
45
+ form: {
46
+ fields: ["*","!creator","!createdAt","!updatedAt","!created_at","!updated_at"],
47
+ reaction: {
48
+ id: {
49
+ toggle: [],
50
+ defaultProps: {
51
+ hidden: true,
52
+ },
53
+ },
54
+ },
55
+ },
56
+ show: {
57
+ fields: ["*","!createdAt","!created_at"],
58
+ },
59
+ }
60
+ ;
@@ -28,7 +28,7 @@ export const Event: ModelConfig =
28
28
  filter: [],
29
29
  sorter: ["id"],
30
30
  },
31
- fields: ["*","!created_at","!businessRequester","!number","!additionalInfo","!snSysId","!oitOwner","!createdAt","!endDate","!creator","!updatedAt","!startDate"],
31
+ fields: ["*","!created_at","!businessRequester","!number","!additionalInfo","!snSysId","!oitOwner","!createdAt","!endDate","!creator","!updatedAt","!startDate","!eventType"],
32
32
  rowSelection: {
33
33
  actions: [
34
34
  {action: 'INSERT', desc: 'Insert'},
@@ -0,0 +1,62 @@
1
+ import { ModelConfig } from "../.types";
2
+ import { pageActions, PAGE_SIZE } from "./_common";
3
+
4
+ export const WorkflowEventOutbox: ModelConfig =
5
+ {
6
+ metadata: {
7
+ nameKeys: ["id"],
8
+ pageActions,
9
+ },
10
+ table: {
11
+ toolbar: {
12
+ searchBar: {
13
+ fields: ["id"],
14
+ containsFields: [],
15
+ placeholder: "id",
16
+ },
17
+ actions: [
18
+ {action: 'REFRESH', desc: 'Refresh'},
19
+ {action: 'SETTING', desc: 'Setting'},
20
+ {
21
+ action: "EXPORT",
22
+ desc: 'export',
23
+ fields: ["*","!createdAt","!created_at"]
24
+ },
25
+ ],
26
+ },
27
+ header: {
28
+ filter: [],
29
+ sorter: ["id"],
30
+ },
31
+ fields: ["*","!createdAt","!created_at", "!payload"],
32
+ rowSelection: {
33
+ actions: [
34
+ {action: 'EXPORT', desc: 'Export'},
35
+ ],
36
+ },
37
+ rowActions: {
38
+ visibleNum: 1,
39
+ actions: [
40
+ {action: "DETAIL", desc: 'Detail'},
41
+ ],
42
+ },
43
+ params: {
44
+ pageSize: PAGE_SIZE,
45
+ },
46
+ },
47
+ form: {
48
+ fields: ["*","!creator","!createdAt","!updatedAt","!created_at","!updated_at"],
49
+ reaction: {
50
+ id: {
51
+ toggle: [],
52
+ defaultProps: {
53
+ hidden: true,
54
+ },
55
+ },
56
+ },
57
+ },
58
+ show: {
59
+ fields: ["*","!createdAt","!created_at"],
60
+ },
61
+ }
62
+ ;
@@ -0,0 +1,62 @@
1
+ import { ModelConfig } from "../.types";
2
+ import { pageActions, PAGE_SIZE } from "./_common";
3
+
4
+ export const WorkflowNodeInstance: ModelConfig =
5
+ {
6
+ metadata: {
7
+ nameKeys: ["id"],
8
+ pageActions,
9
+ },
10
+ table: {
11
+ toolbar: {
12
+ searchBar: {
13
+ fields: ["id"],
14
+ containsFields: ["name"],
15
+ placeholder: "Search by name",
16
+ },
17
+ actions: [
18
+ {action: 'REFRESH', desc: 'Refresh'},
19
+ {action: 'SETTING', desc: 'Setting'},
20
+ ],
21
+ },
22
+ header: {
23
+ filter: [],
24
+ sorter: ["id"],
25
+ },
26
+ fields: ["*","!createdAt"],
27
+ rowSelection: {
28
+ actions: [
29
+ {action: 'INSERT', desc: 'Insert'},
30
+ {action: 'DELETE', desc: 'Delete'},
31
+ ],
32
+ },
33
+ rowActions: {
34
+ visibleNum: 2,
35
+ actions: [
36
+ {
37
+ action: "EDIT",
38
+ desc: "Edit",
39
+ },
40
+ {action: "DELETE", desc: 'Delete'}
41
+ ],
42
+ },
43
+ params: {
44
+ pageSize: PAGE_SIZE,
45
+ },
46
+ },
47
+ form: {
48
+ fields: ["*","!creator","!createdAt","!updatedAt"],
49
+ reaction: {
50
+ id: {
51
+ toggle: [],
52
+ defaultProps: {
53
+ hidden: true,
54
+ },
55
+ },
56
+ },
57
+ },
58
+ show: {
59
+ fields: ["*","!createdAt"],
60
+ },
61
+ }
62
+ ;
@@ -0,0 +1,62 @@
1
+ import { ModelConfig } from "../.types";
2
+ import { pageActions, PAGE_SIZE } from "./_common";
3
+
4
+ export const WorkflowNodeType: ModelConfig =
5
+ {
6
+ metadata: {
7
+ nameKeys: ["id"],
8
+ pageActions,
9
+ },
10
+ table: {
11
+ toolbar: {
12
+ searchBar: {
13
+ fields: ["id"],
14
+ containsFields: ["label", "type"],
15
+ placeholder: "Search by label or type",
16
+ },
17
+ actions: [
18
+ {action: 'REFRESH', desc: 'Refresh'},
19
+ {action: 'SETTING', desc: 'Setting'},
20
+ ],
21
+ },
22
+ header: {
23
+ filter: [],
24
+ sorter: ["id"],
25
+ },
26
+ fields: ["*","!createdAt"],
27
+ rowSelection: {
28
+ actions: [
29
+ {action: 'INSERT', desc: 'Insert'},
30
+ {action: 'DELETE', desc: 'Delete'},
31
+ ],
32
+ },
33
+ rowActions: {
34
+ visibleNum: 2,
35
+ actions: [
36
+ {
37
+ action: "EDIT",
38
+ desc: "Edit",
39
+ },
40
+ {action: "DELETE", desc: 'Delete'}
41
+ ],
42
+ },
43
+ params: {
44
+ pageSize: PAGE_SIZE,
45
+ },
46
+ },
47
+ form: {
48
+ fields: ["*","!creator","!createdAt","!updatedAt"],
49
+ reaction: {
50
+ id: {
51
+ toggle: [],
52
+ defaultProps: {
53
+ hidden: true,
54
+ },
55
+ },
56
+ },
57
+ },
58
+ show: {
59
+ fields: ["*","!createdAt"],
60
+ },
61
+ }
62
+ ;
@@ -29,3 +29,8 @@ OTEL_TRACES_EXPORTER=otlp
29
29
  OTEL_RESOURCE_ATTRIBUTES_TOKEN=xxxx
30
30
  OTEL_EXPORTER_OTLP_PROTOCOL=http
31
31
  OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=http://pl.ap-singapore.apm.tencentcs.com:4319
32
+
33
+ # Temporal Workflow Engine
34
+ TEMPORAL_ADDRESS=localhost:7233
35
+ TEMPORAL_NAMESPACE=default
36
+ TEMPORAL_TASK_QUEUE=workflow-execution
@@ -1,5 +1,5 @@
1
1
  {
2
- "name": "erp-backend",
2
+ "name": "server",
3
3
  "version": "0.0.1",
4
4
  "description": "",
5
5
  "author": "",
@@ -36,7 +36,7 @@
36
36
  "dependencies": {
37
37
  "@agendajs/postgres-backend": "^3.0.5",
38
38
  "@azure/identity": "^4.13.0",
39
- "@gadmin2n/nest-common": "^0.0.42",
39
+ "@gadmin2n/nest-common": "^0.0.45",
40
40
  "@nestjs/cache-manager": "^3.0.1",
41
41
  "@nestjs/common": "^10.4.15",
42
42
  "@nestjs/config": "^3.2.0",
@@ -46,6 +46,7 @@
46
46
  "@nestjs/schedule": "^4.0.1",
47
47
  "@nestjs/serve-static": "^4.0.1",
48
48
  "@nestjs/swagger": "^7.3.0",
49
+ "@temporalio/client": "^1.11.6",
49
50
  "@opentelemetry/api": "^1.9.0",
50
51
  "@opentelemetry/exporter-trace-otlp-grpc": "^0.211.0",
51
52
  "@opentelemetry/instrumentation-express": "^0.47.0",
@@ -87,8 +88,8 @@
87
88
  },
88
89
  "devDependencies": {
89
90
  "@faker-js/faker": "^10.4.0",
90
- "@gadmin2n/prisma-nest-generator": "^0.0.36",
91
- "@gadmin2n/prisma-react-generator": "^0.0.52",
91
+ "@gadmin2n/prisma-nest-generator": "^0.0.38",
92
+ "@gadmin2n/prisma-react-generator": "^0.0.54",
92
93
  "@nestjs/testing": "^10.4.15",
93
94
  "@types/cookie-parser": "^1.4.3",
94
95
  "@types/express": "^4.17.21",
@@ -1,16 +1,23 @@
1
- import 'dotenv/config';
1
+ import * as dotenv from 'dotenv';
2
+ import * as path from 'path';
2
3
  import { defineConfig } from 'prisma/config';
3
4
 
5
+ // Load .env.local first (higher priority), then .env
6
+ dotenv.config({ path: path.resolve(__dirname, '.env.local') });
7
+ dotenv.config({ path: path.resolve(__dirname, '.env') });
8
+
4
9
  export default defineConfig({
10
+ engine: 'classic',
11
+ datasource: {
12
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
13
+ url: process.env.DATABASE_URL!,
14
+ },
5
15
  experimental: {
6
16
  externalTables: true,
7
17
  },
8
- // 将要被 Prisma 标记为“外部管理”的表名列表
9
- // 可以使用 "schema.table" 或仅 "table"(依你 DB/项目设置)
10
18
  tables: {
11
- external: [
12
- 'public.users', // public.users
13
- ],
19
+ // 将要被 Prisma 标记为“外部管理”的表名列表
20
+ // 可以使用 "schema.table" 或仅 "table"(依你 DB/项目设置)
21
+ external: ['public.users'],
14
22
  },
15
- // 其余配置项...
16
23
  });
@@ -1,12 +1,16 @@
1
1
  import { PrismaClient } from '@prisma/client';
2
2
  import { seedPermissions } from './permissions';
3
3
  import users from './users';
4
+ import { seedNodeTypes } from './workflow-node-types';
5
+ import { seedWorkflows } from './workflows';
4
6
 
5
7
  const prisma = new PrismaClient();
6
8
 
7
9
  export async function main() {
8
10
  await prisma.user.createMany({ data: users, skipDuplicates: true });
9
11
  await seedPermissions(prisma);
12
+ await seedNodeTypes(prisma);
13
+ await seedWorkflows(prisma);
10
14
  }
11
15
 
12
16
  if (require.main === module) {