gdsc-osaka/machikane-coffee

在庫管理系のモデルに変更

Closed this issue · 1 comments

目的

  • 商品の完成と注文の完成を分ける

仕様

管理者側

  • 注文追加→stockとorderを追加
    order.stocksRef にstockのパスを入れる
  • AdminBaristaPageでは、stockを参照して従来通り捌く
    stockを完成にしたらproduct.stockに1プラス
  • orderの完成判定は、自分のproduct_amountの必要数がproduct.stockで足りてるかどうか
  • orderを受け取りにするとproduct.stockを減らす
    それぞれの order.stocksRef について
    • status == "completed" の場合: そのstock.status == "received" にする
    • status != "completed" の場合: 最新の completed なstockの statusreceived にし、orderRef をこの注文にし、元のorderRefで指定されていた order にはこのstockを指定する
  • 各商品についての受取設定
    • order.status ではなく productStatus[productId] = "received" を用いる
    • 全てのproductStatusreceivedになったらorder.statusreceivedにする
  • stockをstream取得
  • complete_atの更新ロジック
    • 個別受け取り
      1. 該当注文のstockを消費する場合: そのstockの作成にかかった時間とproduct.spanとの差分をcomplete_atから減算
      2. 別注文のstockを消費する場合:
        該当の注文: 1と同じ
        別注文: 1を行った上でcomplete_atにproduct.spanを加算

ユーザー側

  • 自分の注文以前の未受け取り注文を全てstream取得
  • 自分の注文をstream
  • productを全てstream
  • 待ち時間=(それぞれの注文に対して)Σ {(自分とそれ以前の注文の必要商品数) - (product.stock)} * product.span
  • 完成判定=(自分とそれ以前の注文の必要商品数) > product.stock
  • order.stocksRef から各商品のステータス(workingなど)を取得

問題点

既存モデル

  • ”完成にする”操作をCashierが担当するのかBaristaが担当するのかで混乱する

新モデル

  • 各商品が作成中かどうかが取得しづらい(stockを全て取得しなければならない)

DB設計

stock:
  status: "idle" | "working" | "completed" | "received"
  product_id: string
  barista_id: number
  created_at: Timestamp
  start_working_at: Timestamp
  orderRef: DocumentReference

order:
  order_statuses, complete_at, status=="completed" を削除
  stocksRef: DocumentReference[]
  productStatus: {
    [productId+数字]: "idle" | "received"
  }
  required_products: {
    [productId]: number
  }
  
product:
  stock: number を追加

パフォーマンス問題

書き込みを増やし読み取りを減らす場合

  • order.required_products その注文+それ以前の注文に必要な商品数を設定
    注文がreceivedがなったときに更新される
  • 注文(の商品)が受け取りになったときにそれ以降の注文の required_products を更新する

※最新のデータがキャッシュされている場合

function read read as server write
addOrder (最新の注文のIndex取得=1) (対象の注文=1) + (合計商品数≈2) ≈ 3
receiveOrder 0 (対象の注文=1)+(それ以降の注文数≈6)=7 (対象の注文=1)+(注文に登録された商品数≈2)+(receivedに設定する在庫数≈2)+(対象の注文以降の注文数≈6)×(stocksRefを交換=2) ≈ 17
UserPage (shopをstream=1)+(確認するorderが参照するproduct数≈1.5)×(productの更新数≈5)+(order数≈1)×(orderの更新数≈6+1)=15.5 0
1ユーザーあたり合計 16.5 20

統計情報

order:
  spend_to_make: 時間

stock:

closed by #137