パレットジャッキレンタル
AIエージェントで構築
パレットジャックレンタルバックエンド

パレットジャックレンタルアプリバックエンドテンプレート
レンタルデスクの予約、容量チェック、および倉庫の在庫管理

パレットジャックレンタルバックエンドの生産準備完了版が Back4app にあり、予約記録、重量容量チェック、保守ログ、および倉庫カウント用の UserWarehousePalletJackRentalBookingMaintenanceLogInventoryCheck を提供します。

レンタルのポイント

このテンプレートは、<strong>PalletJack</strong>の利用可能性、<strong>RentalBooking</strong>ウィンドウ、<strong>MaintenanceLog</strong>の履歴、および<strong>InventoryCheck</strong>のカウントを持つパレットジャックレンタルバックエンドを提供しますので、デスクは出荷前に資産を確認できます。

  1. 予約ウィンドウを最初に各<strong>RentalBooking</strong>を予約番号、パレットジャック、顧客、倉庫、開始日時、終了日時で追跡します。
  2. 容量の検証<strong>PalletJack</strong>に重さの制限(kg)、日額料金、および時間料金を保存し、スタッフがチェックアウト前に安全な使用を確認できるようにします。
  3. メンテナンストレーサビリティ<strong>MaintenanceLog</strong>エントリを使用して、メンテナンスタイプ、ステータス、報告された問題、および実施された作業を記録してサービス履歴を記録します。
  4. 倉庫在庫の明確さ各<strong>倉庫</strong>と<strong>在庫チェック</strong>のカウントを表示して、チームがavailableCount、reservedCount、およびmaintenanceCountを調整できるようにします。

概要: パレットジャックレンタルアプリ

スムーズなパレットジャックレンタルのチェックアウトは、適格性、競合、預金、そして履行への引き渡しなど、数多くのチェックを隠しています。これは単一のバグではなく、ドリフトです。このテンプレートは、Back4app上のコアエンティティをモデル化しており、予約ロジックを最初から作り直すことなく、動作するパレットジャックレンタルプラットフォームを立ち上げることができます。スキーマは、<strong>ユーザー</strong>(ユーザー名、メール、パスワード、役割)、<strong>倉庫</strong>(倉庫コード、名前、住所、マネージャー)、<strong>パレットジャック</strong>(資産タグ、モデル名、重量容量Kg、状態、倉庫、日額料金、時間料金、最終検査日時)、<strong>レンタル予約</strong>(予約番号、パレットジャック、顧客、倉庫、開始日時、終了日時、状態、重量LoadKg、メモ)、<strong>メンテナンスログ</strong>(パレットジャック、技術者、メンテナンスタイプ、状態、報告された問題、行った作業、完了日時)、および<strong>在庫チェック</strong>(倉庫、検査者、チェック日時、availableCount、reservedCount、maintenanceCount、メモ)をカバーし、認証と役割ベースのアクセスが組み込まれています。好みのフロントエンドを接続して、より早く立ち上げましょう。

ベスト:

パレットジャックレンタルデスク倉庫機器予約アプリ資産所有者の在庫ダッシュボードメンテナンストラッキングツールレンタル業務のMVPローンチ倉庫設備のためにBaaSを選択するチーム

パレットジャックレンタルテンプレートで得られるもの

パレットジャックレンタルのボリュームが急増すると、非公式なプロセスが最初に崩壊します — それは人々が気にしなくなるからではなく、記憶とメッセージがスケールしないからです。

Flutter、React、Next.js、または他のサポートされているパスから開始しても、同じユーザーログインと役割、パレットジャック資産記録、レンタル予約ウィンドウ、負荷チェックを期待してください。

パレットジャックレンタル機能

このハブ内のすべての技術カードは、ユーザー、倉庫、パレットジャック、RentalBooking、メンテナンスログ、および InventoryCheck を使用して、同じレンタルバックエンドスキーマを使用します。

ユーザーログインと役割

ユーザーは、rentalDesk、オーナー、または顧客アクセスのために、ユーザー名、メール、パスワード、および役割を保存します。

パレットジャックの資産記録

PalletJackは、assetTag、modelName、weightCapacityKg、status、warehouse、dailyRate、hourlyRateを追跡します。

RentalBookingウィンドウとロードチェック

RentalBookingは、顧客、パレットジャック、倉庫、予約ウィンドウ、ステータス、要求されたweightLoadKgをリンクします。

メンテナンスログのサービス履歴

メンテナンスログは、各パレットジャックの maintenanceType、status、reportedIssue、workPerformed、completedAt を保存します。

倉庫の在庫状況

InventoryCheck は、各倉庫の監査に対して availableCount、reservedCount、および maintenanceCount を保持します。

なぜBack4appでパレットジャックレンタルバックエンドを構築するのか?

Back4appは、予約、資産、およびメンテナンスのプリミティブを提供するため、チームはストレージ、認証、APIホスティングを結合するのではなく、配送と安全チェックに集中できます。

  • 予約と資産管理: RentalBookingは、開始時刻、終了時刻、荷重Kg、およびステータスを使用して、顧客をパレットジャックに関連付けることで、デスクがすべての予約ウィンドウを確認できるようにします。
  • 容量とサービスチェック: 重量容量Kg、日額料金、時間料金、ステータスなどのパレットジャックフィールドは、レンタル開始前にBlockの安全でないチェックアウト試行を簡単に行えるようにします。
  • リアルタイム + APIの柔軟性: 全てのデスクタブレットとオーナーダッシュボードのためにRESTとGraphQLを利用可能にしながら、RentalBookingおよびMaintenanceLogの更新にLive Queriesを使用します。

すべてのプラットフォームにまたがる1つのバックエンド契約で、レンタルデスクのワークフローを迅速に構築および反復します。

パレットジャックレンタルの利点

デスクスタッフ、資産所有者、および顧客が手渡しミスを減らしながら予約を調整できるレンタルバックエンド。

迅速なカウンターチェックイン

RentalBookingレコードにはすでにbookingNumber、palletJack、customer、warehouse、startAt、およびendAtが含まれているため、デスクはスプレッドシートを探さずに予約を確認できます。

より安全な配送決定

PalletJack.weightCapacityKgとstatusを使用して、資産が倉庫を離れる前に過剰収容のレンタルを停止します。

明確な保守履歴

MaintenanceLogは、各資産レビューのためにmaintenanceType、reportedIssue、workPerformed、およびcompletedAtを1か所に保持します。

在庫のアカウンタビリティ

InventoryCheckはavailableCount、reservedCount、およびmaintenanceCountを表示し、どのパレットジャックがフロアにあり、修理中で、または利用可能かを調整しやすくします。

所有者に優しい報告

資産所有者は、フロントデスクのワークフローを変更することなく、倉庫、パレットジャック、およびレンタル予約データをレビューできます。

AIブートストラップワークフロー

1つの構造化されたプロンプトで、バックエンドのスキャフォールディングとレンタルデスクの統合ガイダンスを迅速に生成します。

パレットジャックレンタルアプリを立ち上げる準備はできましたか?

Back4app AIエージェントにレンタルバックエンドのスキャフォールディングをさせ、1つのプロンプトから予約、メンテナンス、在庫ワークフローを生成します。

無料で開始 — 毎月50のAIエージェントプロンプト、クレジットカードは不要

レンタルテクノロジースタック

このパレットジャックリースバックエンドテンプレートに含まれるすべて

フロントエンド
13以上の技術
バックエンド
Back4app
データベース
MongoDB
認証
組み込みの認証 + セッション
API
REST と GraphQL
リアルタイム
Live Queries

レンタルエンティティマップ

パレットジャッキレンタルバックエンドスキーマのエンティティ関係モデル。

図のソースを見る
Mermaid
erDiagram
    User ||--o{ Warehouse : "manager"
    User ||--o{ RentalBooking : "customer"
    User ||--o{ MaintenanceLog : "technician"
    User ||--o{ InventoryCheck : "inspector"
    Warehouse ||--o{ PalletJack : "stores"
    Warehouse ||--o{ RentalBooking : "fulfills"
    Warehouse ||--o{ InventoryCheck : "audits"
    PalletJack ||--o{ RentalBooking : "reserved in"
    PalletJack ||--o{ MaintenanceLog : "service history"
    PalletJack }o--|| Warehouse : "assigned to"
    RentalBooking }o--|| PalletJack : "books"
    MaintenanceLog }o--|| PalletJack : "tracks"
    InventoryCheck }o--|| Warehouse : "counts"

    User {
        String objectId PK
        String username
        String email
        String password
        String role
        Date createdAt
        Date updatedAt
    }

    Warehouse {
        String objectId PK
        String warehouseCode
        String name
        String address
        String managerId FK
        Date createdAt
        Date updatedAt
    }

    PalletJack {
        String objectId PK
        String assetTag
        String modelName
        Number weightCapacityKg
        String status
        String warehouseId FK
        Number dailyRate
        Number hourlyRate
        Date lastInspectionAt
        Date createdAt
        Date updatedAt
    }

    RentalBooking {
        String objectId PK
        String bookingNumber
        String palletJackId FK
        String customerId FK
        String warehouseId FK
        Date startAt
        Date endAt
        String status
        Number weightLoadKg
        String notes
        Date createdAt
        Date updatedAt
    }

    MaintenanceLog {
        String objectId PK
        String palletJackId FK
        String technicianId FK
        String maintenanceType
        String status
        String reportedIssue
        String workPerformed
        Date completedAt
        Date createdAt
        Date updatedAt
    }

    InventoryCheck {
        String objectId PK
        String warehouseId FK
        String inspectorId FK
        Date countedAt
        Number availableCount
        Number reservedCount
        Number maintenanceCount
        String notes
        Date createdAt
        Date updatedAt
    }

レンタルデスクのフロー

サインイン、パレットジャックの検索、予約の作成、メンテナンスのレビュー、在庫更新の典型的な実行フロー。

図のソースを見る
Mermaid
sequenceDiagram
  participant User
  participant App as Pallet Jack Rental App
  participant Back4app as Back4app Cloud

  User->>App: Sign in to the rental desk dashboard
  App->>Back4app: POST /login
  Back4app-->>App: Session token

  User->>App: Load warehouse inventory and pallet jack status
  App->>Back4app: GET /classes/PalletJack?include=warehouse&order=assetTag
  Back4app-->>App: PalletJack list with warehouse pointers

  User->>App: Reserve a pallet jack for a booking window
  App->>Back4app: POST /classes/RentalBooking
  Back4app-->>App: Booking confirmation and bookingNumber

  User->>App: Record a maintenance log after inspection
  App->>Back4app: POST /classes/MaintenanceLog
  Back4app-->>App: MaintenanceLog objectId

  User->>App: Refresh stock counts for the warehouse
  App->>Back4app: POST /classes/InventoryCheck
  Back4app-->>App: InventoryCheck saved

フィールドガイド

パレットジャックレンタルスキーマにおけるすべてのクラスの完全なフィールドレベル参照。

フィールドタイプ説明必須
objectIdStringAuto-generated unique identifier自動
usernameStringUser login name
emailStringUser email address
passwordStringHashed password (write-only)
roleStringRole of the user (e.g., rentalDesk, owner, customer)
createdAtDateAuto-generated creation timestamp自動
updatedAtDateAuto-generated last-update timestamp自動

7 フィールドが User にあります

アクセスルールと権限

ACLおよびCLP戦略がユーザープロファイル、パレットジャック資産、予約、エンジニアリングログをどのように保護するか。

ユーザーと予約の所有権

認証されたデスクユーザーまたは資産マネージャーのみが、自身が責任を持つユーザー、レンタル予約、および在庫チェックの行を作成、編集、またはキャンセルできます。

資産の整合性チェック

重量負荷(Kg)がPalletJack.weightCapacityKgを超える場合、または資産のステータスがinMaintenanceに設定されている場合に、RentalBookingを拒否するためにCloud CodeのbeforeSaveを使用します。

スコープ付き倉庫の可視性

倉庫とInventoryCheckの読み取りをスタッフと所有者に制限し、一般顧客は自分の予約詳細に限定します。

JSONスキーマ

Back4appにコピーするための生のJSONスキーマ定義、または実装リファレンスとして使用します。

JSON
{
  "classes": [
    {
      "className": "User",
      "fields": {
        "objectId": {
          "type": "String",
          "required": false,
          "auto": true
        },
        "username": {
          "type": "String",
          "required": true
        },
        "email": {
          "type": "String",
          "required": true
        },
        "password": {
          "type": "String",
          "required": true
        },
        "role": {
          "type": "String",
          "required": true
        },
        "createdAt": {
          "type": "Date",
          "required": false,
          "auto": true
        },
        "updatedAt": {
          "type": "Date",
          "required": false,
          "auto": true
        }
      }
    },
    {
      "className": "Warehouse",
      "fields": {
        "objectId": {
          "type": "String",
          "required": false,
          "auto": true
        },
        "warehouseCode": {
          "type": "String",
          "required": true
        },
        "name": {
          "type": "String",
          "required": true
        },
        "address": {
          "type": "String",
          "required": true
        },
        "manager": {
          "type": "Pointer",
          "required": true,
          "targetClass": "User"
        },
        "createdAt": {
          "type": "Date",
          "required": false,
          "auto": true
        },
        "updatedAt": {
          "type": "Date",
          "required": false,
          "auto": true
        }
      }
    },
    {
      "className": "PalletJack",
      "fields": {
        "objectId": {
          "type": "String",
          "required": false,
          "auto": true
        },
        "assetTag": {
          "type": "String",
          "required": true
        },
        "modelName": {
          "type": "String",
          "required": true
        },
        "weightCapacityKg": {
          "type": "Number",
          "required": true
        },
        "status": {
          "type": "String",
          "required": true
        },
        "warehouse": {
          "type": "Pointer",
          "required": true,
          "targetClass": "Warehouse"
        },
        "dailyRate": {
          "type": "Number",
          "required": true
        },
        "hourlyRate": {
          "type": "Number",
          "required": true
        },
        "lastInspectionAt": {
          "type": "Date",
          "required": false
        },
        "createdAt": {
          "type": "Date",
          "required": false,
          "auto": true
        },
        "updatedAt": {
          "type": "Date",
          "required": false,
          "auto": true
        }
      }
    },
    {
      "className": "RentalBooking",
      "fields": {
        "objectId": {
          "type": "String",
          "required": false,
          "auto": true
        },
        "bookingNumber": {
          "type": "String",
          "required": true
        },
        "palletJack": {
          "type": "Pointer",
          "required": true,
          "targetClass": "PalletJack"
        },
        "customer": {
          "type": "Pointer",
          "required": true,
          "targetClass": "User"
        },
        "warehouse": {
          "type": "Pointer",
          "required": true,
          "targetClass": "Warehouse"
        },
        "startAt": {
          "type": "Date",
          "required": true
        },
        "endAt": {
          "type": "Date",
          "required": true
        },
        "status": {
          "type": "String",
          "required": true
        },
        "weightLoadKg": {
          "type": "Number",
          "required": false
        },
        "notes": {
          "type": "String",
          "required": false
        },
        "createdAt": {
          "type": "Date",
          "required": false,
          "auto": true
        },
        "updatedAt": {
          "type": "Date",
          "required": false,
          "auto": true
        }
      }
    },
    {
      "className": "MaintenanceLog",
      "fields": {
        "objectId": {
          "type": "String",
          "required": false,
          "auto": true
        },
        "palletJack": {
          "type": "Pointer",
          "required": true,
          "targetClass": "PalletJack"
        },
        "technician": {
          "type": "Pointer",
          "required": true,
          "targetClass": "User"
        },
        "maintenanceType": {
          "type": "String",
          "required": true
        },
        "status": {
          "type": "String",
          "required": true
        },
        "reportedIssue": {
          "type": "String",
          "required": false
        },
        "workPerformed": {
          "type": "String",
          "required": false
        },
        "completedAt": {
          "type": "Date",
          "required": false
        },
        "createdAt": {
          "type": "Date",
          "required": false,
          "auto": true
        },
        "updatedAt": {
          "type": "Date",
          "required": false,
          "auto": true
        }
      }
    },
    {
      "className": "InventoryCheck",
      "fields": {
        "objectId": {
          "type": "String",
          "required": false,
          "auto": true
        },
        "warehouse": {
          "type": "Pointer",
          "required": true,
          "targetClass": "Warehouse"
        },
        "inspector": {
          "type": "Pointer",
          "required": true,
          "targetClass": "User"
        },
        "countedAt": {
          "type": "Date",
          "required": true
        },
        "availableCount": {
          "type": "Number",
          "required": true
        },
        "reservedCount": {
          "type": "Number",
          "required": true
        },
        "maintenanceCount": {
          "type": "Number",
          "required": true
        },
        "notes": {
          "type": "String",
          "required": false
        },
        "createdAt": {
          "type": "Date",
          "required": false,
          "auto": true
        },
        "updatedAt": {
          "type": "Date",
          "required": false,
          "auto": true
        }
      }
    }
  ]
}

パレットジャックビルダーのプロンプト

Back4app AIエージェントを使用して、このテンプレートからフロントエンド、バックエンド、認証、予約、メンテナンス、在庫フローを含む本物のパレットジャックレンタルアプリを生成します。

Back4app AIエージェント
ビルドする準備ができました
Back4appでこの正確なスキーマと動作を持つ安全なパレットジャックレンタルアプリのバックエンドを作成します。

スキーマ:
1. ユーザー (Back4appの組み込みを使用): ユーザー名、メール、パスワード、役割; objectId, createdAt, updatedAt (システム).
2. 倉庫: warehouseCode (文字列, 必須), name (文字列, 必須), address (文字列, 必須), manager (ユーザーへのポインタ, 必須); objectId, createdAt, updatedAt (システム).
3. PalletJack: assetTag (文字列, 必須), modelName (文字列, 必須), weightCapacityKg (数値, 必須), status (文字列, 必須), warehouse (倉庫へのポインタ, 必須), dailyRate (数値, 必須), hourlyRate (数値, 必須), lastInspectionAt (日付, オプション); objectId, createdAt, updatedAt (システム).
4. RentalBooking: bookingNumber (文字列, 必須), palletJack (PalletJackへのポインタ, 必須), customer (ユーザーへのポインタ, 必須), warehouse (倉庫へのポインタ, 必須), startAt (日付, 必須), endAt (日付, 必須), status (文字列, 必須), weightLoadKg (数値, オプション), notes (文字列, オプション); objectId, createdAt, updatedAt (システム).
5. MaintenanceLog: palletJack (PalletJackへのポインタ, 必須), technician (ユーザーへのポインタ, 必須), maintenanceType (文字列, 必須), status (文字列, 必須), reportedIssue (文字列, オプション), workPerformed (文字列, オプション), completedAt (日付, オプション); objectId, createdAt, updatedAt (システム).
6. InventoryCheck: warehouse (倉庫へのポインタ, 必須), inspector (ユーザーへのポインタ, 必須), countedAt (日付, 必須), availableCount (数値, 必須), reservedCount (数値, 必須), maintenanceCount (数値, 必須), notes (文字列, オプション); objectId, createdAt, updatedAt (システム).

セキュリティ:
- レンタルデスクのスタッフと倉庫マネージャーのみがRentalBookingレコードを作成または承認できます。
- 所有者は自分の資産のパレットジャック在庫とメンテナンス履歴を表示できます。
- 顧客は自分のRentalBookingレコードのみを表示できます。
- MaintenanceLogの作成は技術者とマネージャーに制限されています。
- InventoryCheckレコードは倉庫チームのみが表示できます。
- ACLとCLPを使用してPaletJackのステータス、倉庫在庫、および予約詳細が公開書き込み不可能になるようにします。

認証:
- サインアップ、ログイン、ログアウト。

動作:
- 倉庫およびweightCapacityKgでパレットジャックをリストし、予約を作成し、メンテナンスを記録し、在庫カウントをキャプチャし、メンテナンスまたはレンタルによって利用可能性が変更されるときにパレットジャックのステータスを更新します。

提供:
- Back4app アプリにはスキーマ、ACL、CLP、およびレンタルデスクスタッフ、資産所有者、顧客がパレットジャックの予約、容量チェック、メンテナンスログ、倉庫在庫を管理するためのフロントエンドフローがあります。

下のボタンを押して、このテンプレートプロンプトがプリフィルされた状態でエージェントを開いてください。

これはテクノロジーサフィックスなしの基本プロンプトです。生成されたフロントエンドスタックは後で調整できます。

数分でデプロイ月あたり50の無料プロンプトクレジットカードは不要

APIサンドボックス

パレットジャッキレンタルスキーマに対して、RESTおよびGraphQLエンドポイントを試してください。レスポンスはモックデータを使用しており、Back4appアカウントは必要ありません。

プレイグラウンドを読み込んでいます…

このテンプレートと同じスキーマを使用しています。

スタックを選択

各カードを展開して、選択したスタックでWarehouse、Code、PalletJackを統合する方法を確認してください。

Flutter パレットジャックレンタルバックエンド

React パレットジャックレンタルバックエンド

React ネイティブ パレットジャックレンタルバックエンド

Next.js パレットジャックレンタルバックエンド

JavaScript パレットジャックレンタルバックエンド

Android パレットジャックレンタルバックエンド

iOS パレットジャックレンタルバックエンド

Vue パレットジャックレンタルバックエンド

Angular パレットジャックレンタルバックエンド

GraphQL パレットジャックレンタルバックエンド

REST API パレットジャックレンタルバックエンド

PHP パレットジャックレンタルバックエンド

.NET パレットジャックレンタルバックエンド

各テクノロジーで得られるもの

すべてのスタックは同じパレットジャックレンタルバックエンドスキーマとAPI契約を使用します。

統一されたレンタルデータ構造

一貫したスキーマでユーザー、Warehouse、PalletJack、RentalBooking、MaintenanceLog、InventoryCheckレコードを簡単に管理できます。

レンタルのためのキャパシティチェック

予約を作成する前に、要求された重量 Load Kg を PalletJack.weightCapacityKg と比較してください。

資産のメンテナンス可視性

各パレットジャックの検査履歴と状態を1か所で追跡。

倉庫在庫管理

床ストックと予約のために availableCount、reservedCount、および maintenanceCount を表示させておきます。

スタック比較

サポートされているすべての技術にわたって、セットアップ速度、SDKスタイル、AIサポートを比較します。

フレームワークセットアップ時間レンタル特典SDKタイプAIサポート
約5分モバイルとWeb用のレンタルデスクツールの単一コードベース。型付けされたSDKフル
5分未満予約および資産の状態に関する高速ウェブダッシュボード。型付けされたSDKフル
~3~7分倉庫スタッフのためのクロスプラットフォームモバイルアプリ。タイプされたSDKフル
迅速な(5分)セットアップ顧客とスタッフのためのサーバーレンダリング予約ポータル。タイプされたSDKフル
約3~5分レンタル業務のための軽量ウェブ統合。タイプされたSDKフル
約5分倉庫のスキャンと発送のためのネイティブAndroidアプリ。タイプSDKフル
5分未満スーパーバイザーおよびレンタルデスクスタッフのためのネイティブiOSアプリ。タイプSDKフル
約3〜7分予約と在庫管理のためのReactウェブUI。タイプSDKフル
迅速(5分)設定倉庫業務のためのエンタープライズウェブアプリ。タイプSDKフル
2分未満予約と資産照会のための柔軟な GraphQL API。GraphQL APIフル
迅速な(2分)セットアップ予約と在庫システムのための REST API 統合。REST APIフル
約3分レンタルワークフローのためのサーバーサイド PHP バックエンド。REST APIフル
~3〜7分.NET の運用ダッシュボード用バックエンド。入力済みSDKフル

セットアップ時間は、このテンプレートスキーマを使用してプロジェクトのブートストラップから最初のパレットジャックまたは予約クエリまでの期待される期間を反映しています。

パレットジャックに関する質問

このテンプレートを使用してパレットジャックレンタルバックエンドを構築する際の一般的な質問。

どのパレットジャックレンタルポリシーが構造化された予約データなしに施行するのが最も難しいですか?
パレットジャックレンタルチームは、高回転のレンタルで資産の状態をどのように追跡すべきですか?
パレットジャックレンタルカタログの複雑さがシーズンごとに跳ね上がると、移行はどのようになりますか?
Flutterを使ってパレットジャックと予約をどのようにクエリしますか?
Next.js Server ActionsでweightLoadKgをどのように検証しますか?
React ネイティブキャッシュのメンテナンスログをオフラインで管理できますか?
不安全なパレットジャックの出荷を防ぐにはどうすればよいですか?
Android での倉庫の在庫を表示する最適な方法は何ですか?
レンタルフローはどのように機能しますか?

世界中の開発者に信頼されています

Back4app テンプレートを使用して、レンタルおよび倉庫製品を迅速に出荷するチームに参加しましょう。

G2 Users Love Us Badge

パレットジャックレンタルアプリの構築の準備はできていますか?

数分でパレットジャックレンタルプロジェクトを開始します。クレジットカードは不要です。

技術を選択