在庫管理系のモデルに変更
Closed this issue · 1 comments
Harineko0 commented
目的
- 商品の完成と注文の完成を分ける
仕様
管理者側
- 注文追加→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のstatus
をreceived
にし、orderRef
をこの注文にし、元のorderRef
で指定されていた order にはこのstockを指定する
- 各商品についての受取設定
order.status
ではなくproductStatus[productId] = "received"
を用いる- 全ての
productStatus
がreceived
になったらorder.status
もreceived
にする
- stockをstream取得
- complete_atの更新ロジック
- 個別受け取り
- 該当注文のstockを消費する場合: そのstockの作成にかかった時間とproduct.spanとの差分をcomplete_atから減算
- 別注文の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: