terrylee
e1a2a45810
feat(app-ui): A3(異常鎖定/遠端鎖定頁)接後台換膚 — MaintenanceActivity 滿版圖套 UiSkin.apply("A3")
...
activity_maintenance.xml 加 lockImage ImageView(預設 a3_errorlock_aat_01);verPatch 42
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-15 13:58:13 +08:00
terrylee
b3258c2b0d
feat(cash): 現金連線方案選擇 — 串口/連線設定與相關調整
...
MainActivity/MyApp/PortProfile/Rs232Dev/DispatchDialog + build.gradle
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-15 11:59:54 +08:00
terrylee
1d11367066
feat: 出貨自救、登入gate、全站i18n補翻、硬幣修正、待機優化 (verPatch 40)
...
出貨/連線
- 出貨當下加連線閘門:送出貨指令前先確認下位機,失連則反覆自動重連
直到活著或逾時(ensureXinYuanConnectedForDispatch),再送指令 → 真正補出貨
- 保留 checkSlot 重試輪當第二道保險(出貨中途掉線)
- 非現金付款進出貨前補送 inComeByIPC
- PortProfile 重構:引入 DEFAULT_PROFILE 常數(通用預設 LEGACY)
後台登入
- 進 MainActivity(含長按序號後門)一律先跳登入視窗,帳密正確才進主控台,
取消則 finish() 返回前台
多國語(中/英/日)
- 商品名改用 getLocalizedName:出貨中畫面、取貨確認清單、取貨碼確認清單
- 補翻取貨口提示(門未關/升降/狀態確認中/檢查中)
- 補翻取貨碼頁(主提示/取消倒數/員工卡hint/驗證中/過效期/折扣類型)
- 補翻出貨列狀態(已出貨數量/出貨中X件/All)
- 發票方式頁「捐贈發票」→「捐贈發票/下一步」(新key,僅該卡片)
現金/硬幣
- 1元虛擬庫存封頂實體上限200(增量與載入均夾住)
- 投幣測試面板解析 COIN_STOCK/NOTE_STOCK 十進位(修1元>255破版)
出貨完成
- 有待機機台出貨完成後留數秒取貨提示即跳待機(CMUH/北護無待機維持原流程)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-13 17:20:58 +08:00
terrylee
954d4a3716
feat: 串口方案設定、取貨口/連線判斷重構、下位機當掉修正、客服圖外部化 (verPatch 37)
...
- 版號 verPatch 36 → 37
- 串口方案(本機設定):後台系統設定可切換 舊版本(下位機 ttyS1/刷卡機 ttyS2) ↔
星科技(ttyS7/ttyS6),因應不同 IPC 主板串口位置不一致;切換後重啟套用。
(PortProfile / ComPort.getFilepath / SystemSetActivity / activity_system_set.xml)
- 進銷售平台不再檢查/擋導航列(隱藏提示)。(MainActivity)
- 取貨口+連線判斷改為「點選商品時一次主動問答」(比照舊專案 DaiLemei):
早退、~3.5 秒封頂;收到 05/門/升降立即擋、01 立即放行;拿不到 VMC_02 但機台
仍在線(近期有任何 VMC 通訊)→保守擋住請客人稍候再點,避免漏放有東西;完全無通訊
才自動重連重試 3 次。加單飛守衛、查詢前清殘留佇列。
(BasicSaleFlow / DevXinYuanController: getSlotStatusSince/isRecentlyAlive/lastVmcCommTime)
- 修下位機「連續判斷後整個當掉」:送出佇列過載(>50)由 setRun(false) 停掉讀取迴圈
改為「丟最舊、留最新」(load shedding),讀取迴圈持續運作、過載緩解自動恢復。
(DevController.addSendBuffer)
- 出貨失敗客服 QR 圖改為執行期優先讀裝置替換檔(/sdcard 或 App 外部目錄的 cs_qrcode.jpg/png),
找不到才用內建預設;換客戶不用重編。本版預設圖設為 qrcode_msg_dailemei(專給代樂美)。
(DispatchDialog / dialog_dispatch.xml / qrcode_msg_dailemei.jpg)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 14:56:20 +08:00
terrylee
9112f46f4e
[FEAT] 現金支付串口移植+面額明細上報+取貨口點選判斷+下位機維修模式(verPatch 36)
...
現金支付(串口 Modbus 移植自 Yueji,後台全 MQTT):
- 抽出 ICashAcceptorHandler 介面 + CashAcceptorFactory 工廠(三連線 USB/ComPort3/ttyS9
可於現金機設定頁切換);SerialCashAcceptorHandler(Modbus+CRC,含使能/即時偵測/退幣退鈔)
與既有 SimpleCashAcceptorHandler(USB) 並存;MdbEventListener/DebugLogListener 事件橋接。
- 前台現金入口統一到 CashPayDialogGeneral(SaleFlowHandler/DialogAbstract/BuyPickupCodeDialog/
InvoiceDonationDialog/CashPayoutManager 一併改由工廠取得 handler)。
- CashMachineSettings 測試頁:連線選擇 UI + 螢幕除錯 log + 退幣/退鈔。
- 修正退幣 50 元:0D 退幣翻譯的硬幣通道 type 應為 4(與投幣 08 54 一致),原誤判為 3 致 50 元不動作。
現金面額明細回傳後台:
- order 新增巢狀 cash_detail{b1000,b500,b100,c50,c10,c5,c1}(僅 payment_type=9 帶),
找零沿用 change_amount。CashPayDialogGeneral 於 calculate_amount_update_UI 依面額累計張數,
經 ReportFlowInfoStructure → TransactionFinalizeBuilder 組 TransactionFinalizePayload.CashDetail。
取貨口(主櫃 XinYuan)偵測:
- DevXinYuanController 快取 VMC_02 自發廣播狀態(lastSlotStatus/getRecentSlotStatus)+補長度防護,
避免錯位幀越界漏收。
- BasicSaleFlow 點選商品當下先判斷取貨口(checkPickupOnly,聆聽廣播快取,異常擋不開詳情頁);
BuyDialog 付款前檢查退回讀廣播快取當後備。
- 修正:預檢成功(機台已在線)後按「直接購買」,跳過重複的下位機連線判斷,避免預檢佔串口後
的 300ms 探詢誤判「未連線」並觸發不必要的重連。
下位機軟體→維修/設置模式(釋放串口,移植自 StarApp-LockBoard):
- 新增 MaintenanceMode(持久化旗標) + MaintenanceSerialActivity(維修畫面)。
- MainActivity「下位機軟體」改為進維修模式(釋放串口)而非開原廠 app+killProcess,避免 kiosk
自動重啟後又搶回串口;MyApp 啟動略過佔串口/不自動重連 + releaseAllDeviceSerialPorts;
DevXinYuanController 新增 releasePort()+維修模式建構子略過開串口+close null 防護。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 17:16:29 +08:00
sky121113
f46dbe0b51
[FEAT] 取貨碼改綁商品:App 刷碼依即時庫存自挑可出貨道(升版號 verPatch 29)
...
1. StarCloudAPI.verifyPickupCode 解析 B660 回傳的 product_id(數字且可能為 JSON null,改用 optInt 避免 optString 把 null 轉成 "null" 字串),PickupVerificationCallback.onSuccess 新增 productId 參數。
2. FontendPickupCodeDialog.onSuccess 依回傳分流:有 product_id(綁商品碼)→ getSlotDataByPid 取代表貨道 + allocateBuyStructures 自挑可出貨道(已濾 count>0 && !lock && !expired,壞一條自動換同商品下一條);無 product_id(舊綁貨道碼)→ 沿用原 slot_no 路徑,向後相容。
3. 綁商品碼若挑不到可出貨道(全缺貨/鎖定/過期)→ 提示缺貨並取消。
4. 升 verPatch 26→29(S9XYU OTA:versionName 21_02_29、versionCode 210229)。
2026-06-26 17:54:05 +08:00
terrylee
8dc0433e66
chore(version): 升 verPatch 至 26
...
購物車3件 + 進付款前下位機連線判斷 的測試版號(S9=21_02_26 / S12=10_02_26)。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 16:18:53 +08:00
sky121113
e6ebac8dc1
[FEAT] 升版號至 verPatch 24(S9/S12 共用簽章 OTA 驗證版)
...
1. app/build.gradle:verPatch 22 → 24,觸發機台 OTA 升級(S12 versionCode 100224 / S9 versionCode 210224)。
2. 本版為導入共用簽章金鑰後首批產出,已編譯 S12XYU 與 S9XYU 兩支 Debug APK 並驗證憑證 SHA-1 與現場機台一致(23:57:65:A1...),確認可直接 OTA 覆蓋安裝。
2026-06-26 15:40:58 +08:00
sky121113
e4b095b971
[FIX] 固定共用簽章金鑰確保跨電腦 OTA 更新不失效
...
1. 新增 repo 內固定簽章檔 app/signing/taiwanstar.keystore(即現場機台沿用的金鑰,SHA1 23:57:65:A1...,有效至 2056)。
2. app/build.gradle 新增 signingConfigs.debug 明確指向上述 keystore,取代過去依賴各電腦自動生成的 ~/.android/debug.keystore。
3. 修正根因:原本 release build type 用 signingConfig signingConfigs.debug=各電腦互不相同的 debug 金鑰,換電腦/換人編 APK 簽章不符 → INSTALL_FAILED_UPDATE_INCOMPATIBLE → 無法 OTA。
4. compiler-apk(debug) 與 release-apk(release) 兩個打包指令共用同一把 signingConfigs.debug,一次修好;任何 build 機 pull repo 後即可產出可 OTA 更新現場機台的 APK,現場毋須重裝。
5. 已編譯 S12XYU Debug 驗證產出 APK 簽章 SHA1 與現場一致。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 15:21:44 +08:00
sky121113
e4e62de5b8
[FIX] 修復遠端重啟刷卡機/結帳失敗(指令名稱不符)並補刷卡機序列埠健壯性
...
1. 指令名稱對齊後台:MqttService 的 nfc_reset 相容 reboot_card、nfc_checkout 相容 checkout。
後台(star-cloud)按鈕送出 reboot_card / checkout,App 原本只認 nfc_reset / nfc_checkout,
導致一律落入 Unknown command → failed,此功能自串接首日(df8dae9 )即從未成功;改別名後相容兩種。
2. 遠端 nfc_reset / nfc_checkout 執行前加 Busy Check:getBusyReason() 非空(現場交易中)即拒收並回報
Machine busy,避免與現場刷卡爭用 comPort2。
3. 遠端指令送完電文改用 finally 強制 comPort2.closePort(),杜絕序列埠洩漏害下一筆現場交易開不了埠。
4. Rs232Dev 的 isMockMode 由 static 改為 instance 欄位,另立 static suMissing 表「su 缺失」全域事實;
單一埠連線失敗只標記該實例,不再污染全 App 的 send 全部空轉(原 bug 須重啟才復原)。
5. verPatch 21→22(versionName 21_02_22_D / versionCode 210222;21 已 Release,避免 OTA 撞號)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 09:11:55 +08:00
sky121113
377da0a2da
[FEAT] 進購物平台前強制關閉導航列 + 序號版本號字體放大加深
...
1. MainActivity「銷售平台」按鈕點擊改為先檢查導航列狀態:
以 isNavigationReallyHidden() 判斷,未真正關閉時跳出
showMustHideSystemBarsDialog() 提醒並擋下,符合販賣機機台不應出現系統導航列的規範。
2. 開發者後門(長按 2 秒強制進入)維持不變,刻意不受導航列檢查限制,方便手機測試。
3. 購物平台機台資訊列 textMachineInfoName(序號 + 版本號,亦為長按進主控台後門的觸發點)
字體 14sp→16sp、alpha 0.7→0.9,放大加深以提升可讀性與長按命中率。
4. verPatch 20→21(versionName 21_02_21_D / versionCode 210221)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 17:14:07 +08:00
sky121113
a24bdfdc0e
[FEAT] 貨道效期+鎖定 App↔後台雙向同步(LWW)+ 現場效期輸入
...
1. SlotStructure 新增 lock_rev/lock_synced_rev/expiry_rev/expiry_synced_rev(per-field LWW 序號)與 getExpiryDate/setExpiryDate/getBatchNo helper;clearExpiry 明定不可遞增 rev。
2. DatabaseHelper:slot 表新增 4 個 rev 欄位;onUpgrade 由「DROP 全表重建」改為「ALTER ADD COLUMN」增量升級保留既有資料;並把現場已鎖貨道 lock_rev 設 1 以遷移上雲。
3. SlotsDao:新增單行 updateSlot 與單一交易 replaceAll;insert/read 帶 4 個 rev,取代 deleteAll+insertAll 全表重寫避免 race。
4. StarCloudAPI B009:每筆 data[] 加 is_locked/lock_rev/expiry_date/batch_no/expiry_rev;被鎖空貨道(有 lock/rev>0)也上報;上報成功以快照 rev 回填 synced_rev。
5. MqttService update_inventory 下行:解析 is_locked/lock_rev/expiry_rev,依 synced_rev 拒絕覆蓋未上報的現場編輯,只動「下行確實帶的鍵」,改用單行 updateSlot 寫入。
6. VmcSlotListActivity:進頁拍 lock/效期 baseline,存檔時實際變更才遞增對應 rev;saveData 改用 replaceAll 交易。
7. RecyclerVmcSlotListAdpter:效期欄位改為永遠可點,開 DatePicker 供補貨員現場輸入效期(含「清除效期」)。
8. build.gradle:verPatch 19→20。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 14:58:10 +08:00
sky121113
90f86cf3c9
[FIX] 鎖貨道/效期只鎖該貨道不再鎖整商品,同商品多貨道改逐道出貨
...
1. VmcFragment.updateFlowerBuyList():銷售卡合併同商品多貨道改為「任一可賣貨道(count>0且未鎖未過期)即可售」,庫存只計可賣貨道加總;全部不可賣才依 鎖定>過期>售完 顯示對應遮罩。修正鎖一個貨道或單一貨道過期就把整個商品擋掉的問題。
2. MyApp 新增 allocateBuyStructures():把購買數量依可賣貨道 greedy 拆成多筆 count=1 的 BuyStructure,規避 VMC 出貨狀態機不支援單筆 quantity>1(出完第一個會卡 40 秒看門狗);庫存不足才溢位回代表道,交既有「出貨失敗→後台依 dispense 退款」保護網。
3. CartViewModel.convertToBuyStructure():多品項購物車改用 allocateBuyStructures 拆道,避免同商品買多個時重複出同一貨道而卡頓/出貨失敗。
4. DialogProductDetail 直購:改走 allocateBuyStructures 拆道。
5. PickupSheetSaleFlow:中國醫領藥 buildMaterialSlotMap 與 isAvailableCmuhStock 排除鎖定/過期藥道,避免藥單驗證通過卻在出貨時失敗。
6. build.gradle:verPatch 18→19(versionName 依硬體規格產生)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 10:22:03 +08:00
sky121113
8db3fab1c0
[FEAT] 效期過期商品自動下架(暫不販售)+ 訊號權限 root 自授權規格
...
1. SlotStructure 新增 isExpired()/getExpiryDate()/clearExpiry():以 ISO 日期字串字典序比對效期(避開時區/解析誤差),當天可賣、隔天起才鎖;解析失敗 fail-open 不擋售,避免時鐘或資料異常誤鎖全機。
2. VMC 銷售清單與貨道清單:過期商品顯示「暫不販售」遮罩並禁止加入購物車/購買(recycler_vmc_slot_list.xml + RecyclerVmcBuyListAdpter/RecyclerVmcSlotListAdpter)。
3. 出貨前即時效期複查:DialogProductDetail/DispatchDialog/MemberCardPickupDialog/CartViewModel 於出貨當下再驗一次,過期則取消出貨並返回銷售平台。
4. 貨道庫存歸 0(賣完)時自動清除效期與批號,避免舊批效期殘留導致補新貨被誤鎖。
5. 新增多語系字串 product_expired「暫不販售」(11 語系)。
6. docs:network-signal-reporting-spec 補上「機台 rooted → App 啟動時以 su 自我授權 ACCESS_FINE_LOCATION」的定案做法(失敗靜默、不影響其他功能)。
7. 版號遞增 verPatch 17→18(versionName 21_02_18_D / versionCode 210218)供 OTA 辨識。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 17:08:29 +08:00
sky121113
ed9b05636c
[FIX] 修復掃碼槍HID幽靈輸入卡死商品視窗、遠端重啟被誤判忙碌拒絕與執行緒洩漏卡頓
...
現場 M000008 經 log 確認三症狀同一根因:掃碼槍(HID鍵盤)按鍵穿透 FLAG_NOT_FOCUSABLE
對話框打進 FontendActivity,觸發 onUserInteraction 不斷把閒置時間歸零,導致待機看門狗
與重啟條件永遠達不到,且 [Dialog Open] 讓遠端 reboot 被當忙碌拒絕(指令484實證)。
1. FontendActivity.onUserInteraction 不再更新閒置時間/不呼叫 super,改在
dispatchTouchEvent 更新;閒置一律以「實體觸控」為準,HID 按鍵不再算互動。
2. DialogAbstract 新增 isBusyDialog/isInputNeededDialog 分類、hasBusyDialogShowing/
hasInputNeededDialogShowing 查詢、dismissAll 統一關窗,並加 dispatchTouchEvent
讓對話框上的真人觸控也算互動(避免操作中被誤關)。
3. DialogProductDetail 標記 isBusyDialog=false:商品詳情不再卡成 [Dialog Open] 忙碌,
閒置可自動返回首頁、亦不再擋掉遠端重啟。
4. FontendPickupCodeDialog / MemberCardPickupDialog 標記 isInputNeededDialog=true,
保留取貨碼/會員卡的掃碼槍/讀卡機輸入。
5. MyApp.getBusyReason 改用 hasBusyDialogShowing(),只計入付款/出貨等真正忙碌對話框。
6. FontendActivity.dispatchKeyEvent 同時攔截 ENTER 與 NUMPAD_ENTER,僅放行正在顯示
需要 HID 輸入的對話框,阻止幽靈輸入反覆開關商品視窗。
7. FontendActivity.idleRunnable 返回首頁前呼叫 dismissAll 清除殘窗。
8. FontendActivity.onDestroy 各釋放步驟全包 try-catch 並把 super.onDestroy 移到最後,
確保 stopHeaderReportScheduler 一定執行,修正 ClockTickScheduler 執行緒洩漏卡頓。
9. MqttService 遠端 reboot 新增 force(command:"reboot_force" 或 payload {"force":true}),
現場卡死時可無視忙碌強制重啟,作為最後逃生口。
10. 升版號 verPatch 至 16(正式版 21_02_16_R / versionCode 210216)以觸發 OTA。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 13:20:25 +08:00
sky121113
8d764ba388
[FIX] 修復遠端 OTA 更新失敗並依環境區分 APK 版本後綴
...
1. 新增 DOWNLOAD_WITHOUT_NOTIFICATION 權限:OtaManager 改用 DownloadManager 後以 VISIBILITY_HIDDEN 靜默下載,缺此權限會在 enqueue 時丟出「Invalid value for visibility: 2」導致每次遠端更新一啟動就失敗。
2. versionName 後綴依 build type 動態切換:release → _R(正式)、debug → _D(測試),現場可一眼辨識 APK 來源;versionCode 不含後綴、兩者相同不影響 OTA 比版。
3. compiler-apk workflow 的後台 keyin 列印由寫死 _R 改為 _D,與實際 debug 檔名一致。
4. verPatch 升至 13。
5. 新增 docs/network-signal-reporting-spec.md 網路訊號上報規格文件。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 16:16:47 +08:00
sky121113
c7da4d1a12
[FEAT] 刷卡逾時/使用者終止改判未完成,不再誤報付款失敗
...
1. TransactionFinalizeBuilder.publishFailed:刷卡機回應碼 0003(交易逾時)/ 0006(使用者終止)改以 status=abandoned 上報且不帶 code,後台立即將該筆 pending 轉為「未完成 abandoned」,列表不再顯示為付款失敗,也不產生刷卡機硬體警告噪音。
2. 空電文與真實拒絕碼(0001/0002、0005 通訊失敗、0015/0016 餘額不足、1001~1003 等,卡片已讀到或可能已扣款)維持上報 failed(帶 code),保留對帳軌跡。
3. 邏輯集中於 publishFailed 一處,三個 NFC 結帳 Dialog(信用卡/電子票證/手機支付)與後台皆不需變更。
4. 升版號 verPatch 10→11(S9XYU:versionName 21_02_11_R、versionCode 210211)以利 OTA 更新。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 15:01:28 +08:00
sky121113
6dfadbe246
[FEAT] 重構 OTA 升級管理器以改用 DownloadManager 支援背景續傳與進度回報
...
1. 升級 `app/build.gradle` 頂部修補版號為 10 (verPatch = 10)。
2. 重構 `OtaManager.java`:
- 捨棄舊版自架 Thread 下載,改用系統 `DownloadManager` 進行背景下載,防止 App 重啟被殺中斷。
- 下載期間定期透過 MQTT 發送進度 ACK (`result="progress"`)。
- 語意修正:不再一開始就回報 `success`,僅在終態回報成敗。因靜默安裝成功會重啟 App,故於新版啟動後透過 `resumeIfPending` 比對預期版本並回報 `success`。
- 新增閒置安裝機制,若機台忙碌中則持續等待並定期重試。
- 提供無 `DownloadManager` 時的舊版直連下載退回方案。
3. 修改 `MqttManager.java`:在 MQTT 連線就緒後呼叫 `OtaManager.resumeIfPending` 接手未完成的 OTA 任務,避免狀態遺失。
4. 修改 `MqttService.java`:解析 MQTT `update_app` 指令 payload 中的 `version` 欄位並帶入 `OtaManager` 進行版本確認。
2026-06-18 09:10:21 +08:00
sky121113
272164e0ed
[STYLE] 品牌更名為 Star Cloud、修正圖片快取並升版號至 _9
...
1. 品牌字串統一更名為「Star Cloud」:首頁歡迎標題(登入前/後)由「AAT」改為「Star Cloud」、標題副字串「智能販賣機系統」精簡為「智能系統」(MainActivity、activity_main.xml);刷卡收據抬頭「AAT」改為「Star Cloud」(dialog_credit_card_receipt.xml)。
2. 首頁主視覺由 vending_machine_scenario_v1 改用 starcloud_logo_circle,並新增 starcloudlogo.png 素材。
3. 修正 ImageGlide 圖片快取鍵:本機檔案以 lastModified() 為簽章(檔案未變則命中快取、避免滑動每格重抓;圖片更新時自動失效重載),URL 載入與例外路徑移除 currentTimeMillis() 簽章,修掉永遠顯示 loading 的問題。
4. build.gradle 版號 verPatch 由 6 升至 9(對應 21_02_9_R)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 19:36:27 +08:00
sky121113
16420ae5a3
[FEAT] 一鍵補貨依貨道型式分流履帶/彈簧補貨上限
...
1. StarCloudAPI.saveProducts() 解析 B012 新欄位 spring_limit,設入 ProductStructure 並另存持久化 blob(履帶上限沿用 t060v11=track_limit,不動 products 表 schema 避免升 DB 版本洗掉貨道綁定)。
2. MyApp 新增 productSpringLimitBlob 之 get/set/saveProductSpringLimit 與離線重啟載入,供從 DB 重載商品(springLimit=-1)時 fallback。
3. ProductStructure 新增 springLimit 欄位與 getTrackLimit()/getSpringLimit();springLimit 缺時向 MyApp blob 取,再缺則退回履帶上限,維持舊行為不會把數量補成 0。
4. HardwareSetStructure 新增 isSpringSlot(slotNo),依 10 槽分組對齊後台 SPRING_SLOT_FLAGS,超出 1–60 視為履帶。
5. VmcSlotListActivity 一鍵補貨改依貨道型式取上限:彈簧用 getSpringLimit()、履帶用 getTrackLimit(),並於 log 標註(彈簧)/(履帶)。
6. build.gradle verPatch 5→6。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 13:22:27 +08:00
sky121113
84c7ac8933
[REFACTOR] 取貨口閘門由進場改為付款前檢查,並修正發版腳本與語系下發
...
1. 取貨口閘門時機調整(basic 模式):移除「進入銷售頁」的總閘門,改在「準備付款時」於 BuyDialog 檢查。
- VmcFragment:移除 maybeRunPickupPortEntryGate 與 entryGateChecked,startOnSwitchFragment 還原為僅更新清單。
- RecyclerVmcBuyListAdpter:移除 checkPickupPortOnEntry 與 DevEntryGateByVMC 整段(進場閘門)。
- BuyDialog:新增 checkPickupPortBeforePay 與 DevCheckPickupByVMC,取貨口有東西(0x05)或門沒關(0x06/0x09)時提示,
使用者確認後以 Option.FORCE_CLOSE 關閉付款頁回銷售頁;機器無回應(3000ms 超時)視為正常放行。
2. StarCloudAPI 語系下發改為後台優先:每次下發機台預設語系即立即套用,覆蓋使用者先前手動選擇
(設定下發頻率低且皆在無人時段,不會打斷操作)。
3. dialog_buy.xml:選擇支付方式頁的 Line Pay 按鈕文字由「掃碼支付」改為「Line Pay 支付」。
4. app/build.gradle:verPatch 4 → 5(S9XYU 正式發版,versionCode 210205 / versionName 21_02_5_R)。
5. release-apk workflow:修正終止 Gradle Daemon 段落的腳本自殺 bug,比對字串改為拆字串拼接並以 grep -vx "$$"
排除自身 PID,避免背景任務中 pgrep -f 命中腳本本身導致 exit 144。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 08:43:09 +08:00
sky121113
f905380597
[FEAT] 取貨口入口閘門放寬至整個 basic 模式並調整對話框文字
...
1. VmcFragment 取貨口「進銷售頁總閘門」條件由 (isBasic && cartOn) 放寬為僅判斷 isBasic:basic 模式不論購物車開關,進銷售頁都先檢查取貨口,避免「購物車關閉」時點商品完全無上游取貨口檢查。
2. 員工卡(employee_card)流程仍於點擊時自檢、pickup_sheet 維持不檢查,皆不重複;同步更新方法註解。
3. dialog_buy.xml 對話框文字「贈品兌換」改為「來店禮」。
4. app/build.gradle verPatch 升至 3(versionName 21_02_3_R / versionCode 210203)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 18:15:59 +08:00
sky121113
309518f3ca
[FEAT] 選擇支付方式頁顯示件數與應付金額,並防止來店禮重複掃描
...
1. dialog_buy.xml:將原本隱藏的金額列改為可見,新增「共 X 件」件數顯示與「應付金額」標題,金額靠右呈現。
2. BuyDialog.java:新增 refreshAmountBar() 統一刷新件數與應付金額,onCreate 與 SET_PRICE 事件皆改走此方法。
3. BuyDialog.java:抽出 getOriginalPrice()(未折扣原價)與 getTotalCount()(總件數,排除免費商品),getTotalPrice() 改用 getOriginalPrice() 並沿用折抵後至少 1 元保護。
4. BuyDialog.java:來店禮折抵改以「實際省下的金額」顯示(NT$XXX (已折抵 NT$YY)),取代原本 mode 2 顯示折扣乘數 0.8 的難懂呈現。
5. BuyDialog.java:防呆——本筆已套用來店禮(freeGiftId 非空)即隱藏來店禮入口按鈕,禁止重複掃描覆蓋/疊加折扣。
6. strings.xml:新增 pay_item_count、pay_payable_amount、pay_discounted_format 字串。
7. app/build.gradle:verPatch 1 → 2。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 17:01:45 +08:00
sky121113
c986b69e16
[FIX] 修復出貨中途加購倒數疊畫面、結案欄位被洗成 0、對話框誤判待機,並修打包腳本自殺
...
1. 結案上報穩定化:TransactionFinalizeBuilder 新增 captureOrderInfo() 快照(flowType/總金額/找零/點數),DispatchDialog 進入出貨時(isCmuh→42 覆寫後)擷取;build() 與「通行碼(5)不上報」判斷改用快照(effectiveXxx/getOrderFlowType),避免出貨中途全域 flowInfo 被洗回 0 導致 payment_type/total 落地成 0「未知」或通行碼被誤報。
2. 加購倒數疊畫面:DispatchDialog.onCreate 與 CheckoutAccessCodeDialog.changeDispatch 進入出貨前統一補送 STOP_COUNTDOWN,關閉 FontendActivity 的 40 秒加購倒數,避免出貨/取貨倒數中途到期觸發 BUY_DIALOG_OPEN、支付畫面疊在出貨畫面上跳出(通行碼、TapPay 等成功路徑原本未送)。
3. 移除加購功能殘留:BuyDialog 刪除 buttonAddProduct 監聽與 gotoAddProduct(),dialog_buy.xml 移除加購按鈕。
4. 待機誤判修復:FontendActivity.onUserInteraction 一併 resetIdleTimer(對話框觸控不會觸發 dispatchTouchEvent),idleRunnable 以全域最後互動時間二次確認,剩餘時間不足才真正踢回待機,避免操作付款/詳情等對話框時被誤判閒置。
5. 打包腳本修復:compiler-apk.md 的 daemon-kill 段把 pgrep/pkill 比對字串拆開拼接並排除自身 PID,修正背景任務情境下腳本命令列含完整 GradleDaemon class 字串導致 pgrep 比對到自己、pkill 自殺、編譯 exit 144 未啟動的問題。
6. 升版號:build.gradle verMinor=2、verPatch=1(S9XYU=21_02_1_R/210201)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 16:32:13 +08:00
sky121113
9a4f68455d
[FIX] 修復發票統編「下一步」失效與待機死結,並調整銷售平台資訊欄
...
1. 修復發票統編對話框「下一步」按鈕未綁定點擊事件,導致統編→電話兩步驟流程卡死、統編永遠送不到後台;新增 changeNextStep() 驗證統編長度並切換至電話輸入步驟。
2. 修復購物車殘留造成「永遠忙碌→永不待機→永不清車」死結:忙碌判定移除「購物車非空」條件,進行中狀態改由對話框開啟(isShowDialog)與感應支付(isNfcPaymentActive)涵蓋。
3. 銷售平台移除上、下方灰色資訊欄(linearLayout5、bottom_bar),改於 applySaleOverlayVisibility 一律隱藏。
4. 機台資訊列新增時間顯示(置於網路前),並以獨立的 ClockTickScheduler 每秒刷新,與 10 秒上報重活迴圈分離,避免將上報/重啟判斷拉到每秒。
5. 版號遞增 verPatch 97→98。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 15:26:07 +08:00
sky121113
c7bc554eca
[FIX] 修復掃碼支付(玉山)結案前購物車被清空導致「無商品紀錄」
...
1. 根因:order.items 在結案 build() 當下才即時讀 live buyList,掃碼支付(玉山)流程較慢(掃碼+玉山API約20s),結案前 buyList 會被取消/倒數路徑清空,造成 order.items 變空陣列(無商品紀錄),但出貨其實成功(dispense 有商品)。
2. TransactionFinalizeBuilder 新增 itemsSnapshot 商品明細快照欄位與 captureItems() 方法;buyList 為空時不覆寫既有快照。
3. 抽出共用 buildItemRecords() helper,captureItems() 與 build() fallback 共用。
4. build()/buildOrderPayload() 改為優先採用快照,無快照時才 fallback 讀 live buyList。
5. DispatchDialog onCreate 建立 finalizeBuilder 後立即 captureItems(),此時 buyList 必完整。
6. 升版 verPatch 95 → 96 (S9XYU versionName 21_01_96_R / versionCode 210196)。
正常情況快照==live,逐字等價;僅在 buyList 被清空的 bug 情境修正。純 App 端,不影響後台與線上 main。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 13:13:46 +08:00
sky121113
89c7d04f7a
[FIX] 修復遠端更新設定誤刪廣告,並完善機台資訊列顯示
...
1. [FIX] persistCurrentSettings() 原以 deleteAll() 清空整張 SettingsDao,
連坐刪除廣告(VideoEoxPlayer)等持久資料;改為僅 deleteWhere 逐筆刪除
接下來要重寫的 4 個設定 key(Machine/Esunpay/GreenInvoice/Greenpaysetting)。
修正「遠端更新設定→重啟 App 後廣告消失,須再更新廣告才出現」問題。
2. [FEAT] 機台資訊列左側改顯示「序號 + 版本號(Ver versionName)」。
3. [FEAT] 機台資訊列網路訊號改為動態:依 WiFi RSSI / 行動網路 dBm 切換訊號格數
icon 與文字(無網路/WiFi/行動/有線),並於 SET_NETWORK 與輪詢時即時更新。
4. [REFACTOR] 進站後門觸控由舊 textNetwork 遷移至機台資訊列的「序號+版本號」元素
(舊系統列已隱藏不再接收觸控)。
5. [STYLE] activity_fontend 機台資訊名稱樣式調整(灰色/14sp/透明度 0.7)。
6. 版號 verPatch 93 → 94。
2026-06-16 11:09:45 +08:00
sky121113
6caaf0890e
[FEAT] 交易生命週期上報(pending/failed)與發布 v93
...
1. app/build.gradle:verPatch 91 → 93(高於機台已 OTA 的 v92,確保修正上得了機台)。
2. structure/ReportFlowInfoStructure.java:新增 mqttFlowId 欄位,作為一次交易的 MQTT 流水號,pending → completed/failed 全程共用,與取貨碼/通行碼用的 reportFlowId 分離。
3. structure/mqtt/TransactionFinalizePayload.java:OrderPayload 新增 status 欄位(pending/completed/failed/abandoned),未帶時後台預設 completed,確保線上 main 機台行為不變。
4. tools/TransactionFinalizeBuilder.java:改用 mqttFlowId(無則生成並回存)、新增可變 status/payment_status 與失敗代碼;新增 publishPending()/publishFailed() 靜態上報;以 shopping_mode == "basic" 判斷是否上報(晟崴 employee_card/中國醫 pickup_sheet 無實際付款不送);pending/failed 不開立發票。
5. ui/dialog/BuyDialog.java:changeCheckout 進入付款時為實際付款方式(1/2/3/4/9/30/70)生成新 mqttFlowId 並上報 pending(進付款一律留底),先清除上一筆避免 flow_id 撞單。
6. ui/dialog/CheckoutNfcCardDialog、CheckoutNfcRechargeDialog、CheckoutNfcPhoneDialog:刷卡機回非 0000 或空電文的失敗分支補上 publishFailed(代碼),救回原本默默消失的失敗單。
7. ui/dialog/CheckoutEsunPayDialog、CheckoutTapPayDialog、CheckoutLinePayDialog:掃碼/官方支付 TRANSACTION_FAILED 分支補上 publishFailed。
過渡期保護:晟崴/中國醫 跑 main 分支、無實際付款,且後台四鐵律(無 status 預設 completed、終態冪等、pending 才轉移、abandoned 只掃 pending)保證其後台資料逐字不變。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 08:54:42 +08:00
sky121113
7875db4c7d
[FIX] 升版 v91(OTA 版號遞增,內容同 v90 支付 MQTT finalize 修正)
...
1. build.gradle verPatch 90 → 91,供實體機台 OTA 升級。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 14:03:17 +08:00
sky121113
3fd34becb6
[FIX] 支付成功改走 MQTT finalize、修正卡在倒數不出貨;升版 v90
...
真因:各支付 Dialog 成功後呼叫已停用的 B600(reportFlowInfo),再靠 B600 的 HTTP 回應回呼 REPORT_FLOW 才進 DispatchDialog;B600 已失敗 → 永遠不出貨,卡到倒數 COUNTDOWN_CANCEL(症狀:刷卡機顯示成功但流程不繼續)。
1. CheckoutNfcCardDialog / CheckoutNfcRechargeDialog:支付成功(0000)不再呼叫 B600,直接 changeDispatch() 進 DispatchDialog,由 MQTT publishTransactionFinalize 統一上報(payload 已含 invoice_info,B600/B650 皆不需要)。
2. CheckoutNfcPhoneDialog:同上,且進 dispatch 前覆寫 payment_type=10(手機支付);刷卡機 NCCC 電文無法區分手機錢包/實體卡,依使用者所選按鈕分類。
3. CheckoutEsunPayDialog / CheckoutLinePayDialog / CheckoutTapPayDialog:交易成功直接 changeDispatch;交易失敗改為提示「交易失敗」並返回購買頁(changeBuy),不再卡住或誤出貨。
4. LinePay 維持 payment_type=70(官方直連),後台另補定義;TapPay 子項 30~34 沿用。
5. 舊 CheckoutCashDialog/CashPayDialog 為 legacy,basic shopping_mode 不使用(現金走 CashPayDialogGeneral),本次未動。
6. build.gradle 版號 verPatch 89 → 90。
注意:後台 star-cloud 需同步新增 payment_type 10(手機支付)/70(LINE Pay 官方) 與翻譯(另一 repo,另行提交)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 13:56:56 +08:00
sky121113
d7bef7b827
[FIX] 修正直接購買(購物車版)未跳購物車品項頁的真因;升版 v89
...
1. 真因:DialogProductDetail 取 SaleFlowHandler 時用 onCreate 的 getContext(),那是 AlertDialog 包裝過的 ContextThemeWrapper,instanceof FontendActivity 為 false,導致 openCartList 靜默 return(一般版因 requestBuy 有 new BuyDialog 後路才照常開支付頁,故僅購物車版受影響)。
2. 修法:建構子保存原始傳入的 Context(真正的 FontendActivity)為 hostContext,openCartList/requestBuy 改用 hostContext 做 instanceof 與取 SaleFlowHandler。
3. 升版號 verPatch 88 → 89。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 11:24:28 +08:00
sky121113
1c9022cc5e
[FIX] 修正商品格線右緣觸控失效與直接購買未跳購物車頁;升版 v88
...
1. 修正 fragment_vmc.xml 商品格線 recyclerBuy 在 ConstraintLayout 缺水平約束(原 match_parent 僅綁上下)導致右側佈局/觸控異常:改為 0dp + start/end 綁 parent 確保全寬與右緣可點。
2. RecyclerVmcBuyListAdpter 讓整張商品卡片皆可點開詳情頁(原僅圖片可點),避免點到名稱/價格區無反應。
3. 商品詳情頁「直接購買」(購物車版)改為先切換至購物車品項頁、再關閉詳情頁,避免關閉對話框與 fragment 切換時序互相干擾導致未跳頁。
4. 升版號 verPatch 87 → 88。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 11:13:36 +08:00
sky121113
df96f33d5f
[FEAT] 商品詳情頁直接購買分流與數量帶入;升版 v87
...
1. 詳情頁「直接購買」依購物車開關分流:購物車開啟時以詳情頁選定數量加入購物車後前往購物車列表頁(不直接結帳);購物車關閉(一般版)維持單品直購彈 BuyDialog 選付款。
2. 修正數量未帶入問題:加入購物車與直接購買統一走 addSelectedQuantityToCart(),依詳情頁數量逐件加入,點 N 件購物車即為 N 件。
3. 升版號 verPatch 86 → 87。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 10:44:19 +08:00
sky121113
35af9fec8f
[FEAT] 升版 v85 並打包 S9XYU(多語系 11 語+後台 API 對接+ui-design 合併)
...
1. verPatch 84 → 85,對應自 v84 以來累積的多語系擴充(法德西)、後台 B014 LangSet/B012 i18n 對接、ui-design UI 改版合併與 10 語系字串對齊等變更,供 OTA 版號對齊。
2. 產出 S9XYU Debug APK:versionName 21_01_85_R、versionCode 210185。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 09:36:57 +08:00
sky121113
5b8a0d7cf6
[FEAT] 新增遠端 update_settings MQTT 指令並收斂系統設定為唯讀;升版 v84
...
1. MqttService 新增 update_settings 指令分支:收到後重抓系統設定(B014),
不串接商品/廣告同步,僅更新設定本身。
2. 忙碌防呆:交易/購物車/對話框進行中(getBusyReason 非空)時拒收並回 failed
ACK,後台 RemoteCommand 約 1 分鐘 timeout 後可重發。
3. 重連時序修正:先發成功 ACK,再延遲 1.5 秒重連 MQTT,避免重連把送指令的
連線斷掉導致 ACK 發不出去(涵蓋 token 輪換情境)。
4. StarCloudAPI.downloadSetting 新增可選 reconnectMqtt 參數(saveSettings 同步),
綁定 UI 流程維持 true、update_settings 路徑傳 false 由呼叫端控制重連時機;
無參數多載維持原行為,向下相容。
5. SystemSetActivity 收斂:機台端系統設定全面唯讀,唯一可編輯項為硬體貨道
(彈簧/履帶,僅系統方);移除現金總開關連動,回寫雲端只送 is_spring_slot_*。
6. app/build.gradle verPatch 升至 84。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-12 12:01:50 +08:00
sky121113
318bfde1fb
[FEAT] 多語系擴充至 8 語並改用語言選單;升版 v83
...
1. 新增 5 個語系資源:簡體中文(values-zh-rCN)、韓文(values-ko)、越南文(values-vi)、泰文(values-th)、印尼文(values-in,採 Android 舊代碼 in),各 285 條以 en 已翻譯集合為範本,缺漏字串自動 fallback 回預設繁中。
2. LanguageHelper 重寫支援 8 語完整 locale:SUPPORTED_LANGUAGES 清單、canonicalize() 相容舊碼(tw/jp)並帶 region、buildLocale() 處理 zh-TW/zh-CN 與印尼資源代碼、getDisplayName() 以各語自身文字顯示。
3. 商品名稱多語以 toProductLang() 收斂:僅 en/ja 取對應翻譯,其餘語言(簡中/韓/越/泰/印尼)一律 fallback 中文主值(後台目前僅中/英/日)。
4. FontendActivity 語言入口由 3 顆內聯鈕改為單一 🌐 鈕開啟 AlertDialog 單選選單(showLanguagePicker),隱藏 En/Ja 舊鈕;切換後重綁定入口。
5. 新增字串 select_language 並補齊全 8 語系翻譯。
6. 升版號 verPatch 82 → 83。
註:泰文需於真機驗證系統字型支援;5 種新翻譯為機器品質,customer-facing 字串建議母語者校對。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-12 10:30:22 +08:00
sky121113
fdf02189fb
[FEAT] 解除 App 多語系隱藏並收斂商品名稱多語邏輯;升版 v82
...
1. FontendActivity 重新顯示中/En/日語言切換鈕(移除 visibility=gone),點擊監聽改傳統一代碼 zh/en/ja。
2. LanguageHelper 新增 normalizeCode()/normalizedLang(),將歷史 tw、Locale zh、日文 jp 全部收斂為 zh/en/ja 一套,changeLanguage 一律儲存正規化代碼。
3. ProductStructure 新增 getLocalizedName(),依目前語言取商品名稱,英/日未翻譯時自動 fallback 回中文主值,作為商品名稱顯示的單一來源。
4. 各 adapter 改用 getLocalizedName():RecyclerVmcBuyListAdpter、CartOperationAdapter、RecyclerDialogBuyListAdpter(原被註解)、RecyclerProductListAdpter 與 RecyclerProductSearchAdpter(原永遠顯示中文),刪除各自重複的語言 switch。
5. applySavedLanguage() 集中至 base class AppCompatActivityAbstract.onCreate(),所有 Activity 於 inflate 前統一套用語言設定。
6. 升版號 verPatch 81 → 82。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-12 09:59:47 +08:00
sky121113
39245a0608
[FIX] TapPay 圖示檔名改小寫修正 aapt2 命名違規;升版 v81
...
- ui-design 合併帶進的 TapPay30~34.png 用大寫檔名,違反 Android
resource「只能 a-z/0-9/底線」規則,導致 mergeResources 失敗。
改名為 tappay30~34.png(git mv 保留歷史)。圖示目前未被引用,
改名不影響功能,保留供日後接線。
- verPatch 80→81
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-12 08:47:43 +08:00
sky121113
8d2adee5ab
[FEAT] 支付方式「母&&子」集中判斷 + 入口防呆;對話框期間隱藏銷售平台浮層
...
- DevSetStructure 新增 canCreditCard/canCardPay/canMobilePay/canEsunPay/
canTapPay/canLinePay/canCash,集中「母開關 && 子項」真相
- BuyDialog 購物車/單品/例外三分支改用上述便利方法,並在 changeCheckout
入口以 isPaymentFlowAllowed 再次防呆,擋下被繞過的已停用支付
- 浮層連動:HIDDEN/SHOW_MULTILANGUAGE_BUTTON 改為 HIDE/SHOW_SALE_OVERLAY,
對話框與購物車 Fragment 期間統一隱藏取貨碼/購物車浮鈕與上下系統列
- 無操作逾時 3 分鐘調整為 5 分鐘;verPatch 79→80
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-11 16:58:14 +08:00
sky121113
fc21186a53
[FEAT] 來店禮串接 B690 + 掃碼即時回饋與空窗修正、通行碼購物車模式封堵
...
1. 來店禮改串新端點 B690(取代舊 HttpAPI.freeGiftCode):
- StarCloudAPI 新增 verifyWelcomeGift(),POST machine/welcome-gift/verify/B690(Bearer 機台 token,body {code})。
- CheckoutFreeGiftCodeDialog 手動輸入與掃碼皆改走 B690;折扣映射 amount→mode1(折抵金額)、percentage→mode2(折扣趴數換算總價乘數,八折20→0.8)。
- 加 isWelcomeGift API 防護;非 amount/percentage 型別擋下提示。
- 注意:B690 無舊「免費商品」型,純折扣。
2. 掃碼 UX 空窗修正(取貨碼/通行碼/來店禮三個對話框):
- 掃描器啟動延遲 5 秒→0,對話框一彈出即監聽,解決「剛彈出馬上掃會整個丟失、時好時壞、無回饋」。
- 讀取窗口 7→9 次(約 45 秒),覆蓋 40 秒對話框存活時間。
- 新增 SET_SCAN_INPUT:掃到的碼即時顯示在輸入框;送出前顯示「驗證中…」。
3. 通行碼購物車模式封堵:
- BuyDialog 購物車模式的付款清單中,通行碼(buttonAccessCode)從未 gating;改在 onCreate 加權威判斷,需 isPickupModule && isPassCode 才顯示,涵蓋購物車/單品所有模式。
4. 版號 verPatch 76→79。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 15:09:42 +08:00
sky121113
e8b3185b8a
[FIX] 取貨碼/通行碼:封堵付款備援漏出、API 防護、掃碼即時回饋
...
通行碼漏洞封堵
- BuyDialog 單品模式 NFC 不支援時會強制顯示通行碼(buttonAccessCode)當備援,
未判斷 isPassCode;改為從屬取貨模組(isPickupModule && isPassCode)才顯示
API 防護(defense-in-depth,UI 漏出入口也擋下)
- submitPassCode/submitPickupCode 開頭加守門:功能關閉即不呼叫 B670/B660,狀態列提示「功能未開放」
掃碼 UX 回饋
- 新增 SET_SCAN_INPUT 事件:掃碼後即時把掃到的碼顯示在輸入框
- 送出驗證前顯示「驗證中…」狀態,取代原本易忽略的遮罩 Toast,避免使用者誤以為沒掃到
- 版號 verPatch 75→76
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 14:11:06 +08:00
sky121113
018da036b1
[FEAT] B014 系統設定全面接入:取貨模組/來店禮 gating、購物車單品直購、購物方式顯示與設定權限分流
...
雲端 B014 設定解析與持久化(StarCloudAPI / MyApp / DevSetStructure)
- FunctionSet 改接 PickupModule/WelcomeGift/MemberSystem/AmbientTemp(原僅 PickupCode/PassCode)
- DevSet 補接刷卡機/掃碼支付細項;新增 HardwareSet 貨道型式(彈簧/履帶)解析
- B000 登入解析 identity/loginToken,供系統設定唯讀身分判斷與 B016 回寫
- 新增 bootstrap 預設(devset_defaults)、initialSystemSet/saveSystemSet DB 持久化
前台流程 gating
- 取貨碼、通行碼從屬「取貨模組」(PickupModule):模組關閉時連動隱藏(畫面與流程都不出現)
- 來店禮獨立判斷(WelcomeGift):原按鈕恆亮,改為依雲端開關顯示
- BasicSaleFlow:購物車(ShoppingCar)關閉時點商品改單品直購,清空後僅放本品並直接開 BuyDialog
系統設定頁(SystemSetActivity / activity_system_set / styles)
- 新增「購物方式」唯讀顯示(基礎版/員工卡/取貨單);僅 basic 展開其下可設定項
- 權限分流:商業政策項(購物車/發票/各支付方式/取貨模組/來店禮/會員)恆唯讀,
機台實體項(刷卡機/掃碼/現金總開關、面額、環溫、硬體貨道)系統方可改並寫回雲端
其他
- DispatchDialog 成功結案清空 v2 購物車;ShoppingCartFragment 調整數量續命倒數
- 版號 verPatch 72→75
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 12:33:57 +08:00
sky121113
ab3b53da99
[REFACTOR] 收斂 project 維度為執行期 shopping_mode + B014 雲端設定唯讀同步
...
1. B014 雲端設定下發 → App 解析寫入 DevSet 並持久化:
- StarCloudAPI.saveSettings() 解析 DevSet(14 開關)/CashSet(7 面額)/
FunctionSet(取貨碼 PickupCode、通行碼 PassCode)/ShoppingMode;
缺漏粒度區分(整個物件缺→不動本地防誤關;物件內 key 缺→視為 false)。
- MyApp 修 TapPay30~34 持久化 bug(saveSystemSet 補序列化、initialSystemSet
改 optBoolean 防舊紀錄 crash),並新增 PickupCode/PassCode/ShoppingMode 持久化。
- DevSetStructure 新增 isPickupCode/isPassCode 欄位。
- SystemSetActivity 全部 21 個 checkbox 鎖唯讀、返回鈕只 finish() 不回寫。
- 取貨碼浮鈕(FontendActivity)改吃 DevSet.isPickupCode()、通行碼入口(BuyDialog)
改吃 DevSet.isPassCode(),取代舊 flavor 資源/寫死。
2. 收掉 project flavor 維度,三種購買流程改由雲端 shopping_mode 執行期切換:
- SaleFlowHandler 改為 main 抽象基底 + create() factory,依 shopping_mode 回傳
BasicSaleFlow(basic/原 General)、EmployeeCardSaleFlow(employee_card/原 Chengwai)、
PickupSheetSaleFlow(pickup_sheet/原 Cmuh) 三策略。
- 三 flavor 的 dialog/adapter/Kotlin 購物車/Cmuh 醫令類別全併入 main;重複類別去重。
- FontendPickupCodeDialog 內部依 shopping_mode 分支(basic/employee 走 B660、
pickup_sheet 走舊 memberVerification 並跳過取貨口檢查)。
- fragment_vmc 合併掃描單據按鈕,VmcFragment 依 shopping_mode toggle 可見性。
- General strings(zh/en/ja)、drawable、購物車 layout 併入 main;
devset_defaults 併為 basic-mode bootstrap 預設。
3. 取代 BuildConfig.FLAVOR_project 編譯期分支:
- AppEntry.isCmuh() 改判 shopping_mode == pickup_sheet。
- DispatchDialog 6 處 Cmuh 分支改用 AppEntry.isCmuh()。
- ComPort.getFilepath() 改認硬體維度 BuildConfig.FLAVOR(S12XYU→ttyS7/S6、
S9XYU→ttyS1/S2),與購買流程正交;對現役機台行為不變。
4. build.gradle 移除 project 維度,flavorDimensions 只留 hardware;輸出檔名去掉
project 段(app-S_12_XY_U-<ver>-debug.apk)。刪除 app/src/{General,Chengwai,Cmuh}/。
5. compiler-apk / release-apk(workflow + .claude/commands)改以硬體規格 S9/S12 為
打包對象,OTA keyin 改依硬體分版並提示 shopping_mode 部署鐵律。
6. verPatch 69→70(供 OTA 遠端更新)。
雙硬體 clean 編譯回歸 S12XYU/S9XYU 全綠。實機三流程驗證待硬體。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 15:28:59 +08:00
sky121113
2c3255cb64
[RELEASE] 升級修補版號 verPatch 68→69(供 General 下位機修正 OTA 更新)
...
ComPort 修正後需遞增版號讓現場機台可觸發 OTA 覆蓋更新。
General S9XYU → versionCode 210169 / versionName 21_01_69_R。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 12:14:48 +08:00
sky121113
cfc802dbb5
[FEAT] General flavor 多品項購物車(Part 1)
...
移植 Luzui v2 Kotlin MVVM 購物車到 General flavor,接 TaiwanStar 既有
結帳鏈(BuyDialog → 付款 → DispatchDialog → MQTT 結案)、沿用 VMC 出貨。
- build:啟用 Kotlin/lifecycle/BaseRecyclerViewAdapterHelper(全域 classpath,
cart .kt 僅在 src/General 編譯,不影響 Chengwai/Cmuh 行為)
- 移植至 src/General:CartViewModel/CartOperationAdapter/CartOperationResult/
SafeCountdownUtil/UnibuyHelper/ShoppingCartFragment + layout/drawable/三語 strings
- 移除 Luzui 的 updateLocalGoods(FLOWER/DAO)、DialogXManager、HttpAPI、格子機依賴
- 結帳改 convertToBuyStructure() + SaleFlowHandler.onBuyRequested()
- 共用檔最小改動(對 Chengwai/Cmuh 零行為影響):
- SlotStructure 加 cartSelectedCount
- FontendActivity 加 openFragment()/backToVmc()、購物車浮鈕改走 onShoppingCartRequested()
- RecyclerVmcBuyListAdpter 點商品改走 flavor hook handleProductSelected()
- 三個 SaleFlowHandler 加 onShoppingCartRequested()/handleProductSelected()
(General:加入購物車;Chengwai/Cmuh:維持原行為)
三 flavor 編譯通過、General APK 打包成功。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 08:45:11 +08:00
sky121113
5f480d6cb6
[FIX] 修正非中國醫專案的物料代碼一致性驗證邏輯並升級修補版號
...
1. 於 VmcSlotListActivity 限制 validateMaterialCodeConsistency 僅在中國醫 (CMUH) 專案下執行,其他專案直接跳過。
2. 調整 app/build.gradle 的修補版號 (verPatch) 變數值,由 67 遞增至 68。
2026-06-09 16:00:58 +08:00
sky121113
0637f71e34
[FIX] 優化機台鎖定防護流程與遞增版本號
...
1. 遞增修補版號 verPatch 至 67 以落實機台 OTA 更新規範。
2. 於 FontendActivity 的 onCreate 流程新增機台鎖定狀態檢查,若鎖定則強制跳轉至 MaintenanceActivity 並清除 Activity 棧。
3. 修正 MqttService 的鎖定命令跳轉旗標,改用 Intent.FLAG_ACTIVITY_CLEAR_TASK 確保舊 Activity 棧被完整清理。
4. 移除 AppUtils 中未使用的 MqttManager 引用。
2026-06-04 16:07:31 +08:00
sky121113
bfc2915403
[FIX] 修復中國醫多貨道庫存分配異常與遞增發版版號
...
1. 修復 SaleFlowHandler.java:重構中國醫客製領藥流程中的多商品貨道分配演算法,引進動態多貨道輪替分配機制,徹底解決一筆單多商品(如 3 個同商品)時貨道重複分配為 3, 4, 4 的 Bug。
2. 更新 build.gradle:配合生產發版,將修補版號 verPatch 遞增至 66,並在背景成功編譯產出正式 Release APK (CmuhS9XYURelease)。
2026-06-02 17:49:40 +08:00
sky121113
a5add7d8ae
RELEASE: 修正多商品取貨 UI 倒數閃跳與 3 分鐘閒置崩潰問題,發佈版本 65
2026-06-02 16:00:58 +08:00
sky121113
808b9c40d9
[FIX] 修正 OTA 連線超時與首頁執行緒併發競態導致 UI 異常問題
...
1. OtaManager.java: 將下載的連線逾時從 15 秒調高至 30 秒,讀取逾時調高至 120 秒,提升 OTA 下載穩定性。
2. FontendActivity.java: 修正多執行緒更新 UI 時,共用 logs 緩衝區所引發的競態條件 (Race Condition) 導致欄位變空的問題,改採區域變數更新;並安全封裝重構 reportOnScheduler 的生命週期管理方法;調整閒置逾時為 5 分鐘。
3. build.gradle: 依據實體機台 OTA 版號自動化規範,安全遞增 verPatch 修補版號至 56。
4. compiler-apk.md: 優化編譯工作流中的後台更新說明提示欄位。
2026-06-01 17:48:32 +08:00