fix(bpm): 流程管理员写入时带上当前操作人,避免换账号后无法再改模型

背景:客户要求流程管理员固定为超级管理员(界面不给选择),
之前实现是 managerUserIds = [admin.id]。
但后端 updateModel 是「先校验管理员、后写入」,一旦模型被保存成只含超管,
用其他账号再次修改就会报「你不是该流程的管理员」且无法自愈。

修改:
- basic-info.vue:回写 managerUserIds 时按 [超管id, 当前登录用户id] 去重写入;
界面展示仍然是「超级管理员」只读文本,客户无感。
- index.vue:新建场景的默认管理员同样带上当前操作人。

配合后端 validateModelManager 的「空管理员放行 / 超管放行」,
彻底消除该报错。
已修改2个文件
47 ■■■■■ 文件已修改
src/views/bpm/model/form/index.vue 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/bpm/model/form/modules/basic-info.vue 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/bpm/model/form/index.vue
@@ -199,15 +199,22 @@
  // 获取部门列表
  deptList.value = await getSimpleDeptList();
  // 新增场景(流程管理员还没值时)默认取超级管理员(admin),而不是当前登录用户
  if (!formData.value.managerUserIds?.length) {
    const adminUser = userList.value.find(
      (user: SystemUserApi.User) => user.username === 'admin',
    );
    const defaultManagerId = adminUser?.id ?? userStore.userInfo?.id;
    if (defaultManagerId) {
      formData.value.managerUserIds = [defaultManagerId];
    }
  // 流程管理员固定为超级管理员(客户要求,界面上不给选择)。
  // 同时把「当前操作人」一并写入:后端 updateModel 是「先校验管理员、后写入」,
  // 只写超管的话,换一个账号再修改就会报「你不是该流程的管理员」,且无法自愈。
  const adminUser = userList.value.find(
    (user: SystemUserApi.User) => user.username === 'admin',
  );
  const currentUserId = userStore.userInfo?.id;
  const managerIds: number[] = [];
  if (adminUser?.id) {
    managerIds.push(adminUser.id);
  }
  if (currentUserId && !managerIds.includes(currentUserId)) {
    managerIds.push(currentUserId);
  }
  if (managerIds.length > 0) {
    formData.value.managerUserIds = managerIds;
  }
  // 最终,设置 currentStep 切换到第一步
src/views/bpm/model/form/modules/basic-info.vue
@@ -14,6 +14,7 @@
import { DICT_TYPE } from '@vben/constants';
import { getDictOptions } from '@vben/hooks';
import { IconifyIcon } from '@vben/icons';
import { useUserStore } from '@vben/stores';
import {
  Avatar,
@@ -56,6 +57,7 @@
const formRef = ref(); // 表单引用
const modelData = defineModel<any>(); // 创建本地数据副本
const userStore = useUserStore(); // 当前登录用户(写入流程管理员,避免换账号后无法再修改模型)
const selectedStartUsers = ref<SystemUserApi.User[]>([]); // 选中的发起人
const selectedStartDepts = ref<SystemDeptApi.Dept[]>([]); // 选中的发起部门
@@ -113,13 +115,27 @@
          newVal.managerUserIds.includes(user.id),
        ) as SystemUserApi.User[])
      : [];
    // 流程管理员固定为超级管理员:进入页面即强制回写,修改场景同样生效
    // 流程管理员固定为超级管理员:进入页面即强制回写,修改场景同样生效。
    // 注意:同时把「当前操作人」一并写入。因为后端 updateModel 是「先校验管理员、后写入」,
    // 一旦模型被保存成只包含超管,用其他账号再次修改就会报
    // 「操作流程失败,原因:你不是该流程(xxx)的管理员」,且无法自愈。
    const admin = props.userList.find(
      (user: SystemUserApi.User) => user.username === 'admin',
    );
    const currentUserId = userStore.userInfo?.id;
    const managerIds: number[] = [];
    if (admin) {
      newVal.managerUserIds = [admin.id];
      selectedManagerUsers.value = [admin as SystemUserApi.User];
      managerIds.push(admin.id);
    }
    if (currentUserId && !managerIds.includes(currentUserId)) {
      managerIds.push(currentUserId);
    }
    if (managerIds.length > 0) {
      newVal.managerUserIds = managerIds;
      // 界面上仍然只展示「超级管理员」
      const displayUser =
        admin ?? props.userList.find((user) => user.id === managerIds[0]);
      selectedManagerUsers.value = displayUser ? [displayUser] : [];
    }
  },
  {