Korat
功能

網店系統——櫃檯上賣,也送到家

一套店家自己就能配好的網店系統:一個有真實規格和誠實庫存的商品頁,一個分得清配送與自取的結賬流程,以及一張在每一步都告訴買賣雙方它走到哪裡的訂單。收銀和網店共用一份庫存,免費,沒有月費。

這套網店系統之所以存在,是因為一個靠聊天記錄賣貨的本地商家遲早會漏掉一單。取代聊天記錄的東西刻意毫不花哨:帶搜尋和分類篩選的商品目錄、在點選之前就顯示庫存的商品頁、絕不含糊屬於哪家店的購物車,以及一張走過五個命名狀態、每次流轉都發通知的訂單。

商品頁:規格、庫存和折扣,都在點選之前

每件商品有照片、描述、庫存,以及可以打折的價格——促銷價旁邊是劃掉的原價和一個百分比角標,讓折扣的幅度是讀得出來的,而不是暗示出來的。商品缺貨時,那句話畫在照片上,而不是等到結賬才被發現。這遵循整個應用共同的一條規則:任何會改變一次點選後果的資訊,必須在點選之前可見。按鈕絕不能承諾下一屏會拒絕的事。

規格由屬性生成,而不是一條條錄入。賣家宣告軸——尺碼、顏色,或這件商品實際在變化的那個維度——組合出來的每個規格各自持有庫存。這樣就把常見的壞資料擋在外面:同一件襯衫被分別錄成三個商品,永遠無法合在一起統計,而庫存只有其中一個是對的。

一個購物車只屬於一家店

購物車是單店的。從另一家賣家新增商品會先詢問是否清空,而不是悄悄堆出一個橫跨四家商戶的籃子。這是一次設計上的拒絕,不是缺失的功能:多店購物車意味著一次結賬、一次運費計算和一個出問題時負責的物件,而當賣家是四家各有各配送安排的獨立本地商戶時,這三樣都不存在。

一車一店,是故意的。切換店鋪會詢問是否清空購物車。橫跨多個賣家的籃子要想誠實,就需要一次統一結賬,而這裡沒有全平臺的結賬——每一單都發生在一位買家和一家商戶之間。

運費不是應用傳上來的欄位。下單時,伺服器從店鋪自己的記錄裡讀取,而且只對配送生效。

結賬:配送或自取,以及一筆客戶端定不了的運費

結賬只問一張訂單真正需要的東西:配送還是自取、姓名、電話、地址、備註和支付方式。選自取會完全移除運費,而不是顯示為零,因為這兩種狀態含義不同,而“零”讀起來像 bug。地址來自帶預設項的地址簿,所以第二單不必重打第一單的地址——而且只有一份地址簿,與個人資料共用,因為資料地址和收貨地址是同一個事實,存兩份就註定兩份遲早對不上。

運費本身在服務端。place_shop_order 從資料庫讀取 businesses.delivery_fee,忽略客戶端提交的任何值,正如堂食路徑自己給每一行定價一樣。一個被信任的客戶端欄位就是一張自助折扣券;金額歸伺服器管。這不是一條能在設定裡關掉的策略——它就是這個數字的來源。

五個訂單狀態、運單號,兩側都收到通知

訂單流轉經過待處理、已確認、打包中、已發貨和已送達,另有已取消與已拒絕兩個終止分支。買家看到的是進度條而不是孤零零的狀態詞,所以“打包中”讀起來是序列裡的一個位置,後面還有東西。運單號在發貨這一步附上,同時還要選一家承運商——名單由管理端維護,每家都帶一個追蹤網址模板,所以商家填進去的號碼會變成買家能點開的連結。商家不能只填運單號而不指明承運商,因為一個不知道屬於誰的號碼永遠變不成連結。

兩種結束都要給理由:顧客取消要說明原因,店家拒絕也要說明原因,而理由隨訂單儲存,不會像聊天裡的一句話那樣滾走。每次流轉兩側都收到通知——一個沒有通知的下單流程,會讓店家漏單、買家乾等。

  • 待處理 — 已下單,等店家
  • 已確認 — 已接受,店家做出了承諾
  • 打包中 — 正在準備
  • 已發貨 — 已寄出,附有運單號
  • 已送達 — 已完結,買家因此獲得評價資格

賣家這一側:門店 POS、線上訂單和庫存

零售商家拿到三塊控制檯磁貼:面對面銷售的收銀臺、承接應用內訂單的線上訂單臺,以及帶低庫存預警的商品與庫存。儀表盤的實時角標每隔幾秒重新整理,所以新訂單會自己出聲,而不是等著被發現。店裡賣和線上賣寫進同一本流水。

正因為兩條渠道落在同一處,報表覆蓋的是整間店而不是線上那一片:營業額、訂單數、客單價、現金/PromptPay/其他的構成、銷量前五、七日營業額柱狀圖,以及今天/七天/三十天/全部四個週期。收據可以補打,也能生成可分享的收據文字;開不了稅務發票——只有增值稅登記人才能開具,而系統裡還沒有記錄任何一家店的登記資訊。客戶名單同樣由這本流水生成,附帶逐客戶的備註與標籤、購買歷史,以及按店家自設匯率(以店家自己的貨幣計)累積的積分,對應可配置的最低消費額與獎勵。

員工訪問由帶角色預設和按人覆蓋的權限矩陣管理,所以可以只給店員商品和訂單,而不給工資表和報表。同一套矩陣在資料庫裡以 has_capability(business_id, capability) 存在,為行級安全策略在服務端展開預設——伺服器從不聽信客戶端關於某人是什麼角色的說法。

商品評價只有真的買過的人才能寫

商品評價與商家評價是分開的,但門檻一樣:只有平臺能證明發生過交易的顧客才能寫。資格是一個資料庫檢視,而“買過”是其中一種合格型別,與堂食、外送、住宿和使用服務並列。其餘的人看到的是一張說明為什麼沒有寫入按鈕的鎖定卡片,而不是一個點了會失敗的按鈕。

星級不是誰能編輯的儲存數字:資料庫觸發器從評價記錄重算,所以店鋪卡片上的評分和頁面上的評價不會各說各話。買家可以編輯或刪除自己最新的一條,回購時新增一條而舊的一條保留;店家可以公開回復。

顧客把買到的裝置登記進資產臺賬之後,理賠會回到賣出它的那家店——也就是你這一側。

按天或按月出借而不是賣斷的東西,走租賃;店裡還有堂食的,點餐讀的是同一份商品與庫存。

常見問題

我能在一單裡買兩家店的東西嗎?

不能。購物車一次只裝一家店,切換時會詢問是否清空。每一單都發生在你和一家商戶之間,用那家商戶自己的配送安排——這裡沒有合併的全平臺結賬。

運費是怎麼算的?

由店家配置,下單時伺服器從店鋪記錄裡讀取。應用傳上來的運費不會被信任。自取訂單是完全沒有運費,而不是運費為零。

店家沒法履行我的訂單會怎樣?

店家帶著理由拒絕,你會收到通知。訂單還在流程早期時,你也可以自己帶著理由取消。兩種結束都會把理由留在訂單記錄上。

任何人都能給我的商品寫評價嗎?

不能。評價資格是一個資料庫檢視,買過這件商品才有資格寫它。沒買過的人看到一張說明為什麼缺少寫入按鈕的卡片,而星級平均分由觸發器從真實記錄重算。

面對面銷售還需要另一套軟體嗎?

不需要。控制檯自帶收銀臺,面對面銷售與線上訂單寫進同一本流水——所以營業額、暢銷榜和客戶名單覆蓋的是整間店,而不是其中一條渠道。

上架一件商品,下一單

在控制檯裡建立一家零售商家,把生命週期的兩半都親自走一遍。