forked from ChaiHao/BPOS-MVP
三面拆分⑰:编辑即其身 —— 保存写回本版,新版本只出自「新建」
用户问:为什么编辑一个版本、保存就自动多一个副本?那不是我要的。
旧机制「保存恒新增版本号」改为:
- savePackage:pkg.version 已存在 → **就地写回该版**(号不变、状态不变);
`asNew: true`(新建按钮)或新流程首版才铸新版本号(服务端算,不生效)
- 底线三道,一道不少:
① **在途钉版不可变** —— 该版有未完结工作流(按 (包,版本) 钉定义)→ 409,
一字不落库;「就地覆盖会改掉在途正在读的编排」由这道闸守,不再靠只插不改一刀切
② **生效版必须始终可运行** —— 写回生效版跑闭合闸,不闭合 412 带整份报告;
未生效版画图不检查、随手存
③ **陈旧编辑不复活** —— 流程存在而版本号已被清理 → 409(实测:停在已删旧版上的
标签页发来保存,把老内容静默复活成了新版本;StaleVersionError 拦死)
- store:新增 updatePackageDefinition(只许命中现存版本)+ countPinnedInFlight
- 前端:保存按钮「保存 v{n}」;新建走 asNew;文案全线「新建才长版本」
- 测试:save-package.test 六例(写回/钉版/热改闭合/asNew/防复活/首版);
过程中揪出双 API 进程并存(旧进程霸端口跑旧代码)——已重启归一
实测:改名保存 → 版本列表仍唯一 v4 生效中,名字已写回;八例端到端全绿;
五闸退出码全过(api:check 提交后转绿)。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
This commit is contained in:
@@ -6,7 +6,8 @@
|
||||
* 图下是节点属性,再往下才是声明式的契约细节(调用接口 · 边映射 · 触发器)。
|
||||
*
|
||||
* 版本是**运行时开关**,不是发布流程:
|
||||
* · 画图不检查:保存 = 存为新版,**不生效**;激活才跑闭合校验(异常清零方可)
|
||||
* · 编辑即其身:保存**写回当前版本**(号不变);新版本只出自「新建」
|
||||
* · 画图不检查(未生效版);写回生效版须闭合;在途钉版不可变(409)
|
||||
* · 一条流恰一个生效版本;可把生效切回旧版,也可全部停用让整条流下线
|
||||
* · 在途工作流按启动时钉住的版本跑完 —— 启停对它们零影响
|
||||
*/
|
||||
@@ -218,7 +219,7 @@ function OverviewHome() {
|
||||
<QueryGate query={q}>
|
||||
<div className="g-kpis">
|
||||
<Kpi ico="workflow" tone="ok" label="流程" value={flows.length} sub="一条流恰一个生效版本" />
|
||||
<Kpi ico="history" label="版本" value={packages.length} sub="保存恒新增 · 在途按启动版本跑完" />
|
||||
<Kpi ico="history" label="版本" value={packages.length} sub="新建才长版本 · 在途按启动版本跑完" />
|
||||
<Kpi
|
||||
ico="git-merge"
|
||||
label="边闭合率"
|
||||
@@ -539,7 +540,7 @@ function FlowLab({
|
||||
setSaveErr(undefined);
|
||||
void queryClient.invalidateQueries({ queryKey: ['gov', 'process'] });
|
||||
void queryClient.invalidateQueries({ queryKey: ['gov', 'process-reports'] });
|
||||
// 存下来的是未生效的新版 —— 钉过去接着画;异常看板会列它还缺什么
|
||||
// 编辑即其身:写回的还是这一版,号不变;异常看板会列它还缺什么
|
||||
onSaved(out.pkg.version);
|
||||
},
|
||||
onError: (e: unknown) => setSaveErr((e as { message?: string }).message ?? '保存失败'),
|
||||
@@ -564,7 +565,7 @@ function FlowLab({
|
||||
* 新建版本才长一版 —— 把旧定义复活成最新版、或在现状上另起一版接着画,都走这儿。
|
||||
*/
|
||||
const cloneVersion = useMutation({
|
||||
mutationFn: () => call<{ pkg: ProcessPackage; report: ClosureReport }>(saveProcessRoute, { body: { pkg } }),
|
||||
mutationFn: () => call<{ pkg: ProcessPackage; report: ClosureReport }>(saveProcessRoute, { body: { pkg, asNew: true } }),
|
||||
onSuccess: (out) => {
|
||||
setReport(out.report);
|
||||
void queryClient.invalidateQueries({ queryKey: ['gov', 'process'] });
|
||||
@@ -581,7 +582,7 @@ function FlowLab({
|
||||
note: dirty ? (
|
||||
<Note tone="warn">
|
||||
画布上有<b>未保存的改动</b>,新建版本不会带上它们(克隆的是已存的 v{pkg.version})。
|
||||
想连改动一起走,直接点「保存为 v{nextVersion}」。
|
||||
想连改动一起走,先点「保存 v{pkg.version}」再来新建。
|
||||
</Note>
|
||||
) : (
|
||||
<Note>
|
||||
@@ -906,7 +907,7 @@ function FlowLab({
|
||||
if (graph !== null) save.mutate({ graph, idMap: {} });
|
||||
}}
|
||||
>
|
||||
<Ico name="send" s={11} /> {save.isPending ? '保存中…' : `保存为 v${nextVersion}`}
|
||||
<Ico name="send" s={11} /> {save.isPending ? '保存中…' : `保存 v${pkg.version}`}
|
||||
</button>
|
||||
</div>
|
||||
<div className="g-nodecard-b">
|
||||
|
||||
Reference in New Issue
Block a user