Skip to content

fix(app): 後端比 App 新時,進行中的訂單會從畫面上消失(第二十七輪) - #99

Merged
thothawei merged 1 commit into
mainfrom
claude/round27-unknown-status
Aug 1, 2026
Merged

fix(app): 後端比 App 新時,進行中的訂單會從畫面上消失(第二十七輪)#99
thothawei merged 1 commit into
mainfrom
claude/round27-unknown-status

Conversation

@thothawei

Copy link
Copy Markdown
Owner

本輪掃了兩族。第一族沒有找到任何問題——這件事本身也寫進 TODO 了,免得下一輪重掃。

一、掃過但沒有發現問題的:金額與數值格式

查的東西 結論
formatCentsAsNtd 的 0/負數/千分位 ✅ 0 → NT$ 0、負數帶 -、四捨五入對稱
畫面上「車資 + 清潔費 = 合計」三個數會不會加不起來 ✅ 不會。後端 roundNtdfloorNtd 把每筆收斂到整數元,三個數小數位一致、同方向進位
司機收入頁「營業額 − 手續費 + 清潔費 = 實得」 ✅ 四個數全由後端算好帶回,App 不自行推導
完成卡的 totalCents 是 App 自己加的 ✅ 合理——ride.completed payload 只有 fare_amount_centscleaning_fee_cents,後端沒送總額(送總額的 estimate 那支,App 也確實吃後端的)
唯一例外 ⚠️ min_fare_cents 沒被收斂成整數元(validator 只檢查範圍),但不破壞上面任何一條等式,且目前無真金流——不值得為它改後端

二、第二族修掉一個:未知的 ride status code

根因一句話

RideStatus.isTerminal 是白名單,未知碼不算終態 → controller 繼續把它當進行中的訂單輪詢;但畫面的 switchdefault: 回到叫車表單

三件事同時發生:

  1. 那一按必定被後端的「已有進行中訂單」擋掉;
  2. 整張進行中的訂單在畫面上完全消失,乘客不知道自己還有一趟車在跑;
  3. controller 還在背景輪詢它——狀態與畫面各說各話。

誠實說清楚這是什麼等級的東西

前瞻性修補,不是現在就會踩到的 bug:現行後端只有 0/1/2/3/4/9,未知碼只會來自「後端比 App 上架版本新」。但行為本身是確定的、測試可重現,不是「看起來可能有問題」的猜測。

修法

新增 UnknownPhaseContent:據實說出狀態碼(「狀態 7・請更新 App 以看到完整資訊」——客服問「畫面上寫什麼」時這是唯一能對帳的線索)、保留「取消行程」這條唯一的脫身出口(能不能取消由後端判斷)、不提供叫車

卡片版首頁一併改:它的 default:SizedBox.shrink()(更徹底的隱形)。那支目前沒被 app.dart 使用,但兩邊要一致——否則哪天換回來,這個洞會安靜地回來(pitfall-error-set-but-never-shown 的「新功能加在沒被使用的那個首頁」是這個 repo 踩過的坑)。

三、順手補完第二十六輪留的缺口

上一輪只補了常用地點與聊天室的「真畫面接上去了」測試,另外三個留著缺口。本輪補齊:遺失物描述 300/預約備註 200/評分評論 200,各自開真表單、貼 emoji、斷言擋在 rune 上並看計數器數字。

補的過程確認了一件事:預約表單是 Navigator.push 出去的新 route,provider 要放在 MaterialApp 之上才看得到(否則 ProviderNotFoundException)。查了 production 的 CustomerApp——它確實是放在上面的,所以那是我測試結構沒比照 production,不是 App 會崩。這一步不能跳過:如果 production 也放錯,那就是一個真的會崩的畫面。

驗收

  • flutter analyze 無 issue、flutter test 440 passed(434 +新 6)、56 個測試檔。
  • 反向驗證:把 default: 改回 OrderFormContent → 該案 FAILFound 1 widget with type "OrderFormContent")。
  • 另有一案守「沒有把正常流程一起改壞」status=0 仍然是 SearchingContent
  • flutter build apk --debug --flavor customer -t lib/main_customer.dart 成功。

開工前的例行實查(第十次)

三個外部卡點依然都不在;開工時三個 repo 的 open PR 皆為 0。

🤖 Generated with Claude Code

本輪掃兩族。第一族(金額與數值格式)**沒有找到任何問題**,五項查證結果寫進
TODO——不寫的話下一輪會有人再查一次同樣的東西(第十九輪立的規矩)。
重點結論:畫面上「車資+清潔費=合計」不會加不起來,因為後端 roundNtd/floorNtd
把每筆都收斂到整數元;司機收入頁四個數也全部由後端算好帶回。

第二族修掉一個:RideStatus.isTerminal 是白名單,未知狀態碼不算終態,所以
controller 會繼續把它當進行中的訂單輪詢;但畫面的 switch 走 default 回到
**叫車表單**。三件事同時發生——那一按必定被後端「已有進行中訂單」擋掉、整張
進行中的訂單在畫面上完全消失、controller 還在背景輪詢它。

這是前瞻性修補(現行後端只有 0/1/2/3/4/9,未知碼只會來自後端比 App 新),
但行為本身是確定的、測試可重現,不是猜測。

修法:UnknownPhaseContent——據實說出狀態碼(客服問「畫面上寫什麼」時這是唯一
能對帳的線索)、保留「取消行程」這條唯一脫身出口、不提供叫車。卡片版首頁的
default 是 SizedBox.shrink()(更徹底的隱形),一併對齊——那支目前沒被 app.dart
使用,但哪天換回來這個洞會安靜地回來。

順手補完第二十六輪留的缺口:遺失物描述/預約備註/評分評論三個畫面的「真畫面
接上去了」測試。補的過程確認了一件事——預約表單是 push 出去的新 route,provider
要放在 MaterialApp 之上才看得到,而 production 的 CustomerApp 確實是這樣放的
(所以那是測試結構問題,不是 App 會崩)。

驗收:flutter analyze 無 issue、flutter test 440 passed(434+新 6)、56 個測試檔、
flutter build apk --debug --flavor customer 成功。
反向驗證:把 default 改回 OrderFormContent → 該案 FAIL;另有一案守「沒有把正常
流程一起改壞」(status=0 仍是 SearchingContent)。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@thothawei
thothawei merged commit b71f9a5 into main Aug 1, 2026
2 checks passed
@thothawei
thothawei deleted the claude/round27-unknown-status branch August 1, 2026 11:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant