diff --git a/msh_single_uniapp/pages/tool/post-detail.vue b/msh_single_uniapp/pages/tool/post-detail.vue index 0ea6e0c..89cd2d0 100644 --- a/msh_single_uniapp/pages/tool/post-detail.vue +++ b/msh_single_uniapp/pages/tool/post-detail.vue @@ -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,7 +638,11 @@ export default { // 解析营养数据:支持多种后端字段名,以及从打卡数据计算 let nutritionStats = this.buildNutritionStatsFromDetailData(data) - + // 若全部为占位符 "-",视为无有效数据,避免占位数组阻塞后续打卡详情/服务端填充 + if (Array.isArray(nutritionStats) && nutritionStats.length > 0 && nutritionStats.every(s => s.value === '-' || s.value === '')) { + nutritionStats = [] + } + // 提取纯文本内容 let description = '' if (data.content) {