gaoluyang
2 天以前 4762afb6cb043a3e539ed7ec8da5bde997bfaf65
src/views/officeProcessAutomation/ApproveManage/approve-template/selectOptionSource.js
@@ -1,16 +1,19 @@
import { deptTreeSelect, userListNoPageByTenantId } from "@/api/system/user.js";
import { listVehiclePage } from "@/api/officeProcessAutomation/vehicle.js";
/** 下拉选项来源(写入 formConfig,提交页按来源拉取数据) */
export const SELECT_OPTION_SOURCE = {
  STATIC: "static",
  USER: "user",
  DEPT: "dept",
  VEHICLE: "vehicle",
};
export const SELECT_OPTION_SOURCE_OPTIONS = [
  { value: SELECT_OPTION_SOURCE.STATIC, label: "手动配置", desc: "在模板中自定义选项文本与值" },
  { value: SELECT_OPTION_SOURCE.USER, label: "人员列表", desc: "从系统用户中选择,值为用户 ID" },
  { value: SELECT_OPTION_SOURCE.DEPT, label: "部门列表", desc: "从组织架构中选择,值为部门 ID" },
  { value: SELECT_OPTION_SOURCE.VEHICLE, label: "车辆列表", desc: "从车辆管理中选择,值为车牌号" },
];
export function selectOptionSourceLabel(source) {
@@ -18,7 +21,7 @@
}
export function isDynamicOptionSource(source) {
  return source === SELECT_OPTION_SOURCE.USER || source === SELECT_OPTION_SOURCE.DEPT;
  return source === SELECT_OPTION_SOURCE.USER || source === SELECT_OPTION_SOURCE.DEPT || source === SELECT_OPTION_SOURCE.VEHICLE;
}
function unwrapArray(payload) {
@@ -69,6 +72,14 @@
  });
}
/** 车辆 → 下拉 option */
export function mapVehicleToSelectOption(v) {
  return {
    label: v.plateNumber || `车辆${v.id}`,
    value: v.plateNumber || String(v.id),
  };
}
/** 按字段配置解析下拉 options(需传入已加载的缓存) */
export function resolveFieldSelectOptions(field, caches = {}) {
  const source = field?.optionSource || SELECT_OPTION_SOURCE.STATIC;
@@ -77,6 +88,9 @@
  }
  if (source === SELECT_OPTION_SOURCE.DEPT) {
    return caches.deptOptions || [];
  }
  if (source === SELECT_OPTION_SOURCE.VEHICLE) {
    return (caches.vehicles || []).map(mapVehicleToSelectOption);
  }
  return (field?.options || []).filter((o) => o.value !== "" && o.value != null);
}
@@ -89,13 +103,14 @@
  return hit?.label || String(val);
}
/** 加载人员 / 部门缓存(多处复用) */
/** 加载人员 / 部门 / 车辆缓存(多处复用) */
export async function fetchSelectOptionCaches(sources = []) {
  const needUser = sources.includes(SELECT_OPTION_SOURCE.USER);
  const needDept = sources.includes(SELECT_OPTION_SOURCE.DEPT);
  const caches = { users: [], deptOptions: [] };
  const needVehicle = sources.includes(SELECT_OPTION_SOURCE.VEHICLE);
  const caches = { users: [], deptOptions: [], vehicles: [] };
  if (!needUser && !needDept) return caches;
  if (!needUser && !needDept && !needVehicle) return caches;
  const tasks = [];
  if (needUser) {
@@ -123,6 +138,19 @@
        })
    );
  }
  if (needVehicle) {
    tasks.push(
      listVehiclePage({ current: 1, size: 1000 })
        .then((res) => {
          // 车辆接口返回格式: { data: { records: [...], total: ... } }
          const records = res?.data?.records;
          caches.vehicles = Array.isArray(records) ? records : [];
        })
        .catch(() => {
          caches.vehicles = [];
        })
    );
  }
  await Promise.all(tasks);
  return caches;