@gadmin2n/schematics 0.0.142 → 0.0.144

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 (140) hide show
  1. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/workflow.prisma +5 -23
  2. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/lib/page-helpers.ts +4 -2
  3. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/page-manage.ts +36 -1
  4. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/agenda.seed.ts +14 -14
  5. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/bootstrap.ts +18 -13
  6. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/canvas.seed.ts +14 -14
  7. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/index.ts +1 -1
  8. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-node-types.ts +67 -404
  9. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow.seed.ts +16 -40
  10. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflows.ts +12 -124
  11. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/app.module.ts +3 -0
  12. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/config/index.ts +0 -21
  13. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.controller.ts +3 -10
  14. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/codeRuntime.module.ts +1 -2
  15. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-callback.controller.spec.ts +48 -0
  16. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-callback.controller.ts +96 -0
  17. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.spec.ts +1 -59
  18. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.ts +8 -43
  19. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.dto.ts +0 -23
  20. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.service.ts +2 -0
  21. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-wait.handler.ts +2 -0
  22. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/externalInteraction.module.ts +7 -3
  23. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/workflow-callback-url.controller.ts +2 -2
  24. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/workflow-callback-url.service.spec.ts +18 -123
  25. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/workflow-callback-url.service.ts +4 -0
  26. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.controller.ts +3 -10
  27. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/httpRequest.module.ts +1 -2
  28. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.controller.ts +0 -10
  29. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.dto.ts +12 -4
  30. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.errors.ts +1 -1
  31. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.external-decision.spec.ts +42 -209
  32. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.service.ts +108 -225
  33. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/humanApproval.module.ts +0 -2
  34. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.controller.ts +27 -22
  35. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.dto.ts +9 -1
  36. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/runtime-token.guard.spec.ts +30 -0
  37. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/runtime-token.guard.ts +8 -15
  38. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/index.ts +0 -2
  39. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/runtime-connectivity-probe.service.spec.ts +14 -0
  40. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/runtime-connectivity-probe.service.ts +37 -0
  41. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/temporalTenantConfig.controller.spec.ts +41 -0
  42. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/temporalTenantConfig.controller.ts +53 -0
  43. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/temporalTenantConfig.module.ts +7 -2
  44. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/workflow-runtime-health.controller.ts +21 -0
  45. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/dsl-validate.util.spec.ts +2 -2
  46. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.spec.ts +16 -88
  47. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.ts +23 -59
  48. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.spec.ts +125 -39
  49. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.ts +95 -28
  50. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-handle-validator.ts +0 -20
  51. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-http-response.spec.ts +23 -26
  52. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-http-response.ts +6 -52
  53. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.ts +2 -2
  54. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.spec.ts +24 -0
  55. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.ts +26 -21
  56. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.spec.ts +0 -1
  57. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.ts +0 -1
  58. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowRuntimeConfig/workflow-runtime-config.service.spec.ts +32 -0
  59. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowRuntimeConfig/workflow-runtime-config.service.ts +41 -0
  60. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowRuntimeConfig/workflowRuntimeConfig.module.ts +10 -0
  61. package/dist/lib/application/files/gadmin2-game-angle-demo/server/tsconfig.build.json +10 -1
  62. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/README.md +16 -12
  63. package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +1 -1
  64. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/PageHeader.tsx +1 -1
  65. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/inspectorActions.ts +19 -19
  66. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/color-mode/index.tsx +1 -1
  67. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/header.tsx +15 -11
  68. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +0 -6
  69. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddDataModal.tsx +3 -3
  70. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddPageModal.tsx +1 -1
  71. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DeleteDataConfirm.tsx +1 -1
  72. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/EditDataModal.tsx +1 -1
  73. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useDynamicResources.tsx +1 -0
  74. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/workflow.json +85 -95
  75. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/workflow.json +85 -95
  76. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/index.tsx +2 -2
  77. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/list.tsx +21 -2
  78. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/list.tsx +21 -2
  79. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/inbox.tsx +14 -66
  80. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/list.tsx +4 -4
  81. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/list.tsx +3 -3
  82. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/list.tsx +3 -3
  83. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CustomNode.test.tsx +29 -0
  84. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CustomNode.tsx +4 -2
  85. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/EnhancedFlowRenderer.tsx +4 -6
  86. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.test.tsx +3 -0
  87. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.tsx +3 -1
  88. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/FlowRenderer.tsx +4 -6
  89. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NewNodeDefaults.test.tsx +23 -92
  90. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeOutputSummary.tsx +200 -0
  91. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.test.tsx +61 -136
  92. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.tsx +96 -195
  93. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeTypeBadge.tsx +36 -0
  94. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/CreateNodeInstanceModal.tsx +5 -10
  95. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/NodeInstanceForm.tsx +47 -22
  96. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/create.tsx +7 -5
  97. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/edit.tsx +8 -6
  98. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/node-config.css +35 -0
  99. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/default-widgets.tsx +1 -6
  100. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.tsx +1 -4
  101. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CodeConfigEditor.tsx +1 -1
  102. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalRequestConfigEditor.tsx +1 -1
  103. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalWaitConfigEditor.tsx +82 -259
  104. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HttpRequestConfigEditor.tsx +1 -2
  105. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.test.tsx +7 -6
  106. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.tsx +77 -71
  107. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.test.tsx +10 -57
  108. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.tsx +8 -273
  109. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/temporal-tenant/index.test.tsx +54 -0
  110. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/temporal-tenant/index.tsx +110 -20
  111. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/newNodeConfig.ts +4 -34
  112. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.test.ts +3 -10
  113. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.ts +2 -37
  114. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/list.tsx +26 -2
  115. package/package.json +1 -1
  116. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.controller.ts +0 -89
  117. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.dto.ts +0 -68
  118. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.service.spec.ts +0 -177
  119. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.service.ts +0 -283
  120. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approvalChannel.module.ts +0 -10
  121. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/ApprovalChannelModal.test.tsx +0 -84
  122. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/ApprovalChannelModal.tsx +0 -141
  123. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/approval-channel.types.ts +0 -16
  124. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/index.tsx +0 -210
  125. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRequestTriggerConfigEditor.tsx +0 -39
  126. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubmitApprovalResultConfigEditor.tsx +0 -104
  127. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubmitExternalResultConfigEditor.tsx +0 -98
  128. /package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/{Components → components}/AssignRolesModal.tsx +0 -0
  129. /package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/{Components → components}/CreatePageModal.tsx +0 -0
  130. /package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/{Components → components}/EditPageModal.tsx +0 -0
  131. /package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/{Components → components}/PageDetailDrawer.tsx +0 -0
  132. /package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/{Components → components}/PageFormModal.tsx +0 -0
  133. /package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/{Components → components}/CreateModal.tsx +0 -0
  134. /package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/{Components → components}/EditModal.tsx +0 -0
  135. /package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/{Components → components}/ResourceDetailDrawer.tsx +0 -0
  136. /package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/{Components → components}/modal.tsx +0 -0
  137. /package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/{Components → components}/CreateModal.tsx +0 -0
  138. /package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/{Components → components}/EditModal.tsx +0 -0
  139. /package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/{Components → components}/RoleDetailDrawer.tsx +0 -0
  140. /package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/{Components → components}/modal.tsx +0 -0
@@ -76,7 +76,6 @@ model Workflow {
76
76
 
77
77
  versions WorkflowVersion[]
78
78
  instances WorkflowInstance[]
79
- approvalChannelsAsDispatch ApprovalChannel[] @relation("ApprovalChannelDispatch")
80
79
 
81
80
  @@map("t_workflow")
82
81
  }
@@ -293,7 +292,9 @@ model WorkflowNodeInstance {
293
292
  /// never copied into Node Templates or WorkflowVersion DSL snapshots.
294
293
  /// @IgnoreNestCode
295
294
  /// @IgnoreReactCode
295
+ /// @IgnoreAutoField
296
296
  model IntegrationConnection {
297
+ id BigInt @id @default(autoincrement())
297
298
  code String @unique @default(nanoid()) @db.VarChar(64)
298
299
  name String @db.VarChar(128)
299
300
  description String? @db.VarChar(512)
@@ -304,32 +305,13 @@ model IntegrationConnection {
304
305
  encryptedSecrets String? @db.Text @map("encrypted_secrets")
305
306
  isEnabled Boolean @default(true) @map("is_enabled")
306
307
  revision Int @default(1)
308
+ creator String? @map("creator") @db.VarChar(128)
309
+ createdAt DateTime @default(now()) @map("created_at")
310
+ updatedAt DateTime @updatedAt @default(now()) @map("updated_at")
307
311
 
308
312
  @@map("t_integration_connection")
309
313
  }
310
314
 
311
- /// Reusable dispatch bridge between Human Approval and provider-specific workflows.
312
- /// @IgnoreNestCode
313
- /// @IgnoreReactCode
314
- /// @IgnoreAutoField
315
- model ApprovalChannel {
316
- id BigInt @id @default(autoincrement())
317
- code String @unique @db.VarChar(64)
318
- name String @db.VarChar(128)
319
- description String? @db.VarChar(512)
320
- dispatchWorkflowId BigInt @map("dispatch_workflow_id")
321
- isEnabled Boolean @default(true) @map("is_enabled")
322
- revision Int @default(1)
323
- creator String @default("") @db.VarChar(128)
324
- createdAt DateTime @default(now()) @map("created_at")
325
- updatedAt DateTime @updatedAt @map("updated_at")
326
-
327
- dispatchWorkflow Workflow @relation("ApprovalChannelDispatch", fields: [dispatchWorkflowId], references: [id], onDelete: Restrict)
328
-
329
- @@index([dispatchWorkflowId], map: "idx_ac_dispatch_workflow_id")
330
- @@map("t_approval_channel")
331
- }
332
-
333
315
  // Outbox Pattern:业务表触发器将事件写入此表,outbox-poller 定时扫描并触发 workflow
334
316
  /// @IgnoreAutoField
335
317
  model WorkflowEventOutbox {
@@ -98,7 +98,8 @@ export async function bindResourceToPage(
98
98
  );
99
99
  await prisma.pageResource.upsert({
100
100
  where: { pageId_resourceId: { pageId, resourceId: resource.id } },
101
- update: { actions: FULL_ACTIONS },
101
+ // update: {} — 保留 DB 里手工调整的 actions
102
+ update: {},
102
103
  create: { pageId, resourceId: resource.id, actions: FULL_ACTIONS },
103
104
  });
104
105
  return resource;
@@ -125,7 +126,8 @@ export async function grantRoleAccess(
125
126
  for (const resourceId of resourceIds) {
126
127
  await prisma.roleResource.upsert({
127
128
  where: { roleId_resourceId: { roleId, resourceId } },
128
- update: { actions: FULL_ACTIONS },
129
+ // update: {} — 与 RolePages 一致:保留 DB 里手工收窄的 actions
130
+ update: {},
129
131
  create: { roleId, resourceId, actions: FULL_ACTIONS },
130
132
  });
131
133
  }
@@ -25,6 +25,9 @@
25
25
  * ── 删除页面 ──────────────────────────────────────────────────────────────────
26
26
  * ts-node scripts/page-manage.ts delete \
27
27
  * --pageCode myModule (required)
28
+ * --withResources (optional — also delete Resource rows that are
29
+ * bound ONLY to this page, plus their RoleResource
30
+ * rows; shared or isCommonResource resources are kept)
28
31
  *
29
32
  * ── 绑定资源 ──────────────────────────────────────────────────────────────────
30
33
  * ts-node scripts/page-manage.ts bind \
@@ -174,7 +177,7 @@ async function actionUpdate(flags: Record<string, string>) {
174
177
  }
175
178
 
176
179
  async function actionDelete(flags: Record<string, string>) {
177
- const { pageCode } = flags;
180
+ const { pageCode, withResources } = flags;
178
181
  if (!pageCode) {
179
182
  console.error('[page-manage] --pageCode is required.');
180
183
  process.exit(1);
@@ -182,6 +185,11 @@ async function actionDelete(flags: Record<string, string>) {
182
185
 
183
186
  const page = await requirePage(pageCode);
184
187
 
188
+ const pageResources = await prisma.pageResource.findMany({
189
+ where: { pageId: page.id },
190
+ include: { resource: true },
191
+ });
192
+
185
193
  await prisma.pageResource.deleteMany({ where: { pageId: page.id } });
186
194
  await prisma.rolePages.deleteMany({ where: { pageId: page.id } });
187
195
  await prisma.page.delete({ where: { id: page.id } });
@@ -189,6 +197,33 @@ async function actionDelete(flags: Record<string, string>) {
189
197
  console.log(
190
198
  `[page-manage] ✖ Deleted page: ${pageCode} (id=${page.id}) + its PageResource + RolePages rows`,
191
199
  );
200
+
201
+ if (withResources === 'true') {
202
+ for (const pr of pageResources) {
203
+ if (pr.resource.isCommonResource) {
204
+ console.warn(
205
+ `[page-manage] ⚠ Resource "${pr.resource.code}" is a common resource — kept`,
206
+ );
207
+ continue;
208
+ }
209
+ const otherBindings = await prisma.pageResource.count({
210
+ where: { resourceId: pr.resourceId },
211
+ });
212
+ if (otherBindings > 0) {
213
+ console.warn(
214
+ `[page-manage] ⚠ Resource "${pr.resource.code}" still bound to ${otherBindings} other page(s) — kept`,
215
+ );
216
+ continue;
217
+ }
218
+ await prisma.roleResource.deleteMany({
219
+ where: { resourceId: pr.resourceId },
220
+ });
221
+ await prisma.resource.delete({ where: { id: pr.resourceId } });
222
+ console.log(
223
+ `[page-manage] ✖ Deleted resource: ${pr.resource.code} (+ its RoleResource rows)`,
224
+ );
225
+ }
226
+ }
192
227
  }
193
228
 
194
229
  async function actionBind(flags: Record<string, string>) {
@@ -1,5 +1,4 @@
1
1
  import { PrismaClient } from '@prisma/client';
2
- import { ADMIN_PAGE_CODE } from '../scripts/lib/admin-code';
3
2
  import {
4
3
  bindResourceToPage,
5
4
  getPageResourceIds,
@@ -10,25 +9,26 @@ import {
10
9
  /**
11
10
  * Agenda 模块 seed
12
11
  *
13
- * 职责:agenda page (顶级 admin/administration 子节点) + agenda resource + 自家 SYSTEM_ADMIN 授权。
14
- * 前置:seedBootstrap 已建好 顶级 page 与 SYSTEM_ADMIN。
12
+ * 职责:agenda page (与 admin 平级的顶级菜单) + agenda resource + 自家 SYSTEM_ADMIN 授权。
13
+ * 前置:seedBootstrap 已建好 SYSTEM_ADMIN。
15
14
  */
16
15
  export async function seedAgendaModule(prisma: PrismaClient): Promise<void> {
17
16
  const role = await prisma.role.findUniqueOrThrow({
18
17
  where: { name: 'SYSTEM_ADMIN' },
19
18
  });
20
- const admin = await prisma.page.findUniqueOrThrow({
21
- where: { code: ADMIN_PAGE_CODE },
22
- });
23
19
 
24
- const page = await upsertPage(prisma, {
25
- code: 'agenda',
26
- name: 'agenda',
27
- zhName: 'Cron Jobs',
28
- enName: 'Cron Jobs',
29
- sortOrder: 1020,
30
- parentId: admin.id,
31
- });
20
+ const page = await upsertPage(
21
+ prisma,
22
+ {
23
+ code: 'agenda',
24
+ name: 'agenda',
25
+ zhName: 'Cron Jobs',
26
+ enName: 'Cron Jobs',
27
+ sortOrder: 1040,
28
+ },
29
+ // 从「系统管理」子菜单提升为顶级菜单:同步 parentId/排序到已有 DB
30
+ { parentId: null, sortOrder: 1040 },
31
+ );
32
32
  console.log(`[agenda] Page: ${page.code} (id=${page.id})`);
33
33
 
34
34
  await bindResourceToPage(prisma, page.id, 'agenda', 'Agenda job management');
@@ -7,9 +7,9 @@ import { grantRoleAccess, upsertPage } from '../scripts/lib/page-helpers';
7
7
  *
8
8
  * 任何模块 seed 都假设以下 3 个对象已存在:
9
9
  * 1. SYSTEM_ADMIN 角色 —— 各模块 grant SYSTEM_ADMIN 时通过 name 查找
10
- * 2. ADMIN_PAGE_CODE 顶级 page —— 各业务模块 page 的 parentId
10
+ * 2. ADMIN_PAGE_CODE 顶级 page —— 系统内置模块(permission/audit/game)page 的 parentId
11
11
  * (默认 'admin';ERP 通过环境变量 ADMIN_PAGE_CODE=administration 覆盖)
12
- * 3. dataMngt 分组 page —— 自动生成 CRUD 页面(data-mngt.seed.ts)的 parentId
12
+ * 3. dataMngt 顶级分组 page —— 自动生成 CRUD 页面(data-mngt.seed.ts)的 parentId
13
13
  *
14
14
  * 同时把 SYSTEM_ADMIN 对 顶级 / dataMngt 这两个分组节点的 RolePages 也建好,
15
15
  * 否则它们的子菜单父节点不会展开。
@@ -39,21 +39,26 @@ export async function seedBootstrap(prisma: PrismaClient): Promise<void> {
39
39
  name: ADMIN_PAGE_CODE,
40
40
  zhName: '系统管理',
41
41
  enName: 'System Mgnt',
42
- sortOrder: 1000,
42
+ // 排顶级菜单最下面:业务菜单用 10xx
43
+ sortOrder: 1050,
43
44
  },
44
- { zhName: '系统管理', enName: 'System Mgnt', sortOrder: 1000 },
45
+ { zhName: '系统管理', enName: 'System Mgnt', sortOrder: 1050 },
45
46
  );
46
47
  console.log(`[bootstrap] Page: ${adminPage.code} (id=${adminPage.id})`);
47
48
 
48
- // ── dataMngt 分组 page(自动 CRUD 菜单容器) ──────────────────────────────
49
- const dataMngtPage = await upsertPage(prisma, {
50
- code: 'dataMngt',
51
- name: '数据管理',
52
- zhName: '数据管理',
53
- enName: 'Data Management',
54
- sortOrder: 1000,
55
- parentId: adminPage.id,
56
- });
49
+ // ── dataMngt 分组 page(自动 CRUD 菜单容器,与 admin 平级的顶级菜单) ──────
50
+ const dataMngtPage = await upsertPage(
51
+ prisma,
52
+ {
53
+ code: 'dataMngt',
54
+ name: '数据管理',
55
+ zhName: '数据管理',
56
+ enName: 'Data Management',
57
+ sortOrder: 1010,
58
+ },
59
+ // 从「系统管理」子菜单提升为顶级菜单:同步 parentId/排序到已有 DB
60
+ { parentId: null, sortOrder: 1010 },
61
+ );
57
62
  console.log(`[bootstrap] Page: ${dataMngtPage.code} (id=${dataMngtPage.id})`);
58
63
 
59
64
  // ── 分组 page 的 SYSTEM_ADMIN RolePages(无 resource) ──────────────────────
@@ -1,5 +1,4 @@
1
1
  import { PrismaClient } from '@prisma/client';
2
- import { ADMIN_PAGE_CODE } from '../scripts/lib/admin-code';
3
2
  import {
4
3
  bindResourceToPage,
5
4
  getPageResourceIds,
@@ -10,25 +9,26 @@ import {
10
9
  /**
11
10
  * Canvas 模块 seed
12
11
  *
13
- * 职责:canvas page (顶级 admin/administration 子节点) + canvas resource + 自家 SYSTEM_ADMIN 授权。
14
- * 前置:seedBootstrap 已建好 顶级 page 与 SYSTEM_ADMIN。
12
+ * 职责:canvas page (与 admin 平级的顶级菜单) + canvas resource + 自家 SYSTEM_ADMIN 授权。
13
+ * 前置:seedBootstrap 已建好 SYSTEM_ADMIN。
15
14
  */
16
15
  export async function seedCanvasModule(prisma: PrismaClient): Promise<void> {
17
16
  const role = await prisma.role.findUniqueOrThrow({
18
17
  where: { name: 'SYSTEM_ADMIN' },
19
18
  });
20
- const admin = await prisma.page.findUniqueOrThrow({
21
- where: { code: ADMIN_PAGE_CODE },
22
- });
23
19
 
24
- const page = await upsertPage(prisma, {
25
- code: 'canvas',
26
- name: 'canvas',
27
- zhName: 'Canvas',
28
- enName: 'Canvas',
29
- sortOrder: 1010,
30
- parentId: admin.id,
31
- });
20
+ const page = await upsertPage(
21
+ prisma,
22
+ {
23
+ code: 'canvas',
24
+ name: 'canvas',
25
+ zhName: 'Canvas',
26
+ enName: 'Canvas',
27
+ sortOrder: 1020,
28
+ },
29
+ // 从「系统管理」子菜单提升为顶级菜单:同步 parentId/排序到已有 DB
30
+ { parentId: null, sortOrder: 1020 },
31
+ );
32
32
  console.log(`[canvas] Page: ${page.code} (id=${page.id})`);
33
33
 
34
34
  await bindResourceToPage(prisma, page.id, 'canvas', 'Canvas management');
@@ -44,7 +44,7 @@ export async function main() {
44
44
  if (require.main === module) {
45
45
  main()
46
46
  .catch((e) => {
47
- console.log(e);
47
+ console.error(e);
48
48
  process.exit(1);
49
49
  })
50
50
  .finally(async () => {