skill-calorie 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SKILL.md +54 -26
- package/dist/analysis/anomaly/common.d.ts.map +1 -1
- package/dist/analysis/anomaly/common.js +2 -1
- package/dist/analysis/anomaly/common.js.map +1 -1
- package/dist/analysis/cross.d.ts.map +1 -1
- package/dist/analysis/cross.js +3 -2
- package/dist/analysis/cross.js.map +1 -1
- package/dist/analysis/deficit.d.ts.map +1 -1
- package/dist/analysis/deficit.js +4 -0
- package/dist/analysis/deficit.js.map +1 -1
- package/dist/analysis/diet.js +2 -2
- package/dist/analysis/diet.js.map +1 -1
- package/dist/analysis/exercise.js +5 -5
- package/dist/analysis/exercise.js.map +1 -1
- package/dist/analysis/review.js +2 -2
- package/dist/analysis/review.js.map +1 -1
- package/dist/analysis/series.d.ts +7 -1
- package/dist/analysis/series.d.ts.map +1 -1
- package/dist/analysis/series.js +22 -6
- package/dist/analysis/series.js.map +1 -1
- package/dist/analysis/utils.d.ts +7 -0
- package/dist/analysis/utils.d.ts.map +1 -1
- package/dist/analysis/utils.js +7 -0
- package/dist/analysis/utils.js.map +1 -1
- package/dist/analysis/weightCompare3.js +2 -2
- package/dist/analysis/weightCompare3.js.map +1 -1
- package/dist/cli/cmd_read.d.ts +21 -3
- package/dist/cli/cmd_read.d.ts.map +1 -1
- package/dist/cli/cmd_read.js +460 -54
- package/dist/cli/cmd_read.js.map +1 -1
- package/dist/cli/keys.d.ts +89 -1
- package/dist/cli/keys.d.ts.map +1 -1
- package/dist/cli/keys.js +30 -0
- package/dist/cli/keys.js.map +1 -1
- package/dist/cli/write.d.ts +12 -9
- package/dist/cli/write.d.ts.map +1 -1
- package/dist/cli/write.js +133 -48
- package/dist/cli/write.js.map +1 -1
- package/dist/output.d.ts +55 -1
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +203 -5
- package/dist/output.js.map +1 -1
- package/dist/render/dietDocs.d.ts +45 -0
- package/dist/render/dietDocs.d.ts.map +1 -0
- package/dist/render/dietDocs.js +561 -0
- package/dist/render/dietDocs.js.map +1 -0
- package/dist/render/envelope.d.ts +32 -6
- package/dist/render/envelope.d.ts.map +1 -1
- package/dist/render/envelope.js +71 -0
- package/dist/render/envelope.js.map +1 -1
- package/dist/render/exercisePort.d.ts +161 -0
- package/dist/render/exercisePort.d.ts.map +1 -0
- package/dist/render/exercisePort.js +395 -0
- package/dist/render/exercisePort.js.map +1 -0
- package/dist/render/goal.d.ts.map +1 -1
- package/dist/render/goal.js +13 -2
- package/dist/render/goal.js.map +1 -1
- package/dist/render/goalPlate.d.ts +1 -1
- package/dist/render/goalPlate.d.ts.map +1 -1
- package/dist/render/goalPlate.js +5 -1
- package/dist/render/goalPlate.js.map +1 -1
- package/dist/render/helpCenter.d.ts +104 -0
- package/dist/render/helpCenter.d.ts.map +1 -0
- package/dist/render/helpCenter.js +386 -0
- package/dist/render/helpCenter.js.map +1 -0
- package/dist/render/html.d.ts.map +1 -1
- package/dist/render/html.js +2 -1
- package/dist/render/html.js.map +1 -1
- package/dist/render/index.d.ts +3 -0
- package/dist/render/index.d.ts.map +1 -1
- package/dist/render/index.js +2 -0
- package/dist/render/index.js.map +1 -1
- package/dist/render/nutritionPort.d.ts +89 -0
- package/dist/render/nutritionPort.d.ts.map +1 -0
- package/dist/render/nutritionPort.js +183 -0
- package/dist/render/nutritionPort.js.map +1 -0
- package/dist/render/nutritionPortDocs.d.ts +6 -0
- package/dist/render/nutritionPortDocs.d.ts.map +1 -0
- package/dist/render/nutritionPortDocs.js +317 -0
- package/dist/render/nutritionPortDocs.js.map +1 -0
- package/dist/render/photo.d.ts.map +1 -1
- package/dist/render/photo.js +5 -1
- package/dist/render/photo.js.map +1 -1
- package/dist/render/planPlate.d.ts +2 -1
- package/dist/render/planPlate.d.ts.map +1 -1
- package/dist/render/planPlate.js +6 -1
- package/dist/render/planPlate.js.map +1 -1
- package/dist/render/receipt.d.ts +47 -1
- package/dist/render/receipt.d.ts.map +1 -1
- package/dist/render/receipt.js +67 -3
- package/dist/render/receipt.js.map +1 -1
- package/dist/render/sportDocs.d.ts +14 -0
- package/dist/render/sportDocs.d.ts.map +1 -0
- package/dist/render/sportDocs.js +540 -0
- package/dist/render/sportDocs.js.map +1 -0
- package/dist/render/sportPortDocs.d.ts +8 -0
- package/dist/render/sportPortDocs.d.ts.map +1 -0
- package/dist/render/sportPortDocs.js +468 -0
- package/dist/render/sportPortDocs.js.map +1 -0
- package/dist/render/trendDocs.d.ts +11 -0
- package/dist/render/trendDocs.d.ts.map +1 -0
- package/dist/render/trendDocs.js +445 -0
- package/dist/render/trendDocs.js.map +1 -0
- package/dist/render/trendMiscPort.d.ts +127 -0
- package/dist/render/trendMiscPort.d.ts.map +1 -0
- package/dist/render/trendMiscPort.js +277 -0
- package/dist/render/trendMiscPort.js.map +1 -0
- package/dist/render/trendMiscPortDocs.d.ts +10 -0
- package/dist/render/trendMiscPortDocs.d.ts.map +1 -0
- package/dist/render/trendMiscPortDocs.js +397 -0
- package/dist/render/trendMiscPortDocs.js.map +1 -0
- package/dist/render/wizardPort.d.ts +125 -0
- package/dist/render/wizardPort.d.ts.map +1 -0
- package/dist/render/wizardPort.js +393 -0
- package/dist/render/wizardPort.js.map +1 -0
- package/dist/render/wizardPortDocs.d.ts +6 -0
- package/dist/render/wizardPortDocs.d.ts.map +1 -0
- package/dist/render/wizardPortDocs.js +274 -0
- package/dist/render/wizardPortDocs.js.map +1 -0
- package/dist/triggers/routing.d.ts +21 -21
- package/dist/triggers/routing.d.ts.map +1 -1
- package/dist/triggers/routing.js +60 -30
- package/dist/triggers/routing.js.map +1 -1
- package/package.json +1 -1
- package/templates/diet.html +2 -2
- package/templates/exercise.html +2 -2
- package/templates/goal.html +2 -2
- package/templates/help.html +2 -2
- package/templates/home.html +2 -2
- package/templates/photo-gallery.html +2 -2
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import { WATER_NAME, readGoal } from '../fetch/diet.js';
|
|
2
|
+
import { buildTrendData } from '../analysis/trend.js';
|
|
3
|
+
import { shiftISODate, todayISO } from '../analysis/utils.js';
|
|
4
|
+
import { CalorieRenderError } from './errors.js';
|
|
5
|
+
function assertRange(start, end) {
|
|
6
|
+
if (!/^\d{4}-\d{2}-\d{2}$/.test(start) || !/^\d{4}-\d{2}-\d{2}$/.test(end)) {
|
|
7
|
+
throw new CalorieRenderError('bad-input', '起止日期非法: ' + start + ' ~ ' + end);
|
|
8
|
+
}
|
|
9
|
+
if (start > end)
|
|
10
|
+
throw new CalorieRenderError('bad-input', 'start 不得晚于 end');
|
|
11
|
+
}
|
|
12
|
+
function assertISODate(v, field) {
|
|
13
|
+
if (!/^\d{4}-\d{2}-\d{2}$/.test(v)) {
|
|
14
|
+
throw new CalorieRenderError('bad-input', field + ' 非法(须 YYYY-MM-DD):' + v);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function buildCalorieTrendView(db, start, end) {
|
|
18
|
+
assertRange(start, end);
|
|
19
|
+
const n = db.prepare('SELECT COUNT(*) AS n FROM food_log WHERE date BETWEEN ? AND ? AND food_name != ?').get(start, end, WATER_NAME).n;
|
|
20
|
+
if (n === 0)
|
|
21
|
+
throw new CalorieRenderError('missing-data', `无饮食记录:${start} ~ ${end}`);
|
|
22
|
+
return { start, end, data: buildTrendData(db, start, end) };
|
|
23
|
+
}
|
|
24
|
+
export function parseWindowDays(window) {
|
|
25
|
+
if (window === undefined || window === null || window === '')
|
|
26
|
+
return 30;
|
|
27
|
+
const m = /^(\d+)d$/.exec(window);
|
|
28
|
+
if (!m)
|
|
29
|
+
throw new CalorieRenderError('bad-input', 'window 非法(须如 30d):' + window);
|
|
30
|
+
const n = Number(m[1]);
|
|
31
|
+
if (n < 2 || n > 365)
|
|
32
|
+
throw new CalorieRenderError('bad-input', 'window 越界(2~365d):' + window);
|
|
33
|
+
return n;
|
|
34
|
+
}
|
|
35
|
+
export function buildLongTrendView(db, group, window, endFallback) {
|
|
36
|
+
const g = group ?? 'weight_calorie';
|
|
37
|
+
if (g !== 'weight_calorie')
|
|
38
|
+
throw new CalorieRenderError('bad-input', 'group 仅支持 weight_calorie:' + g);
|
|
39
|
+
assertISODate(endFallback, 'end');
|
|
40
|
+
const n = parseWindowDays(window);
|
|
41
|
+
const end = endFallback;
|
|
42
|
+
const start = shiftISODate(end, -(n - 1));
|
|
43
|
+
const calRows = db.prepare(`SELECT date, COALESCE(SUM(calories), 0) AS cal FROM food_log
|
|
44
|
+
WHERE date BETWEEN ? AND ? AND food_name != ? GROUP BY date`).all(start, end, WATER_NAME);
|
|
45
|
+
const wRows = db.prepare(`SELECT date, weight_kg FROM weight_log WHERE date BETWEEN ? AND ? ORDER BY date, id`).all(start, end);
|
|
46
|
+
if (calRows.length === 0 && wRows.length === 0) {
|
|
47
|
+
throw new CalorieRenderError('missing-data', `无热量/体重记录:${start} ~ ${end}`);
|
|
48
|
+
}
|
|
49
|
+
const calByDate = new Map(calRows.map((r) => [r.date, r.cal]));
|
|
50
|
+
const wByDate = new Map();
|
|
51
|
+
for (const r of wRows)
|
|
52
|
+
wByDate.set(r.date, r.weight_kg);
|
|
53
|
+
const days = [];
|
|
54
|
+
for (let i = 0; i < n; i++) {
|
|
55
|
+
const d = shiftISODate(start, i);
|
|
56
|
+
days.push({ date: d, calorie: calByDate.get(d) ?? 0, weightKg: wByDate.get(d) ?? null });
|
|
57
|
+
}
|
|
58
|
+
const weights = days.map((d) => d.weightKg).filter((w) => w !== null);
|
|
59
|
+
const cals = days.map((d) => d.calorie);
|
|
60
|
+
return {
|
|
61
|
+
start, end, group: g, windowDays: n, days,
|
|
62
|
+
avgCalorie: Math.round(cals.reduce((a, b) => a + b, 0) / n),
|
|
63
|
+
weightChange: weights.length >= 2
|
|
64
|
+
? Math.round((weights[weights.length - 1] - weights[0]) * 10) / 10 : null,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export function buildNutritionAnalysisView(db, start, end) {
|
|
68
|
+
assertRange(start, end);
|
|
69
|
+
// 微量口径(M2 回填 parity):food_log.sodium_mg/sugar_g/fiber_g 任一 NULL 即整行
|
|
70
|
+
// 按迁移同公式从库折算(ORDER BY id DESC 取最新未下架,ROUND 1 位),与 openDb 回填逐值一致,
|
|
71
|
+
// 故只读句柄(不跑迁移)与可写句柄结果全等;三列全有实测值即用实测。
|
|
72
|
+
const micro = (col, prod) => `CASE WHEN f.sodium_mg IS NULL OR f.sugar_g IS NULL OR f.fiber_g IS NULL THEN ` +
|
|
73
|
+
`ROUND((SELECT n.${prod} FROM nutrition_products n WHERE n.product_name = f.food_name ` +
|
|
74
|
+
`AND COALESCE(n.is_deprecated, 0) = 0 ORDER BY n.id DESC LIMIT 1) * f.grams / 100.0, 1) ` +
|
|
75
|
+
`ELSE f.${col} END`;
|
|
76
|
+
const row = db.prepare(`SELECT COUNT(*) AS n, COALESCE(SUM(f.calories), 0) AS cal,
|
|
77
|
+
COALESCE(SUM(f.protein), 0) AS p, COALESCE(SUM(f.carbs), 0) AS c, COALESCE(SUM(f.fat), 0) AS f,
|
|
78
|
+
COALESCE(SUM(${micro('fiber_g', 'dietary_fiber')}), 0) AS fiber,
|
|
79
|
+
COALESCE(SUM(${micro('sodium_mg', 'sodium')}), 0) AS sodium,
|
|
80
|
+
COALESCE(SUM(${micro('sugar_g', 'sugar')}), 0) AS sugar
|
|
81
|
+
FROM food_log f WHERE f.date BETWEEN ? AND ? AND f.food_name != ?`).get(start, end, WATER_NAME);
|
|
82
|
+
if (row.n === 0)
|
|
83
|
+
throw new CalorieRenderError('missing-data', `无饮食记录:${start} ~ ${end}`);
|
|
84
|
+
const days = Math.round((Date.parse(end) - Date.parse(start)) / 86400000) + 1;
|
|
85
|
+
const total = row.cal;
|
|
86
|
+
const pPct = total > 0 ? Math.round((row.p * 4) / total * 100) : 0;
|
|
87
|
+
const cPct = total > 0 ? Math.round((row.c * 4) / total * 100) : 0;
|
|
88
|
+
const fPct = total > 0 ? Math.round((row.f * 9) / total * 100) : 0;
|
|
89
|
+
const fiberAvg = Math.round((row.fiber / days) * 10) / 10;
|
|
90
|
+
const sodiumAvg = Math.round(row.sodium / days);
|
|
91
|
+
const sugarAvg = Math.round((row.sugar / days) * 10) / 10;
|
|
92
|
+
// 规则建议(阈值:蛋白占比<10/脂肪占比>35/纤维日均<25g/钠日均>2000mg/糖日均>50g)。
|
|
93
|
+
const advice = [];
|
|
94
|
+
if (pPct < 10)
|
|
95
|
+
advice.push('蛋白占比 ' + pPct + '% 偏低(建议 10~20%):可加一份高蛋白食物');
|
|
96
|
+
if (fPct > 35)
|
|
97
|
+
advice.push('脂肪占比 ' + fPct + '% 偏高(建议 20~35%):可减油炸/肥肉类');
|
|
98
|
+
if (cPct < 45)
|
|
99
|
+
advice.push('碳水占比 ' + cPct + '% 偏低(建议 45~65%):主食不宜长期缺席');
|
|
100
|
+
if (fiberAvg < 25)
|
|
101
|
+
advice.push('膳食纤维日均 ' + fiberAvg + 'g 不足 25g:可加蔬菜/全谷物');
|
|
102
|
+
if (sodiumAvg > 2000)
|
|
103
|
+
advice.push('钠日均 ' + sodiumAvg + 'mg 超 2000mg:注意减盐');
|
|
104
|
+
if (sugarAvg > 50)
|
|
105
|
+
advice.push('糖日均 ' + sugarAvg + 'g 超 50g:含糖饮料/甜点宜减量');
|
|
106
|
+
if (advice.length === 0)
|
|
107
|
+
advice.push('窗内配比与微量均在建议范围内,继续保持');
|
|
108
|
+
return {
|
|
109
|
+
start, end, days, totalCalorie: total,
|
|
110
|
+
proteinG: row.p, proteinPct: pPct, carbG: row.c, carbPct: cPct, fatG: row.f, fatPct: fPct,
|
|
111
|
+
fiberAvg, sodiumAvg, sugarAvg, advice,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
export function buildSixFactorsView(db, date) {
|
|
115
|
+
assertISODate(date, 'date');
|
|
116
|
+
const goal = readGoal(db);
|
|
117
|
+
const diet = db.prepare(`SELECT COUNT(*) AS meals, COALESCE(SUM(calories), 0) AS cal, COALESCE(SUM(protein), 0) AS p
|
|
118
|
+
FROM food_log WHERE date = ? AND food_name != ?`).get(date, WATER_NAME);
|
|
119
|
+
const water = db.prepare(`SELECT COALESCE(SUM(grams), 0) AS ml FROM food_log WHERE date = ? AND food_name = ?`).get(date, WATER_NAME);
|
|
120
|
+
const ex = db.prepare(`SELECT COUNT(*) AS n FROM exercise_log WHERE date = ? AND COALESCE(is_deleted, 0) = 0`).get(date);
|
|
121
|
+
const w = db.prepare(`SELECT COUNT(*) AS n FROM weight_log WHERE date = ?`).get(date);
|
|
122
|
+
const calGoal = goal?.calorie_goal ?? null;
|
|
123
|
+
const proGoal = goal?.protein_goal ?? null;
|
|
124
|
+
const waterGoal = goal?.water_goal ?? null;
|
|
125
|
+
const factors = [
|
|
126
|
+
{
|
|
127
|
+
key: 'calorie', label: '热量达标',
|
|
128
|
+
ok: calGoal !== null && diet.cal > 0 && diet.cal <= calGoal * 1.05,
|
|
129
|
+
detail: calGoal === null ? '无热量目标(先设目标)' : `${diet.cal} / ${calGoal}卡`,
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
key: 'protein', label: '蛋白达标',
|
|
133
|
+
ok: proGoal !== null && diet.p >= proGoal,
|
|
134
|
+
detail: proGoal === null ? '无蛋白目标(先设目标)' : `${diet.p} / ${proGoal}g`,
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
key: 'water', label: '饮水达标',
|
|
138
|
+
ok: waterGoal !== null && water.ml >= waterGoal,
|
|
139
|
+
detail: waterGoal === null ? '无饮水目标(先设目标)' : `${water.ml} / ${waterGoal}ml`,
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
key: 'exercise', label: '当日运动',
|
|
143
|
+
ok: ex.n > 0,
|
|
144
|
+
detail: ex.n > 0 ? ex.n + ' 次运动记录' : '当日无运动记录',
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
key: 'weigh', label: '当日称重',
|
|
148
|
+
ok: w.n > 0,
|
|
149
|
+
detail: w.n > 0 ? '已称重' : '当日未称重',
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
key: 'meals', label: '三餐齐备',
|
|
153
|
+
ok: diet.meals >= 3,
|
|
154
|
+
detail: diet.meals + ' 餐记录' + (diet.meals >= 3 ? '' : '(不足三餐)'),
|
|
155
|
+
},
|
|
156
|
+
];
|
|
157
|
+
if (diet.meals === 0 && ex.n === 0 && w.n === 0) {
|
|
158
|
+
throw new CalorieRenderError('missing-data', `当日无记录:${date}`);
|
|
159
|
+
}
|
|
160
|
+
return { date, score: factors.filter((f) => f.ok).length, factors };
|
|
161
|
+
}
|
|
162
|
+
export function buildLintHealthView(db) {
|
|
163
|
+
const today = todayISO();
|
|
164
|
+
const libNames = new Set(db.prepare('SELECT product_name AS n FROM nutrition_products WHERE COALESCE(is_deprecated, 0) = 0').all().map((r) => r.n));
|
|
165
|
+
const usedNames = db.prepare('SELECT DISTINCT food_name AS n FROM food_log WHERE food_name != ?').all(WATER_NAME).map((r) => r.n);
|
|
166
|
+
const unmatched = usedNames.filter((n) => !libNames.has(n));
|
|
167
|
+
const badCal = db.prepare('SELECT COUNT(*) AS n FROM food_log WHERE calories <= 0 AND food_name != ?').get(WATER_NAME).n;
|
|
168
|
+
const future = db.prepare('SELECT COUNT(*) AS n FROM food_log WHERE date > ?').get(today).n;
|
|
169
|
+
const dupGroups = db.prepare(`SELECT COUNT(*) AS n FROM (SELECT date, time, food_name, COUNT(*) AS c FROM food_log
|
|
170
|
+
GROUP BY date, time, food_name HAVING c > 1)`).get().n;
|
|
171
|
+
const checks = [
|
|
172
|
+
{
|
|
173
|
+
key: 'unmatched', label: '未匹配食品库',
|
|
174
|
+
count: unmatched.length,
|
|
175
|
+
detail: unmatched.length > 0 ? '如:' + unmatched.slice(0, 5).join('、') : '全部已匹配',
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
key: 'bad-calorie', label: '零/负热量行',
|
|
179
|
+
count: badCal,
|
|
180
|
+
detail: badCal > 0 ? badCal + ' 行热量≤0(水行除外),建议核查' : '无',
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
key: 'future', label: '未来日期行',
|
|
184
|
+
count: future,
|
|
185
|
+
detail: future > 0 ? future + ' 行日期晚于今天,疑似误录' : '无',
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
key: 'duplicate', label: '疑似重复行',
|
|
189
|
+
count: dupGroups,
|
|
190
|
+
detail: dupGroups > 0 ? dupGroups + ' 组同日期时间食物名重复' : '无',
|
|
191
|
+
},
|
|
192
|
+
];
|
|
193
|
+
return { issueCount: checks.reduce((a, c) => a + c.count, 0), checks };
|
|
194
|
+
}
|
|
195
|
+
export function buildBatchImportPreviewView(db, items) {
|
|
196
|
+
if (!Array.isArray(items) || items.length === 0 || items.length > 200) {
|
|
197
|
+
throw new CalorieRenderError('bad-input', 'items 须为 1~200 条数组');
|
|
198
|
+
}
|
|
199
|
+
const lib = new Map(db.prepare('SELECT product_name AS n, calories AS cal FROM nutrition_products WHERE COALESCE(is_deprecated, 0) = 0').all().map((r) => [r.n, r.cal]));
|
|
200
|
+
const out = [];
|
|
201
|
+
for (const raw of items) {
|
|
202
|
+
const it = raw;
|
|
203
|
+
if (typeof it?.foodName !== 'string' || it.foodName.trim() === '') {
|
|
204
|
+
throw new CalorieRenderError('bad-input', 'items[].foodName 须为非空字符串');
|
|
205
|
+
}
|
|
206
|
+
if (typeof it?.calories !== 'number' || !(it.calories > 0)) {
|
|
207
|
+
throw new CalorieRenderError('bad-input', 'items[].calories 须为正数:' + it.foodName);
|
|
208
|
+
}
|
|
209
|
+
const libCal = lib.get(it.foodName) ?? null;
|
|
210
|
+
out.push({ foodName: it.foodName, calories: it.calories, matched: libCal !== null, libCalories: libCal });
|
|
211
|
+
}
|
|
212
|
+
const missingNames = [...new Set(out.filter((i) => !i.matched).map((i) => i.foodName))];
|
|
213
|
+
return {
|
|
214
|
+
total: out.length,
|
|
215
|
+
matched: out.filter((i) => i.matched).length,
|
|
216
|
+
missing: missingNames.length,
|
|
217
|
+
totalCalorie: out.reduce((a, i) => a + i.calories, 0),
|
|
218
|
+
missingNames,
|
|
219
|
+
items: out,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
export function buildProcessProgressView(db, endFallback) {
|
|
223
|
+
assertISODate(endFallback, 'end');
|
|
224
|
+
const end = endFallback;
|
|
225
|
+
const start = shiftISODate(end, -6);
|
|
226
|
+
const plan = db.prepare('SELECT title, total_weeks AS weeks FROM workout_plan_config WHERE id = 1').get();
|
|
227
|
+
const plannedDays = plan
|
|
228
|
+
? db.prepare('SELECT COUNT(*) AS n FROM workout_plans WHERE COALESCE(is_rest_day, 0) = 0').get().n
|
|
229
|
+
: 0;
|
|
230
|
+
const ex = db.prepare(`SELECT COUNT(*) AS n, COALESCE(SUM(duration_minutes), 0) AS mins FROM exercise_log
|
|
231
|
+
WHERE date BETWEEN ? AND ? AND COALESCE(is_deleted, 0) = 0`).get(start, end);
|
|
232
|
+
if (!plan && ex.n === 0)
|
|
233
|
+
throw new CalorieRenderError('missing-data', '无训练计划且近 7 天无运动记录');
|
|
234
|
+
return {
|
|
235
|
+
hasPlan: !!plan,
|
|
236
|
+
title: plan?.title ?? null,
|
|
237
|
+
totalWeeks: plan?.weeks ?? null,
|
|
238
|
+
plannedDays,
|
|
239
|
+
sessions7d: ex.n,
|
|
240
|
+
minutes7d: ex.mins,
|
|
241
|
+
start, end,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
export function buildReviewTemplateView(db, start, end) {
|
|
245
|
+
assertRange(start, end);
|
|
246
|
+
const diet = db.prepare(`SELECT COUNT(*) AS meals, COALESCE(SUM(calories), 0) AS cal FROM food_log
|
|
247
|
+
WHERE date BETWEEN ? AND ? AND food_name != ?`).get(start, end, WATER_NAME);
|
|
248
|
+
const ex = db.prepare(`SELECT COUNT(*) AS n, COALESCE(SUM(duration_minutes), 0) AS mins FROM exercise_log
|
|
249
|
+
WHERE date BETWEEN ? AND ? AND COALESCE(is_deleted, 0) = 0`).get(start, end);
|
|
250
|
+
const weights = db.prepare('SELECT weight_kg AS w FROM weight_log WHERE date BETWEEN ? AND ? ORDER BY date, id').all(start, end).map((r) => r.w);
|
|
251
|
+
if (diet.meals === 0 && ex.n === 0 && weights.length === 0) {
|
|
252
|
+
throw new CalorieRenderError('missing-data', `窗内无记录:${start} ~ ${end}`);
|
|
253
|
+
}
|
|
254
|
+
const days = Math.round((Date.parse(end) - Date.parse(start)) / 86400000) + 1;
|
|
255
|
+
const goal = readGoal(db);
|
|
256
|
+
const avgCalorie = Math.round(diet.cal / days);
|
|
257
|
+
const weightChange = weights.length >= 2
|
|
258
|
+
? Math.round((weights[weights.length - 1] - weights[0]) * 10) / 10 : null;
|
|
259
|
+
const points = [];
|
|
260
|
+
if (goal !== null && diet.meals > 0) {
|
|
261
|
+
points.push(avgCalorie <= goal.calorie_goal * 1.05
|
|
262
|
+
? `日均 ${avgCalorie}卡,控在目标 ${goal.calorie_goal}卡内,达标`
|
|
263
|
+
: `日均 ${avgCalorie}卡,超目标 ${goal.calorie_goal}卡,日均超约 ${avgCalorie - goal.calorie_goal}卡`);
|
|
264
|
+
}
|
|
265
|
+
points.push(ex.n > 0 ? `共运动 ${ex.n} 次 ${ex.mins} 分钟` : '窗内无运动记录,下周可先加一次短时运动');
|
|
266
|
+
if (weightChange !== null) {
|
|
267
|
+
points.push(weightChange < 0 ? `体重降 ${0 - weightChange}kg,方向向好` : (weightChange > 0 ? `体重涨 ${weightChange}kg,结合饮食找原因` : '体重持平'));
|
|
268
|
+
}
|
|
269
|
+
if (diet.meals > 0 && diet.meals < days * 2)
|
|
270
|
+
points.push('记餐偏疏(日均不足 2 餐),复盘结论仅供参考');
|
|
271
|
+
return {
|
|
272
|
+
start, end, days, meals: diet.meals, avgCalorie,
|
|
273
|
+
goalCalorie: goal?.calorie_goal ?? null,
|
|
274
|
+
sessions: ex.n, minutes: ex.mins, weightChange, points,
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=trendMiscPort.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trendMiscPort.js","sourceRoot":"","sources":["../../src/render/trendMiscPort.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { BatchImportPreviewView, CalorieTrendView, LintHealthView, LongTrendView, NutritionAnalysisView, ProcessProgressView, ReviewTemplateView, SixFactorsView } from './trendMiscPort.js';
|
|
2
|
+
export declare function buildCalorieTrendDoc(v: CalorieTrendView): string;
|
|
3
|
+
export declare function buildLongTrendDoc(v: LongTrendView): string;
|
|
4
|
+
export declare function buildNutritionAnalysisDoc(v: NutritionAnalysisView): string;
|
|
5
|
+
export declare function buildSixFactorsDoc(v: SixFactorsView): string;
|
|
6
|
+
export declare function buildLintHealthDoc(v: LintHealthView): string;
|
|
7
|
+
export declare function buildBatchImportPreviewDoc(v: BatchImportPreviewView): string;
|
|
8
|
+
export declare function buildProcessProgressDoc(v: ProcessProgressView): string;
|
|
9
|
+
export declare function buildReviewTemplateDoc(v: ReviewTemplateView): string;
|
|
10
|
+
//# sourceMappingURL=trendMiscPortDocs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trendMiscPortDocs.d.ts","sourceRoot":"","sources":["../../src/render/trendMiscPortDocs.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EACV,sBAAsB,EACtB,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACf,MAAM,oBAAoB,CAAC;AAoE5B,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAqChE;AAID,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAmD1D;AAID,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,qBAAqB,GAAG,MAAM,CA6E1E;AAID,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,cAAc,GAAG,MAAM,CAwC5D;AAID,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,cAAc,GAAG,MAAM,CAyC5D;AAID,wBAAgB,0BAA0B,CAAC,CAAC,EAAE,sBAAsB,GAAG,MAAM,CAoD5E;AAID,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,mBAAmB,GAAG,MAAM,CA2BtE;AAID,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAsCpE"}
|