Przeglądaj źródła

fix(health-report): P1-1 报告日期可修改·前端修复1 - 保存失败不再覆盖后端明确原因

问题:submitDateChange / saveEdit 的 catch 无条件弹通用提示,把后端明确错误盖掉。

根因:api.js 的 request() 封装在 res.data.code !== 200 时,已先
uni.showToast(res.data.message) 再 reject(res.data)。随后 catch 又弹「保存失败」/
「保存异常」——uni-app 的 showToast 不排队,后者替换前者,用户永远看不到
「报告日期格式应为 yyyy-MM-dd,当前值:xxx」「报告日期不能晚于今天,当前值:xxx」
这类后端原因(P1-1 原实现声称的非 200 直出 res.message 实际是死代码:
/report/edit 不返回 5001,封装层对非 200 一律 reject,.then 只会拿到 200)。

修复:
1) submitDateChange 删除 .then() 内不可达的 else 分支。
2) 两个 catch 统一改为以 err.message 为准:先 hideLoading,再重放同一条后端原文;
   仅当 reject 的对象没有 message(网络异常等非业务错误)时才兜底弹一次通用提示。
   关键:微信小程序 showToast 与 showLoading 共用同一组件(官方文档:二者同时只能
   显示一个),hideLoading 会把封装层刚弹的那条提示一并隐藏。所以不能写成「只
   hideLoading、不再弹」——那样微信端会一条提示都不剩,反而吞错;重放同一文案在
   小程序与 H5 上表现一致,且不改变接口契约与数据结构。

影响面:仅 report-detail.vue 的 saveEdit / submitDateChange 两处失败提示。
iwt 2 tygodni temu
rodzic
commit
b3b683f673
1 zmienionych plików z 15 dodań i 7 usunięć
  1. 15 7
      cfc-frontend/pages/health/report-detail.vue

+ 15 - 7
cfc-frontend/pages/health/report-detail.vue

@@ -1114,9 +1114,13 @@ export default {
         } else {
           uni.showToast({ title: res.message || '保存失败', icon: 'none' })
         }
-      }).catch(function() {
+      }).catch(function(err) {
+        // 与 submitDateChange 同理:后端明确原因以 err.message 为准。封装层已弹过该文案,
+        // 但微信小程序 showToast 与 showLoading 共用同一组件,hideLoading 会把它一并隐藏,
+        // 故 hideLoading 后重放同一条原因;仅非业务错误(无 message)才兜底弹通用提示。
         uni.hideLoading()
-        uni.showToast({ title: '保存异常', icon: 'none' })
+        var reason = (err && err.message) ? err.message : ''
+        uni.showToast({ title: reason || '保存异常', icon: 'none' })
       })
     },
     // ===== view 模式:报告日期修改(复用 /report/edit,只改 summary.reportDate)=====
@@ -1161,13 +1165,17 @@ export default {
           self.dateEditing = false
           uni.showToast({ title: '已保存', icon: 'success' })
           setTimeout(function() { self.loadData() }, 600)
-        } else {
-          // 非 200(如日期格式非法/未来日期):直接展示后端返回的明确错误,不吞
-          uni.showToast({ title: res.message || '保存失败', icon: 'none' })
         }
-      }).catch(function() {
+        // 非 200 不在此处理:api.js 封装层对 code!==200 会先弹后端明确原因再 reject,
+        // .then 只会拿到 200(/report/edit 不返回 5001),此处再弹一次只会覆盖具体原因。
+      }).catch(function(err) {
+        // err.message 即后端原文(如「报告日期不能晚于今天,当前值:2099-01-01」)。
+        // 注意:微信小程序 showToast 与 showLoading 共用同一组件,hideLoading 会把封装层
+        // 刚弹的那条提示一并隐藏,所以这里 hideLoading 后重放同一条原因,保证不吞错;
+        // 只有非业务错误对象(无 message)才兜底弹一次通用提示。
         uni.hideLoading()
-        uni.showToast({ title: '保存失败', icon: 'none' })
+        var reason = (err && err.message) ? err.message : ''
+        uni.showToast({ title: reason || '保存失败', icon: 'none' })
       })
     },
     /** 从 blocks 中过滤掉"食物推荐/饮食推荐"块(报告详情不展示饮食推荐) */