Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
Harineko0 opened this issue Oct 21, 2023 · 1 comment
Closed

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

Harineko0 opened this issue Oct 21, 2023 · 1 comment
Assignees
Labels
enhancement New feature or request
Milestone

Comments

@Harineko0
Copy link
Contributor

Harineko0 commented Oct 21, 2023

目的

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

仕様

管理者側

  • 注文追加→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:
@Harineko0 Harineko0 added the enhancement New feature or request label Oct 21, 2023
@Harineko0 Harineko0 added this to the v1.1 milestone Oct 21, 2023
@Harineko0 Harineko0 self-assigned this Oct 21, 2023
@Harineko0
Copy link
Contributor Author

closed by #137

@Harineko0 Harineko0 pinned this issue Nov 1, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

1 participant