运营中心撤掉「数据」区;流程包首页重排:卡有层次、⋯ 管编辑与删除、新建变幽灵卡

**运营 · 数据(活动记忆四层)整个撤掉** —— 记忆的放行口还没成形,摆一个空区不如
不摆;真要做时随「数据资产」一并重开。区表、面归属、shell 映射、KnowledgeHome /
MemPage、活动详情里那枚入口一并清干净;旧深链 `#/gov/memory/layers` 落运营首页
(测试跟着改口径,不留死链)。运营中心自此六区。

**流程包首页**:
  · 「编排要素:四种」这枚计数删了 —— 网关早废,它是句没人用的口号;
  · 卡片重做。从前是「头 + 芯片行 + 一大片空 + 脚注」,158 高全靠留白撑;
    现在两段:头(图标 · 名 · 标识 · 生效版 · ⋯)+ **数据板**(活动/审批/边闭合/版本
    四格等宽、竖线分隔)。段段有内容、段间有线,高矮由内容说了算 —— 实测 111 高;
  · 卡上 **⋯ 菜单**:编辑(就地改名,落在卡面那一版上)/ 删除(整条流,菜单原地翻成
    确认,不另弹窗);
  · **新建按钮变幽灵卡**:虚线卡住在货架末位,与真卡同宽同高(111/111)。

删整条流是新能力:`DELETE /api/gov/process/:id` + `process.deleteFlow`。
生效版这道闸不设(明示动作,不是手滑),在途单那道照设(PinnedVersionError → 409);
**「还有调起规则指着它」由路由层反查** —— process 是 L7,不该知道 trigger 的存在。

实测(丁子乔账号):改名往返、删除被 2 条调起规则如实挡回、幽灵卡建 `tmp-drop`
再删掉整条流,库里回到只剩 unified-quote v4,试跑数据已清。五闸绿。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
This commit is contained in:
2026-07-29 22:38:52 +08:00
co-authored by Claude Opus 5
parent f631b5b8bb
commit e5cfca638f
18 changed files with 392 additions and 164 deletions
+2 -5
View File
@@ -34,7 +34,7 @@ import { ToolPage, ToolsHome } from '@features/gov-tool';
import { DataHome, LedgersHome, ObjPage } from '@features/gov-data';
import { ArchiveHome } from '@features/gov-archive';
import { TestbedHome } from '@features/gov-testbed';
import { CockpitHome, KnowledgeHome, MemPage } from '@features/gov-memory';
import { CockpitHome } from '@features/gov-memory';
import { ChanPage, LlmPage, ModelsHome, SystemHome } from '@features/gov-system';
/* ── URL 编解码:`#/<surface>/<zone>/<tab>[/<k>:<id>…]` ────────────────── */
@@ -298,7 +298,6 @@ function ZoneHome({ zone, tab, nav }: { zone: GovZone; tab: string; nav: Nav })
tasks: TasksHome,
people: PeopleHome,
ledgers: LedgersHome,
knowledge: KnowledgeHome,
system: SystemHome,
}[zone];
return <P tab={tab} nav={nav} />;
@@ -322,13 +321,11 @@ function Detail({ route, nav }: { route: Route; nav: Nav }) {
case 'trigger':
return <TriggerPage id={route.id} />;
case 'act':
return <ActPage id={route.id} nav={nav} />;
return <ActPage id={route.id} />;
case 'tool':
return <ToolPage id={route.id} />;
case 'obj':
return <ObjPage id={route.id} />;
case 'mem':
return <MemPage id={route.id} />;
case 'llm':
return <LlmPage id={route.id} />;
case 'chan':
+39
View File
@@ -260,6 +260,45 @@
.g-tile-f > .g-btn { margin-left: auto; height: 24px; padding: 0 9px; font-size: 11px; }
.g-tile-f .r { margin-left: auto; font-family: var(--mono); color: var(--ink-4); }
/* ── 流程卡(货架)—— 两段:头(身份 · 状态 · ⋯)+ 数据板(四格计量) ──────
从前是「头 + 芯片行 + 一大片空 + 脚注」,卡撑到 158 高全靠留白;
现在段段有内容、段间有线,高矮由内容说了算。 */
.g-fcard { position: relative; display: flex; flex-direction: column; background: var(--card); border: 1px solid var(--cline); border-radius: 12px; box-shadow: var(--cshadow); overflow: hidden; transition: border-color var(--t-fast), box-shadow var(--t-fast), transform var(--t-fast); }
.g-fcard:hover { border-color: #c9d6e6; box-shadow: 0 5px 14px -5px rgba(19, 28, 38, .22); transform: translateY(-1px); }
/* 整面一枚透明按钮 = 进这条流;字面不吃点击,直接穿到它身上(卡里还住着 ⋯ 与输入框) */
.g-fcard > .hit { position: absolute; inset: 0; z-index: 0; border: 0; background: transparent; cursor: pointer; }
.g-fcard > .hit:focus-visible { outline: 2px solid var(--brand); outline-offset: -3px; border-radius: 12px; }
.g-fcard > .hd, .g-fcard > .plate { position: relative; z-index: 1; pointer-events: none; }
.g-fcard button, .g-fcard input { pointer-events: auto; }
.g-fcard > .hd { display: flex; align-items: center; gap: 9px; padding: 13px 12px 12px 13px; }
.g-fcard .ico { flex: none; width: 30px; height: 30px; border-radius: 9px; display: grid; place-items: center; color: var(--brand-deep); background: var(--brand-wash); }
.g-fcard.off .ico { color: var(--ink-4); background: #eef1f5; }
.g-fcard .ttl { flex: 1; min-width: 0; line-height: 1.3; }
.g-fcard .ttl b { display: block; font-size: 14px; font-weight: 700; color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.g-fcard .ttl em { display: block; font-style: normal; font-size: 10.5px; font-family: var(--mono); color: var(--ink-4); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.g-fcard .ttl .g-input { width: 100%; height: 25px; padding: 0 7px; font-size: 13px; }
.g-fcard .stx { flex: none; font: 600 10.5px/1 var(--mono); color: var(--ink-4); }
.g-fcard .stx.on { color: var(--ok); }
.g-fcard .mbtn { flex: none; width: 24px; height: 24px; display: grid; place-items: center; border: 1px solid transparent; border-radius: 7px; background: transparent; color: var(--ink-4); cursor: pointer; }
.g-fcard .mbtn:hover, .g-fcard .mbtn.on { border-color: var(--cline); background: #f3f6fa; color: var(--ink); }
/* 数据板:四格等宽、竖线分隔 —— 数字在上、名目在下,一行说完这条流有多大 */
.g-fcard .plate { display: grid; grid-template-columns: repeat(4, 1fr); border-top: 1px solid var(--line-soft); background: #fafbfd; }
.g-fcard .plate > span { display: flex; flex-direction: column; align-items: center; gap: 3px; padding: 9px 4px 10px; border-left: 1px solid var(--line-soft); }
.g-fcard .plate > span:first-child { border-left: 0; }
.g-fcard .plate b { font: 700 15px/1 var(--mono); letter-spacing: -.02em; color: var(--ink); }
.g-fcard .plate i { font-style: normal; font-size: 10px; color: var(--ink-4); }
.g-fcard .plate > span.bad b { color: var(--danger); }
/* ⋯ 菜单:压在卡内右上角(卡是 overflow:hidden,菜单只在卡里活动) */
.g-fcard .menu { position: absolute; right: 10px; top: 41px; z-index: 3; width: 138px; display: flex; flex-direction: column; gap: 2px; padding: 5px; border: 1px solid var(--cline); border-radius: 9px; background: #fff; box-shadow: 0 10px 22px -8px rgba(19, 28, 38, .3); }
.g-fcard .menu button { display: flex; align-items: center; gap: 6px; width: 100%; height: 27px; padding: 0 8px; border: 0; border-radius: 6px; background: transparent; font: 500 12px/1 var(--sans); color: var(--ink); text-align: left; cursor: pointer; }
.g-fcard .menu button:hover { background: #f2f5f9; }
.g-fcard .menu button.bad { color: var(--danger); }
.g-fcard .menu button.bad:hover { background: #fdf2f2; }
.g-fcard .menu .q { padding: 3px 8px 5px; font-size: 11px; line-height: 1.5; color: var(--ink-3); }
/* 幽灵卡:新建住在货架里 —— 与真卡同宽同高,一眼看出「这儿还能再添一条」 */
.g-fcard.ghost { flex-direction: row; align-items: center; justify-content: center; gap: 7px; min-height: 102px; border-style: dashed; border-color: #c6d1de; background: transparent; box-shadow: none; color: var(--ink-4); font: 600 12.5px/1 var(--sans); cursor: pointer; }
.g-fcard.ghost:hover { border-color: var(--brand); background: var(--brand-wash); color: var(--brand-deep); box-shadow: none; transform: none; }
/* ============ 规则清单(触发器):整行可下钻 ============ */
.g-rules { display: flex; flex-direction: column; }
.g-rule { display: grid; grid-template-columns: 30px minmax(0, 1fr) 84px 108px 78px 18px; align-items: center; gap: 12px; width: 100%; padding: 13px 16px; border: 0; border-bottom: 1px solid var(--line-soft); background: transparent; font: inherit; text-align: left; cursor: pointer; transition: background var(--t-fast); }