From c93313cdb749c2f740c1a2182504b286af3aca81 Mon Sep 17 00:00:00 2001 From: chenxing Date: Wed, 28 Oct 2026 03:18:54 +0800 Subject: [PATCH] =?UTF-8?q?feat(flow):=20=E6=B5=81=E7=A8=8B=E5=9B=BE?= =?UTF-8?q?=E5=85=A5=E5=8F=A3/=E5=A4=B1=E8=B4=A5=E6=8F=90=E7=A4=BA/?= =?UTF-8?q?=E6=8C=87=E6=B4=BE=E9=A2=84=E8=A7=88/=E7=BA=BF=E7=BA=A7?= =?UTF-8?q?=E5=81=9C=E5=8F=91=E9=97=AD=E7=8E=AF/=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E5=88=86=E5=B1=82/=E9=80=89=E4=BA=BA=E5=AE=BF=E4=B8=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复办理页「查看流程图」双 hash URL:改 router.resolve + toAppHashUrl 单 hash - 修复管理端办件抽屉「查看大图」域名尾点(origin + BASE_URL("./") 拼接) - 新增 flowError 口径层与办理页内联失败条,审批失败提示可读、不泄漏堆栈 - 审批节点抽屉新增「预览候选人」真入口 + AssigneePreviewModal(只读,不写回定义) - 线级停发/恢复失败改为单条错误面,避免同错双 toast - 审批抽屉核心区/高级设置分层;插入菜单常用/高级分组 - 新增 FlowAssignEmbed 选人 iframe 父侧宿主(origin/source/信封/context 四校验) - 修复 /diagram、/assign-preview 面包屑误显示「流程编辑器」 --- package.json | 3 +- src/api/module/flow.ts | 13 +- src/components/FlowAssignEmbed.vue | 132 ++++++++++ src/components/layout.vue | 19 +- src/utils/alova/alova-core.ts | 26 +- src/utils/alova/alova-iview.ts | 7 +- src/utils/appUrl.ts | 13 + src/utils/flowError.ts | 75 ++++++ src/views/flow/AssignPreview.vue | 5 +- src/views/flow/TaskHandle.vue | 34 ++- src/views/flow/admin/Defs.vue | 4 +- .../flow/admin/def-editor/assignPreview.ts | 226 +++++++++++++++++ .../def-editor/components/ApprovalDrawer.vue | 88 +++++++ .../components/AssigneePreviewModal.vue | 91 +++++++ .../def-editor/components/PlusButton.vue | 14 ++ src/views/flow/admin/def-editor/index.vue | 10 +- src/views/flow/admin/def-editor/model.ts | 2 + src/views/flow/components/InstanceDrawer.vue | 13 +- tests/app-url.test.ts | 48 ++++ tests/assign-preview.test.ts | 162 ++++++++++++ .../approval-drawer.component.test.ts | 231 ++++++++++++++++++ .../components/assign-embed.component.test.ts | 204 ++++++++++++++++ .../defs-line-offline.component.test.ts | 4 +- tests/convert-roundtrip.test.ts | 145 +++++++++++ tests/flow-error.test.ts | 55 +++++ tests/line-offline.test.ts | 14 +- 26 files changed, 1602 insertions(+), 36 deletions(-) create mode 100644 src/components/FlowAssignEmbed.vue create mode 100644 src/utils/appUrl.ts create mode 100644 src/utils/flowError.ts create mode 100644 src/views/flow/admin/def-editor/assignPreview.ts create mode 100644 src/views/flow/admin/def-editor/components/AssigneePreviewModal.vue create mode 100644 tests/app-url.test.ts create mode 100644 tests/assign-preview.test.ts create mode 100644 tests/components/approval-drawer.component.test.ts create mode 100644 tests/components/assign-embed.component.test.ts create mode 100644 tests/convert-roundtrip.test.ts create mode 100644 tests/flow-error.test.ts diff --git a/package.json b/package.json index fede2f2..a730b61 100644 --- a/package.json +++ b/package.json @@ -15,8 +15,9 @@ "api:gen": "alova gen -f", "typecheck": "vue-tsc --noEmit", "test:line-offline": "esbuild tests/line-offline.test.ts --bundle --platform=node --format=esm --target=node20 --external:node:* --outfile=node_modules/.cache/line-offline.test.mjs && node node_modules/.cache/line-offline.test.mjs", + "test:unit": "esbuild tests/line-offline.test.ts tests/app-url.test.ts tests/flow-error.test.ts tests/assign-preview.test.ts tests/convert-roundtrip.test.ts --bundle --platform=node --format=esm --target=node20 --external:node:* --outbase=tests --outdir=node_modules/.cache/unit && node --test node_modules/.cache/unit", "test:component": "vitest run", - "test": "npm run test:line-offline && npm run test:component" + "test": "npm run test:unit && npm run test:component" }, "dependencies": { "@open-file-viewer/core": "^0.1.43", diff --git a/src/api/module/flow.ts b/src/api/module/flow.ts index bd9fe51..cc700fd 100644 --- a/src/api/module/flow.ts +++ b/src/api/module/flow.ts @@ -13,8 +13,9 @@ function get(url: string, params?: Record): Method { // alova 的请求体是 Method 构造的第 5 个参数(instance.data),不是 config 上的键: // 写进 config 的 body/data 都会被适配器忽略,POST 将发出空 body。 -function post(url: string, body?: any): Method { - return new Method("POST", alovaInstance, url, {}, body); +// 第 4 个参数 config 可带 silentBizToast:调用方自己承担错误提示时,不再叠加全局 toast。 +function post(url: string, body?: any, config?: Record): Method { + return new Method("POST", alovaInstance, url, config || {}, body); } /** 状态枚举(后端 FlwEnums 口径) */ @@ -187,12 +188,12 @@ class FlowApi { * 流程线级停发(T03):整条 flowGuid 停止新发起/预览,在途实例按原版本跑完; * 与版本级 status 正交,返回受影响版本行数。 */ - defOfflineLine(flowGuid: string) { - return post(`${ROOT}/admin/def/offlineLine`, { flowGuid }); + defOfflineLine(flowGuid: string, config?: Record) { + return post(`${ROOT}/admin/def/offlineLine`, { flowGuid }, config); } /** 流程线级恢复(T03):只恢复线可用性,不改写任何版本状态或发布内容;返回受影响版本行数 */ - defEnableLine(flowGuid: string) { - return post(`${ROOT}/admin/def/enableLine`, { flowGuid }); + defEnableLine(flowGuid: string, config?: Record) { + return post(`${ROOT}/admin/def/enableLine`, { flowGuid }, config); } defVersions(flowGuid: string) { return get(`${ROOT}/admin/def/versions`, { flowGuid }); diff --git a/src/components/FlowAssignEmbed.vue b/src/components/FlowAssignEmbed.vue new file mode 100644 index 0000000..8e82f04 --- /dev/null +++ b/src/components/FlowAssignEmbed.vue @@ -0,0 +1,132 @@ + + +