← 回主控台
下一批計劃:總帳本 · 開發者聯絡 · 課程改版 · 館方營運日曆
2026-07-15 規劃(老闆口述需求 → 完整計劃)。照
底層對齊原則:表開對、鏈拆對、入口收攏;業餘 UI 收合複雜度。每節=需求還原 → 資料地基 → UIUX →
你沒想到的面向 → 拍板題。
這批的共同地基洞察:五個需求其實咬在一起 — 課程開課要吃「館方暫停日」;課表行事曆要聚合「課程+賽事+暫停日」;總帳本要吃「課程抽成+賽事報名費+裁判費支出」。所以批 A 先把三張地基表一次開對(帳本事件表/館方封館表/學程表),再往上蓋 UI,順序錯了會做兩次。
一、總帳本(每館一本)批B
需求還原:每個體育館一本總帳;各賽事(和課程)在總帳裡是一個項目(收入/支出);點項目進詳細(該次辦賽的每筆收支)。
資料地基(關鍵決策)
金流現況是散的:賽事報名費(fee book)、課程收入抽成(coach_ledger 95/5)、裁判費(批1 結算,記帳)、退費。建議開一張帳本事件表而不是每次現算聚合:
| 表 | 欄位 | 說明 |
| arena_gym_ledger | gym_id / direction(in|out) / amount / source_type(tournament|course|officiating|refund|manual) / source_id / counterparty / occurred_at / memo / method(mock|cash|ecpay) | 每一筆錢進出=一列;寫入點收攏成 LedgerRepository(綠界接上時只換 method,表不用改 — G3 同款思路)。既有資料寫 backfill script 補進來 |
UIUX
- 入口:館後台 → 「總帳本」。頂部月份切換+三格(收入/支出/淨額),下面依 source 聚合的清單:「7/12 排球館間聯誼 +$3,600 / −$900(裁判費)」一列一活動
- 點賽事列 → 重用既有 FeeBookPage(報名費與帳本)當詳細頁,不重做;課程列 → 該課的收支明細;手動收支 → 「+ 記一筆」(場地維修/水電,對齊 POS 臨時收支概念)
- 權限走 G1:tournamentCan/fees 同語意 → 館層 gym fees capability(owner/admin+行政公關)
- 匯出:月結 CSV(報稅/對帳)— 一顆按鈕,複製或分享
你沒想到的面向:
- 退費要當負項且連回原收入(不然月報表會虛胖):refund 事件帶 source_id 指向原收入列
- 平台費 5% 要不要顯示?建議顯示「毛收入/平台費/實收」三欄,對帳才對得起來
- 現金 vs 線上標記(method):現在報名費常是現場繳,綠界接上後兩種並存,不標記帳會亂
- 裁判費是支出:批1 結算清單「應領」目前只是顯示,批B 讓「標記已付」寫一筆 out 事件 — 帳才closes
- 課程的錢是「抽成」不是全額:館的收入=場地費+抽成,教練實拿另一本(教練端未來也要自己的帳本 — 表設計時 counterparty 欄就是為這個留的)
二、開發者聯絡強化批B
需求還原:能篩選訊息有沒有價值;有 LINE ID/電話欄位,能真的聯繫用戶討論規格。
資料地基
| 改動 | 說明 |
| feedback 表 +contact_line_id / +contact_phone | 回饋表單加兩個選填欄(附一行「留下聯絡方式,開發者可能找你聊需求」=取得同意) |
| +triage(untriaged|valuable|normal|junk|done) / +triage_note | 審核台的價值分級;done=已處理 |
UIUX
- 審核台(OperatorReview)feedback 區改:篩選 chips(未分級/高價值/有聯絡方式/已處理)+每則卡上四顆分級鈕(一鍵標)
- 有聯絡方式的卡:「LINE 聯繫」「撥號」按鈕直接開 line://ti/p/~{id} / tel: — 你點了就能聊
- 回覆照走既有 feedback_reply 鏈
你沒想到的面向:
- 個資聲明:收電話要在欄位旁寫用途(僅開發團隊聯繫產品需求,不對外)— 一行字的事,先寫進去省麻煩
- 高價值回饋 → 一鍵轉需求:標 valuable 時順手填一行「規格摘要」,審核台可匯出成清單(你開發排程的原料)
- 統計小條:本週 N 則/採納 M 則 — 幫你判斷回饋管道活性
三、課程改版:教練分類+九步開課流+學程批C(最大)
需求還原:課程按教練分類。開課流程:準備課程資訊(含退款制度:官方統一+系統建議)→ 選課/學程 → 預約場地(只列可約的)→ 招生 → 繳費 → 行前通知 → 報到 → 課後評價 → 預約下一堂。學程=可連續階段(上完前一階段才能進下一階段),也可單學程。
現況對照(哪些已有、哪些要新做)
1 課程模板庫+退款制度→
2 從模板選課/學程→
3 場地空檔預約→
4 招生(已有:審核+報名+候補)→
5 繳費(已有 mock)→
6 行前通知(已有 24h+加自訂訊息)→
7 報到(已有 GPS/點名)→
8 課後評價→
9 預約下一堂
資料地基
| 表/欄位 | 說明 |
| arena_course_templates | 教練的「準備好開課資訊」:名稱/類別/大綱/定價/退款制度 key。開課=從模板帶入,改一次全系列適用 |
| refund_policy(平台常數+課程欄位) | 官方統一制度存平台常數(如 官方標準:開課 7 天前全退/72h 前 50%/之後不退);系統建議=依類別給預設;教練只能選官方制度或「更寬鬆」自訂(Gate 擋更嚴苛)。課程存 policy key+快照(同 G4 思路:報名當下的制度要可回溯) |
| arena_coach_programs + program_stages | 學程:program(名稱/教練/整包價?)+stages(order, course_id)。單學程=只有一個 stage。解鎖 Gate:報 stage N+1 需 stage N 完課(出席率門檻拍板) |
| arena_course_reviews | 課後評價:1-5 星+標籤(專業/準時/講解清楚/親切)+留言;unique(slot, student);只有「有出席」者能評(Gate)。教練頁聚合顯示 |
UIUX
- 課程頁改「教練為中心」:教練卡清單(頭像/專長/★評分/開課數/證照徽章)→ 教練頁=簡介+評價+「課程」「學程」兩區。找課=先找人(信任感),這是跟現在最大的差別
- 學程卡:階段進度條(①基礎 ✓ → ②進階 進行中 → ③實戰 🔒)— 學員在「我的課程」看到自己的解鎖進度,🔒上寫「完成上一階段解鎖」
- 開課精靈(教練端):選模板 → 挑場地時段(只列可約:讀場地空檔+館方暫停日+自己既有課衝突)→ 確認送審。場地=選了先佔 pending,審核退回自動釋放(跟賽事排場一致)
- 評價時機:完課(教練按完課/課後總結送出)觸發學員通知「這堂課如何?」→ 評完出現「預約下一堂」CTA(同課下一時段 or 學程下一階段);沒評也能約(不綁架)
- 報名頁顯示退款制度(同意才報,同 G4 模式)
你沒想到的面向:
- 階段中途插班:新學員想直接報 stage 2?建議 Gate 預設鎖、教練可個案豁免(「教練評估可跳級」按鈕)— 不做豁免會流失有基礎的學員
- 學程定價:整包價(折扣)vs 逐階段買 — 建議兩者都支援,整包=預收多階段,退款制度要定義「上到一半退整包」怎麼算(已上階段照單堂價扣,餘額退)— 這條最容易吵,務必寫進官方制度
- 評價防刷/防報復:只有出席者能評+完課後 7 天內;教練可回覆但不能刪;低分不公開理由只給館方?(拍板)
- 教練行事曆:教練自己的課+執法+比賽要一張表,不然開課選時段會自己撞自己(至少做「自己既有課衝突」檢查)
- 場地費歸屬:開課佔場地=館方收入(場地費)→ 寫進總帳本(批B 的 counterparty 就是為這個)
- 棄課學員的信任:報名沒到 → 進 no-show 信任(既有機制掛上即可)
四、館方暫停開放日批A(地基)+批D(UI)
需求還原:館方可以把某些天暫停對外開放(整修/辦比賽用)。
資料地基
| 表 | 欄位 |
| arena_gym_closures | gym_id / date_from / date_to / scope(all|courts[])/ reason(renovation|tournament|private) / note |
UIUX+影響面(重點)
- 館後台 → 「營運日曆」:月視圖,點日期(可拖範圍)→ 標暫停+原因;暫停日在所有人的日曆上顯示灰底「整修中/包場」
- 一個 Gate 全系統吃:gymClosedBlock(gymId, date) 收攏 — 揪團開場/課程開課選時段/賽事排場次/場地預約全部過這個閘(單一入口,對齊 G1 思路)
你沒想到的面向(最容易炸的一條):
- 標暫停時「這期間已經有東西」怎麼辦?— 標記當下要列出受影響的既有場次/課程/賽事場(N 筆),讓館方選:①保留(館內賽事自己用)②逐筆取消通知(走既有取消鏈退費)。不做這步就會出現「館關了但課還在賣」
- 辦比賽的暫停可以從賽事排程反向自動建(排場次時勾「這幾天閉館辦賽」)— P2
- 地圖/館頁要顯示「N/N–N/N 整修中」,不然用戶白跑
五、館方課表行事曆(用戶端)批D
需求還原:用戶一進體育館(或開館頁)就能打開行事曆看近期活動。
UIUX
- 館頁+進館首頁(GPS 圍欄觸發那頁)加「行事曆」入口:月視圖+當日清單,聚合四種既有資料:課程 slots(彩色點=類別)/賽事場次/公開揪團/暫停日(灰底)
- 點任一項 → 直接跳對應詳情(課程報名頁/賽事頁/場次頁)— 行事曆=發現+轉化入口,不只是看
- 篩選 chips:全部/課程/比賽/揪團;預設顯示未來 30 天
- 純聚合 view,零新表 — 資料全都有(這就是為什麼排批D,等暫停日表就緒)
你沒想到的面向:
- 非會員可見度:行事曆是拉新利器 — 建議公開可看、報名才要登入(拍板)
- 「加入我的行事曆」:單一活動 → 既有 add_2_calendar 直接掛;整館訂閱(ics feed)= P2
- 大會螢幕(/arena-screen)已能放電視;行事曆可以加「本週牆」模式同一招 — P2
建議批次順序+工作量
| 批 | 內容 | 為什麼這順序 |
| 批A 地基 migration | arena_gym_ledger+backfill/arena_gym_closures/course_templates+refund_policy/programs+stages/course_reviews/feedback 聯絡+triage 欄 — 一次開齊 | 五個功能互相咬(行事曆吃暫停日、開課吃暫停日+模板、帳本吃課程抽成),表先對,UI 不返工 |
| 批B 帳本+聯絡 | 總帳本頁(聚合+FeeBookPage 重用+手動記帳+CSV)/裁判費標記已付入帳/審核台分級篩選+LINE/電話按鈕 | 小而獨立,先見效 |
| 批C 課程大改 | 教練分類頁 → 模板+官方退款制度 → 場地空檔預約 → 評價 → 學程階段解鎖 → 預約下一堂;含通知鏈與 docs 同步 | 最大一塊,吃批A 全部地基 |
| 批D 營運日曆 | 館方暫停日 UI(含受影響項目處理)/gymClosedBlock 全系統掛閘/用戶端課表行事曆 | 行事曆最後做=一次聚合到位 |
開工前要拍板的題目
- 官方退款制度的數字:建議「開課 7 天前全退/72 小時前退 50%/之後不退;教練或館方取消一律全退」— 要改嗎?
- 學程「完課」定義:出席該階段 ≥ 幾成才解鎖下一階段?(建議 60%,教練可豁免跳級)
- 整包學程退一半:已上階段照單堂原價扣、餘額退 — 同意嗎?
- 課程評價:星等公開;文字留言要「教練可回覆、僅館方+教練可見低分理由」還是全公開?
- 總帳本範圍:先做 賽事+課程+裁判費+手動;會員費/場租(散客)要不要這批一起?
- 行事曆對非會員公開?(建議公開,報名才登入)
- 暫停日撞既有預約:預設「列出讓館方逐筆決定」— 還是一鍵全取消?
✅ 完成紀錄(2026-07-15,老闆拍板「全部照建議做」)
四批全部上 main;七道拍板題全用建議值。行事曆追加拍板:活動標題直接顯示在格子上,點標題彈出正反面翻卡(不導航;翻卡手法同球員名片)。測試 1450 全綠。
- 批A migration 20260715_next_batch_foundations.sql(+fkeys):帳本事件表+鏡射 trigger+backfill/裁判費 payouts/暫停日/課程模板/退款制度欄/學程四表/課後評價/回饋聯絡+triage。已 apply。
- 批B 館後台「總帳本」(月切換+收支淨+依活動聚合+點賽事列進 FeeBookPage+記一筆+月結 CSV);執法結算「標記已付」→ 自動入賽事帳+館帳;審核台篩選 chips+一鍵分級+LINE/撥號;回饋表單 LINE/電話選填欄。
- 批C 課程頁改教練為中心(教練/課程/學程三分頁+教練公開頁);模板帶入/存模板;官方退款制度(7天/72h/50%,自訂只能更寬鬆)+報名同意;包場空檔快選;課後評價(出席限定+7天內,低分留言限館方教練本人,教練可回覆)+完課自動邀評+評完「預約下一堂」;學程階段解鎖(出席≥60%,教練可豁免跳級)+整包/逐階段+整包退=已上階段原價扣。
- 批D 館後台「營運日曆」(選範圍+原因+全館/指定場地+受影響盤點逐筆處理);GymClosureGates 單一閘掛進 createVenueReservation/createSession/computeVenueSlots/開課精靈;用戶端「課表行事曆」(櫃檯+預約頁入口,月視圖格子直接顯示標題,點標題開翻卡,篩選 chips,非會員可看)。
Dogfood 驗證點:
- 後台 → 總帳本:看 backfill 的課程/賽事收入;+記一筆;匯 CSV。
- 賽事頁執法結算 → 標記已付 → 回總帳本看裁判費支出(同賽事聚合一列)。
- 個人頁意見回饋:填 LINE ID 送出 → 審核台篩「有聯絡方式」→ 點 LINE 鈕。
- 教練開課:選模板 → 自訂退款制度(填比官方嚴會被擋)→ 包場「空檔快選」。
- 報名課程:先看到退款制度同意 dialog;取消報名按新制度算退費。
- 點名完課 → 學員收「課後評價邀請」→ 我的課程評星 → 「預約下一堂」CTA。
- 我的開課 → 建學程(挑 2 門課)→ 學員整包報名 → 完成第 1 階(出席≥60%)解鎖第 2 階;教練可豁免跳級/退學程看退費算法。
- 後台 → 營運日曆:標下週兩天整修(這期間先開一個場次)→ 受影響盤點出現 → 取消場次;之後預約/開場/開課選那兩天都被擋;課表行事曆那兩天灰底。
- 櫃檯 → 課表行事曆:格子上直接看到課程/賽事/揪團標題 → 點標題翻卡(正面時間/背面詳情+課程報名 CTA)。
P2 未做(規劃內註記):辦賽自動建暫停日/整館 ics 訂閱/行事曆本週牆模式/50% 退費的分帳精算(綠界接上時處理;現況 offline 現場退現金以決策金額為準)。
本頁=規格書+完成紀錄;老闆原話需求已存 memory(arena-next-batch-spec)。