朱墨印譜風 · 零後端 · 完整隱私 · 即時雙向的 CEO 營運儀表板。瀏覽器直連既有 Airtable(方案甲),部署於 GitHub Pages,公開網址不存放任何客戶資料。
風格:朱墨印譜(朱紅×墨黑、方形朱印、墨底白字表頭、民國紀年、大寫序號)。CTA-first:本日待辦行動置頂,聚焦結案與補登成交金額。
CEO 瀏覽器 ⇄ Airtable REST API(HTTPS 直連)。零後端、零外部系統、零成本。第三方函式庫走 CDN(Chart.js、Google Fonts),無建置步驟,全相對路徑(GitHub Pages 子路徑安全)。
config.js 合約/設定 · auth.js 憑證+Setup Gate · airtable.js 連線/schema/讀寫
logic.js 分析(上次互動校正/佇列/團隊/行動/摘要) · render.js 朱墨印譜渲染
charts.js 圖表 · app.js orchestrator(boot/輪詢/CTA 寫回)
- 推到
main(本 repo 已含.nojekyll,停用 Jekyll)。 - GitHub → Settings → Pages → Build and deployment → Source = Deploy from a branch → Branch =
main// (root)→ Save。 - 約 1 分鐘後開:
https://realchrisl.github.io/quanjin-ops/。 - 全相對路徑,子路徑可正常運作;無建置步驟。
首次開啟只會看到一張朱墨印譜設定卡,貼入三項即啟用(之後存在本機,不再詢問):
- Airtable Personal Access Token(PAT) — 在 Airtable → Developer hub → Personal access tokens 建立 scoped PAT:
- Scopes(僅勾三個):
data.records:read、data.records:write、schema.bases:read - Access:僅授權這一個 Base(不要 all bases)
- 建議僅於 CEO 自有裝置使用,網址勿外流。
- Scopes(僅勾三個):
- Base ID(形如
app…)。 - Table ID(預設帶入起點值,可改)。 右上角「清除憑證」可一鍵抹除並回到設定卡。
- repo/Pages 不含任何客戶資料、Base ID、欄位名稱。
- PAT/Base ID 僅存於這台瀏覽器的
localStorage(qj.pat/qj.baseId/qj.tableId/qj.fieldMap)。 - 全程 HTTPS 直連 Airtable,不經第三方。沒有權杖,公開網址什麼都看不到。
載入後以 Meta API 自動偵測 schema,依欄位名啟發式對應語意欄位(委託人/案件類型/承辦人/狀態/成交金額/案號/案件說明/建立時間,以及「上次互動時間」的多個候選欄位)。上次互動時間取多個候選欄位中的最新有效值。解析結果存於 localStorage['qj.fieldMap']。
v1 為自動偵測;若某欄位對錯,可清除憑證重設或進階手改
qj.fieldMap。視覺化 FIELD_MAP 確認/修正面板列為 fast-follow。
全部樂觀更新 UI → PATCH Airtable →(成功)以伺服器回傳值校正+角落同步紀錄;(失敗)回滾並顯示清楚錯誤。
| CTA | 寫回 | 狀態 |
|---|---|---|
| 送件結案 | 進度狀態→已完成 + 結案日期=今天;就地展開成交金額,確認即一併寫回 |
✅ v1 |
| 補登成交金額 | 成交金額(數字),結案日期若空補今天 |
✅ v1 |
| 標記已聯繫 | 最後互動時間→現在(直接消除逾期) |
✅ v1 |
| 改派承辦人 | 委派團隊成員 |
⏳ fast-follow(停用中) |
本工具寫的是 LINE Agent 在用的同一個生產 CRM,CTA 繞過了 bot 的副作用,故:
- 進度狀態只用三態(跟進中/人工接管中/已完成);結案→已完成,bot 對已完成客戶的再進線會自動 reactivate(正常)。
- 標記已聯繫 只更新
最後互動時間;bot 的已聯繫指令還會額外寫一條 audit row 讓提醒不再出現——本工具不寫那條,故 bot 端的逾時摘要可能仍會列入。可接受。 - 改派(fast-follow):bot 解析
委派團隊成員期望「名字 (uid)」格式;啟用前須先以實際 schema 確認欄位型別與格式,避免打斷 bot 的委派路由。故 v1 停用。
佇列上方的搜尋框兩段式運作:輸入即本地過濾進行中案件(零網路);本地零命中時(500ms debounce)才單發一筆伺服器查詢(filterByFormula 限 進度狀態=已完成,SEARCH 比對 姓名/LINE顯示名稱/Line 備註名稱,maxRecords=10,不預載不翻頁)。命中以灰卡呈現(「已結案・不在目前進行中清單內」,僅 🔗詳情+開回 兩鍵,無等候徽章、不入佇列不入統計)。
開回=confirm 後直寫 PATCH {進度狀態: 人工接管中} 單一欄位(PAT 直連 Airtable)——刻意不走 proxy 的 restore/takeover 動作:恢復 會推「感謝耐心等候🙏」給客戶;接管 在已完成紀錄上會穿透 no-op 守衛觸發 manual-takeover ack(下班時段真推客訊,airtable_crm.py:2246 一帶,屬 bot 端既存缺陷、另列 backlog)。開回不清 結案日期(保留歷史)、不動其他欄位;成功後刷新即進佇列可指派。取捨:無 proxy 稽核軌跡(backlog:proxy 靜默 reopen action)。
背景:2026-08-04 謝代書在戰情室找不到 陳彥甫/田禾麗——兩筆均為「已完成但案件實續跑」(近 7 天活躍的同類共 62 筆,多為 6/26 legacy 舊客群)。主查詢維持「進行中 或 近30天結案」不放寬=防洪原則。
載入即抓;背景輪詢(預設 25 秒,config.js:SETTINGS.pollSeconds)只更新有變動的列、保留捲動與展開狀態;視窗切回前景立即刷新;CTA 後以伺服器值校正。
- OAuth 2.0 + PKCE:以公開 client(無 secret、redirect = 本 Pages 網址)取代手貼 PAT。預設先用 PAT。
- 絕對零憑證:若不願在瀏覽器存任何權杖,改用 Airtable Interface(Airtable 原生介面,無自有前端)。本工具的取捨是換取朱墨印譜 UI、CTA-first 與離線可控。
.gitignore 阻擋憑證/資料檔;全程 HTTPS;介面文案明確說明資料不離開 Airtable/本機;PAT 僅存本機、可一鍵清除。