{{ c.n }}{{ c.u }} {{ c.badge.t }}
{{ c.f1 }}
{{ c.f2 }}
管理員登入
請用總部管理員帳號進入。這裡的每一個動作都會記進稽核簿。
OPERATIONS
{{ c.n }}{{ c.u }} {{ c.badge.t }}
{{ c.f1 }}
{{ c.f2 }}
這幾家店有事情等著 —— 已經過期還開著的、快到期的、看起來沒在用的
正在看今天有什麼事…
{{ todayTab === 'all' ? '今天沒有待辦。' : '這一類現在沒有。' }} {{ todayTab === 'all' ? '沒有過期的、沒有快到期的、也沒有看起來沒在用的 —— 24 家店都正常。' : '換上面的分頁籤看別類。' }}
{{ x.txt }}
| 租戶 | 方案 | 服務到期 | 授權模組 | 操作 |
|---|---|---|---|---|
|
!
讀不到租戶名冊{{ tenants.length ? '這一次沒拿到最新的名冊,所以暫時不顯示(不是客戶不見了)。' : '這不是「沒有客戶」—— 是這一次沒拿到。' }} |
||||
|
正在讀租戶名冊… |
||||
|
還沒有開通任何租戶。 右上角的「開通新租戶」會建立一間新的店 —— 子網域、資料庫、預設帳號一次做完。 |
||||
|
這個條件篩不到任何租戶(名冊裡一共有 {{ tenants.length }} 間)。 |
||||
|
{{ t.tenant_name }}
自備行情金鑰
試用
已停權
{{ t.subdomain }}.cj33.tw
|
{{ p.plan_name }} {{ p.band_code }} 未設方案 | {{ expiryLabel(t) }} |
{{ m }}(已停售)
|
設定 進入協助 看畫面 清理 刪除 |
本月續約漏斗
讀取中… {{ renewFunnel.total }} 家到期 · {{ renewFunnel.amount.toLocaleString() }} 這個月 0 家到期
{{ renewFunnel.noExpiry }} 家沒有設服務到期日(現在寫「永久」)——
沒有到期日就不會進這張漏斗,也不會被自動停權、收不到第二期。
去租戶的「方案」設服務到期日,這張圖就會有東西。
這個月沒有人到期 —— 下一張到期日還在這個月以外,不用追續約。
卡最兇的是 {{ renewFunnel.worst.from }} {{ renewFunnel.worst.to }} 這一段,掉了 {{ renewFunnel.worst.lost }} 家
收入結構
讀取中… 月 {{ revenueMix.total.toLocaleString() }} 月 0客戶健康分布
用量 × 月費還沒有店可以放上這張圖 —— 要先替客戶設方案(才有月費與容量),點數才畫得出來。
另有 {{ healthScatter.skipped.length }} 家沒畫進來(還沒設方案,算不出月費與容量):{{ healthScatter.skipped.slice(0,3).join('、') }}…
全部都是{{ healthMix[0].label }}({{ healthMix[0].n }} 家)
系統維運
讀取中… 讀不到 {{ opsCard.bad }} 支掛了 全部正常 一支都沒登記
讀不到排程的心跳 —— 這不等於「排程都正常」,是這一頁問不到它們的狀態。
{{ loadErr.cron }}
一支排程都沒有登記 —— 主機上的排程設定可能整個沒掛上去。
去「系統 → 排程健康」看一次;那一頁會告訴你是沒登記、還是心跳檔不見了。
成功率算不出來:掛掉的 {{ opsCard.badNoHist }} 支完全沒有執行紀錄, 把它們算成「沒失敗」會得到一個騙人的 100%。
全平台 · 近半年活躍學生
{{ spark(platformTrend.map(m => m.v), 600, 150, 8).last }}人
今日操作分布
{{ todayOps.total }} 筆· 長度跟最多的那一項比 今天還沒有人動過方案分布
全部都是{{ tierMix[0].label }}({{ tierMix[0].n }} 家)
還沒有店設方案
模組採用率
租戶名冊照舊可以用 —— 只有這一塊這次沒拿到。
{{ loadErr.insights }}
正在讀全平台數字…
{{ loadErr.insights ? '這一塊也沒拿到(原因同上)。' : '正在讀租戶健康…' }}
目前沒有需要注意的租戶。
(這是算出來的結果,不是沒拿到資料。)
{{ centerMeta.sub }}
這不是「沒有資料」—— 是這一次沒拿到。
{{ loadErr.health }}
正在讀租戶健康…
還沒有任何租戶。
這不是「沒有資料」—— 是這一次沒拿到。
{{ loadErr.plans }}
正在讀方案目錄…
還沒有任何方案 —— 所以現在開不出任何一張報價單。
按右上角「帶入建議方案」可以一次建好兩條產品線的版本與級距,再逐項改成你談定的價格;
或按「新增方案」自己開。建議先開草稿,內容排好再改成「正式開放」(草稿不會發出任何功能)。
內部{{ p.notes }}
還沒開級距,所以這個方案開不出報價單 —— 按「編輯」加一級並填月費。
這一版少掉上一版有的 {{ p._removed.length }} 項:
{{ featLabel(c) }}
高階版通常要包含低階版的全部 —— 請按「編輯」確認是不是漏勾了。
算進那 {{ setupOpened }} 家的是:
· {{ c.tenant_name }} ({{ c.kind_label }}) ← 這一家要是你自己的店,到「租戶管理」把種類改成「自用」就不會算進名額
目前一個正式客戶都沒有 —— 名額從第 1 家開始算
最便宜那一級 原價 {{ Number(founding.sample_monthly).toLocaleString() }}/月 → 第一年 {{ Number(founding.state.monthly).toLocaleString() }}/月 (每月省 {{ Number(founding.state.saved_monthly).toLocaleString() }})· 第二年起回原價
{{ it.item_desc }}
做到這裡算完成{{ it.done_when }}
這一列要做的工變了
定價當時按 {{ it.priced_for_accounts }} 個 LINE 官方帳號,而這條線現在要建 {{ it.accounts_now }} 個
你當初寫的是:「{{ it.price_reason }}」寫了 {{ it.reason_age_days }} 天
這一列沒有寫定價理由 三年後沒有人答得出為什麼收這個價
這個方案有 {{ planEditing.tenants }} 家店在用。改內含功能會讓那幾家店當天就變(多給或少給)。
同一個版本賣不同規模是不同價錢,所以價格綁在級距上。
月費留 0 表示還沒定價 —— 存得下來,但報價單會擋住不准出單。
級距只能加不能減:已經有客戶指在第 3 級,把它刪掉那位客戶的報價單就再也印不出來。
改既有價格一定要填「定價依據」,而且不能把舊的原封不動留著 ——
後端會擋下來。只改級距名稱不用填。
建置費不在這裡 —— 它一項一項設在底下的建置費菜單(可以設促銷價、到期日、前幾家)
這一級有價格但沒有依據 —— 半年後沒有人答得出它憑什麼。
{{ grp }} ({{ featureGroups[key].filter(f => planEditing.features.includes(f.code)).length }}/{{ featureGroups[key].length }})
一律內含(所有版本都有,不可拿來賣)
超過上限只提醒、不擋(不可以讓客戶的店突然做不了生意)。無上限填 -1。
家長與供應商永不計席次、老師不佔行政帳號 —— 那是服務說明對客戶的承諾,所以這裡沒有那幾種。
系統自己檢查過的承諾({{ termPromises.filter(p => p.ok).length }} 條成立、{{ termPromises.filter(p => !p.ok).length }} 條還不成立)
這不是「沒有資料」—— 是這一次沒拿到。
{{ loadErr.terms }}
正在讀服務說明條文…
還沒有任何條文。按「帶入建議條文」會照 2026-09-27 定案的六節寫進去,
之後你逐條改字;其中三條會被機器擋住印不出來(那三個功能還沒做)。
{{ label }}
可以印出去的那一份 ({{ termPrint.generated_at }} 產生)
這 {{ termPrint.blocked.length }} 條沒有印進去(那件事還沒做完 —— 現在寫上去就是承諾一個不存在的東西)
· {{ b.title }} —— {{ b.check.evidence }}
{{ label }}
· {{ t.title }} {{ t.body }}
已經選了店,名字就跟著那家店走,不用再填。
這幾級是方案目錄裡真的有的。級距越大代表學生數/品項數越多,月費越高。
印在單子上的「這個價格何時失效」。留白=不印期限。
要賣哪幾個方案
要收哪幾項建置費 (一項都不勾=這張單不收建置費)
這幾項沒有重複收:{{ d.item_name }}({{ d.because }})、
{{ quoteDraft.founding.label }}({{ rateText(quoteDraft.founding.rate) }}) 還剩 {{ quoteDraft.founding.left_quota }} 家
· 第一年 每月 {{ quoteDraft.founding.y1_monthly.toLocaleString() }} (月繳一年 {{ quoteDraft.founding.y1_monthly_total.toLocaleString() }}/年繳 {{ quoteDraft.founding.y1_annual.toLocaleString() }}) 省 {{ quoteDraft.founding.saved_y1.toLocaleString() }}
· 第二年起 每月 {{ quoteDraft.founding.later_monthly.toLocaleString() }} (年繳 {{ quoteDraft.founding.later_annual.toLocaleString() }})—— 回原價
年繳 9 折是疊在這個折扣上算的(月費先打折並進位,那個整數才算年繳)
創始客戶優惠沒有套用:{{ quoteDraft.founding.why }}
這張單有 {{ quoteDraft.setup_mismatch.length }} 件事對不上(不擋你,但先看一眼)
· {{ m.item_name }}:{{ m.note }}
這一句會原樣印在單子上給客人看,不影響上面算出來的金額。
· {{ l.plan_name }} ({{ l.band_name }}) (第 {{ l.band_no }} 級) 月 {{ l.monthly_fee.toLocaleString() }} +一次性 {{ l.setup_fee.toLocaleString() }} · 含 {{ l.features.length }} 項功能 · {{ l.item_name }} (套餐) 一次性 報價 {{ l.list_price.toLocaleString() }} {{ l.price > 0 ? l.price.toLocaleString() : '免費' }} 促銷省 {{ l.saved.toLocaleString() }} · {{ l.why }} · 加購:{{ l.label }} (單價你自己填在單子上 —— 加購怎麼收錢還沒定案,系統不替你發明數字)
這幾個方案還沒定價,存不了:{{ quoteDraft.price_missing.join('、') }}
先到「方案目錄」把那一級的月費填好 —— 0 元的單發出去,對方會當成免費。
這不是「沒有資料」—— 是這一次沒拿到。
{{ loadErr.quotes }}
正在讀報價單…
{{ quotePrint.quote.quote_no }} · {{ quotePrint.quote.who }} (這是當時定格的內容,不是現在重算的)
· {{ l.plan_name }} ({{ l.band_name }}) 月 {{ Number(l.monthly_fee).toLocaleString() }} +一次性 {{ Number(l.setup_fee).toLocaleString() }} · {{ l.item_name }} (套餐) 一次性 {{ l.is_quoted ? '報價' : (Number(l.price) > 0 ? Number(l.price).toLocaleString() : '免費') }} · 加購:{{ l.label }}
月費合計 {{ Number(quotePrint.quote.total_monthly).toLocaleString() }} · 一次性 {{ Number(quotePrint.quote.total_setup).toLocaleString() }}
{{ quotePrint.quote.discount_note }}
這不是「沒有資料」—— 是這一次沒拿到。
{{ loadErr.audit }}
正在讀總部操作紀錄…
這一頁只有總管理員看得到。
(不是沒有紀錄 —— 是你的角色沒有查閱稽核紀錄的權限。)
沒有符合條件的紀錄。
(開啟租戶列表不會留痕 —— 那會把稽核表洗版,真正重要的事反而查不到。)
這不是「沒有資料」—— 是這一次沒拿到。
{{ loadErr.storeaudit }}
正在讀分店操作紀錄…
這一頁只有總管理員看得到。
(不是店家沒有操作紀錄 —— 是你的角色沒有查閱稽核紀錄的權限。)
沒有符合條件的店家稽核紀錄。
現在是篩過的: 只看真人 單一租戶 操作人「{{ storeAuditFilter.operator }}」 關鍵字「{{ storeAuditFilter.keyword }}」
這不是「沒有資料」—— 是這一次沒拿到。
{{ loadErr.imp }}
正在讀化身通行證紀錄…
這一頁只有總管理員看得到。
(不是還沒有人進去過 —— 是你的角色沒有查閱化身紀錄的權限。你自己按「進入協助」是可以的。)
還沒有化身紀錄。
(按過「進入協助」之後才會出現;表格若尚未建立也會是空的)
{{ loadErr.platformline }}
{{ plLine.configured ? (plLine.channel_name || 'CJ33 總部') : '還沒設定' }} {{ plLine.configured ? (plLine.active ? '使用中' : '已停用') : '待設定' }}
金鑰存在系統裡,畫面上不顯示
{{ plLine.last_webhook_at ? '通了' : '還沒通' }} {{ plLine.last_webhook_at ? '收得到' : '收不到' }}
{{ plLine.last_webhook_at ? ('最後一次 ' + plLine.last_webhook_at) : '收訊網址還沒貼回 LINE 後台,或是貼錯了' }}
{{ (plLine.recipients || []).length }}人 {{ (plLine.recipients || []).length ? '發得出去' : '發不出去' }}
一個都沒有的話,守門情報只會寫進日誌,沒有人會知道
{{ plSteps.rows[0].title }}
{{ plSteps.rows[0].sub }}
貼到「Messaging API → Webhook網址」按儲存,
再打開使用 Webhook、關掉自動回覆訊息。
{{ plSteps.rows[1].title }}
{{ plSteps.rows[1].sub }}
還問不到這個帳號的 LINE ID(@ 開頭那一串)—— 到下面「帳號設定」按一次存起來,系統就會向 LINE 問一次並把連結放在這裡。
為什麼要先按一下?這個 LINE 官方帳號是公開的,任何人都加得到好友。
如果「加好友就會被記下來」,陌生人就能把自己推進這張清單
—— 所以改成你先宣告要接,只有那 60 秒內進來的才算。
已經加過好友了?不用重加 —— 按下「接上我的 LINE」之後,
在那個聊天室隨便傳一句話就會出現。
60 秒不夠?過期了再按一次就好,按幾次都可以。
{{ f.display_name || ('沒有顯示名稱 · 編號尾碼 ' + (f.uid_tail || '???')) }}
{{ f.followed_at }}
{{ !plLine.last_webhook_at ? '收訊還沒通 —— 先做完第 1 步。' : (plLine.window && plLine.window.mine) ? '等你的 LINE…… 加好友或傳一句話之後,它會自動出現在這裡(不用重新整理)。' : '按上面的「接上我的 LINE」開始。' }}
{{ plSteps.rows[2].title }}
{{ plSteps.rows[2].sub }}
一個都沒有 —— 守門情報這類通知現在只會寫進日誌,沒有人會知道。
只有 1 個人收得到 —— 他請假、換手機、或把這個帳號封鎖了, 整條平台通知就斷了,而這條路平常不發,沒有人會發現。 建議至少再接一位總部人員:請他用自己的 LINE 加好友,然後在第 2 步按「這是我」。
{{ r.name }}
LINE:{{ r.line_name }} · 尾碼 {{ r.uid_tail }}
LINE 尾碼 {{ r.uid_tail }}(這支還沒抓到顯示名稱)
還沒有這個帳號?去 developers.line.biz —— ① 建一個 Provider ② 在它底下 Create a Messaging API channel ③ 進那個 channel 的 Messaging API 頁籤,最下面按 Issue 產生 Channel access token; Channel secret 在 Basic settings 頁籤。
正在讀設定…
這不是「沒有設定」—— 是這一次沒拿到。
{{ secSetErr || '原因不明' }}
現在會發給:{{ r.name || r.line_user_id }}、 (來源:{{ secSet.recipients_now[0].from }}) 現在沒有任何人收得到 —— 請在上面填一位,或先去設定每日週報的收件人。
{{ r.label }}:{{ r.value }} {{ r.hint }}
{{ secNum(secCards.outsider.hits) }}次 {{ secCards.outsider.hits ? '要你看一眼' : '乾淨' }}
{{ secCards.outsider.rows }} 件 · 來自 {{ secCards.outsider.sources }} 個不同來源
通行證無效、金鑰猜錯、排程通行碼錯 —— 這一類不可能是員工手滑
這 {{ secFilter.days }} 天沒有外人敲過門。
這一類一次都不該發生,所以出現就值得看。
{{ secNum(secCards.insider.hits) }}次 {{ secCards.insider.hits ? '行政待辦' : '乾淨' }}
{{ secCards.insider.rows }} 件 —— 去人員管理替他勾選就解決了
這不是資安事件,不會讓上面那個燈亮
這 {{ secFilter.days }} 天沒有人撞到權限牆。
有的話多半是權限沒勾好,不是有人在試探。
這不是「沒有人被擋」—— 是這一次沒拿到。
{{ loadErr.secintel }}
正在讀守門情報…
這一頁只有總管理員看得到。
(不是沒有紀錄 —— 是你的角色沒有查閱稽核紀錄的權限。)
上面那一列已經說了:現在沒有在記錄。
(所以這裡的空白【不代表】沒有人被擋。)
這個條件下沒有紀錄。
(上面的篩選縮小了範圍 —— 清掉它看全部。)
這 {{ secFilter.days }} 天沒有任何人被擋下來。
(這是好消息 —— 而上面那一列證明了它真的在看。)
現在是篩過的: 只看外人 只看權限沒勾好 單一租戶
同一天、同一個人、同一條網址只佔一列,右邊那個「幾次」才是真的發生幾次。 最多列出 100 列。
這不是「沒有資料」—— 是這一次沒拿到。
{{ loadErr.cron }}
正在讀排程健康…
還沒有任何排程心跳紀錄。
(登記在系統裡的排程都會列出來,包含從來沒跑過的)
這不是「沒有資料」—— 是這一次沒拿到。
{{ loadErr.deploy }}
正在讀部署紀錄…
還沒有部署紀錄。
(下一次送檔成功之後,這裡就會出現一筆)
這不是「沒有資料」—— 是這一次沒拿到。
{{ loadErr.mig }}
正在讀搬家健康…
沒有資料。
(需要 customers/cl_attendance 等表存在)
還差 {{ 8 - newUser.password.length }} 個字。
客服可以:{{ supportCan.join('、') || '(讀不到分權表)' }}。
客服不能:{{ supportCannot.join('、') || '(讀不到分權表)' }}。
這不是「沒有資料」—— 是這一次沒拿到。
{{ loadErr.users }}
正在讀總部人員…
這一頁只有總管理員看得到。
(不是名單讀不到 —— 是你的角色沒有看總部人員的權限。)
讀不到人員名單。
每次按「清理」或「刪除」之前,系統會自動把那家店的資料存成一個檔放在這裡。
超過 30 天的會被每天凌晨那支排程自動清掉,所以要救要趁早。
倒回去之前,系統會先把「現在的樣子」另外存一份。
你的角色看不到備份檔清單。
(備份檔名帶著店號與清理日期,那本身就是營運情報)
這不是「沒有資料」—— 是這一次沒拿到。
{{ loadErr.backup }}
正在讀備份清單…
目前沒有任何備份檔。
(按過「清理」或「刪除」之後才會出現;超過 30 天的會被每天凌晨那支排程清掉)
第一步:先看清楚這個檔裡有什麼、倒回去會覆蓋掉什麼。這一步不會動到任何資料。
這個檔是 {{ rsInspect.tenant_name }}(#{{ rsInspect.tenant_id }})的資料,
共 {{ rsInspect.tables.length }} 張表、{{ rsInspect.total_rows }} 筆。
這家店現在不存在,還原等於把整家店倒回來。
這份備份是舊格式,倒回去之後這些東西救不回來
這份備份是 2026-09-24 之前產生的,那時系統還沒有把權限一起備份進去。
還原之後那家店會回來、人也會回來,但每個人都沒有任何角色與權限 ——
他們登得進去,卻什麼都不能做,要總部一個一個重新設定。
之後產生的備份就不會有這個問題了。
第三步:先把現在的樣子另外存一份 —— 萬一你倒錯了一份備份,用它救回來。
最後一步會把 {{ rsInspect.total_rows }} 筆資料倒回去,並覆蓋那家店現在的資料。 請照這裡的店名完整打一次:{{ rsInspect.tenant_name }}