yyb
2026-05-21 856f10107b7681f91114dc48991ebd121a3a8c3f
src/pages/oa/_utils/approveListUtils.js
@@ -5,6 +5,11 @@
  isSelectField,
  mergeFormConfigForEdit,
} from "./approvalFormField.js";
import {
  formatKnownSelectLabel,
  resolveInstanceFormPayload,
  resolveListFieldRawValue,
} from "./approvalModuleListSearch.js";
export const DETAIL_STORAGE_KEY = "oa_approve_instance_detail_row";
@@ -57,9 +62,19 @@
  return parseTime(val, "{y}-{m}-{d} {h}:{i}:{s}") || String(val);
}
/** 解析实例 formConfig 为只读展示字段 */
export function resolveInstanceDisplayFields(formConfig) {
  const merged = mergeFormConfigForEdit("", formConfig);
/** 解析实例为只读展示字段(合并 formPayload,支持传整行或仅 formConfig) */
export function resolveInstanceDisplayFields(formConfigOrRow) {
  const row =
    formConfigOrRow &&
    typeof formConfigOrRow === "object" &&
    (formConfigOrRow.formConfig != null ||
      formConfigOrRow.formPayload != null ||
      formConfigOrRow.formFieldDefs != null)
      ? formConfigOrRow
      : { formConfig: formConfigOrRow };
  const { fields } = resolveInstanceFormPayload(row);
  if (fields.length) return fields.filter(f => f?.key);
  const merged = mergeFormConfigForEdit("", row.formConfig);
  return (merged.fields || []).filter(f => f?.key);
}
@@ -67,10 +82,39 @@
  const val = field.value ?? field.defaultValue;
  if (val === undefined || val === null || val === "") return "-";
  if (isSelectField(field)) {
    return getFieldOptionLabel(field, val) || String(val);
    const fromOptions = getFieldOptionLabel(field, val);
    if (fromOptions && fromOptions !== "-") return fromOptions;
    const known = formatKnownSelectLabel(field.key, val);
    if (known) return known;
    return String(val);
  }
  const known = formatKnownSelectLabel(field?.key, val);
  if (known) return known;
  const shown = formatFieldDisplayValue(field, val);
  return shown || String(val);
}
const DATETIME_LIST_PROPS = new Set([
  "startTime",
  "endTime",
  "overtimeDate",
  "applyTime",
]);
function formatListFieldDisplay(prop, val, field) {
  if (val === undefined || val === null || val === "") return "-";
  if (DATETIME_LIST_PROPS.has(prop)) {
    const shown = formatDateTime(val);
    if (shown && shown !== "-") return shown;
  }
  if (field?.type === "datetimerange") {
    const shown = formatFieldDisplayValue(field, val);
    if (shown) return shown;
  }
  if (field) return displayFieldValue({ ...field, value: val });
  const known = formatKnownSelectLabel(prop, val);
  if (known) return known;
  return String(val);
}
/** 审批记录 result:approved | rejected | pending */
@@ -279,18 +323,23 @@
  };
}
/** 从 formConfig 提取列表展示字段(label + value) */
export function buildFormDisplayRows(formConfig, listFields = []) {
  const fields = resolveInstanceDisplayFields(formConfig);
/** 从实例行提取列表展示字段(label + value,含 formPayload) */
export function buildFormDisplayRows(row, listFields = []) {
  const { fields, formPayload } = resolveInstanceFormPayload(row);
  const fieldByKey = new Map((fields || []).map(f => [f.key, f]));
  const rows = [];
  const propKeys = (listFields || []).map(f => f.prop).filter(Boolean);
  const defs = listFields || [];
  if (propKeys.length) {
    propKeys.forEach(prop => {
      const hit = fields.find(f => f.key === prop);
      if (hit) {
        rows.push({ label: hit.label, value: displayFieldValue(hit) });
      }
  if (defs.length) {
    defs.forEach(def => {
      if (!def?.prop) return;
      const prop = def.prop;
      const hit = fieldByKey.get(prop);
      const raw = resolveListFieldRawValue(prop, row, fields, formPayload);
      rows.push({
        label: def.label || hit?.label || prop,
        value: formatListFieldDisplay(prop, raw, hit),
      });
    });
  } else {
    fields.slice(0, 3).forEach(f => {
@@ -303,17 +352,14 @@
/** 列表行增强(保留原始字段供详情/编辑) */
export function mapInstanceListRow(row, listFields = []) {
  if (!row) return {};
  const displayRows = buildFormDisplayRows(row.formConfig, listFields);
  const displayRows = buildFormDisplayRows(row, listFields);
  const extra = {};
  const formFields = resolveInstanceDisplayFields(row.formConfig);
  const { fields, formPayload } = resolveInstanceFormPayload(row);
  (listFields || []).forEach(def => {
    if (!def?.prop) return;
    const hit = formFields.find(f => f.key === def.prop);
    extra[def.prop] = hit ? displayFieldValue(hit) : "-";
  });
  const formPayload = {};
  formFields.forEach(f => {
    if (f?.key) formPayload[f.key] = f.value ?? f.defaultValue ?? "";
    const hit = fields.find(f => f.key === def.prop);
    const raw = resolveListFieldRawValue(def.prop, row, fields, formPayload);
    extra[def.prop] = formatListFieldDisplay(def.prop, raw, hit);
  });
  return {
    ...row,
@@ -322,6 +368,7 @@
    createTime: formatDateTime(row.applyTime || row.createTime),
    displayRows,
    formPayload,
    formFieldDefs: fields,
    ...extra,
  };
}