fix: 修复帖子详情营养数据为占位符 '-' 时无法从打卡记录补充的问题

根本原因:
- buildNutritionStatsFromDetailData 返回 [{value: '-'}, ...] 而非 []
- loadPostData 用 length===0 判断,但 4 个 '-' 时 length=4,不会走打卡补数据

修复内容:
- 增加 hasValidNutritionStats() 判断,检测是否有至少一项非占位符
- rawStats 映射后若全为 '-' 则返回 []
- formatPostData 中若 nutritionStats 全为占位符则强制设为 []
- 只有无有效营养数据时才调用 fillNutritionStatsFromCheckin 和 fillNutritionFromServer

由 Cursor CLI 检测并修复
This commit is contained in:
2026-03-05 12:16:45 +08:00
parent cd7b3f6b40
commit 3dc1a24706

View File

@@ -338,14 +338,21 @@ export default {
// 格式化帖子数据
this.formatPostData(data)
// 判断是否有有效营养数据(有至少一项非占位符)
const hasValidNutritionStats = () => {
const arr = this.postData.nutritionStats
if (!Array.isArray(arr) || arr.length === 0) return false
return arr.some(s => s.value !== '-' && s.value !== '')
}
// 若详情接口未返回有效营养数据且有关联打卡记录,则根据打卡详情补充营养统计(等待完成后再结束加载)
const rawCheckInId = data.checkInRecordId ?? data.check_in_record_id
const checkInId = rawCheckInId != null ? (Number(rawCheckInId) || rawCheckInId) : null
if (this.postData.nutritionStats.length === 0 && checkInId != null) {
if (!hasValidNutritionStats() && checkInId != null) {
await this.fillNutritionStatsFromCheckin(checkInId)
}
// T07: 营养仍为空时调用服务端填充接口
if (this.postData.nutritionStats.length === 0) {
// T07: 营养仍无有效数据时调用服务端填充接口
if (!hasValidNutritionStats()) {
await this.fillNutritionFromServer()
}
@@ -381,10 +388,15 @@ export default {
// 1) 后端直接返回的 stat 数组(兼容不同命名)
const rawStats = data.nutritionStats || data.nutrition_stats
if (Array.isArray(rawStats) && rawStats.length > 0) {
return rawStats.map(s => ({
const mapped = rawStats.map(s => ({
label: s.label || s.name || '',
value: s.value != null ? String(s.value) : '-'
})).filter(s => s.label)
// 若全部为占位符 "-",视为无有效数据,返回 [] 以便走打卡详情/服务端填充
if (mapped.length > 0 && mapped.every(s => s.value === '-' || s.value === '')) {
return []
}
return mapped
}
// 2) nutritionDataJson / nutrition_data_json兼容后端驼峰与下划线含 fill-nutrition 的 energyKcal/proteinG/potassiumMg/phosphorusMg、打卡字段 actualEnergy/actualProtein
@@ -626,6 +638,10 @@ export default {
// 解析营养数据:支持多种后端字段名,以及从打卡数据计算
let nutritionStats = this.buildNutritionStatsFromDetailData(data)
// 若全部为占位符 "-",视为无有效数据,避免占位数组阻塞后续打卡详情/服务端填充
if (Array.isArray(nutritionStats) && nutritionStats.length > 0 && nutritionStats.every(s => s.value === '-' || s.value === '')) {
nutritionStats = []
}
// 提取纯文本内容
let description = ''