nutritionDefaultsMerge.ts 1.73 KB
/**
 * 将管理端保存的营养成分默认值 JSON 合并进 NUTRITION 元素 config(与 Web nutritionManualEntry 字段一致)。
 */
export function applyNutritionDefaultJsonToConfig(
  baseCfg: Record<string, unknown>,
  jsonStr: string,
): Record<string, unknown> {
  const t = String(jsonStr ?? "").trim();
  if (!t.startsWith("{")) return baseCfg;
  let manual: Record<string, string> = {};
  try {
    manual = JSON.parse(t) as Record<string, string>;
  } catch {
    return baseCfg;
  }
  const out: Record<string, unknown> = { ...baseCfg };
  for (const [k, val] of Object.entries(manual)) {
    const v = String(val ?? "").trim();
    if (k === "calories") {
      if (v) out.calories = v;
      continue;
    }
    if (k === "servingsPerContainer") {
      out.servingsPerContainer = v;
      continue;
    }
    if (k === "servingSize") {
      out.servingSize = v;
      continue;
    }
    if (k.startsWith("extra:") && k.endsWith(":value")) {
      const id = k.slice("extra:".length, -":value".length);
      const arr = Array.isArray(out.extraNutrients)
        ? ([...(out.extraNutrients as Record<string, unknown>[])])
        : [];
      const idx = arr.findIndex((row) => String((row as any).id ?? "") === id);
      if (idx >= 0) {
        arr[idx] = { ...arr[idx], value: v };
      }
      out.extraNutrients = arr;
      continue;
    }
    const fr = Array.isArray(out.fixedNutrients)
      ? ([...(out.fixedNutrients as Record<string, unknown>[])])
      : [];
    const idx = fr.findIndex((row) => String((row as any).key ?? "").trim() === k);
    if (idx >= 0) {
      fr[idx] = { ...fr[idx], value: v };
    } else {
      fr.push({ key: k, label: k, value: v, unit: "" });
    }
    out.fixedNutrients = fr;
  }
  return out;
}