From 3dc1a24706a2d276891943810b086c505d23d23f Mon Sep 17 00:00:00 2001 From: scottpan <43121650@qq.com> Date: Thu, 5 Mar 2026 12:16:45 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=B8=96=E5=AD=90?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E8=90=A5=E5=85=BB=E6=95=B0=E6=8D=AE=E4=B8=BA?= =?UTF-8?q?=E5=8D=A0=E4=BD=8D=E7=AC=A6=20'-'=20=E6=97=B6=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E4=BB=8E=E6=89=93=E5=8D=A1=E8=AE=B0=E5=BD=95=E8=A1=A5=E5=85=85?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根本原因: - buildNutritionStatsFromDetailData 返回 [{value: '-'}, ...] 而非 [] - loadPostData 用 length===0 判断,但 4 个 '-' 时 length=4,不会走打卡补数据 修复内容: - 增加 hasValidNutritionStats() 判断,检测是否有至少一项非占位符 - rawStats 映射后若全为 '-' 则返回 [] - formatPostData 中若 nutritionStats 全为占位符则强制设为 [] - 只有无有效营养数据时才调用 fillNutritionStatsFromCheckin 和 fillNutritionFromServer 由 Cursor CLI 检测并修复 --- msh_single_uniapp/pages/tool/post-detail.vue | 26 ++++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) 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) {