skill-calorie 0.1.0
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/dist/analysis/anomaly/common.d.ts +53 -0
- package/dist/analysis/anomaly/common.d.ts.map +1 -0
- package/dist/analysis/anomaly/common.js +69 -0
- package/dist/analysis/anomaly/common.js.map +1 -0
- package/dist/analysis/anomaly/diet.d.ts +8 -0
- package/dist/analysis/anomaly/diet.d.ts.map +1 -0
- package/dist/analysis/anomaly/diet.js +95 -0
- package/dist/analysis/anomaly/diet.js.map +1 -0
- package/dist/analysis/anomaly/exercise.d.ts +9 -0
- package/dist/analysis/anomaly/exercise.d.ts.map +1 -0
- package/dist/analysis/anomaly/exercise.js +116 -0
- package/dist/analysis/anomaly/exercise.js.map +1 -0
- package/dist/analysis/anomaly/index.d.ts +19 -0
- package/dist/analysis/anomaly/index.d.ts.map +1 -0
- package/dist/analysis/anomaly/index.js +51 -0
- package/dist/analysis/anomaly/index.js.map +1 -0
- package/dist/analysis/anomaly/overall.d.ts +13 -0
- package/dist/analysis/anomaly/overall.d.ts.map +1 -0
- package/dist/analysis/anomaly/overall.js +128 -0
- package/dist/analysis/anomaly/overall.js.map +1 -0
- package/dist/analysis/anomaly/overall2.d.ts +5 -0
- package/dist/analysis/anomaly/overall2.d.ts.map +1 -0
- package/dist/analysis/anomaly/overall2.js +94 -0
- package/dist/analysis/anomaly/overall2.js.map +1 -0
- package/dist/analysis/anomaly/weight.d.ts +8 -0
- package/dist/analysis/anomaly/weight.d.ts.map +1 -0
- package/dist/analysis/anomaly/weight.js +106 -0
- package/dist/analysis/anomaly/weight.js.map +1 -0
- package/dist/analysis/anomaly/weight2.d.ts +4 -0
- package/dist/analysis/anomaly/weight2.d.ts.map +1 -0
- package/dist/analysis/anomaly/weight2.js +59 -0
- package/dist/analysis/anomaly/weight2.js.map +1 -0
- package/dist/analysis/contraindications.d.ts +63 -0
- package/dist/analysis/contraindications.d.ts.map +1 -0
- package/dist/analysis/contraindications.js +121 -0
- package/dist/analysis/contraindications.js.map +1 -0
- package/dist/analysis/cross.d.ts +75 -0
- package/dist/analysis/cross.d.ts.map +1 -0
- package/dist/analysis/cross.js +283 -0
- package/dist/analysis/cross.js.map +1 -0
- package/dist/analysis/dashboard.d.ts +18 -0
- package/dist/analysis/dashboard.d.ts.map +1 -0
- package/dist/analysis/dashboard.js +48 -0
- package/dist/analysis/dashboard.js.map +1 -0
- package/dist/analysis/deficit.d.ts +44 -0
- package/dist/analysis/deficit.d.ts.map +1 -0
- package/dist/analysis/deficit.js +54 -0
- package/dist/analysis/deficit.js.map +1 -0
- package/dist/analysis/diet.d.ts +76 -0
- package/dist/analysis/diet.d.ts.map +1 -0
- package/dist/analysis/diet.js +164 -0
- package/dist/analysis/diet.js.map +1 -0
- package/dist/analysis/exercise.d.ts +98 -0
- package/dist/analysis/exercise.d.ts.map +1 -0
- package/dist/analysis/exercise.js +298 -0
- package/dist/analysis/exercise.js.map +1 -0
- package/dist/analysis/exerciseReview.d.ts +36 -0
- package/dist/analysis/exerciseReview.d.ts.map +1 -0
- package/dist/analysis/exerciseReview.js +50 -0
- package/dist/analysis/exerciseReview.js.map +1 -0
- package/dist/analysis/precision.d.ts +15 -0
- package/dist/analysis/precision.d.ts.map +1 -0
- package/dist/analysis/precision.js +38 -0
- package/dist/analysis/precision.js.map +1 -0
- package/dist/analysis/result.d.ts +15 -0
- package/dist/analysis/result.d.ts.map +1 -0
- package/dist/analysis/result.js +13 -0
- package/dist/analysis/result.js.map +1 -0
- package/dist/analysis/review.d.ts +118 -0
- package/dist/analysis/review.d.ts.map +1 -0
- package/dist/analysis/review.js +195 -0
- package/dist/analysis/review.js.map +1 -0
- package/dist/analysis/series.d.ts +42 -0
- package/dist/analysis/series.d.ts.map +1 -0
- package/dist/analysis/series.js +127 -0
- package/dist/analysis/series.js.map +1 -0
- package/dist/analysis/simulate.d.ts +43 -0
- package/dist/analysis/simulate.d.ts.map +1 -0
- package/dist/analysis/simulate.js +109 -0
- package/dist/analysis/simulate.js.map +1 -0
- package/dist/analysis/simulate2.d.ts +65 -0
- package/dist/analysis/simulate2.d.ts.map +1 -0
- package/dist/analysis/simulate2.js +173 -0
- package/dist/analysis/simulate2.js.map +1 -0
- package/dist/analysis/trend.d.ts +39 -0
- package/dist/analysis/trend.d.ts.map +1 -0
- package/dist/analysis/trend.js +48 -0
- package/dist/analysis/trend.js.map +1 -0
- package/dist/analysis/utils.d.ts +17 -0
- package/dist/analysis/utils.d.ts.map +1 -0
- package/dist/analysis/utils.js +52 -0
- package/dist/analysis/utils.js.map +1 -0
- package/dist/analysis/volatility.d.ts +43 -0
- package/dist/analysis/volatility.d.ts.map +1 -0
- package/dist/analysis/volatility.js +96 -0
- package/dist/analysis/volatility.js.map +1 -0
- package/dist/analysis/weight.d.ts +86 -0
- package/dist/analysis/weight.d.ts.map +1 -0
- package/dist/analysis/weight.js +219 -0
- package/dist/analysis/weight.js.map +1 -0
- package/dist/analysis/weightCompare.d.ts +63 -0
- package/dist/analysis/weightCompare.d.ts.map +1 -0
- package/dist/analysis/weightCompare.js +212 -0
- package/dist/analysis/weightCompare.js.map +1 -0
- package/dist/analysis/weightCompare2.d.ts +63 -0
- package/dist/analysis/weightCompare2.d.ts.map +1 -0
- package/dist/analysis/weightCompare2.js +211 -0
- package/dist/analysis/weightCompare2.js.map +1 -0
- package/dist/analysis/weightCompare3.d.ts +13 -0
- package/dist/analysis/weightCompare3.d.ts.map +1 -0
- package/dist/analysis/weightCompare3.js +199 -0
- package/dist/analysis/weightCompare3.js.map +1 -0
- package/dist/cli/cmd_read.d.ts +8 -0
- package/dist/cli/cmd_read.d.ts.map +1 -0
- package/dist/cli/cmd_read.js +719 -0
- package/dist/cli/cmd_read.js.map +1 -0
- package/dist/cli/keys.d.ts +333 -0
- package/dist/cli/keys.d.ts.map +1 -0
- package/dist/cli/keys.js +103 -0
- package/dist/cli/keys.js.map +1 -0
- package/dist/cli/write.d.ts +24 -0
- package/dist/cli/write.d.ts.map +1 -0
- package/dist/cli/write.js +832 -0
- package/dist/cli/write.js.map +1 -0
- package/dist/fetch/audit.d.ts +25 -0
- package/dist/fetch/audit.d.ts.map +1 -0
- package/dist/fetch/audit.js +46 -0
- package/dist/fetch/audit.js.map +1 -0
- package/dist/fetch/batch.d.ts +68 -0
- package/dist/fetch/batch.d.ts.map +1 -0
- package/dist/fetch/batch.js +183 -0
- package/dist/fetch/batch.js.map +1 -0
- package/dist/fetch/body.d.ts +89 -0
- package/dist/fetch/body.d.ts.map +1 -0
- package/dist/fetch/body.js +217 -0
- package/dist/fetch/body.js.map +1 -0
- package/dist/fetch/cli.d.ts +3 -0
- package/dist/fetch/cli.d.ts.map +1 -0
- package/dist/fetch/cli.js +195 -0
- package/dist/fetch/cli.js.map +1 -0
- package/dist/fetch/cross-skill.d.ts +29 -0
- package/dist/fetch/cross-skill.d.ts.map +1 -0
- package/dist/fetch/cross-skill.js +42 -0
- package/dist/fetch/cross-skill.js.map +1 -0
- package/dist/fetch/db.d.ts +5 -0
- package/dist/fetch/db.d.ts.map +1 -0
- package/dist/fetch/db.js +4 -0
- package/dist/fetch/db.js.map +1 -0
- package/dist/fetch/diet.d.ts +174 -0
- package/dist/fetch/diet.d.ts.map +1 -0
- package/dist/fetch/diet.js +239 -0
- package/dist/fetch/diet.js.map +1 -0
- package/dist/fetch/errors.d.ts +5 -0
- package/dist/fetch/errors.d.ts.map +1 -0
- package/dist/fetch/errors.js +8 -0
- package/dist/fetch/errors.js.map +1 -0
- package/dist/fetch/exercise.d.ts +72 -0
- package/dist/fetch/exercise.d.ts.map +1 -0
- package/dist/fetch/exercise.js +270 -0
- package/dist/fetch/exercise.js.map +1 -0
- package/dist/fetch/goal.d.ts +48 -0
- package/dist/fetch/goal.d.ts.map +1 -0
- package/dist/fetch/goal.js +73 -0
- package/dist/fetch/goal.js.map +1 -0
- package/dist/fetch/goalHistory.d.ts +24 -0
- package/dist/fetch/goalHistory.d.ts.map +1 -0
- package/dist/fetch/goalHistory.js +51 -0
- package/dist/fetch/goalHistory.js.map +1 -0
- package/dist/fetch/history.d.ts +28 -0
- package/dist/fetch/history.d.ts.map +1 -0
- package/dist/fetch/history.js +29 -0
- package/dist/fetch/history.js.map +1 -0
- package/dist/fetch/index.d.ts +23 -0
- package/dist/fetch/index.d.ts.map +1 -0
- package/dist/fetch/index.js +16 -0
- package/dist/fetch/index.js.map +1 -0
- package/dist/fetch/nutritionGoal.d.ts +115 -0
- package/dist/fetch/nutritionGoal.d.ts.map +1 -0
- package/dist/fetch/nutritionGoal.js +154 -0
- package/dist/fetch/nutritionGoal.js.map +1 -0
- package/dist/fetch/photos.d.ts +76 -0
- package/dist/fetch/photos.d.ts.map +1 -0
- package/dist/fetch/photos.js +193 -0
- package/dist/fetch/photos.js.map +1 -0
- package/dist/fetch/plan.d.ts +145 -0
- package/dist/fetch/plan.d.ts.map +1 -0
- package/dist/fetch/plan.js +258 -0
- package/dist/fetch/plan.js.map +1 -0
- package/dist/fetch/products.d.ts +62 -0
- package/dist/fetch/products.d.ts.map +1 -0
- package/dist/fetch/products.js +73 -0
- package/dist/fetch/products.js.map +1 -0
- package/dist/fetch/profile.d.ts +46 -0
- package/dist/fetch/profile.d.ts.map +1 -0
- package/dist/fetch/profile.js +105 -0
- package/dist/fetch/profile.js.map +1 -0
- package/dist/fetch/shapes.d.ts +41 -0
- package/dist/fetch/shapes.d.ts.map +1 -0
- package/dist/fetch/shapes.js +38 -0
- package/dist/fetch/shapes.js.map +1 -0
- package/dist/fetch/validate.d.ts +11 -0
- package/dist/fetch/validate.d.ts.map +1 -0
- package/dist/fetch/validate.js +64 -0
- package/dist/fetch/validate.js.map +1 -0
- package/dist/fetch/weight.d.ts +109 -0
- package/dist/fetch/weight.d.ts.map +1 -0
- package/dist/fetch/weight.js +210 -0
- package/dist/fetch/weight.js.map +1 -0
- package/dist/fetch/xunji-catalog.d.ts +17 -0
- package/dist/fetch/xunji-catalog.d.ts.map +1 -0
- package/dist/fetch/xunji-catalog.js +57 -0
- package/dist/fetch/xunji-catalog.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/kcal.d.ts +21 -0
- package/dist/kcal.d.ts.map +1 -0
- package/dist/kcal.js +27 -0
- package/dist/kcal.js.map +1 -0
- package/dist/migrate/migrate.d.ts +71 -0
- package/dist/migrate/migrate.d.ts.map +1 -0
- package/dist/migrate/migrate.js +450 -0
- package/dist/migrate/migrate.js.map +1 -0
- package/dist/paths.d.ts +6 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +34 -0
- package/dist/paths.js.map +1 -0
- package/dist/render/analysisPlate.d.ts +49 -0
- package/dist/render/analysisPlate.d.ts.map +1 -0
- package/dist/render/analysisPlate.js +149 -0
- package/dist/render/analysisPlate.js.map +1 -0
- package/dist/render/bodyPlate.d.ts +55 -0
- package/dist/render/bodyPlate.d.ts.map +1 -0
- package/dist/render/bodyPlate.js +97 -0
- package/dist/render/bodyPlate.js.map +1 -0
- package/dist/render/diet.d.ts +47 -0
- package/dist/render/diet.d.ts.map +1 -0
- package/dist/render/diet.js +94 -0
- package/dist/render/diet.js.map +1 -0
- package/dist/render/envelope.d.ts +60 -0
- package/dist/render/envelope.d.ts.map +1 -0
- package/dist/render/envelope.js +111 -0
- package/dist/render/envelope.js.map +1 -0
- package/dist/render/errors.d.ts +10 -0
- package/dist/render/errors.d.ts.map +1 -0
- package/dist/render/errors.js +9 -0
- package/dist/render/errors.js.map +1 -0
- package/dist/render/exercise.d.ts +20 -0
- package/dist/render/exercise.d.ts.map +1 -0
- package/dist/render/exercise.js +32 -0
- package/dist/render/exercise.js.map +1 -0
- package/dist/render/goal.d.ts +24 -0
- package/dist/render/goal.d.ts.map +1 -0
- package/dist/render/goal.js +23 -0
- package/dist/render/goal.js.map +1 -0
- package/dist/render/goalExtra.d.ts +45 -0
- package/dist/render/goalExtra.d.ts.map +1 -0
- package/dist/render/goalExtra.js +94 -0
- package/dist/render/goalExtra.js.map +1 -0
- package/dist/render/goalPlate.d.ts +66 -0
- package/dist/render/goalPlate.d.ts.map +1 -0
- package/dist/render/goalPlate.js +110 -0
- package/dist/render/goalPlate.js.map +1 -0
- package/dist/render/health.d.ts +21 -0
- package/dist/render/health.d.ts.map +1 -0
- package/dist/render/health.js +41 -0
- package/dist/render/health.js.map +1 -0
- package/dist/render/help.d.ts +18 -0
- package/dist/render/help.d.ts.map +1 -0
- package/dist/render/help.js +58 -0
- package/dist/render/help.js.map +1 -0
- package/dist/render/home.d.ts +30 -0
- package/dist/render/home.d.ts.map +1 -0
- package/dist/render/home.js +73 -0
- package/dist/render/home.js.map +1 -0
- package/dist/render/html.d.ts +66 -0
- package/dist/render/html.d.ts.map +1 -0
- package/dist/render/html.js +510 -0
- package/dist/render/html.js.map +1 -0
- package/dist/render/index.d.ts +47 -0
- package/dist/render/index.d.ts.map +1 -0
- package/dist/render/index.js +26 -0
- package/dist/render/index.js.map +1 -0
- package/dist/render/insightPlate.d.ts +55 -0
- package/dist/render/insightPlate.d.ts.map +1 -0
- package/dist/render/insightPlate.js +97 -0
- package/dist/render/insightPlate.js.map +1 -0
- package/dist/render/library.d.ts +32 -0
- package/dist/render/library.d.ts.map +1 -0
- package/dist/render/library.js +54 -0
- package/dist/render/library.js.map +1 -0
- package/dist/render/photo.d.ts +101 -0
- package/dist/render/photo.d.ts.map +1 -0
- package/dist/render/photo.js +241 -0
- package/dist/render/photo.js.map +1 -0
- package/dist/render/planPlate.d.ts +40 -0
- package/dist/render/planPlate.d.ts.map +1 -0
- package/dist/render/planPlate.js +72 -0
- package/dist/render/planPlate.js.map +1 -0
- package/dist/render/profilePlate.d.ts +17 -0
- package/dist/render/profilePlate.d.ts.map +1 -0
- package/dist/render/profilePlate.js +18 -0
- package/dist/render/profilePlate.js.map +1 -0
- package/dist/render/ranking.d.ts +22 -0
- package/dist/render/ranking.d.ts.map +1 -0
- package/dist/render/ranking.js +63 -0
- package/dist/render/ranking.js.map +1 -0
- package/dist/render/receipt.d.ts +71 -0
- package/dist/render/receipt.d.ts.map +1 -0
- package/dist/render/receipt.js +65 -0
- package/dist/render/receipt.js.map +1 -0
- package/dist/render/weightPlate.d.ts +54 -0
- package/dist/render/weightPlate.d.ts.map +1 -0
- package/dist/render/weightPlate.js +110 -0
- package/dist/render/weightPlate.js.map +1 -0
- package/dist/schema.d.ts +25 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +281 -0
- package/dist/schema.js.map +1 -0
- package/dist/triggers/help-lookup.d.ts +28 -0
- package/dist/triggers/help-lookup.d.ts.map +1 -0
- package/dist/triggers/help-lookup.js +163 -0
- package/dist/triggers/help-lookup.js.map +1 -0
- package/dist/triggers/index.d.ts +24 -0
- package/dist/triggers/index.d.ts.map +1 -0
- package/dist/triggers/index.js +78 -0
- package/dist/triggers/index.js.map +1 -0
- package/dist/triggers/scene-01-home.d.ts +4 -0
- package/dist/triggers/scene-01-home.d.ts.map +1 -0
- package/dist/triggers/scene-01-home.js +13 -0
- package/dist/triggers/scene-01-home.js.map +1 -0
- package/dist/triggers/scene-02-diet.d.ts +4 -0
- package/dist/triggers/scene-02-diet.d.ts.map +1 -0
- package/dist/triggers/scene-02-diet.js +74 -0
- package/dist/triggers/scene-02-diet.js.map +1 -0
- package/dist/triggers/scene-03-weight.d.ts +4 -0
- package/dist/triggers/scene-03-weight.d.ts.map +1 -0
- package/dist/triggers/scene-03-weight.js +62 -0
- package/dist/triggers/scene-03-weight.js.map +1 -0
- package/dist/triggers/scene-04-exercise.d.ts +4 -0
- package/dist/triggers/scene-04-exercise.d.ts.map +1 -0
- package/dist/triggers/scene-04-exercise.js +43 -0
- package/dist/triggers/scene-04-exercise.js.map +1 -0
- package/dist/triggers/scene-05-workout.d.ts +4 -0
- package/dist/triggers/scene-05-workout.d.ts.map +1 -0
- package/dist/triggers/scene-05-workout.js +36 -0
- package/dist/triggers/scene-05-workout.js.map +1 -0
- package/dist/triggers/scene-06-goal.d.ts +4 -0
- package/dist/triggers/scene-06-goal.d.ts.map +1 -0
- package/dist/triggers/scene-06-goal.js +29 -0
- package/dist/triggers/scene-06-goal.js.map +1 -0
- package/dist/triggers/scene-07-profile.d.ts +4 -0
- package/dist/triggers/scene-07-profile.d.ts.map +1 -0
- package/dist/triggers/scene-07-profile.js +8 -0
- package/dist/triggers/scene-07-profile.js.map +1 -0
- package/dist/triggers/scene-08-body.d.ts +4 -0
- package/dist/triggers/scene-08-body.d.ts.map +1 -0
- package/dist/triggers/scene-08-body.js +17 -0
- package/dist/triggers/scene-08-body.js.map +1 -0
- package/dist/triggers/scene-09-photo.d.ts +4 -0
- package/dist/triggers/scene-09-photo.d.ts.map +1 -0
- package/dist/triggers/scene-09-photo.js +14 -0
- package/dist/triggers/scene-09-photo.js.map +1 -0
- package/dist/triggers/scene-10-analysis.d.ts +4 -0
- package/dist/triggers/scene-10-analysis.d.ts.map +1 -0
- package/dist/triggers/scene-10-analysis.js +180 -0
- package/dist/triggers/scene-10-analysis.js.map +1 -0
- package/dist/triggers/types.d.ts +66 -0
- package/dist/triggers/types.d.ts.map +1 -0
- package/dist/triggers/types.js +3 -0
- package/dist/triggers/types.js.map +1 -0
- package/package.json +35 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/analysis/review.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { FetchError } from '../fetch/errors.js';
|
|
2
|
+
import { getActivityFactor, shiftISODate, todayISO } from './utils.js';
|
|
3
|
+
const round = (n) => Math.round(n);
|
|
4
|
+
const round1 = (n) => Math.round(n * 10) / 10;
|
|
5
|
+
function normalizeDate(s, refISO) {
|
|
6
|
+
const t = s.trim();
|
|
7
|
+
if (/^\d{4}-\d{2}-\d{2}$/.test(t)) {
|
|
8
|
+
if (Number.isNaN(Date.parse(t + 'T12:00:00Z')))
|
|
9
|
+
throw new FetchError('日期格式错误: ' + s);
|
|
10
|
+
return t;
|
|
11
|
+
}
|
|
12
|
+
if (t.includes('/')) {
|
|
13
|
+
const parts = t.split('/');
|
|
14
|
+
const m = Number(parts[0]);
|
|
15
|
+
const d = Number(parts[1]);
|
|
16
|
+
if (!Number.isInteger(m) || !Number.isInteger(d))
|
|
17
|
+
throw new FetchError('日期格式错误: ' + s);
|
|
18
|
+
return refISO.slice(0, 4) + '-' + String(m).padStart(2, '0') + '-' + String(d).padStart(2, '0');
|
|
19
|
+
}
|
|
20
|
+
if (/^\d{1,2}$/.test(t))
|
|
21
|
+
return refISO.slice(0, 8) + t.padStart(2, '0');
|
|
22
|
+
throw new FetchError('无法解析日期: ' + s);
|
|
23
|
+
}
|
|
24
|
+
export function parseRange(rangeArg, rangeType = 'week', today = todayISO()) {
|
|
25
|
+
if (rangeArg) {
|
|
26
|
+
if (rangeArg.includes(':')) {
|
|
27
|
+
const parts = rangeArg.split(':');
|
|
28
|
+
return [normalizeDate(parts[0], today), normalizeDate(parts[1], today)];
|
|
29
|
+
}
|
|
30
|
+
const d = normalizeDate(rangeArg, today);
|
|
31
|
+
return [d, d];
|
|
32
|
+
}
|
|
33
|
+
if (rangeType === 'day')
|
|
34
|
+
return [today, today];
|
|
35
|
+
if (rangeType === 'week')
|
|
36
|
+
return [shiftISODate(today, -6), today];
|
|
37
|
+
if (rangeType === 'month')
|
|
38
|
+
return [today.slice(0, 8) + '01', today];
|
|
39
|
+
if (rangeType === 'year')
|
|
40
|
+
return [today.slice(0, 4) + '-01-01', today];
|
|
41
|
+
throw new FetchError('未知 range_type: ' + rangeType);
|
|
42
|
+
}
|
|
43
|
+
function daysBetween(d1, d2) {
|
|
44
|
+
return Math.round((Date.parse(d2 + 'T12:00:00Z') - Date.parse(d1 + 'T12:00:00Z')) / 86400000);
|
|
45
|
+
}
|
|
46
|
+
export function query5dims(db, start, end) {
|
|
47
|
+
const dailyIntake = db.prepare("SELECT date, SUM(calories) AS totalCalorie, SUM(protein) AS totalProtein, SUM(carbs) AS totalCarbs, SUM(fat) AS totalFat, COUNT(*) AS mealCount" +
|
|
48
|
+
" FROM food_log WHERE food_name != '💧水' AND date BETWEEN ? AND ? GROUP BY date ORDER BY date").all(start, end);
|
|
49
|
+
const dailyBurn = db.prepare('SELECT date, SUM(calories_burned) AS totalBurned, SUM(duration_minutes) AS totalMinutes,' +
|
|
50
|
+
' GROUP_CONCAT(DISTINCT exercise_type) AS types, GROUP_CONCAT(DISTINCT category) AS categories' +
|
|
51
|
+
' FROM exercise_log WHERE date BETWEEN ? AND ? GROUP BY date ORDER BY date').all(start, end);
|
|
52
|
+
const weightLogs = db.prepare('SELECT date, weight_kg AS weightKg FROM weight_log WHERE date BETWEEN ? AND ? ORDER BY date').all(start, end);
|
|
53
|
+
const cfg = db.prepare('SELECT * FROM workout_plan_config WHERE id = 1').get();
|
|
54
|
+
let fitnessPlan = null;
|
|
55
|
+
if (cfg) {
|
|
56
|
+
const plans = db.prepare('SELECT * FROM workout_plans ORDER BY week_number, day_of_week, session_index').all();
|
|
57
|
+
const index = new Map();
|
|
58
|
+
for (const p of plans) {
|
|
59
|
+
const k = p.week_number + ':' + p.day_of_week;
|
|
60
|
+
if (!index.has(k))
|
|
61
|
+
index.set(k, []);
|
|
62
|
+
index.get(k).push(p);
|
|
63
|
+
}
|
|
64
|
+
fitnessPlan = [];
|
|
65
|
+
for (let d = start; d <= end; d = shiftISODate(d, 1)) {
|
|
66
|
+
const realWeek = Math.floor(dayDiff(cfg.start_date, d) / 7) + 1;
|
|
67
|
+
const planWeek = ((realWeek - 1) % cfg.total_weeks) + 1;
|
|
68
|
+
const dow = new Date(d + 'T12:00:00Z').getUTCDay();
|
|
69
|
+
const isoDow = dow === 0 ? 7 : dow;
|
|
70
|
+
for (const p of index.get(planWeek + ':' + isoDow) ?? []) {
|
|
71
|
+
fitnessPlan.push({
|
|
72
|
+
date: d, weekNumber: planWeek, dayOfWeek: isoDow, sessionLabel: p.session_label,
|
|
73
|
+
isRestDay: p.is_rest_day, totalSets: p.total_sets,
|
|
74
|
+
movements: p.movements ? JSON.parse(p.movements) : [],
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const prof = db.prepare('SELECT height_cm, age, gender, activity_level FROM user_profile WHERE id = 1').get();
|
|
80
|
+
const goalRow = db.prepare('SELECT * FROM daily_goal WHERE id = 1').get();
|
|
81
|
+
const topRows = db.prepare("SELECT food_name AS n, SUM(calories) AS totalCal, COUNT(*) AS cnt FROM food_log WHERE food_name != '💧水' AND date BETWEEN ? AND ? GROUP BY food_name ORDER BY cnt DESC, totalCal DESC LIMIT 5").all(start, end);
|
|
82
|
+
return {
|
|
83
|
+
range: { start, end, days: daysBetween(start, end) + 1 },
|
|
84
|
+
dailyIntake,
|
|
85
|
+
dailyBurn,
|
|
86
|
+
weightLogs,
|
|
87
|
+
fitnessPlan,
|
|
88
|
+
userProfile: { heightCm: prof?.height_cm ?? null, age: prof?.age ?? 30, gender: prof?.gender ?? 'male', activityLevel: prof?.activity_level ?? 'moderate' },
|
|
89
|
+
nutritionTargets: goalRow ? { ...goalRow } : {},
|
|
90
|
+
topFoods: topRows.map((r) => ({ name: r.n, totalCal: r.totalCal, cnt: r.cnt, avgCalPerMeal: round(r.totalCal / Math.max(r.cnt, 1)) })),
|
|
91
|
+
};
|
|
92
|
+
function dayDiff(a, b) {
|
|
93
|
+
return Math.round((Date.parse(b + 'T12:00:00Z') - Date.parse(a + 'T12:00:00Z')) / 86400000);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export function nutritionMatchRate(dailyIntake, targets) {
|
|
97
|
+
if (dailyIntake.length === 0)
|
|
98
|
+
return { daysCount: 0, matchedDays: 0, matchRatePct: 0, summary: '无数据' };
|
|
99
|
+
const calGoal = targets['calorie_goal'];
|
|
100
|
+
const proGoal = targets['protein_goal'];
|
|
101
|
+
if (typeof calGoal !== 'number' || typeof proGoal !== 'number' || !calGoal || !proGoal) {
|
|
102
|
+
return { daysCount: dailyIntake.length, matchedDays: 0, matchRatePct: 0, summary: '无营养目标' };
|
|
103
|
+
}
|
|
104
|
+
let matched = 0;
|
|
105
|
+
for (const day of dailyIntake) {
|
|
106
|
+
if (Math.abs(day.totalCalorie - calGoal) <= calGoal * 0.1 && day.totalProtein >= proGoal * 0.8)
|
|
107
|
+
matched += 1;
|
|
108
|
+
}
|
|
109
|
+
const pct = round((matched / dailyIntake.length) * 100);
|
|
110
|
+
return { daysCount: dailyIntake.length, matchedDays: matched, matchRatePct: pct, summary: pct + '%(' + matched + '/' + dailyIntake.length + ' 天 配比达标)' };
|
|
111
|
+
}
|
|
112
|
+
export function deriveReview(db, dims, today = todayISO()) {
|
|
113
|
+
void db;
|
|
114
|
+
const completeIntake = dims.dailyIntake.filter((d) => d.date < today);
|
|
115
|
+
const todayIntake = dims.dailyIntake.find((d) => d.date === today) ?? null;
|
|
116
|
+
const completeBurn = dims.dailyBurn.filter((d) => d.date < today);
|
|
117
|
+
const todayBurn = dims.dailyBurn.find((d) => d.date === today) ?? null;
|
|
118
|
+
const latestWeight = dims.weightLogs.length > 0 ? dims.weightLogs[dims.weightLogs.length - 1].weightKg : null;
|
|
119
|
+
const prof = dims.userProfile;
|
|
120
|
+
const tdee = latestWeight && prof.heightCm
|
|
121
|
+
? round((10 * latestWeight + 6.25 * prof.heightCm - 5 * prof.age + (prof.gender === 'male' ? 5 : -161)) * getActivityFactor(prof.activityLevel))
|
|
122
|
+
: 1800;
|
|
123
|
+
const intakeSummary = completeIntake.length > 0
|
|
124
|
+
? {
|
|
125
|
+
daysCount: completeIntake.length,
|
|
126
|
+
avgCalorie: round1(completeIntake.reduce((a, d) => a + d.totalCalorie, 0) / completeIntake.length),
|
|
127
|
+
avgProtein: round1(completeIntake.reduce((a, d) => a + d.totalProtein, 0) / completeIntake.length),
|
|
128
|
+
avgCarbs: round1(completeIntake.reduce((a, d) => a + d.totalCarbs, 0) / completeIntake.length),
|
|
129
|
+
avgFat: round1(completeIntake.reduce((a, d) => a + d.totalFat, 0) / completeIntake.length),
|
|
130
|
+
}
|
|
131
|
+
: todayIntake
|
|
132
|
+
? { daysCount: 1, isPartial: true, avgCalorie: todayIntake.totalCalorie, avgProtein: todayIntake.totalProtein, avgCarbs: todayIntake.totalCarbs, avgFat: todayIntake.totalFat }
|
|
133
|
+
: { daysCount: 0, avgCalorie: 0, avgProtein: 0, avgCarbs: 0, avgFat: 0 };
|
|
134
|
+
const burnSummary = completeBurn.length > 0
|
|
135
|
+
? {
|
|
136
|
+
daysCount: completeBurn.length,
|
|
137
|
+
totalBurned: completeBurn.reduce((a, d) => a + d.totalBurned, 0),
|
|
138
|
+
avgBurned: round1(completeBurn.reduce((a, d) => a + d.totalBurned, 0) / completeBurn.length),
|
|
139
|
+
totalMinutes: completeBurn.reduce((a, d) => a + (d.totalMinutes ?? 0), 0),
|
|
140
|
+
}
|
|
141
|
+
: todayBurn
|
|
142
|
+
? { daysCount: 1, isPartial: true, totalBurned: todayBurn.totalBurned, avgBurned: todayBurn.totalBurned, totalMinutes: todayBurn.totalMinutes ?? 0 }
|
|
143
|
+
: { daysCount: 0, totalBurned: 0, avgBurned: 0, totalMinutes: 0 };
|
|
144
|
+
const totalKcal = intakeSummary.avgProtein * 4 + intakeSummary.avgCarbs * 4 + intakeSummary.avgFat * 9;
|
|
145
|
+
const macroRatio = totalKcal > 0
|
|
146
|
+
? { proteinPct: round((intakeSummary.avgProtein * 4) / totalKcal * 100), carbsPct: round((intakeSummary.avgCarbs * 4) / totalKcal * 100), fatPct: round((intakeSummary.avgFat * 9) / totalKcal * 100) }
|
|
147
|
+
: { proteinPct: 0, carbsPct: 0, fatPct: 0 };
|
|
148
|
+
const days = completeIntake.length > 0 ? completeIntake.length : (dims.range.days ?? 7);
|
|
149
|
+
const totalIntake = intakeSummary.avgCalorie * days;
|
|
150
|
+
const totalBurnedAll = burnSummary.totalBurned + tdee * days;
|
|
151
|
+
const weeklyDeficit = totalBurnedAll - totalIntake;
|
|
152
|
+
const nutritionMatch = nutritionMatchRate(completeIntake, dims.nutritionTargets);
|
|
153
|
+
const targets = dims.nutritionTargets;
|
|
154
|
+
const calGoal = typeof targets['calorie_goal'] === 'number' ? targets['calorie_goal'] : 1850;
|
|
155
|
+
const fatGoal = typeof targets['fat_goal'] === 'number' ? targets['fat_goal'] : 60;
|
|
156
|
+
const anomalyDays = [];
|
|
157
|
+
for (const d of completeIntake) {
|
|
158
|
+
if (d.totalCalorie > calGoal + 300)
|
|
159
|
+
anomalyDays.push({ date: d.date, type: 'intake_excess', value: d.totalCalorie, target: calGoal, diff: '+' + (d.totalCalorie - calGoal) + ' 卡', severity: 'warn' });
|
|
160
|
+
else if (d.totalCalorie < calGoal - 500)
|
|
161
|
+
anomalyDays.push({ date: d.date, type: 'intake_deficit', value: d.totalCalorie, target: calGoal, diff: (d.totalCalorie - calGoal) + ' 卡', severity: 'warn' });
|
|
162
|
+
if (d.totalFat > fatGoal * 1.5)
|
|
163
|
+
anomalyDays.push({ date: d.date, type: 'fat_excess', value: d.totalFat, target: fatGoal, diff: '+' + (d.totalFat - fatGoal) + 'g 脂肪', severity: 'info' });
|
|
164
|
+
}
|
|
165
|
+
const sortedBurn = [...completeBurn].sort((a, b) => (a.date < b.date ? -1 : 1));
|
|
166
|
+
let consec = 0;
|
|
167
|
+
let maxConsec = 0;
|
|
168
|
+
for (const d of sortedBurn) {
|
|
169
|
+
if ((d.totalBurned ?? 0) === 0) {
|
|
170
|
+
consec += 1;
|
|
171
|
+
maxConsec = Math.max(maxConsec, consec);
|
|
172
|
+
}
|
|
173
|
+
else
|
|
174
|
+
consec = 0;
|
|
175
|
+
}
|
|
176
|
+
if (maxConsec >= 3)
|
|
177
|
+
anomalyDays.push({ date: null, type: 'exercise_streak_miss', value: maxConsec, target: 1, diff: '连续 ' + maxConsec + ' 天未运动', severity: 'warn' });
|
|
178
|
+
return {
|
|
179
|
+
...dims,
|
|
180
|
+
todayPartial: { intake: todayIntake, burn: todayBurn },
|
|
181
|
+
completeDaysCount: completeIntake.length,
|
|
182
|
+
tdee,
|
|
183
|
+
intakeSummary,
|
|
184
|
+
burnSummary,
|
|
185
|
+
macroRatio,
|
|
186
|
+
weeklyDeficit: round(weeklyDeficit),
|
|
187
|
+
avgDailyDeficit: days > 0 ? round(weeklyDeficit / days) : 0,
|
|
188
|
+
theoreticalWeightLoss: round1(weeklyDeficit / 7700),
|
|
189
|
+
nutritionMatch,
|
|
190
|
+
weightTrendSvg: null,
|
|
191
|
+
weightTrendMeta: { deferred: 'SVG 属渲染层,归 T8-T10(待裁决)' },
|
|
192
|
+
anomalyDays,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/analysis/review.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** T5 #24 · 日序列 series 构建器(对照老家 scripts/analysis/series.py)。
|
|
2
|
+
*
|
|
3
|
+
* ADR-0013 唯一真相源:多表按天对齐;deficit = (TDEE + 运动) − 摄入(正=缺口)。
|
|
4
|
+
* TDEE/目标全窗口静态值;无数据日字段为 null(不断言 0,不返空数组)。
|
|
5
|
+
* 键名驼峰化(老家 snake → TS camel),T8 渲染以此为准。
|
|
6
|
+
* today 可注入(默认 UTC 日,与 T3/T4 同口径)。
|
|
7
|
+
*/
|
|
8
|
+
import type { DatabaseSync } from 'node:sqlite';
|
|
9
|
+
export declare const WATER_NAME = "\uD83D\uDCA7\u6C34";
|
|
10
|
+
export interface DaySeries {
|
|
11
|
+
date: string;
|
|
12
|
+
calories: number | null;
|
|
13
|
+
protein: number | null;
|
|
14
|
+
carbs: number | null;
|
|
15
|
+
fat: number | null;
|
|
16
|
+
sodiumMg: number | null;
|
|
17
|
+
sugarG: number | null;
|
|
18
|
+
fiberG: number | null;
|
|
19
|
+
waterMl: number | null;
|
|
20
|
+
exerciseKcal: number | null;
|
|
21
|
+
weightKg: number | null;
|
|
22
|
+
bodyFatPct: number | null;
|
|
23
|
+
waistCm: number | null;
|
|
24
|
+
tdee: number;
|
|
25
|
+
deficit: number | null;
|
|
26
|
+
calorieGoal: number;
|
|
27
|
+
waterGoal: number;
|
|
28
|
+
}
|
|
29
|
+
/** 窗口选择器:Nd / 本周/上周/今年…(老家别名 week_cur 等一并支持)/ custom / 默认 30d。 */
|
|
30
|
+
export declare function resolveWindow(window: string, start?: string | null, end?: string | null, today?: string): [string, string];
|
|
31
|
+
/** 档案 TDEE(体重恒 70.0 parity,见 utils 说明)。 */
|
|
32
|
+
export declare function loadProfileTdee(db: DatabaseSync): number;
|
|
33
|
+
export declare function buildSeries(db: DatabaseSync, start: string, end: string): DaySeries[];
|
|
34
|
+
/** 序列均值(null 跳过;全空回 null)。 */
|
|
35
|
+
export declare function seriesAvg(series: DaySeries[], field: keyof DaySeries): number | null;
|
|
36
|
+
/** 序列求和(null 按 0)。 */
|
|
37
|
+
export declare function seriesSum(series: DaySeries[], field: keyof DaySeries): number;
|
|
38
|
+
/** 序列非空计数。 */
|
|
39
|
+
export declare function seriesCount(series: DaySeries[], field: keyof DaySeries): number;
|
|
40
|
+
/** 序列净变化 = 最后非空 − 最前非空(不足 2 个回 null)。 */
|
|
41
|
+
export declare function seriesDelta(series: DaySeries[], field: keyof DaySeries): number | null;
|
|
42
|
+
//# sourceMappingURL=series.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"series.d.ts","sourceRoot":"","sources":["../../src/analysis/series.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,eAAO,MAAM,UAAU,uBAAQ,CAAC;AAEhC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,kEAAkE;AAClE,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,GAAE,MAAmB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAqBtI;AASD,2CAA2C;AAC3C,wBAAgB,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,MAAM,CAOxD;AAMD,wBAAgB,WAAW,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,CAmErF;AAED,8BAA8B;AAC9B,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,SAAS,GAAG,MAAM,GAAG,IAAI,CAIpF;AAED,sBAAsB;AACtB,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,SAAS,GAAG,MAAM,CAE7E;AAED,cAAc;AACd,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,SAAS,GAAG,MAAM,CAE/E;AAED,yCAAyC;AACzC,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,SAAS,GAAG,MAAM,GAAG,IAAI,CAItF"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { FetchError } from '../fetch/errors.js';
|
|
2
|
+
import { calcTdee, shiftISODate, todayISO } from './utils.js';
|
|
3
|
+
export const WATER_NAME = '💧水';
|
|
4
|
+
const round1 = (n) => Math.round(n * 10) / 10;
|
|
5
|
+
/** 窗口选择器:Nd / 本周/上周/今年…(老家别名 week_cur 等一并支持)/ custom / 默认 30d。 */
|
|
6
|
+
export function resolveWindow(window, start, end, today = todayISO()) {
|
|
7
|
+
const t = Date.parse(today + 'T12:00:00Z');
|
|
8
|
+
if (Number.isNaN(t))
|
|
9
|
+
throw new FetchError('日期非法: ' + today);
|
|
10
|
+
const weekday = Math.floor(((t / 86400000) + 3) % 7);
|
|
11
|
+
const mondayOffset = -weekday;
|
|
12
|
+
if (window === 'custom') {
|
|
13
|
+
if (start && end)
|
|
14
|
+
return [start, end];
|
|
15
|
+
return [shiftISODate(today, -30), shiftISODate(today, -1)];
|
|
16
|
+
}
|
|
17
|
+
const m = /^([0-9]+)d$/.exec(window);
|
|
18
|
+
if (m)
|
|
19
|
+
return [shiftISODate(today, -(Number(m[1]) - 1)), today];
|
|
20
|
+
if (window === '本周' || window === 'week_cur')
|
|
21
|
+
return [shiftISODate(today, mondayOffset), today];
|
|
22
|
+
if (window === '上周' || window === 'week_prev')
|
|
23
|
+
return [shiftISODate(today, mondayOffset - 7), shiftISODate(today, mondayOffset - 1)];
|
|
24
|
+
if (window === '本月' || window === 'month_cur')
|
|
25
|
+
return [today.slice(0, 8) + '01', today];
|
|
26
|
+
if (window === '上月' || window === 'month_prev') {
|
|
27
|
+
const firstThis = today.slice(0, 8) + '01';
|
|
28
|
+
const lastLast = shiftISODate(firstThis, -1);
|
|
29
|
+
return [lastLast.slice(0, 8) + '01', lastLast];
|
|
30
|
+
}
|
|
31
|
+
if (window === '今年' || window === 'year_cur')
|
|
32
|
+
return [today.slice(0, 4) + '-01-01', today];
|
|
33
|
+
return [shiftISODate(today, -29), today];
|
|
34
|
+
}
|
|
35
|
+
/** 档案 TDEE(体重恒 70.0 parity,见 utils 说明)。 */
|
|
36
|
+
export function loadProfileTdee(db) {
|
|
37
|
+
try {
|
|
38
|
+
const prof = db.prepare('SELECT age, gender, height_cm, activity_level FROM user_profile WHERE id = 1').get();
|
|
39
|
+
return calcTdee(70.0, prof?.height_cm ?? 170.0, prof?.age ?? 30, prof?.gender ?? 'male', prof?.activity_level ?? 'moderate');
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return 1800;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export function buildSeries(db, start, end) {
|
|
46
|
+
if (!/^\d{4}-\d{2}-\d{2}$/.test(start) || !/^\d{4}-\d{2}-\d{2}$/.test(end)) {
|
|
47
|
+
throw new FetchError('起止日期非法: ' + start + ' ~ ' + end);
|
|
48
|
+
}
|
|
49
|
+
if (start > end)
|
|
50
|
+
throw new FetchError('start 不得晚于 end');
|
|
51
|
+
const tdee = loadProfileTdee(db);
|
|
52
|
+
const diet = db.prepare('SELECT date, SUM(calories) AS c, SUM(protein) AS p, SUM(carbs) AS cb, SUM(fat) AS f,' +
|
|
53
|
+
' SUM(sodium_mg) AS na, SUM(sugar_g) AS su, SUM(fiber_g) AS fi' +
|
|
54
|
+
' FROM food_log WHERE date BETWEEN ? AND ? AND food_name != ? GROUP BY date').all(start, end, WATER_NAME);
|
|
55
|
+
const water = db.prepare('SELECT date, SUM(grams) AS v FROM food_log WHERE date BETWEEN ? AND ? AND food_name = ? GROUP BY date').all(start, end, WATER_NAME);
|
|
56
|
+
const ex = db.prepare('SELECT date, SUM(calories_burned) AS v FROM exercise_log WHERE date BETWEEN ? AND ? GROUP BY date').all(start, end);
|
|
57
|
+
const wrows = db.prepare('SELECT date, weight_kg AS v FROM weight_log WHERE date BETWEEN ? AND ? ORDER BY date, time ASC, id ASC').all(start, end);
|
|
58
|
+
const bfrows = db.prepare('SELECT date, body_fat_pct AS v FROM body_composition WHERE date BETWEEN ? AND ? AND is_deprecated = 0 ORDER BY date, id ASC').all(start, end);
|
|
59
|
+
const bmrows = db.prepare('SELECT date, waist_cm AS waist, hip_cm AS hip FROM body_measurements WHERE date BETWEEN ? AND ? AND is_deprecated = 0 ORDER BY date, id ASC').all(start, end);
|
|
60
|
+
const goal = db.prepare('SELECT calorie_goal, water_goal FROM daily_goal WHERE id = 1').get();
|
|
61
|
+
const dietBy = new Map(diet.map((r) => [r.date, r]));
|
|
62
|
+
const waterBy = new Map(water.map((r) => [r.date, r.v]));
|
|
63
|
+
const exBy = new Map(ex.map((r) => [r.date, r.v]));
|
|
64
|
+
const weightFirst = new Map();
|
|
65
|
+
for (const r of wrows)
|
|
66
|
+
if (!weightFirst.has(r.date))
|
|
67
|
+
weightFirst.set(r.date, r.v);
|
|
68
|
+
const bfFirst = new Map();
|
|
69
|
+
for (const r of bfrows)
|
|
70
|
+
if (!bfFirst.has(r.date))
|
|
71
|
+
bfFirst.set(r.date, r.v);
|
|
72
|
+
const waistFirst = new Map();
|
|
73
|
+
for (const r of bmrows) {
|
|
74
|
+
if (!waistFirst.has(r.date))
|
|
75
|
+
waistFirst.set(r.date, r.waist ?? r.hip);
|
|
76
|
+
}
|
|
77
|
+
const out = [];
|
|
78
|
+
for (let d = start; d <= end; d = shiftISODate(d, 1)) {
|
|
79
|
+
const dr = dietBy.get(d);
|
|
80
|
+
const calories = dr ? dr.c : null;
|
|
81
|
+
const exerciseKcal = exBy.get(d) ?? null;
|
|
82
|
+
const deficit = calories === null || calories === undefined ? null : round1(tdee + (exerciseKcal ?? 0) - calories);
|
|
83
|
+
out.push({
|
|
84
|
+
date: d,
|
|
85
|
+
calories,
|
|
86
|
+
protein: dr ? dr.p : null,
|
|
87
|
+
carbs: dr ? dr.cb : null,
|
|
88
|
+
fat: dr ? dr.f : null,
|
|
89
|
+
sodiumMg: dr ? dr.na : null,
|
|
90
|
+
sugarG: dr ? dr.su : null,
|
|
91
|
+
fiberG: dr ? dr.fi : null,
|
|
92
|
+
waterMl: waterBy.get(d) ?? null,
|
|
93
|
+
exerciseKcal,
|
|
94
|
+
weightKg: weightFirst.get(d) ?? null,
|
|
95
|
+
bodyFatPct: bfFirst.get(d) ?? null,
|
|
96
|
+
waistCm: waistFirst.get(d) ?? null,
|
|
97
|
+
tdee,
|
|
98
|
+
deficit,
|
|
99
|
+
calorieGoal: goal?.calorie_goal ?? 1800,
|
|
100
|
+
waterGoal: goal?.water_goal ?? 2000,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
return out;
|
|
104
|
+
}
|
|
105
|
+
/** 序列均值(null 跳过;全空回 null)。 */
|
|
106
|
+
export function seriesAvg(series, field) {
|
|
107
|
+
const vals = series.map((s) => s[field]).filter((v) => typeof v === 'number');
|
|
108
|
+
if (vals.length === 0)
|
|
109
|
+
return null;
|
|
110
|
+
return round1(vals.reduce((a, b) => a + b, 0) / vals.length);
|
|
111
|
+
}
|
|
112
|
+
/** 序列求和(null 按 0)。 */
|
|
113
|
+
export function seriesSum(series, field) {
|
|
114
|
+
return round1(series.reduce((a, s) => a + (typeof s[field] === 'number' ? s[field] : 0), 0));
|
|
115
|
+
}
|
|
116
|
+
/** 序列非空计数。 */
|
|
117
|
+
export function seriesCount(series, field) {
|
|
118
|
+
return series.filter((s) => s[field] !== null && s[field] !== undefined).length;
|
|
119
|
+
}
|
|
120
|
+
/** 序列净变化 = 最后非空 − 最前非空(不足 2 个回 null)。 */
|
|
121
|
+
export function seriesDelta(series, field) {
|
|
122
|
+
const vals = series.map((s) => s[field]).filter((v) => typeof v === 'number');
|
|
123
|
+
if (vals.length < 2)
|
|
124
|
+
return null;
|
|
125
|
+
return round1(vals[vals.length - 1] - vals[0]);
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=series.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"series.js","sourceRoot":"","sources":["../../src/analysis/series.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE9D,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,CAAC;AAsBhC,MAAM,MAAM,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;AAE9D,kEAAkE;AAClE,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,KAAqB,EAAE,GAAmB,EAAE,QAAgB,QAAQ,EAAE;IAClH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,YAAY,CAAC,CAAC;IAC3C,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,CAAC,OAAO,CAAC;IAC9B,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,IAAI,KAAK,IAAI,GAAG;YAAE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACtC,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC;IACD,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,CAAC;QAAE,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAChE,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE,KAAK,CAAC,CAAC;IAChG,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,WAAW;QAAE,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC;IACrI,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,WAAW;QAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC;IACxF,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;QAC/C,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;QAC3C,MAAM,QAAQ,GAAG,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,QAAQ,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC3F,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;AAC3C,CAAC;AASD,2CAA2C;AAC3C,MAAM,UAAU,eAAe,CAAC,EAAgB;IAC9C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,8EAA8E,CAAC,CAAC,GAAG,EAA4B,CAAC;QACxI,OAAO,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,IAAI,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,IAAI,MAAM,EAAE,IAAI,EAAE,cAAc,IAAI,UAAU,CAAC,CAAC;IAC/H,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAMD,MAAM,UAAU,WAAW,CAAC,EAAgB,EAAE,KAAa,EAAE,GAAW;IACtE,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,UAAU,CAAC,UAAU,GAAG,KAAK,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,KAAK,GAAG,GAAG;QAAE,MAAM,IAAI,UAAU,CAAC,gBAAgB,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,sFAAsF;QACtF,+DAA+D;QAC/D,4EAA4E,CAC7E,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,UAAU,CAAyB,CAAC;IACtD,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CACtB,uGAAuG,CACxG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,UAAU,CAAyB,CAAC;IACtD,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CACnB,mGAAmG,CACpG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAyB,CAAC;IAC1C,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CACtB,wGAAwG,CACzG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAyB,CAAC;IAC1C,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACvB,6HAA6H,CAC9H,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAyB,CAAC;IAC1C,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACvB,6IAA6I,CAC9I,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAA0B,CAAC;IAC3C,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,8DAA8D,CAAC,CAAC,GAAG,EAE9E,CAAC;IACd,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAyB,CAAC;IACrD,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAClF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;IACjD,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,MAAM,UAAU,GAAG,IAAI,GAAG,EAAyB,CAAC;IACpD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,GAAG,GAAgB,EAAE,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACrD,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAClC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QACzC,MAAM,OAAO,GAAG,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;QACnH,GAAG,CAAC,IAAI,CAAC;YACP,IAAI,EAAE,CAAC;YACP,QAAQ;YACR,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;YACzB,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;YACxB,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;YACrB,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;YAC3B,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;YACzB,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;YACzB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI;YAC/B,YAAY;YACZ,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI;YACpC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI;YAClC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI;YAClC,IAAI;YACJ,OAAO;YACP,WAAW,EAAE,IAAI,EAAE,YAAY,IAAI,IAAI;YACvC,SAAS,EAAE,IAAI,EAAE,UAAU,IAAI,IAAI;SACpC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,8BAA8B;AAC9B,MAAM,UAAU,SAAS,CAAC,MAAmB,EAAE,KAAsB;IACnE,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;IAC3F,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;AAC/D,CAAC;AAED,sBAAsB;AACtB,MAAM,UAAU,SAAS,CAAC,MAAmB,EAAE,KAAsB;IACnE,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAC,KAAK,CAAY,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3G,CAAC;AAED,cAAc;AACd,MAAM,UAAU,WAAW,CAAC,MAAmB,EAAE,KAAsB;IACrE,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;AAClF,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,WAAW,CAAC,MAAmB,EAAE,KAAsB;IACrE,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;IAC3F,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,MAAM,CAAE,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAY,GAAI,IAAI,CAAC,CAAC,CAAY,CAAC,CAAC;AACzE,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { DaySeries } from './series.js';
|
|
2
|
+
export declare const SIM_MIN_DAYS = 14;
|
|
3
|
+
export declare const KCAL_PER_KG = 7700;
|
|
4
|
+
export declare const HEALTHY_RATE: [number, number];
|
|
5
|
+
export interface SimPoint {
|
|
6
|
+
date: string;
|
|
7
|
+
value: number;
|
|
8
|
+
lo?: number;
|
|
9
|
+
hi?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface SimBase {
|
|
12
|
+
kind: string;
|
|
13
|
+
title: string;
|
|
14
|
+
degraded: boolean;
|
|
15
|
+
start?: string;
|
|
16
|
+
end?: string;
|
|
17
|
+
days?: number;
|
|
18
|
+
degradeMsg?: string;
|
|
19
|
+
insight: string;
|
|
20
|
+
}
|
|
21
|
+
export interface WeightForecast extends SimBase {
|
|
22
|
+
current?: number;
|
|
23
|
+
ratePerWeek?: number;
|
|
24
|
+
rateNote?: string;
|
|
25
|
+
assumption?: string;
|
|
26
|
+
forecast?: {
|
|
27
|
+
label: string;
|
|
28
|
+
horizonDays: number;
|
|
29
|
+
points: SimPoint[];
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export declare function weightForecast(series: DaySeries[], horizonDays: number, title: string, kind?: string): WeightForecast;
|
|
33
|
+
export interface WeightTarget extends SimBase {
|
|
34
|
+
current?: number;
|
|
35
|
+
target?: number;
|
|
36
|
+
eta?: string;
|
|
37
|
+
daysLeft?: number;
|
|
38
|
+
ratePerWeek?: number;
|
|
39
|
+
feasible?: boolean;
|
|
40
|
+
assumption?: string;
|
|
41
|
+
}
|
|
42
|
+
export declare function weightTarget(series: DaySeries[], targetKg: number, title: string, kind?: string): WeightTarget;
|
|
43
|
+
//# sourceMappingURL=simulate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simulate.d.ts","sourceRoot":"","sources":["../../src/analysis/simulate.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,eAAO,MAAM,YAAY,KAAK,CAAC;AAC/B,eAAO,MAAM,WAAW,OAAO,CAAC;AAChC,eAAO,MAAM,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,CAAc,CAAC;AAMzD,MAAM,WAAW,QAAQ;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE;AACnF,MAAM,WAAW,OAAO;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AA0D9J,MAAM,WAAW,cAAe,SAAQ,OAAO;IAAG,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,QAAQ,EAAE,CAAA;KAAE,CAAA;CAAE;AAEzM,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,SAAoB,GAAG,cAAc,CAmBhI;AAED,MAAM,WAAW,YAAa,SAAQ,OAAO;IAAG,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE;AAEnL,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,SAAkB,GAAG,YAAY,CAsBvH"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { shiftISODate } from './utils.js';
|
|
2
|
+
export const SIM_MIN_DAYS = 14;
|
|
3
|
+
export const KCAL_PER_KG = 7700;
|
|
4
|
+
export const HEALTHY_RATE = [0.5, 1.0];
|
|
5
|
+
const round = (n) => Math.round(n);
|
|
6
|
+
const round1 = (n) => Math.round(n * 10) / 10;
|
|
7
|
+
const round2 = (n) => Math.round(n * 100) / 100;
|
|
8
|
+
function degrade(kind, title, series, need) {
|
|
9
|
+
return { kind, title, degraded: true, degradeMsg: '数据不足:需要 ' + need + ',当前只有 ' + series.length + ' 天。', insight: '数据不足,无法预测。' };
|
|
10
|
+
}
|
|
11
|
+
function linearRate(series, field) {
|
|
12
|
+
const vals = [];
|
|
13
|
+
for (const s of series) {
|
|
14
|
+
const v = s[field];
|
|
15
|
+
if (v === null || v === undefined)
|
|
16
|
+
continue;
|
|
17
|
+
vals.push([Date.parse(s.date + 'T12:00:00Z'), v]);
|
|
18
|
+
}
|
|
19
|
+
if (vals.length < 2)
|
|
20
|
+
return [null, vals.length > 0 ? vals[vals.length - 1][1] : null];
|
|
21
|
+
const days0 = vals[0][0];
|
|
22
|
+
const xs = vals.map(([t]) => (t - days0) / 86400000);
|
|
23
|
+
const ys = vals.map(([, v]) => v);
|
|
24
|
+
const n = xs.length;
|
|
25
|
+
const sx = xs.reduce((a, b) => a + b, 0);
|
|
26
|
+
const sy = ys.reduce((a, b) => a + b, 0);
|
|
27
|
+
const sxy = xs.reduce((a, x, i) => a + x * ys[i], 0);
|
|
28
|
+
const sx2 = xs.reduce((a, x) => a + x * x, 0);
|
|
29
|
+
const denom = n * sx2 - sx * sx;
|
|
30
|
+
if (denom === 0)
|
|
31
|
+
return [null, ys[ys.length - 1]];
|
|
32
|
+
return [(n * sxy - sx * sy) / denom, ys[ys.length - 1]];
|
|
33
|
+
}
|
|
34
|
+
function residualStd(series, field, slope) {
|
|
35
|
+
const vals = [];
|
|
36
|
+
for (const s of series) {
|
|
37
|
+
const v = s[field];
|
|
38
|
+
if (v === null || v === undefined)
|
|
39
|
+
continue;
|
|
40
|
+
vals.push([Date.parse(s.date + 'T12:00:00Z'), v]);
|
|
41
|
+
}
|
|
42
|
+
if (vals.length < 3)
|
|
43
|
+
return 0;
|
|
44
|
+
const base = vals[0][0];
|
|
45
|
+
const y0 = vals[0][1];
|
|
46
|
+
const resid = vals.map(([t, y]) => y - (y0 + slope * ((t - base) / 86400000)));
|
|
47
|
+
const m = resid.reduce((a, b) => a + b, 0) / resid.length;
|
|
48
|
+
return Math.sqrt(resid.reduce((a, r) => a + (r - m) * (r - m), 0) / (resid.length - 1));
|
|
49
|
+
}
|
|
50
|
+
function weightVals(series) {
|
|
51
|
+
return series.map((s) => s.weightKg).filter((v) => v !== null && v !== undefined);
|
|
52
|
+
}
|
|
53
|
+
function forecastSeries(current, ratePerDay, sigma, horizonDays, startDate, label) {
|
|
54
|
+
const pts = [{ date: startDate, value: round2(current), lo: round2(current), hi: round2(current) }];
|
|
55
|
+
for (let d = 7; d <= horizonDays; d += 7) {
|
|
56
|
+
const v = current + ratePerDay * d;
|
|
57
|
+
const band = ((2 * sigma * Math.sqrt(d)) / Math.sqrt(7));
|
|
58
|
+
pts.push({ date: shiftISODate(startDate, d), value: round2(v), lo: round2(v - band), hi: round2(v + band) });
|
|
59
|
+
}
|
|
60
|
+
return { label, horizonDays, points: pts };
|
|
61
|
+
}
|
|
62
|
+
export function weightForecast(series, horizonDays, title, kind = 'weight_forecast') {
|
|
63
|
+
const wv = weightVals(series);
|
|
64
|
+
if (wv.length < SIM_MIN_DAYS)
|
|
65
|
+
return degrade(kind, title, series, '≥' + SIM_MIN_DAYS + ' 天体重记录');
|
|
66
|
+
const [rate, latest] = linearRate(series, 'weightKg');
|
|
67
|
+
if (rate === null || latest === null)
|
|
68
|
+
return degrade(kind, title, series, '≥' + SIM_MIN_DAYS + ' 天有效体重记录');
|
|
69
|
+
const sigma = residualStd(series, 'weightKg', rate);
|
|
70
|
+
const last = series[series.length - 1];
|
|
71
|
+
const fc = forecastSeries(latest, rate, sigma, horizonDays, last.date, title);
|
|
72
|
+
const weekly = rate * 7;
|
|
73
|
+
const lastPt = fc.points[fc.points.length - 1];
|
|
74
|
+
return {
|
|
75
|
+
kind, title, degraded: false,
|
|
76
|
+
start: series[0].date, end: last.date, days: series.length,
|
|
77
|
+
current: round2(latest), ratePerWeek: round2(weekly),
|
|
78
|
+
rateNote: '按近 ' + series.length + ' 天线性趋势外推,当前 ' + (weekly >= 0 ? '+' : '') + weekly.toFixed(2) + ' kg/周',
|
|
79
|
+
assumption: '假设趋势延续:体重 = 当前值 + 日速率 × 天数;置信带按残差 σ 扩张',
|
|
80
|
+
forecast: fc,
|
|
81
|
+
insight: '按当前趋势,' + horizonDays + ' 天后体重约 ' + lastPt.value + ' kg(' + lastPt.lo + ' ~ ' + lastPt.hi + ',95% 置信带)。',
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export function weightTarget(series, targetKg, title, kind = 'weight_target') {
|
|
85
|
+
const wv = weightVals(series);
|
|
86
|
+
if (wv.length < SIM_MIN_DAYS)
|
|
87
|
+
return degrade(kind, title, series, '≥' + SIM_MIN_DAYS + ' 天体重记录');
|
|
88
|
+
const [rate, latest] = linearRate(series, 'weightKg');
|
|
89
|
+
if (rate === null || latest === null || Math.abs(rate) < 1e-6)
|
|
90
|
+
return degrade(kind, title, series, '体重处于平台期(无趋势)');
|
|
91
|
+
// 有意偏离老家:老家 (latest-target)/rate 在正常趋近时恒为负→恒降级;此处用 (target-latest)/rate,趋近为正(待口径裁决 T7)。
|
|
92
|
+
const daysLeft = (targetKg - latest) / rate;
|
|
93
|
+
if (daysLeft < 0) {
|
|
94
|
+
return { kind, title, degraded: true, degradeMsg: '目标体重与当前趋势方向相反(当前在上涨)。', insight: '先纠正趋势再预测。' };
|
|
95
|
+
}
|
|
96
|
+
const last = series[series.length - 1];
|
|
97
|
+
const eta = shiftISODate(last.date, round(daysLeft));
|
|
98
|
+
const weekly = rate * 7;
|
|
99
|
+
const feasible = HEALTHY_RATE[0] <= weekly && weekly <= HEALTHY_RATE[1];
|
|
100
|
+
return {
|
|
101
|
+
kind, title, degraded: false,
|
|
102
|
+
start: series[0].date, end: last.date, days: series.length,
|
|
103
|
+
current: round2(latest), target: targetKg, eta,
|
|
104
|
+
daysLeft: round(daysLeft), ratePerWeek: round2(weekly), feasible,
|
|
105
|
+
assumption: '按当前速率 ' + (weekly >= 0 ? '+' : '') + weekly.toFixed(2) + ' kg/周 线性外推;健康范围 0.5-1.0 kg/周',
|
|
106
|
+
insight: '按当前趋势,预计 ' + eta + ' 前后达到 ' + targetKg + ' kg' + (feasible ? '。' : ';⚠️ 当前速率超出健康范围,建议调整目标或策略。'),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=simulate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simulate.js","sourceRoot":"","sources":["../../src/analysis/simulate.ts"],"names":[],"mappings":"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"}
|