nutritionDefaultsMerge.ts
1.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/**
* 将管理端保存的营养成分默认值 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;
}