diff --git a/src/api/module/flow.ts b/src/api/module/flow.ts index aebcc12..bb16991 100644 --- a/src/api/module/flow.ts +++ b/src/api/module/flow.ts @@ -143,6 +143,10 @@ class FlowApi { defSave(body: { id?: number; code: string; name: string; contentJson: string; baseGuid?: string; appKey?: string }) { return post(`${ROOT}/admin/def/save`, body); } + /** 元数据原地编辑(2026-10-10 议题2):只改 name/appKey 不升版本;已发布亦可 */ + defUpdateMeta(body: { id: number; name: string; appKey?: string }) { + return post(`${ROOT}/admin/def/updateMeta`, body); + } defPublish(id: number | string) { return post(`${ROOT}/admin/def/publish/${id}`); } diff --git a/src/views/flow/admin/Defs.vue b/src/views/flow/admin/Defs.vue index 1beddb7..fae2c2d 100644 --- a/src/views/flow/admin/Defs.vue +++ b/src/views/flow/admin/Defs.vue @@ -2,7 +2,7 @@ // 流程定义管理:列表 + 发布/启用/停用/升版本/版本历史/图示/源码。 // 新建与编辑走独立的全屏可视化编辑器(/admin/defs/editor,钉钉式卡片流,见《流程编辑器方案.md》); // 本页不再直接编辑 JSON 文本(编辑器内置"源码"高级模式兜底);行内「源码」为只读查看+复制。 -import { ref, onMounted } from "vue"; +import { ref, computed, onMounted } from "vue"; import { useRouter } from "vue-router"; import { Message } from "view-ui-plus"; import MyConfirm from "@/components/MyConfirm"; @@ -40,7 +40,7 @@ const columns = [ } }, { title: "GUID", key: "flowGuid", width: 200 }, { title: "发布时间", width: 160, render: (h: any, p: any) => h("span", (p.row.publishTime || "").replace("T", " ") || "-") }, - { title: "操作", width: 250, align: "center", fixed: "right", render: (h: any, p: any) => { + { title: "操作", width: 310, align: "center", fixed: "right", render: (h: any, p: any) => { const btns: any[] = []; if (p.row.status === 0) { btns.push(Utils.operatingHandle(h, "编辑", "icon-edit", () => onEdit(p.row))); @@ -53,6 +53,8 @@ const columns = [ // 草稿不走这里,草稿用「发布」) btns.push(Utils.operatingHandle(h, "启用", "icon-play", () => onEnable(p.row))); } + // 元数据原地编辑(2026-10-10 议题2):改名称/归属应用不升版本(含已发布/停用) + btns.push(Utils.operatingHandle(h, "编辑信息", "icon-bianji", () => onEditMeta(p.row))); btns.push(Utils.operatingHandle(h, "图示", "icon-tupian", () => onDiagram(p.row))); btns.push(Utils.operatingHandle(h, "源码", "icon-liebiao", () => onSource(p.row))); btns.push(Utils.operatingHandle(h, "版本历史", "icon-shijian", () => onVersions(p.row))); @@ -168,6 +170,50 @@ function onDiagram(row: any) { router.push({ path: "/diagram", query: { defId: row.id } }); } +// ---- 编辑信息(元数据原地编辑,2026-10-10 议题2:改名称/归属应用不升版本) ---- +const metaVisible = ref(false); +const metaSaving = ref(false); +const metaForm = ref<{ id: number; name: string; appKey: string; version: number; status: number }>({ + id: 0, name: "", appKey: "", version: 0, status: 0, +}); + +function onEditMeta(row: any) { + metaForm.value = { id: row.id, name: row.name || "", appKey: row.appKey || "", version: row.version, status: row.status }; + metaVisible.value = true; +} + +/** 当前 appKey 不在启用集合时兜底插入(保存会被后端拦,提示用户先开启或清空) */ +const metaAppOptions = computed(() => { + const list = apps.value.map((a) => ({ value: a.appKey, label: a.appName })); + const cur = metaForm.value.appKey; + if (cur && !list.some((o) => o.value === cur)) { + list.unshift({ value: cur, label: `${cur}(未开启,保存将被拦)` }); + } + return list; +}); + +async function onMetaSave() { + if (!metaForm.value.name.trim()) { + Message.warning("流程名称不能为空"); + return; + } + metaSaving.value = true; + try { + await flowApi.defUpdateMeta({ + id: metaForm.value.id, + name: metaForm.value.name.trim(), + appKey: metaForm.value.appKey || undefined, + }).send(); + Message.success("已更新(版本不变)"); + metaVisible.value = false; + load(); + } catch (e: any) { + Message.error(e?.message || "保存失败"); + } finally { + metaSaving.value = false; + } +} + onMounted(() => { load(); loadAppKeys(); @@ -199,6 +245,28 @@ onMounted(() => { + + +

+ 只修改名称与归属应用,版本与流程内容保持不变(v{{ metaForm.version }},{{ + DEF_STATUS[metaForm.status] || metaForm.status }})。结构改动请走「{{ + metaForm.status === 0 ? "编辑" : "升版本" }}」进编辑器。 +

+
+ + + + + + +
+ +
diff --git a/src/views/flow/admin/def-editor/index.vue b/src/views/flow/admin/def-editor/index.vue index a2add30..eedcab8 100644 --- a/src/views/flow/admin/def-editor/index.vue +++ b/src/views/flow/admin/def-editor/index.vue @@ -200,6 +200,10 @@ async function load(): Promise { const d: any = await flowApi.defGet(queryId).send(); sourceStatus.value = d?.status ?? 0; sourceVersion.value = d?.version ?? 0; + // 非草稿进入提示(2026-10-10 议题2):结构改动保存将升版本;仅改名称/归属应用请回列表用「编辑信息」 + if (d?.status === 1 || d?.status === 2) { + Message.info("结构改动保存将升版本;仅改名称/归属应用请返回列表用「编辑信息」(不升版本)"); + } model.code = d?.code || ""; model.name = d?.name || ""; appKey.value = d?.appKey || "";