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:
+20
-4
@@ -28,10 +28,13 @@ export type StartWorkflowInput = {
|
||||
};
|
||||
export type ProcessService = {
|
||||
/**
|
||||
* 保存 —— **不检查、不生效**:恒存为新版本号(服务端算,不采信入参的 version),
|
||||
* 状态为未生效。画图的中间态天然不完整,保存不设闸;完整性闸在 `setPackageState` 激活时。
|
||||
* 保存 —— **编辑即其身**:pkg.version 已存在则就地写回该版(号不变)。
|
||||
* 两道闸:在途钉版抛 PinnedVersionError;写回生效版须闭合,否则 NotClosedError。
|
||||
* `asNew` 或版本不存在(新流程首版)才产生新版本号(服务端算,不生效)。
|
||||
*/
|
||||
savePackage(pkg: ProcessPackage): Promise<ProcessPackage>;
|
||||
savePackage(pkg: ProcessPackage, opts?: {
|
||||
asNew?: boolean;
|
||||
}): Promise<ProcessPackage>;
|
||||
listPackages(): Promise<ProcessPackage[]>;
|
||||
getPackage(id: string, version?: number): Promise<ProcessPackage | undefined>;
|
||||
/**
|
||||
@@ -63,11 +66,24 @@ export declare class CallInterfaceViolationError extends Error {
|
||||
readonly errors: readonly string[];
|
||||
constructor(packageId: string, errors: readonly string[]);
|
||||
}
|
||||
/** 不闭合不得**激活** —— 画图与保存不拦(中间态天然不完整),上线这一步拦 */
|
||||
/** 不闭合不得**激活/热改生效版** —— 画图与写回未生效版不拦(中间态天然不完整) */
|
||||
export declare class NotClosedError extends Error {
|
||||
readonly report: ClosureReport;
|
||||
constructor(report: ClosureReport);
|
||||
}
|
||||
/** 陈旧编辑:流程存在但该版本号已不存在(被清理)—— 不静默复活旧内容,刷新后再改 */
|
||||
export declare class StaleVersionError extends Error {
|
||||
readonly packageId: string;
|
||||
readonly version: number;
|
||||
constructor(packageId: string, version: number);
|
||||
}
|
||||
/** 在途钉版:该版本有未完结的工作流按 (包, 版本) 钉着定义 —— 定义不可变,改动请新建一版 */
|
||||
export declare class PinnedVersionError extends Error {
|
||||
readonly packageId: string;
|
||||
readonly version: number;
|
||||
readonly inFlight: number;
|
||||
constructor(packageId: string, version: number, inFlight: number);
|
||||
}
|
||||
export declare class PositionVacantError extends Error {
|
||||
readonly position: string;
|
||||
constructor(position: string);
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
* module: process —— 唯一出口。只做 re-export,不写逻辑(编码规范 §10.1)。
|
||||
*/
|
||||
export type { ActivityContractFace, AssembleScope, Candidate, ClosureInput, ClosureReport, ClosureViolation, NodeInstance, OwnerSpec, ProcessPackage, ProcessService, ResolveContext, Resolution, StartWorkflowInput, WorkflowRecord, WorkflowState, } from './contract.ts';
|
||||
export { CallInterfaceViolationError, NotClosedError, PositionVacantError } from './contract.ts';
|
||||
export { CallInterfaceViolationError, NotClosedError, PinnedVersionError, PositionVacantError, StaleVersionError } from './contract.ts';
|
||||
export type { ActivityDirectory, ApprovalGateway, Clock, FlowEventPublisher, IdGenerator, OrgDirectory, ProcessStore, ReceiptNotifier, Sfeel, TaskGateway, } from './port.ts';
|
||||
export type { ProcessServiceDeps } from './internal/usecase/process-service.ts';
|
||||
export { createProcessService } from './internal/usecase/process-service.ts';
|
||||
|
||||
@@ -37,6 +37,10 @@ export type WorkflowRecord = {
|
||||
};
|
||||
export type ProcessStore = {
|
||||
savePackage(pkg: ProcessPackage): Promise<void>;
|
||||
/** 就地写回一版的定义(编辑即其身)—— 撞不存在的版本报错,不静默插入 */
|
||||
updatePackageDefinition(id: string, version: number, pkg: ProcessPackage): Promise<void>;
|
||||
/** 钉在该版上的未完结工作流数 —— 在途钉版不可变的判据 */
|
||||
countPinnedInFlight(id: string, version: number): Promise<number>;
|
||||
/** 只改状态,不动定义 —— state 在列上与 definition 里各存一份,两处要一起改 */
|
||||
setPackageState(id: string, version: number, state: 'active' | 'retired'): Promise<void>;
|
||||
getPackage(id: string, version?: number): Promise<ProcessPackage | undefined>;
|
||||
|
||||
Reference in New Issue
Block a user