From 448285776ca695e28450c1f20d60be1c30969670 Mon Sep 17 00:00:00 2001 From: 18628386721 <18628386721@163.com> Date: Tue, 28 Jul 2026 16:54:51 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E6=8E=89=E6=B5=81=E7=A8=8B=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E7=9A=84=E3=80=8C=E5=A5=91=E7=BA=A6=E7=BB=86=E8=8A=82?= =?UTF-8?q?=E3=80=8D=E6=AE=B5=20=E2=80=94=E2=80=94=20=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E5=88=B0=E8=8A=82=E7=82=B9=E5=B1=9E=E6=80=A7=E4=B8=BA=E6=AD=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 它的三块都已有更好的去处或本就冗余:边映射的问题由异常看板逐条点名(还能点击定位), 调用接口在画布「开始」节点的属性里,触发器有自己的页签。 连带清掉因此变成死代码的整页 EdgesPage(路由类型 / 壳分发 / 出口 / 死 import 一并删, 不留只进不出的入口)。 详情页现在就四件:版本卡 · 流程图 · 异常看板 · 节点属性。 typecheck ✓ lint ✓ depcruise ✓ 506 测试 ✓ Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m --- apps/web/src/app/gov-shell.tsx | 4 +- apps/web/src/features/gov-process/index.ts | 2 +- .../features/gov-process/internal/panel.tsx | 184 +----------------- apps/web/src/shared/gov/gov-route.ts | 3 - 4 files changed, 4 insertions(+), 189 deletions(-) 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':