diff --git a/apps/web/src/app/gov-shell.tsx b/apps/web/src/app/gov-shell.tsx index 8301e02..77c3d13 100644 --- a/apps/web/src/app/gov-shell.tsx +++ b/apps/web/src/app/gov-shell.tsx @@ -26,7 +26,7 @@ import { queryKeys } from './query.ts'; import { BlueprintHome } from '@features/gov-blueprint'; import { TasksHome, TaskLogPage, TaskPage, WfPage } from '@features/gov-task'; import { EmpPage, PeopleHome, RolePage } from '@features/gov-staff'; -import { EdgesPage, PkgPage, WorkflowsHome } from '@features/gov-process'; +import { PkgPage, WorkflowsHome } from '@features/gov-process'; import { TriggerPage } from '@features/gov-trigger'; import { ActPage, LibraryHome } from '@features/gov-activity'; import { ToolPage, ToolsHome } from '@features/gov-tool'; @@ -308,8 +308,6 @@ function Detail({ route, nav }: { route: Route; nav: Nav }) { return ; case 'pkg': return ; - case 'edges': - return ; case 'trigger': return ; case 'act': diff --git a/apps/web/src/features/gov-process/index.ts b/apps/web/src/features/gov-process/index.ts index 06cb39e..ada37b5 100644 --- a/apps/web/src/features/gov-process/index.ts +++ b/apps/web/src/features/gov-process/index.ts @@ -2,4 +2,4 @@ * feature `gov-process` 唯一出口(编码规范 §9.1)。 * 流程包编排画布(diagram-js 画布件平移):连线即映射、画图即校验、不闭合不得发布 */ -export { WorkflowsHome, PkgPage, EdgesPage } from './internal/panel.tsx'; +export { WorkflowsHome, PkgPage } from './internal/panel.tsx'; diff --git a/apps/web/src/features/gov-process/internal/panel.tsx b/apps/web/src/features/gov-process/internal/panel.tsx index 60ac5c4..579cdf3 100644 --- a/apps/web/src/features/gov-process/internal/panel.tsx +++ b/apps/web/src/features/gov-process/internal/panel.tsx @@ -13,7 +13,7 @@ import { useMemo, useRef, useState, useEffect } from 'react'; import { useMutation, useQueryClient, useQuery } from '@tanstack/react-query'; import type { ClosureReport, ProcessPackage, ProcessNode } from '@contracts'; -import { processPackageSchema, saveProcessRoute, setProcessStateRoute, validateProcessRoute, TRIGGER_KIND_LABEL } from '@contracts'; +import { processPackageSchema, saveProcessRoute, setProcessStateRoute, validateProcessRoute } from '@contracts'; import { call } from '@web-shared/typed-fetch.ts'; import { Ico } from '@web-shared/Ico.tsx'; import type { AskSpec } from '@web-shared/gov/primitives.tsx'; @@ -22,23 +22,19 @@ import { AskBand, Card, Chip, - Entry, Field, Kpi, ListEdit, - NList, - NRow, Note, PageHead, Prop, QueryGate, - Rows, Sec, Seg, St, } from '@web-shared/gov/primitives.tsx'; import type { Nav } from '@web-shared/gov/gov-route.ts'; -import { useGovActivities, useGovPackages, useGovPkgReports, useGovStaff, useGovTriggers } from '@web-shared/gov/gov-api.ts'; +import { useGovActivities, useGovPackages, useGovPkgReports, useGovStaff } from '@web-shared/gov/gov-api.ts'; import type { GovActivities } from '@web-shared/gov/gov-api.ts'; import { FlowFigureBlock } from '@web-shared/gov/flow/FlowFigure.tsx'; import { packageToGraph } from '@web-shared/gov/flow/pkg-to-graph.ts'; @@ -567,9 +563,6 @@ function FlowLab({ URL.revokeObjectURL(url); }; - const triggersQ = useGovTriggers(); - const boundTriggers = (triggersQ.data?.triggers ?? []).filter((t) => t.processPackageId === pkg.id); - const callInput = pkg.callInterface.input as { required?: string[]; properties?: Record }; return ( <> @@ -990,179 +983,6 @@ function FlowLab({ - {/* 声明式契约细节:调用接口 · 边映射 · 触发器 —— 图之下,按查看频率排 */} - -
- - {ec.closed}/{ec.total} - - } - onClick={() => nav.push({ k: 'edges', id: `${pkg.id}@${pkg.version}` })} - /> -
- - - {Object.keys(callInput.properties ?? {}).length === 0 ? ( - 这条流还没声明入参 —— 谁调起它都不用带数据;要带,去画布点「开始」节点声明。 - ) : ( - ({ - k, - v: `${v.type ?? 'any'}${(callInput.required ?? []).includes(k) ? ' · 必填' : ''}`, - mono: true, - }))} - /> - )} - - - - {boundTriggers.length > 0 ? ( - - {boundTriggers.map((t) => ( - { - e.stopPropagation(); - nav.jump('workflows', 'rules'); - }} - > - 改规则 - - } - onClick={() => nav.jump('workflows', 'rules', { k: 'trigger', id: t.id })} - /> - ))} - - ) : ( - - 还没有触发器指向这条流 —— 它定义得再完整,也没人调得起来。去触发器页签配一条 - (周期 / 事件 / 登记三选一)。 - - )} - -
- - ); -} - -/* ---- 边映射校验(整页) ---- */ - -export function EdgesPage({ id }: { id: string }) { - const [pid, versionText] = id.split('@'); - const q = useGovPackages(); - const pkg = (q.data?.packages ?? []).find((p) => p.id === pid && String(p.version) === versionText); - const reports = useGovPkgReports(pkg === undefined ? [] : [pkg]); - if (pkg === undefined) { - return ( - - 流程包不存在。 - - ); - } - - const report = reports.data?.get(`${pkg.id}@${pkg.version}`); - const ec = edgeCheckOf(pkg, report); - const okEdge = ec.closed === ec.total; - const labelOf = (nodeId: string) => pkg.nodes.find((n) => n.id === nodeId)?.label ?? nodeId; - const sourceText = (m: ProcessPackage['edges'][number]['mapping'][number]) => { - const s = m.source; - switch (s.from) { - case 'initiation': - return `起单.${s.path}`; - case 'output-port': - return `${s.port}.${s.path}`; - case 'workflow-var': - return `流程变量.${s.name}`; - case 'constant': - return `常量 ${JSON.stringify(s.value)}`; - default: - return '表达式'; - } - }; - - return ( - <> - - {ec.closed} / {ec.total} 已闭合 - - } - desc="连线即映射:每条顺序边都要把上游输出口接到下游契约字段上,必填齐、类型无冲突才算闭合。边不闭合不得保存。" - /> - {!okEdge && report !== undefined && {report.violations.map((v) => v.message).join(';')}} - - - - - - - - - - - - {pkg.edges.map((e) => { - const bad = (report?.violations ?? []).filter((v) => v.edgeId === e.id); - return ( - - - - - - - ); - })} - -
边映射条数状态
- {labelOf(e.from)} → {labelOf(e.to)} - {e.label === undefined ? '' : `(${e.label})`} - - {e.mapping.length === 0 - ? '—' - : e.mapping.map((m) => `${sourceText(m)} → data.${m.target}`).join('; ')} - {bad.length > 0 && ( - <> -
- {bad.map((v) => v.message).join(';')} - - )} -
{e.mapping.length} - {bad.length === 0 ? ( - - 已闭合 - - ) : ( - - 未完成 - - )} -
-
); } diff --git a/apps/web/src/shared/gov/gov-route.ts b/apps/web/src/shared/gov/gov-route.ts index e28cf29..6a6e245 100644 --- a/apps/web/src/shared/gov/gov-route.ts +++ b/apps/web/src/shared/gov/gov-route.ts @@ -13,7 +13,6 @@ export type Route = | { k: 'emp'; id: string } | { k: 'role'; id: string } | { k: 'pkg'; id: string } - | { k: 'edges'; id: string } | { k: 'trigger'; id: string } | { k: 'act'; id: string } | { k: 'tool'; id: string } @@ -190,8 +189,6 @@ export function routeLabel(r: Route): string { return '岗位授权'; case 'pkg': return '流程包'; - case 'edges': - return '边映射'; case 'trigger': return '触发器'; case 'act':