這是待實作架構,不表示資料庫、LINE 身分驗證、檔案儲存或對外 API 已建置。
1. 建議系統分工
提案採 LINE Messaging API+LIFF,管理介面沿用團隊熟悉的 Next.js/TypeScript;獨立 PostgreSQL 支援訂單、收入與帳本的交易及唯一鍵,照片放私有物件儲存。這是技術提案,未選定主機、購買服務或部署;既有 CRM 的 MongoDB 不遷移。
第一版使用具版本的固定規則和人工確認。若後續加 AI,適合用於經授權的文字摘要、文件欄位擷取草稿與客服知識檢索;人身安全、肇責、理賠、實車車況、收益或付款均由可驗證規則與人員決定。這次不設定 AI API 金鑰。
2. LINE 與邀請歸屬
- 平台先用一個專用 LINE 官方帳號,多個 B 以邀請連結識別;後期才做各 B 自有帳號的品牌方案。不得直接覆蓋現有 CRM LINE 用途。
- LIFF 入口示意為
https://liff.line.me/{LIFF_ID}/invite/{code}。登入重導後仍須保留邀請意圖,並由伺服器驗證代碼。LINE 的liff.state只協助傳遞入口,不代表授權。LIFF 官方流程 - 邀請可轉傳不代表個案可轉傳。公開來源碼不能當案件密碼;照片或帳本分享不可塞入同一來源 URL。
- LINE Login 與 Messaging API 的 provider 配置需正確,伺服器驗證 token 與受眾,不能只相信前端
getProfile傳來的 userId。LINE 身分資料官方指引既有好友、外部瀏覽器、登入取消、封鎖與重新加入都要驗收。 - webhook 驗證原始 body 簽章,再交事件佇列;以 channel+
webhookEventId去重,處理重送、亂序、回覆失敗及未知事件。只有可靠收妥事件才確認接收。LINE webhook 文件 - 訊息收回、使用者封鎖與資料撤回各有不同語意;收回內容需適當刪除或停止使用,不能仍在後台顯示原照片。
3. 核心資料模型
| 資料 | 核心欄位 | 約束 |
|---|---|---|
| organizations/memberships | 組織、成員、角色、停用狀態 | B、C、客服與財務依角色;跨組織服務需明確關係 |
| owners/identities | A 內部 ID、LINE provider/subject、狀態 | LINE 身分唯一;前端不能自行指定 A |
| vehicles/vehicle_access | 車型、選填車牌、車主/駕駛/車隊關係 | 車輛不是帳號;共用車不讓駕駛互看私人案件 |
| partner_invites | B、活動、雜湊代碼、狀態、有效期限 | 停用/逾期不能新增綁定 |
| referral_relationships | A、原始 B、來源證據、確認時間、版本 | 同時只有一筆有效原始歸屬;更正留歷史 |
| cases | A、類型、來源、使用關係、狀態、版本 | 每張案件有擁有人與獨立授權,不靠來源授權 |
| case_events | 案件、事件、誰回報、時間、輸入版本 | 本人自述、業者回報、系統核實分開標示 |
| case_assets | 案件、私有物件鍵、類別、可用狀態 | 下載檢查權限,期限網址;未授權不得跨案讀 |
| consents | A、案件/訂單、用途、收件者、欄位/資產、告知版本、期限、撤回 | 原 B 查看、C 轉介、行銷、其他用途分開 |
| service_providers | C、品類、區域、時段、資格/文件狀態 | 沒有可確認的接案能力不顯示可即時派遣 |
| referrals/assignments | 案件、C、服務、授權 ID、接案狀態 | 使用最新有效授權,拒接不自動轉給下一家 |
| quotes/orders | A、案件、C、工項、金額、付款者、核准者、版本 | 報價變更需重新核准;同案多訂單各別結算 |
| revenue_events | 原交易、平台實收、退款、來源、證據、外部事件鍵 | 只採可信帳務事件;同來源事件唯一 |
| revenue_allocations | 收入事件、來源 A、受益 B、分配金額、依據 | 分配總額不可超過原收入;未分配列明;鎖定原 B |
| reward_rules | 品類、比例、基礎、條件、版本及適用期間 | 交易鎖定規則快照,改版不追溯侵蝕既得權益 |
| ledger_entries | B、來源 A、原交易、帳項類型、整數金額、規則、冪等鍵 | 不覆寫歷史;新增沖回;幣別固定並隔離 |
| payout_requests | B 契約收款主體、保留額度、付款識別、狀態、核准及對帳 | 保留與可用額度更新在同一交易內,防止雙花 |
| parking_sessions | A、本人保存的位置/樓層、停車時間、提醒選擇、到期 | 不採持續追蹤,設定到期刪除 |
| notifications | 收件人、用途、來源事件、狀態、重試、退訂 | 行銷撤回即停止;不把送出認定本人完成行動 |
4. 最小化分享
| 接收方/用途 | 初始可分享提案 | 預設不分享 |
|---|---|---|
| 拖吊 C | A 選定聯絡方式、救援位置、車型及必要救援需求 | 保單、事故責任描述、所有歷史、銀行資料 |
| 修復 C | 車型、所選車損照片、需求、聯絡及預約地區 | 無關精準定位、對方身分、保單及 B 的回饋餘額 |
| B 案件協助 | A 明確選定的進度、聯絡與文件 | 未授權照片、定位、全部歷史交易 |
| 保險服務窗口 | 該次選定的事故與保單資料 | 其他無關消費、行蹤、B 的回饋收款資料 |
| 美容/保養/中古車商 | 新需求及本次必要車況、聯絡資料 | 自動繼承事故的全部授權 |
| 財務 | 收益、帳項、核對所需憑證及收款資料 | 無關事故照片、即時位置 |
授權需精確到公司、人員角色、目的、欄位及所選資產。傳送前及每次讀取都重新檢查;撤回時取消待送工作與存取。照片包含他人的資訊時,提供裁切/遮蔽流程;A 的同意不自動涵蓋對方個資。
5. 事件與生命週期
主事件規劃:invite_confirmed、case_created、safety_self_reported、asset_added、consent_granted/revoked、referral_requested/accepted/declined、quote_approved、order_completed、revenue_confirmed/refunded、reward_accrued/adjusted/available、payout_requested/confirmed/failed、case_closed。
各事件包含唯一 ID、來源、時間、案件/訂單、操作者、版本及必要的相關鍵。付款及收入由伺服器權限角色產生;車主不能透過聊天「已付款」直接造成收入入帳。
案件可暫停、取消、重開與轉人工;每次變更保留原因。同一事件重送不再建案、不再媒合、不再記收入、不再發回饋。
6. 保存與刪除
正式保存期間按「暫存登入/未建案、案件資料、定位/停車、授權證據、交易帳務、備份」分別定義,並由營運主體與適用要求確認後填入告知。未決定前,不啟用真實蒐集。
定位只用於本次目的;醫療/病歷文件不列首版上傳項。若後期有必要,另設具法定基礎及嚴格權限的流程。原始照片及文件保存在私有空間,記錄目的、到期、刪除、備份清除及收件方處理狀態。
A 可以查詢、匯出本人資料、提出更正及停止/刪除需求;B 查看本人/組織帳本。交易留存與一般行銷資料分開,A 退訂不取消本人案件查詢,B 的既得收益依約處理。
7. 對外 API 設計提案
| 群組 | 操作 | 身分/授權要求 |
|---|---|---|
| LINE | 接收 webhook、LIFF session exchange | 簽章或經驗證 token;速率限制 |
| 邀請 | B 建立/停用、A 確認歸屬 | B 的組織權限、A 本人 |
| 案件 | 建立、更新本人自述、照片、摘要 | A 本人或有授權的指派角色 |
| 授權 | 建立、查詢、撤回 | A 本人,保留告知版本 |
| 服務 | 需求、轉介、接案、報價、核准 | 對應 B/C 角色;不可自行擴張欄位 |
| 財務 | 收入核對、退款、回饋、付款對帳 | 專屬財務權限、冪等及審計 |
| 停車 | 場站查詢、本人的停車筆記及提醒 | 查詢可不建帳;保存需本人同意 |
8. 既有 TS Dent CRM 介接
在 A 選定 TS Dent 為 C 並授權後,送最小化的商機資料與外部案件/訂單 ID。CRM 回傳接案、報價、完工及可核實收入事件;以外部 ID 去重,不直接把所有 LINE 好友匯入 CRM。
CRM 的完工狀態不等於平台已收取媒合費。收入以實際結算資料為準,回饋帳本由本子專案負責。介接故障可重試及人工對帳,失敗不顯示轉介成功。