From f835965e29d2b115384c22addc583c9a6a8a778d Mon Sep 17 00:00:00 2001 From: chenxing Date: Sat, 10 Oct 2026 19:23:45 +0800 Subject: [PATCH] =?UTF-8?q?feat(def):=20=E6=B5=81=E7=A8=8B=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E5=88=97=E8=A1=A8=E5=A2=9E=E3=80=8C=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E3=80=8D=E5=BC=B9=E7=AA=97=EF=BC=88=E5=8E=9F?= =?UTF-8?q?=E5=9C=B0=E6=94=B9=E5=90=8D=E7=A7=B0/=E5=BD=92=E5=B1=9E?= =?UTF-8?q?=E5=BA=94=E7=94=A8=EF=BC=89+=20=E7=BC=96=E8=BE=91=E5=99=A8?= =?UTF-8?q?=E9=9D=9E=E8=8D=89=E7=A8=BF=E8=BF=9B=E5=85=A5=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 弹窗限 name+appKey(当前 appKey 不在启用集时兜底选项提示);保存后 version 不变 - 编辑器打开已发布/停用时提示:结构改动将升版本,仅改属性请用「编辑信息」 --- src/api/module/flow.ts | 4 ++ src/views/flow/admin/Defs.vue | 72 ++++++++++++++++++++++- src/views/flow/admin/def-editor/index.vue | 4 ++ 3 files changed, 78 insertions(+), 2 deletions(-) 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 || "";