feat(flow): 流程图入口/失败提示/指派预览/线级停发闭环/配置分层/选人宿主
build / build (push) Successful in 1m28s

- 修复办理页「查看流程图」双 hash URL:改 router.resolve + toAppHashUrl 单 hash
- 修复管理端办件抽屉「查看大图」域名尾点(origin + BASE_URL("./") 拼接)
- 新增 flowError 口径层与办理页内联失败条,审批失败提示可读、不泄漏堆栈
- 审批节点抽屉新增「预览候选人」真入口 + AssigneePreviewModal(只读,不写回定义)
- 线级停发/恢复失败改为单条错误面,避免同错双 toast
- 审批抽屉核心区/高级设置分层;插入菜单常用/高级分组
- 新增 FlowAssignEmbed 选人 iframe 父侧宿主(origin/source/信封/context 四校验)
- 修复 /diagram、/assign-preview 面包屑误显示「流程编辑器」
This commit is contained in:
chenxing
2026-10-28 03:18:54 +08:00
parent f2841e2740
commit c93313cdb7
26 changed files with 1602 additions and 36 deletions
+15 -4
View File
@@ -76,10 +76,15 @@ const routeChange = (to: any) => {
const navArr: any[] = [];
// 优先按 path 匹配菜单(平台模块 id 与路由 meta.modId 不保证一致),
// 匹配不到再退回 modId 对照
// 匹配不到再退回 modId 对照。
// modId 为空时必须短路:深链页(/diagram、/assign-preview、/task/*)不带 modId,
// 原先 `x.modId === undefined` 会命中第一条同样没有 modId 的菜单,面包屑于是显示成
// 不相干的「流程编辑器」(验收报告 P3)。
const find: any =
menuArr.value.find((x: any) => x.page && x.page === to.path) ||
menuArr.value.find((x: any) => x.modId === modId);
(modId !== undefined && modId !== null
? menuArr.value.find((x: any) => x.modId === modId)
: null);
if (find) {
currPath.value = find.page || "";
if (find.pid) {
@@ -109,7 +114,10 @@ const routeChange = (to: any) => {
}
}
const r = router.getRoutes().find((rt: any) => (rt.meta as any)?.modId === modId);
// 同上:modId 缺失时不做这条兜底,否则又是"第一条无 modId 路由"中奖
const r = (modId === undefined || modId === null)
? undefined
: router.getRoutes().find((rt: any) => (rt.meta as any)?.modId === modId);
if (r) {
currPath.value = r.path;
navPath.value = [{ name: (r.meta as any).title, page: r.path }];
@@ -117,7 +125,10 @@ const routeChange = (to: any) => {
}
currPath.value = "";
navPath.value = [];
// 深链页(/diagram 流程示意图、/assign-preview 选择办理人、/task/*)不挂菜单:
// 面包屑退回平台应用名(FL 配置的是「流程编辑器」),与实际页面标题不符(验收报告 P3)。
// 菜单匹配不上时至少给出本页 meta.title,父级缺失不再伪造。
navPath.value = title ? [{ name: title }] : [];
};
const linkMenu = (item: any) => {