機能仕様書: RoomCraft(ルームクラフト)
プロジェクト名: RoomCraft
バージョン: 1.0.0
作成日: 2026-03-19
ステータス: Phase 2 設計中
参照: docs/requirements/requirements.md
目次
- 画面遷移図
- 消費者向け画面仕様
- メーカー向け画面仕様
- プラットフォーム管理画面仕様
- API仕様
- データモデル(ER図)
- ビジネスロジック仕様
- 状態遷移仕様
- エラーコード一覧
1. 画面遷移図
1.1 消費者向け画面遷移
flowchart TD
LP[ランディングページ] --> |未ログイン| GUEST[ゲストモード]
LP --> |ログイン/登録| AUTH[認証画面\nCC-Auth]
AUTH --> |成功| MY[マイルーム一覧]
GUEST --> |間取り作成| FLOOR_G[間取りエディタ\nゲストモード]
MY --> |新規作成| FLOOR[間取りエディタ]
MY --> |既存選択| SIM[3Dシミュレーション]
FLOOR --> |保存/完了| SIM
FLOOR_G --> |保存しようとする| AUTH
SIM --> |家具検索| CAT[家具カタログ]
CAT --> |商品選択| PROD[家具詳細]
PROD --> |配置| SIM
PROD --> |カート追加| CART[カート]
SIM --> |AIコーディネート| AI[AIコーディネート画面]
AI --> |適用| SIM
SIM --> |投稿| COM_POST[コミュニティ投稿]
COM_POST --> COM[コミュニティ一覧]
COM --> COM_DETAIL[投稿詳細]
COM_DETAIL --> |参考コピー| SIM
CART --> |チェックアウト| CHECKOUT[チェックアウト]
CHECKOUT --> |完了| ORDER_CONFIRM[注文確認]
ORDER_CONFIRM --> MY
LP --> MYPAGE[マイページ]
MY --> MYPAGE
MYPAGE --> |ログアウト| LP
1.2 メーカー向け画面遷移
flowchart TD
MAKER_LP[メーカー向けLP] --> |申請| APPLY[メーカー申請フォーム]
APPLY --> |審査中| WAIT[審査待ち画面]
WAIT --> |承認| MAKER_LOGIN[メーカーログイン\nCC-Auth]
MAKER_LOGIN --> |成功| DASH[ダッシュボード]
DASH --> PROD_LIST[商品管理一覧]
DASH --> ORDER_LIST[注文管理一覧]
DASH --> ANALYTICS[アナリティクス]
DASH --> BRAND_STORE[ブランドストア設定]
DASH --> ACCOUNT[アカウント設定]
PROD_LIST --> |新規登録| PROD_CREATE[商品登録]
PROD_LIST --> |編集| PROD_EDIT[商品編集]
PROD_CREATE --> MODEL_UPLOAD[3Dモデル管理]
PROD_EDIT --> MODEL_UPLOAD
MODEL_UPLOAD --> |アップロード| MODEL_PREVIEW[3Dモデルプレビュー]
MODEL_UPLOAD --> |AI変換| MODEL_CONVERT[写真→3D変換]
ORDER_LIST --> ORDER_DETAIL[注文詳細]
ORDER_DETAIL --> |発送処理| SHIP[配送情報入力]
ACCOUNT --> PLAN[プラン変更]
ACCOUNT --> BILLING[請求・決済管理]
1.3 プラットフォーム管理画面遷移
flowchart TD
ADMIN_LOGIN[管理者ログイン] --> ADMIN_DASH[管理ダッシュボード]
ADMIN_DASH --> MAKER_REVIEW[メーカー審査管理]
ADMIN_DASH --> USER_MANAGE[ユーザー管理]
ADMIN_DASH --> CAT_MANAGE[カテゴリマスタ管理]
ADMIN_DASH --> CONTENT_MOD[コンテンツモデレーション]
ADMIN_DASH --> NOTICE[システム通知配信]
ADMIN_DASH --> REVENUE[売上・決済管理]
MAKER_REVIEW --> |承認/却下| MAKER_NOTIFY[メーカーへ通知]
CONTENT_MOD --> |削除/警告| USER_ACTION[ユーザーへアクション]
2. 消費者向け画面仕様
2.1 ランディングページ(/)
概要: サービス紹介、人気コーディネート、提携メーカー一覧を表示するトップページ。
入力
| 要素 | 種別 | 説明 |
|---|
| メールアドレス | text input | クイック登録フォーム |
| 間取り選択(テンプレート) | select | 1K/1LDK/2LDK等 |
出力
| 要素 | データソース |
|---|
| 人気コーディネート(最大12件) | /api/community/featured |
| 提携メーカー一覧(最大30件) | /api/makers/featured |
| 掲載商品数・ユーザー数 | /api/stats/public |
バリデーション
| フィールド | ルール |
|---|
| メールアドレス | RFC 5322準拠、255文字以内 |
エラーハンドリング
| エラー | 表示 |
|---|
| メール形式不正 | インラインエラー「正しいメールアドレスを入力してください」 |
| APIエラー | トースト通知(3秒)「読み込みに失敗しました。再度お試しください」 |
2.2 認証画面(/login, /register, /auth/callback)
概要: CC-Auth(Cognito)を利用したSSO認証。外部IdPにリダイレクトして認証後、コールバックでセッションを確立する。
入力
| 要素 | 種別 | 必須 | 説明 |
|---|
| メールアドレス | email | Yes | 認証用メールアドレス |
| パスワード | password | Yes | 8文字以上 |
| 氏名(新規登録) | text | Yes | 1〜50文字 |
| 生年月日(新規登録) | date | No | 統計利用 |
出力
- JWT(アクセストークン): HttpOnly Cookie、有効期間1時間
- リフレッシュトークン: HttpOnly Cookie、有効期間30日
- ユーザープロフィール: Zustand store に格納
バリデーション
| フィールド | ルール |
|---|
| メールアドレス | 必須、RFC 5322準拠、255文字以内 |
| パスワード | 必須、8文字以上、英数字混在、大文字1文字以上 |
| 氏名 | 必須(登録時)、1〜50文字 |
エラーハンドリング
| エラーコード | 画面表示 |
|---|
AUTH_001 | 「メールアドレスまたはパスワードが正しくありません」 |
AUTH_002 | 「このメールアドレスは既に登録されています」 |
AUTH_003 | 「アカウントがロックされています。30分後に再試行してください」 |
AUTH_004 | 「メール認証が完了していません。認証メールをご確認ください」 |
| ソーシャルログイン失敗 | 「Googleログインに失敗しました。ブラウザを更新してお試しください」 |
ゲストモード
- セッションIDをlocalStorageに保存
- 間取りデータをIndexedDBに一時保存(最大1件)
- ゲストで作成したデータは会員登録後に引き継ぎ可能
2.3 マイルーム一覧(/rooms)
概要: ユーザーが作成した部屋(ルーム)の一覧管理画面。
入力
| 要素 | 種別 | 説明 |
|---|
| 新規作成ボタン | button | 間取りエディタへ遷移 |
| ルーム選択 | card click | 3Dシミュレーションへ遷移 |
| ルーム名編集 | inline edit | ルーム名を変更 |
| 複製ボタン | button | ルームをコピー |
| 削除ボタン | button | 確認ダイアログ後に削除 |
出力
| 要素 | 説明 |
|---|
| ルームカード | サムネイル、ルーム名、更新日時、家具数、合計金額 |
| ルーム数 | 最大10件(Starterプラン:1件、有料プラン以外は制限なし) |
バリデーション
エラーハンドリング
| エラー | 表示 |
|---|
| ルーム上限超過 | 「ルームは最大10件まで作成できます」 |
| 削除失敗 | 「削除に失敗しました。再度お試しください」 |
2.4 間取りエディタ(/rooms/new, /rooms/[id]/floor)
概要: 部屋の形状(間取り)を2D平面図で作成・編集する画面。
機能詳細
| 機能 | 説明 |
|---|
| 壁の描画 | クリック→ドラッグで壁を描画。スナップグリッド5cm単位 |
| 部屋形状 | 矩形、L字型、多角形(最大16頂点)対応 |
| ドア配置 | 壁上にドラッグで配置。開き方向(左/右)設定可能 |
| 窓配置 | 壁上にドラッグで配置。幅サイズ設定可能 |
| 柱配置 | 任意位置に配置。サイズ設定可能 |
| 斜め壁 | 45°/30°/60°スナップ対応 |
| 寸法入力 | 各壁の長さをcm単位で数値入力可能 |
| テンプレート | 1K/1DK/1LDK/2LDK/2LDKプラス/3LDK(全6種) |
入力
| 要素 | 種別 | 必須 | バリデーション |
|---|
| 部屋幅 | number | Yes | 100〜2000 cm |
| 部屋奥行き | number | Yes | 100〜2000 cm |
| 天井高 | number | No | 200〜400 cm(デフォルト240cm) |
| ドア幅 | number | No | 60〜120 cm(デフォルト80cm) |
| 窓幅 | number | No | 60〜240 cm |
| 柱サイズ | number | No | 10〜100 cm |
出力
FloorPlanオブジェクト(JSON)がIndexedDB/APIに保存
- サムネイル画像(PNG、400x300px)を自動生成
エラーハンドリング
| エラー | 表示 |
|---|
| 部屋サイズ上限超過 | 「部屋のサイズは2000cm x 2000cm以内に設定してください」 |
| 自己交差ポリゴン | 「壁が交差しています。間取りを修正してください」 |
| 保存失敗 | 「保存に失敗しました。再度お試しください」(オートセーブ30秒毎) |
2.5 3Dシミュレーション(/rooms/[id]/simulate)
概要: 作成した間取りに家具を配置・編集するメイン画面。Three.js + React Three Fiberで描画。
レイアウト
┌─────────────────────────────────────────────────┐
│ ToolBar [Undo/Redo | 2D/3D切替 | 視点 | 共有] │
├──────────────┬──────────────────────────────────┤
│ │ │
│ サイドパネル │ 3Dビューポート(メイン) │
│ ・家具検索 │ │
│ ・配置済み │ [Three.js Canvas] │
│ 家具リスト │ │
│ ・AIコーデ │ │
│ │ │
├──────────────┴──────────────────────────────────┤
│ BottomBar [選択家具情報 | 合計金額 | カート] │
└─────────────────────────────────────────────────┘
操作仕様
| 操作 | PC | モバイル |
|---|
| 視点回転 | 右クリック+ドラッグ | 2本指スワイプ |
| 視点移動 | 中クリック+ドラッグ | 3本指スワイプ |
| ズーム | スクロール | ピンチ |
| 家具選択 | クリック | タップ |
| 家具移動 | ドラッグ | ドラッグ |
| 家具回転 | 選択後Rキー or ハンドル操作 | 選択後回転ハンドル |
| 家具削除 | Deleteキー or コンテキストメニュー | ロングタップ→削除 |
| マルチ選択 | Shift+クリック | - |
| Undo | Ctrl+Z | アイコンボタン |
| Redo | Ctrl+Y | アイコンボタン |
パフォーマンス仕様
| 項目 | 目標値 |
|---|
| フレームレート | 60fps(デスクトップ)、30fps(モバイル) |
| 最大同時表示家具数 | 100点 |
| 3Dモデルロード | 2秒以内/点 |
| LOD(Level of Detail) | 距離に応じて3段階自動切替 |
バリデーション
| チェック項目 | 処理 |
|---|
| 家具の衝突判定 | 重なり時に赤色ハイライト+警告メッセージ |
| 部屋外配置 | 部屋の境界外にドロップ不可(スナップで最寄り位置に補正) |
| 家具上限 | 100点超過時「これ以上配置できません」 |
エラーハンドリング
| エラー | 処理 |
|---|
| 3Dモデル読み込み失敗 | プレースホルダーボックスを表示、リトライボタン提示 |
| WebGL非対応ブラウザ | 「このブラウザは3D表示に対応していません。Chrome/Firefoxをお使いください」 |
| オフライン | ローカルキャッシュで継続、同期は復帰後に自動実行 |
2.6 家具カタログ(/catalog)
概要: 複数メーカーの家具を検索・フィルタリング・閲覧する画面。OpenSearchを使った全文検索対応。
検索・フィルタ仕様
| フィルタ | 種別 | 説明 |
|---|
| キーワード | text | 商品名・説明・タグ全文検索 |
| カテゴリ | tree select | リビング/ダイニング/寝室/書斎/収納/その他(3階層) |
| メーカー | multi select | 審査済みメーカー一覧 |
| スタイル | multi select | モダン/ナチュラル/北欧/インダストリアル/和モダン/ヴィンテージ |
| 価格帯 | range slider | ¥0〜¥1,000,000(1万円単位) |
| 色 | color picker | 15色パレット(複数選択可) |
| 素材 | multi select | 木材/スチール/ファブリック/レザー/ガラス/プラスチック |
| 幅 | range slider | 10〜500 cm |
| 奥行き | range slider | 10〜300 cm |
| 高さ | range slider | 10〜300 cm |
| 在庫あり | toggle | 在庫数1以上のみ表示 |
| 送料無料 | toggle | 送料無料商品のみ |
ソート
| オプション | デフォルト |
|---|
| おすすめ順(スコア降順) | Yes |
| 価格昇順 | No |
| 価格降順 | No |
| 新着順 | No |
| 人気順(配置数降順) | No |
ページネーション
- 1ページ24件表示
- 無限スクロール(モバイル)/ ページネーション(デスクトップ)
出力(商品カード)
| 要素 | 説明 |
|---|
| サムネイル | 200x200px、ホバーで複数枚スライド |
| 商品名 | 最大2行、省略表示 |
| メーカー名 | バッジ表示 |
| 価格 | 税込表示。バリアントあれば「¥XX,000〜」 |
| カラーチップ | 最大5色、6色目以降は「+N」 |
| お気に入りボタン | ハートアイコン |
| 在庫状況 | 「残り僅か」(在庫3以下)/ 「在庫切れ」 |
2.7 家具詳細(/catalog/[productId])
概要: 個別商品の詳細情報・3Dプレビュー・購入アクション画面。
入力
| 要素 | 種別 | 説明 |
|---|
| カラーバリエーション選択 | radio/swatch | バリアントID切替 |
| サイズバリアント選択 | radio | Wサイズ等 |
| 数量 | number | 1〜99 |
| お気に入り登録 | button | ウィッシュリストに追加 |
| カートに追加 | button | カートへ追加 |
| 部屋に配置 | button | アクティブなシミュレーション画面に配置 |
| ECサイトで見る | link | メーカーECサイトへ遷移(新タブ) |
出力
| 要素 | 説明 |
|---|
| 商品画像ギャラリー | メイン1枚+サムネイル最大10枚 |
| 3Dビュー | 360°インタラクティブビュー。モデルが存在する場合 |
| 商品名・ブランド | テキスト |
| 価格 | 税込、税別表示 |
| サイズ情報 | W×D×H(cm) |
| 素材・仕上げ | テキスト |
| 商品説明 | リッチテキスト |
| 配送情報 | 送料、お届け目安日数 |
| レビュー | 評価(5段階)、コメント一覧 |
| 在庫状況 | 数量・入荷予定 |
| 関連商品 | 同カテゴリ・同メーカー4件 |
バリデーション
2.8 AIコーディネート(/rooms/[id]/ai-coordinate)
概要: ユーザーの入力条件をもとにClaudeAPIがコーディネート提案を生成する画面。
入力フォーム
| フィールド | 種別 | 必須 | バリデーション |
|---|
| 予算 | number | Yes | ¥10,000〜¥10,000,000 |
| スタイル | multi select | Yes | 1〜3種選択 |
| 優先家具 | multi select | No | 最大5カテゴリ |
| 除外メーカー | multi select | No | 最大5社 |
| 希望カラートーン | color select | No | 暖色/寒色/ニュートラル/モノトーン |
| 家族構成 | select | No | 1人/カップル/3〜4人家族/5人以上 |
| ライフスタイル | text area | No | 200文字以内。自由記述 |
処理フロー
- フォーム送信 →
POST /api/ai/coordinate
- WebSocketで生成進捗を受信(ストリーミング)
- 最低3パターン生成(約5秒以内に初回パターン表示)
- 各パターン: 配置家具リスト + 合計金額 + コーディネート解説
出力(コーディネートカード)
| 要素 | 説明 |
|---|
| パターン名 | 例:「スカンジナビアンナチュラル」 |
| 3Dプレビュー | サムネイル表示 |
| 使用家具リスト | 家具名、メーカー、価格 |
| 合計金額 | 予算内/超過の表示 |
| AIコメント | 選定理由・スタイルポイント(200文字程度) |
| 「このパターンを採用」ボタン | 現在のシミュレーションに適用 |
| 「家具を差し替え」ボタン | 個別家具の差し替えモード |
エラーハンドリング
| エラー | 処理 |
|---|
| 予算内で家具が見つからない | 「予算を¥XX,000以上に設定すると提案できます」 |
| AIサービス障害 | 「現在AIコーディネートを利用できません。しばらく後にお試しください」 |
| タイムアウト(30秒) | 「生成に時間がかかっています。再試行しますか?」 |
2.9 コミュニティ(/community)
概要: ユーザーがルームデザインを投稿・閲覧・交流する画面。
一覧画面
| フィルタ | 説明 |
|---|
| 新着 | 投稿日時降順 |
| 人気 | いいね数降順(過去7日間) |
| スタイル別 | モダン/ナチュラル/北欧等 |
| 部屋タイプ | 1K/1LDK/2LDK等 |
投稿詳細(/community/[postId])
| 要素 | 説明 |
|---|
| 3Dビュー | 閲覧専用3Dシミュレーション |
| スクリーンショット | 投稿者が選択したアングルの画像 |
| 使用家具リスト | 各家具へのリンク付き |
| いいね | ログインユーザーのみ可能 |
| ブックマーク | ログインユーザーのみ可能 |
| 参考コピー | ログインユーザー限定。同じ家具配置を自分のルームにコピー |
| コメント | テキスト、300文字以内 |
| 通報 | コンテンツ通報(スパム/不適切コンテンツ/著作権侵害) |
投稿フォーム(/community/new)
| フィールド | 種別 | 必須 | バリデーション |
|---|
| タイトル | text | Yes | 1〜100文字 |
| 説明 | textarea | No | 500文字以内 |
| スタイルタグ | multi select | No | 最大5タグ |
| 公開設定 | select | Yes | 公開/限定公開/非公開 |
| スクリーンショット | 自動生成 | - | 現在のビューから自動キャプチャ |
2.10 カート・チェックアウト(/cart, /checkout)
概要: カート管理・購入手続きの画面。メーカーをまたぐ複数商品を一括管理。
カート画面
| 要素 | 説明 |
|---|
| 商品リスト | サムネイル、名前、バリアント、数量変更、削除 |
| メーカー別グループ | メーカーごとにグループ化して表示 |
| 小計 | メーカー別、全体 |
| 送料 | メーカー別に表示 |
| 合計金額 | 税込/税別 |
| クーポン入力 | コードを入力して割引適用 |
| 購入手続きへ | ログイン必須。未ログイン時は認証画面へ |
チェックアウト画面
| ステップ | 入力フィールド |
|---|
| 配送先 | 氏名、郵便番号(自動補完)、住所、電話番号 |
| 配送方法 | メーカー別に選択(通常/速達) |
| 支払い方法 | Stripe Elements(クレカ/コンビニ/銀行振込) |
| 注文確認 | 全項目確認。確定ボタン |
バリデーション
| フィールド | ルール |
|---|
| 氏名 | 必須、1〜50文字 |
| 郵便番号 | 必須、7桁数字(ハイフン任意) |
| 電話番号 | 必須、10〜11桁数字 |
| クレジットカード | Stripe側でバリデーション |
エラーハンドリング
| エラー | 表示 |
|---|
| 在庫切れ(チェックアウト時) | 「[商品名]が在庫切れになりました。カートから削除してください」 |
| 決済失敗 | Stripeエラーメッセージをそのまま表示 |
| 一部在庫不足 | 数量自動調整+通知「[商品名]の在庫が1点のみのため数量を変更しました」 |
2.11 マイページ(/mypage)
概要: ユーザーのアカウント情報・注文履歴・お気に入り管理画面。
サブページ構成
| パス | 内容 |
|---|
/mypage | プロフィール概要 |
/mypage/profile | 氏名、メール、パスワード変更 |
/mypage/orders | 注文履歴一覧 |
/mypage/orders/[orderId] | 注文詳細・追跡 |
/mypage/favorites | お気に入り家具一覧 |
/mypage/rooms | マイルーム一覧(リダイレクト) |
/mypage/notifications | 通知設定(メール/プッシュ) |
3. メーカー向け画面仕様
3.1 メーカー申請フォーム(/maker/apply)
概要: メーカーとして出店申請を行うフォーム。審査ワークフローの起点。
入力
| フィールド | 種別 | 必須 | バリデーション |
|---|
| 会社名/屋号 | text | Yes | 1〜100文字 |
| 代表者名 | text | Yes | 1〜50文字 |
| メールアドレス | email | Yes | RFC 5322準拠 |
| 電話番号 | tel | Yes | 10〜11桁 |
| 郵便番号 | text | Yes | 7桁 |
| 住所 | text | Yes | 10〜200文字 |
| 事業形態 | select | Yes | 個人事業主/法人 |
| 法人番号 | text | Yes(法人) | 13桁数字 |
| 年商規模 | select | Yes | ~500万/500万〜5000万/5000万〜10億/10億〜 |
| 希望プラン | select | Yes | Starter/Growth/Professional/Enterprise |
| ブランド概要 | textarea | Yes | 50〜1000文字 |
| 商品カテゴリ | multi select | Yes | 最大5カテゴリ |
| ウェブサイトURL | url | No | URL形式 |
| SNSアカウント | text | No | URL形式 |
| 商品画像サンプル | file upload | Yes | JPG/PNG、5MB以内、最大5枚 |
| 利用規約同意 | checkbox | Yes | - |
エラーハンドリング
| エラー | 表示 |
|---|
| 既に申請済み | 「このメールアドレスでは申請済みです。審査結果をお待ちください」 |
| 法人番号不正 | 「正しい法人番号を入力してください(13桁)」 |
| ファイルサイズ超過 | 「ファイルサイズは5MB以内にしてください」 |
3.2 ダッシュボード(/maker/dashboard)
概要: メーカーの主要KPI・通知・クイックアクションを表示するホーム画面。
KPIカード(本日/今月/累計)
| 指標 | 説明 |
|---|
| 売上金額 | 本日/今月 |
| 注文件数 | 本日/今月 |
| 商品閲覧数 | 本日/今月 |
| 配置回数 | 本日/今月(シミュレーションで配置された回数) |
| 購入コンバージョン率 | 配置→購入率 |
| 未処理注文数 | 要対応件数(バッジ表示) |
通知一覧
| 通知種別 | トリガー |
|---|
| 新着注文 | 注文受付時 |
| 在庫警告 | 在庫数5以下 |
| 審査完了 | プラットフォームからの連絡 |
| レビュー投稿 | ユーザーがレビュー投稿 |
3.3 商品管理(/maker/products)
概要: 商品の登録・編集・公開管理を行う画面。
商品一覧
| フィルタ | 説明 |
|---|
| ステータス | 公開中/下書き/審査中/非公開 |
| カテゴリ | 絞り込み |
| 在庫状況 | 在庫あり/在庫なし/残り僅か |
| テキスト検索 | 商品名・SKUコード |
商品登録フォーム(/maker/products/new, /maker/products/[id]/edit)
基本情報
| フィールド | 種別 | 必須 | バリデーション |
|---|
| 商品名 | text | Yes | 1〜200文字 |
| 商品説明 | richtext | Yes | 10〜10000文字 |
| カテゴリ | tree select | Yes | 末端カテゴリを選択 |
| スタイルタグ | multi select | No | 最大10タグ |
| SKUコード | text | Yes | 英数字・ハイフン、50文字以内 |
価格・在庫
| フィールド | 種別 | 必須 | バリデーション |
|---|
| 定価(税抜) | number | Yes | 1〜99,999,999円 |
| 販売価格(税抜) | number | Yes | 1〜99,999,999円(定価以下) |
| 消費税率 | select | Yes | 10%/軽減8% |
| 在庫数 | number | Yes | 0〜999,999 |
| 入荷予定日 | date | No | 未来日付のみ |
| 送料設定 | select | Yes | 無料/地域別/重量別 |
| 送料(一律) | number | 条件付き | 0〜99,999円 |
寸法・素材
| フィールド | 種別 | 必須 | バリデーション |
|---|
| 幅(cm) | number | Yes | 1〜500 |
| 奥行き(cm) | number | Yes | 1〜300 |
| 高さ(cm) | number | Yes | 1〜300 |
| 重量(kg) | number | No | 0.1〜999.9 |
| 素材 | multi select | Yes | 1〜5種選択 |
| カラー | color select | Yes | 1〜15色 |
バリエーション
| フィールド | 説明 |
|---|
| カラーバリエーション | 色ごとに価格・在庫・画像・3Dモデルを設定 |
| サイズバリアント | Sサイズ/Mサイズ等、寸法・価格を個別設定 |
画像・3Dモデル
| フィールド | 制約 |
|---|
| 商品画像 | JPG/PNG/WebP、10MB以内、最大20枚 |
| メイン画像 | 1枚必須、正方形推奨(1000x1000px) |
| 3Dモデル | GLB/GLTF推奨、最大100MB |
バリデーション(共通)
| チェック | ルール |
|---|
| 販売価格 | 定価以下であること |
| SKUコード | メーカー内でユニーク |
| 3Dモデル | アップロード後に自動品質チェック |
3.4 3Dモデル管理(/maker/models)
概要: 3Dモデルのアップロード・変換・プレビュー・バージョン管理画面。
アップロード仕様
| 項目 | 仕様 |
|---|
| 対応形式 | GLB(推奨)、GLTF、OBJ(MTLファイル付き)、FBX |
| 最大ファイルサイズ | 100MB |
| アップロード方式 | マルチパート、プログレスバー表示 |
| 自動処理 | アップロード後にLOD生成(高/中/低の3段階) |
自動品質チェック
| チェック項目 | 合格基準 |
|---|
| ポリゴン数 | 50,000以下 |
| テクスチャサイズ | 4096x4096px以下 |
| ファイルサイズ | 50MB以下(変換後) |
| マテリアル数 | 10以下 |
| UVマッピング | エラーなし |
写真→3D変換ツール(AI変換)
| ステップ | 説明 |
|---|
| 1 | 商品写真アップロード(正面/側面/背面の3枚必須、上面任意) |
| 2 | 寸法入力(W×D×H) |
| 3 | 変換開始(処理時間:約3〜10分) |
| 4 | プレビュー確認・承認 |
| 5 | 商品への紐付け |
3.5 注文管理(/maker/orders)
概要: プラットフォーム経由の注文を管理する画面。
注文一覧フィルタ
| フィルタ | 説明 |
|---|
| ステータス | 新着/確認中/発送済み/完了/キャンセル/返品中 |
| 期間 | 今日/今週/今月/カスタム期間 |
| 商品名 | テキスト検索 |
注文詳細(/maker/orders/[orderId])
| 要素 | 説明 |
|---|
| 注文情報 | 注文ID、注文日時、顧客名(匿名化オプション) |
| 商品明細 | 商品名、バリアント、数量、小計 |
| 配送先 | 住所(番地まで表示) |
| 配送情報入力 | 配送業者選択、追跡番号入力 |
| ステータス変更 | ドロップダウンで変更 |
| メモ | 社内メモ(顧客には非表示) |
ステータス変更ルール
詳細は 8.1 注文ステータス遷移 を参照。
3.6 アナリティクス(/maker/analytics)
概要: 商品パフォーマンス・ユーザー行動の詳細分析ダッシュボード。
グラフ・指標一覧
| 指標 | 粒度 | 期間 |
|---|
| 売上推移 | 日/週/月 | 最大365日 |
| 商品別閲覧数 | - | 選択期間 |
| 商品別配置回数 | - | 選択期間 |
| 購入コンバージョン率 | - | 選択期間 |
| AI採用率 | AIコーディネートで採用された割合 | 選択期間 |
| ユーザー属性 | 年齢層/地域/デバイス | 選択期間 |
| 同カテゴリ比較 | 自社vs業界平均 | 選択期間 |
| コンバージョンファネル | 閲覧→配置→カート→購入 | 選択期間 |
エクスポート
- CSV形式でダウンロード可能
- 全指標のRAWデータを対象期間で出力
4. プラットフォーム管理画面仕様
4.1 メーカー審査管理(/admin/makers)
概要: メーカー申請の審査・承認・却下を行う管理画面。
審査フロー
- 申請受付 → ステータス
PENDING
- 担当者アサイン → ステータス
REVIEWING
- 審査実施(書類確認・サイト確認)
- 承認 → ステータス
APPROVED + メーカーへ通知メール
- 却下 → ステータス
REJECTED + 却下理由メール
審査チェックリスト
| チェック項目 | 必須 |
|---|
| 法人番号照合(GBiz API) | 法人のみ |
| 商品画像の品質確認 | Yes |
| ウェブサイト確認 | No |
| 個人情報取扱方針の確認 | Yes |
| 特定商取引法表示確認 | Yes |
4.2 カテゴリマスタ管理(/admin/categories)
概要: 商品カテゴリの階層管理(3階層まで)。
カテゴリツリー(初期データ)
リビング
├── ソファ
│ ├── 1人掛け
│ ├── 2人掛け
│ ├── 3人掛け
│ └── コーナー/L字
├── テレビ台・ローボード
├── センターテーブル/ローテーブル
├── シェルフ・棚
└── ラグ・カーペット
ダイニング
├── ダイニングテーブル
├── ダイニングチェア
└── 食器棚・キッチン収納
寝室
├── ベッド・寝具
│ ├── シングル
│ ├── セミダブル
│ ├── ダブル
│ └── クイーン/キング
├── マットレス
├── 枕・寝具
├── ドレッサー
└── チェスト・たんす
書斎・ワークスペース
├── デスク
├── チェア・ワークチェア
├── 本棚・ブックシェルフ
└── 収納ボックス・ファイルケース
収納・クローゼット
├── ワードローブ・洋服タンス
├── チェスト
├── シューズラック
└── ハンガーラック
その他・インテリア小物
├── 照明・ライト
├── ミラー・鏡
├── 観葉植物
└── インテリア雑貨
5. API仕様
5.1 認証
全APIエンドポイント(/api/public/を除く)は、リクエストヘッダーに有効なJWTトークンが必要です。
Authorization: Bearer <access_token>
または HttpOnly Cookie rc_access_token。
5.2 共通レスポンス形式
成功
{
"success": true,
"data": { ... },
"meta": {
"page": 1,
"limit": 24,
"total": 100
}
}
エラー
{
"success": false,
"error": {
"code": "PRODUCT_NOT_FOUND",
"message": "商品が見つかりませんでした",
"details": {}
}
}
5.3 消費者向けAPI
認証
| メソッド | パス | 説明 |
|---|
| POST | /api/auth/register | 新規ユーザー登録 |
| POST | /api/auth/login | ログイン(CC-Auth委託) |
| POST | /api/auth/logout | ログアウト |
| GET | /api/auth/me | 自分のプロフィール取得 |
| PUT | /api/auth/me | プロフィール更新 |
| POST | /api/auth/refresh | トークンリフレッシュ |
ルーム管理
| メソッド | パス | 説明 | 認証 |
|---|
| GET | /api/rooms | 自分のルーム一覧 | Required |
| POST | /api/rooms | ルーム新規作成 | Required |
| GET | /api/rooms/:roomId | ルーム詳細取得 | Required |
| PUT | /api/rooms/:roomId | ルーム更新 | Required |
| DELETE | /api/rooms/:roomId | ルーム削除 | Required |
| POST | /api/rooms/:roomId/duplicate | ルーム複製 | Required |
| GET | /api/rooms/:roomId/snapshot | スナップショット生成 | Required |
POST /api/rooms リクエスト
{
"name": "リビングルーム",
"floorPlan": {
"width": 500,
"depth": 400,
"height": 240,
"shape": "rectangle",
"walls": [
{ "x1": 0, "y1": 0, "x2": 500, "y2": 0 },
...
],
"doors": [{ "wallIndex": 0, "offset": 100, "width": 80, "direction": "left" }],
"windows": [{ "wallIndex": 2, "offset": 50, "width": 160 }]
},
"furnitures": []
}
PUT /api/rooms/:roomId/furnitures リクエスト
{
"furnitures": [
{
"productId": "prod_abc123",
"variantId": "var_def456",
"position": { "x": 100, "y": 0, "z": 150 },
"rotation": { "x": 0, "y": 90, "z": 0 },
"scale": { "x": 1, "y": 1, "z": 1 }
}
]
}
家具カタログ
| メソッド | パス | 説明 | 認証 |
|---|
| GET | /api/products | 商品一覧・検索 | Optional |
| GET | /api/products/:productId | 商品詳細 | Optional |
| GET | /api/products/:productId/model | 3Dモデル取得(署名付きURL) | Optional |
| GET | /api/categories | カテゴリツリー取得 | None |
| GET | /api/makers | メーカー一覧 | None |
| GET | /api/makers/:makerId | メーカー詳細(ブランドストア) | None |
GET /api/products クエリパラメータ
| パラメータ | 型 | 説明 | 例 |
|---|
q | string | キーワード検索 | ソファ |
categoryId | string | カテゴリID | cat_sofa_2 |
makerIds | string[] | メーカーIDs(カンマ区切り) | maker1,maker2 |
styles | string[] | スタイル | modern,natural |
colorHexes | string[] | カラーコード | #ffffff,#000000 |
minPrice | number | 最低価格(税抜) | 10000 |
maxPrice | number | 最高価格(税抜) | 100000 |
minWidth | number | 最小幅(cm) | 50 |
maxWidth | number | 最大幅(cm) | 200 |
inStock | boolean | 在庫ありのみ | true |
sort | string | ソート | price_asc |
page | number | ページ番号 | 1 |
limit | number | 件数(最大50) | 24 |
AIコーディネート
| メソッド | パス | 説明 | 認証 |
|---|
| POST | /api/ai/coordinate | コーディネート生成(SSE) | Optional |
| POST | /api/ai/coordinate/:requestId/apply | コーディネートを部屋に適用 | Required |
| GET | /api/ai/coordinate/history | 生成履歴 | Required |
POST /api/ai/coordinate リクエスト
{
"roomId": "room_abc123",
"budget": 500000,
"styles": ["natural", "nordic"],
"colorTone": "warm",
"familyType": "couple",
"priorityCategories": ["sofa", "dining_table"],
"excludeMakerIds": [],
"freeText": "北欧ナチュラルな雰囲気で、木の温もりを感じる空間にしたい"
}
SSEレスポンス(event-stream)
event: progress
data: {"step": 1, "message": "部屋の情報を分析中..."}
event: pattern
data: {"patternIndex": 1, "name": "スカンジナビアンナチュラル", "furnitures": [...], "totalPrice": 480000, "comment": "..."}
event: complete
data: {"totalPatterns": 3}
カート・注文
| メソッド | パス | 説明 | 認証 |
|---|
| GET | /api/cart | カート取得 | Required |
| POST | /api/cart/items | カートに追加 | Required |
| PUT | /api/cart/items/:itemId | カートアイテム数量変更 | Required |
| DELETE | /api/cart/items/:itemId | カートから削除 | Required |
| POST | /api/orders | 注文作成(Stripe Payment Intent生成) | Required |
| GET | /api/orders | 注文履歴 | Required |
| GET | /api/orders/:orderId | 注文詳細 | Required |
| POST | /api/orders/:orderId/cancel | 注文キャンセル | Required |
POST /api/orders リクエスト
{
"cartId": "cart_abc123",
"shippingAddress": {
"name": "山田 太郎",
"postalCode": "1500001",
"prefecture": "東京都",
"city": "渋谷区",
"line1": "神南1-2-3",
"line2": "マンション101",
"phone": "09012345678"
},
"paymentMethodId": "pm_stripe_xxx",
"couponCode": "SUMMER2026"
}
コミュニティ
| メソッド | パス | 説明 | 認証 |
|---|
| GET | /api/community/posts | 投稿一覧 | None |
| GET | /api/community/posts/:postId | 投稿詳細 | None |
| POST | /api/community/posts | 投稿作成 | Required |
| PUT | /api/community/posts/:postId | 投稿更新 | Required |
| DELETE | /api/community/posts/:postId | 投稿削除 | Required |
| POST | /api/community/posts/:postId/like | いいね | Required |
| DELETE | /api/community/posts/:postId/like | いいね取消 | Required |
| POST | /api/community/posts/:postId/bookmark | ブックマーク | Required |
| POST | /api/community/posts/:postId/copy | 参考コピー(ルームに複製) | Required |
| POST | /api/community/posts/:postId/report | 通報 | Required |
| GET | /api/community/posts/:postId/comments | コメント一覧 | None |
| POST | /api/community/posts/:postId/comments | コメント投稿 | Required |
5.4 メーカー向けAPI
全エンドポイントは /api/maker/ プレフィックス。メーカーアカウントでのログインが必要。
商品管理
| メソッド | パス | 説明 |
|---|
| GET | /api/maker/products | 商品一覧(自社のみ) |
| POST | /api/maker/products | 商品新規作成 |
| GET | /api/maker/products/:productId | 商品詳細 |
| PUT | /api/maker/products/:productId | 商品更新 |
| DELETE | /api/maker/products/:productId | 商品削除(論理削除) |
| POST | /api/maker/products/:productId/publish | 公開 |
| POST | /api/maker/products/:productId/unpublish | 非公開 |
| POST | /api/maker/products/bulk-import | CSVバルクインポート |
| GET | /api/maker/products/bulk-import/:jobId | インポートジョブ状態 |
3Dモデル管理
| メソッド | パス | 説明 |
|---|
| POST | /api/maker/models/upload-url | 署名付きS3アップロードURL取得 |
| POST | /api/maker/models | モデル登録(アップロード完了後) |
| GET | /api/maker/models/:modelId | モデル詳細 |
| DELETE | /api/maker/models/:modelId | モデル削除 |
| POST | /api/maker/models/convert | 写真→3D変換ジョブ作成 |
| GET | /api/maker/models/convert/:jobId | 変換ジョブ状態 |
注文管理
| メソッド | パス | 説明 |
|---|
| GET | /api/maker/orders | 注文一覧 |
| GET | /api/maker/orders/:orderId | 注文詳細 |
| PUT | /api/maker/orders/:orderId/status | ステータス更新 |
| POST | /api/maker/orders/:orderId/ship | 発送処理(追跡番号登録) |
| POST | /api/maker/orders/:orderId/cancel | キャンセル処理 |
アナリティクス
| メソッド | パス | 説明 |
|---|
| GET | /api/maker/analytics/overview | KPI概要 |
| GET | /api/maker/analytics/products | 商品別パフォーマンス |
| GET | /api/maker/analytics/sales | 売上推移 |
| GET | /api/maker/analytics/users | ユーザー属性 |
| GET | /api/maker/analytics/funnel | コンバージョンファネル |
| GET | /api/maker/analytics/export | CSVエクスポート |
ブランドストア
| メソッド | パス | 説明 |
|---|
| GET | /api/maker/brand-store | ブランドストア設定取得 |
| PUT | /api/maker/brand-store | ブランドストア設定更新 |
| POST | /api/maker/brand-store/hero-image | ヒーロー画像アップロード |
5.5 プラットフォーム管理API
全エンドポイントは /api/admin/ プレフィックス。管理者アカウント必須。
| メソッド | パス | 説明 |
|---|
| GET | /api/admin/makers | メーカー申請一覧 |
| PUT | /api/admin/makers/:makerId/approve | メーカー承認 |
| PUT | /api/admin/makers/:makerId/reject | メーカー却下 |
| GET | /api/admin/users | ユーザー一覧 |
| PUT | /api/admin/users/:userId/ban | ユーザーBANパン |
| GET | /api/admin/reports | 通報一覧 |
| PUT | /api/admin/reports/:reportId/resolve | 通報処理 |
| GET | /api/admin/categories | カテゴリ一覧 |
| POST | /api/admin/categories | カテゴリ作成 |
| PUT | /api/admin/categories/:categoryId | カテゴリ更新 |
| DELETE | /api/admin/categories/:categoryId | カテゴリ削除 |
| POST | /api/admin/notifications | システム通知配信 |
| GET | /api/admin/revenue | 売上・手数料レポート |
5.6 Webhook(外部サービス連携)
| エンドポイント | 送信元 | 説明 |
|---|
POST /api/webhook/stripe | Stripe | 決済完了・失敗通知 |
POST /api/webhook/maker-ec | メーカーEC | 在庫・価格更新(Professional以上) |
6. データモデル(ER図)
erDiagram
User {
uuid id PK
string email UK
string name
string ccAuthUserId UK
string avatarUrl
enum userType "consumer | maker_staff | admin"
date birthdate
timestamp createdAt
timestamp updatedAt
timestamp deletedAt
}
Maker {
uuid id PK
string companyName
string brandName
string email UK
string phone
string postalCode
string address
enum businessType "individual | corporation"
string corporateNumber
enum revenueScale "tiny | small | medium | large"
enum plan "starter | growth | professional | enterprise"
enum status "pending | reviewing | approved | rejected | suspended"
string logoUrl
string brandDescription
string websiteUrl
decimal commissionRate
timestamp approvedAt
timestamp createdAt
timestamp updatedAt
}
MakerStaff {
uuid id PK
uuid userId FK
uuid makerId FK
enum role "owner | admin | editor | viewer"
timestamp createdAt
}
Category {
uuid id PK
uuid parentId FK
string name
string slug UK
int depth "1-3"
int sortOrder
boolean isActive
}
Product {
uuid id PK
uuid makerId FK
uuid categoryId FK
string name
string description
string skuCode UK
int priceBase "税抜定価(円)"
int priceSale "税抜販売価格(円)"
int taxRate "8 or 10"
enum shippingType "free | fixed | by_region | by_weight"
int shippingFee
float widthCm
float depthCm
float heightCm
float weightKg
enum status "draft | reviewing | published | unpublished | deleted"
string[] styleTags
string[] materialTags
timestamp publishedAt
timestamp createdAt
timestamp updatedAt
}
ProductVariant {
uuid id PK
uuid productId FK
string variantType "color | size"
string variantLabel
string colorHex
int priceAdjust "差額(円)"
int stockCount
date restockDate
boolean isDefault
}
ProductImage {
uuid id PK
uuid productId FK
uuid variantId FK
string url
int sortOrder
boolean isMain
}
Model3D {
uuid id PK
uuid productId FK
uuid variantId FK
string s3Key
string cdnUrl
string format "glb | gltf | obj | fbx"
int polygonCount
int fileSizeMb
enum status "processing | ready | error"
string errorMessage
int version
timestamp createdAt
}
Room {
uuid id PK
uuid userId FK
string name
jsonb floorPlan "間取りデータ(JSON)"
jsonb furnitures "配置家具リスト(JSON)"
string thumbnailUrl
boolean isPublic
timestamp createdAt
timestamp updatedAt
}
Cart {
uuid id PK
uuid userId FK
uuid guestSessionId
timestamp expiresAt
timestamp createdAt
timestamp updatedAt
}
CartItem {
uuid id PK
uuid cartId FK
uuid productId FK
uuid variantId FK
int quantity
int priceSnapshot "追加時点の価格"
timestamp addedAt
}
Order {
uuid id PK
uuid userId FK
string orderNumber UK
enum status "pending | confirmed | processing | shipped | delivered | cancelled | refunded"
jsonb shippingAddress
string paymentIntentId UK
int subtotal
int shippingFee
int tax
int total
string couponCode
int discountAmount
timestamp orderedAt
timestamp updatedAt
}
OrderItem {
uuid id PK
uuid orderId FK
uuid makerId FK
uuid productId FK
uuid variantId FK
string productNameSnapshot
int priceSnapshot
int quantity
int subtotal
enum status "confirmed | processing | shipped | delivered | cancelled | return_requested | returned"
string trackingNumber
string shippingCarrier
timestamp shippedAt
timestamp deliveredAt
}
CommunityPost {
uuid id PK
uuid userId FK
uuid roomId FK
string title
string description
string thumbnailUrl
string[] styleTags
enum visibility "public | limited | private"
int likeCount
int bookmarkCount
boolean isOfficialStylist
timestamp createdAt
timestamp updatedAt
}
PostLike {
uuid id PK
uuid postId FK
uuid userId FK
timestamp createdAt
}
PostBookmark {
uuid id PK
uuid postId FK
uuid userId FK
timestamp createdAt
}
PostComment {
uuid id PK
uuid postId FK
uuid userId FK
string content
timestamp createdAt
}
ContentReport {
uuid id PK
uuid reporterId FK
string targetType "post | comment | user"
uuid targetId
enum reason "spam | inappropriate | copyright | other"
string description
enum status "pending | reviewed | resolved"
timestamp createdAt
}
WishlistItem {
uuid id PK
uuid userId FK
uuid productId FK
uuid variantId FK
timestamp addedAt
}
AICoordinateRequest {
uuid id PK
uuid userId FK
uuid roomId FK
int budget
string[] styles
string colorTone
string familyType
string[] priorityCategories
string[] excludeMakerIds
string freeText
jsonb results "生成結果(3パターン)"
int tokenUsed
enum status "pending | processing | completed | failed"
timestamp createdAt
timestamp completedAt
}
MakerApplication {
uuid id PK
uuid makerId FK
uuid reviewerId FK
string[] checklistItems
string reviewNote
enum status "pending | reviewing | approved | rejected"
timestamp submittedAt
timestamp reviewedAt
}
User ||--o{ Room : "creates"
User ||--o{ Cart : "has"
User ||--o{ Order : "places"
User ||--o{ CommunityPost : "posts"
User ||--o{ WishlistItem : "saves"
User ||--o{ AICoordinateRequest : "requests"
User ||--o{ MakerStaff : "belongs to"
Maker ||--o{ MakerStaff : "has"
Maker ||--o{ Product : "owns"
Maker ||--o{ OrderItem : "fulfills"
Product ||--o{ ProductVariant : "has"
Product ||--o{ ProductImage : "has"
Product ||--o{ Model3D : "has"
Product ||--o{ CartItem : "added to"
Product ||--o{ OrderItem : "ordered as"
Product ||--o{ WishlistItem : "saved as"
Category ||--o{ Product : "contains"
Category ||--o{ Category : "has children"
Cart ||--o{ CartItem : "contains"
Order ||--o{ OrderItem : "has"
CommunityPost ||--o{ PostLike : "receives"
CommunityPost ||--o{ PostBookmark : "receives"
CommunityPost ||--o{ PostComment : "has"
Room ||--o{ CommunityPost : "featured in"
7. ビジネスロジック仕様
7.1 販売手数料計算
メーカーのプランに応じて、プラットフォームへの手数料が異なる。
| プラン | 手数料率 |
|---|
| Starter | 15% |
| Growth | 10% |
| Professional | 7% |
| Enterprise | 3〜5%(個別交渉) |
計算式
売上 = 商品価格(税込)× 数量
手数料 = 売上 × 手数料率
メーカー受取額 = 売上 - 手数料
精算サイクル: 月末締め翌月末払い(Stripe Connect経由)
7.2 商品掲載数制限
プランごとに掲載できる商品数の上限を管理する。
| プラン | 上限 |
|---|
| Starter | 20点 |
| Growth | 200点 |
| Professional | 1,000点 |
| Enterprise | 無制限 |
判定タイミング: 商品を「公開」状態に変更しようとした時点で判定。上限超過時はエラーを返す。
エラーコード: PRODUCT_LIMIT_EXCEEDED
メッセージ: "現在のプラン(Starter)では最大20点まで掲載できます。プランをアップグレードしてください"
7.3 AIコーディネート生成ロジック
Claude API(claude-3-7-sonnet)を使用して、以下のフローで家具提案を生成する。
入力コンテキスト
- 部屋の間取り情報(サイズ、形状、開口部)
- ユーザー設定(予算、スタイル、家族構成等)
- 利用可能な家具DB(予算・カテゴリでフィルタ後、上位100件)
生成プロンプト構造
System: あなたはプロのインテリアスタイリストです...(スタイルガイドライン)
User: 以下の条件でインテリアコーディネートを3パターン提案してください。
- 部屋: {width}cm × {depth}cm、{style}間取り
- 予算: ¥{budget}
- 好みのスタイル: {styles}
- 利用可能な家具リスト: {furnitureList}
JSON形式で回答してください: { patterns: [...] }
パターン選定基準
- パターン1: 予算内で最も人気の組み合わせ(配置回数スコア優先)
- パターン2: スタイル一致度優先(埋め込みベクトル類似度)
- パターン3: 価格パフォーマンス優先(評価/価格比)
家具配置アルゴリズム
- 部屋の重心を計算
- 主要家具(ソファ、ダイニングテーブル等)を先に配置(壁際スナップ)
- 副次家具をルールベースで配置(サイドテーブルはソファ横、等)
- 衝突チェック→修正
- 寸法の最終確認
7.4 在庫管理ロジック
楽観的ロックを使用して在庫を管理する。注文確定時に以下の処理を行う。
1. BEGIN TRANSACTION
2. SELECT stock_count FROM product_variants WHERE id = ? FOR UPDATE
3. IF stock_count < quantity THEN ROLLBACK → エラー返却
4. UPDATE product_variants SET stock_count = stock_count - quantity WHERE id = ?
5. CREATE order_item (...)
6. COMMIT
在庫ステータス判定
| 在庫数 | ステータス表示 |
|---|
| 0 | 「在庫切れ」(カート追加不可) |
| 1〜3 | 「残り僅か(残{N}点)」 |
| 4以上 | 表示なし |
7.5 コミュニティモデレーション
自動フィルタ
- 投稿テキストに不適切ワードが含まれる場合、自動で審査保留状態にする
- 24時間以内に管理者が確認・判定
通報後処理
| 通報数 | 自動処理 |
|---|
| 3件以上(同一投稿) | 管理者へアラート通知 |
| 5件以上(同一投稿) | 自動非表示(管理者確認後に再公開) |
| 10件以上(同一ユーザー) | アカウント一時制限(24時間) |
7.6 検索スコアリング
OpenSearchを使用した商品検索スコアは以下の重み付けで計算する。
| 要素 | 重み |
|---|
| キーワード一致(商品名) | 3.0 |
| キーワード一致(タグ) | 2.0 |
| キーワード一致(説明文) | 1.0 |
| 配置回数(直近30日) | 1.5 |
| 購入コンバージョン率 | 2.0 |
| メーカープランボーナス(Growth以上) | 1.2倍 |
| 在庫あり | 1.1倍 |
8. 状態遷移仕様
8.1 注文ステータス遷移
stateDiagram-v2
[*] --> pending : 注文作成(決済処理中)
pending --> confirmed : Stripe決済完了Webhook受信
pending --> cancelled : 決済失敗 or タイムアウト(30分)
confirmed --> processing : メーカーが受注確認
confirmed --> cancelled : メーカーがキャンセル or 在庫切れ
processing --> shipped : メーカーが発送処理(追跡番号登録)
shipped --> delivered : 配送完了(追跡APIまたは手動更新)
shipped --> return_requested : ユーザーが返品申請
delivered --> return_requested : ユーザーが返品申請(配送完了後14日以内)
return_requested --> returned : メーカーが返品承認・着荷確認
returned --> refunded : Stripe返金処理完了
cancelled --> refunded : 決済済みの場合、Stripe返金
OrderItemの独立ステータス遷移
各OrderItemは独立してステータスを持ち、異なるメーカーの商品は別々に処理される。OrderのステータスはOrderItem全体の集約で決定する。
| OrderItems状態 | Order全体ステータス |
|---|
| 全てconfirmed | confirmed |
| 1件以上processing | processing |
| 全てshipped | shipped |
| 全てdelivered | delivered |
| 全てcancelled | cancelled |
| 混在(partial) | 個別ステータスを表示 |
8.2 メーカー審査ステータス遷移
stateDiagram-v2
[*] --> pending : メーカー申請フォーム送信
pending --> reviewing : 管理者が担当者アサイン
reviewing --> approved : 審査合格
reviewing --> rejected : 審査不合格
approved --> suspended : 規約違反・料金未払い等
suspended --> approved : 問題解消・再審査合格
rejected --> pending : 再申請(修正後)
8.3 商品ステータス遷移
stateDiagram-v2
[*] --> draft : 商品新規作成
draft --> reviewing : 公開申請(初回のみ。2回目以降はdraft→publishedへ)
reviewing --> published : 審査合格(初回登録時)
reviewing --> draft : 審査不合格(修正要求)
draft --> published : 再編集後の公開(審査不要)
published --> unpublished : メーカーが非公開設定
unpublished --> published : メーカーが再公開
published --> deleted : 削除(論理削除)
unpublished --> deleted : 削除(論理削除)
8.4 3Dモデル処理ステータス遷移
stateDiagram-v2
[*] --> uploading : S3アップロード開始
uploading --> processing : アップロード完了→自動処理開始
processing --> ready : 品質チェック合格・LOD生成完了
processing --> error : 品質チェック不合格 or 変換エラー
error --> uploading : 再アップロード
ready --> [*] : 商品に紐付け完了
9. エラーコード一覧
9.1 認証エラー(AUTH_XXX)
| コード | HTTPステータス | 説明 |
|---|
AUTH_001 | 401 | 認証失敗(メール/パスワード不一致) |
AUTH_002 | 409 | メールアドレス重複 |
AUTH_003 | 403 | アカウントロック(ログイン試行過多) |
AUTH_004 | 403 | メール未認証 |
AUTH_005 | 401 | トークン期限切れ |
AUTH_006 | 401 | 無効なトークン |
AUTH_007 | 403 | 権限不足 |
9.2 商品エラー(PRODUCT_XXX)
| コード | HTTPステータス | 説明 |
|---|
PRODUCT_001 | 404 | 商品が見つからない |
PRODUCT_002 | 409 | SKUコード重複 |
PRODUCT_003 | 422 | 販売価格が定価を超えている |
PRODUCT_004 | 422 | 必須フィールド不足 |
PRODUCT_005 | 403 | 商品掲載数上限超過 |
PRODUCT_006 | 422 | 3Dモデルの品質チェック不合格(詳細付き) |
9.3 注文エラー(ORDER_XXX)
| コード | HTTPステータス | 説明 |
|---|
ORDER_001 | 409 | 在庫不足(商品名・在庫数含む) |
ORDER_002 | 422 | カートが空 |
ORDER_003 | 402 | 決済失敗(Stripeメッセージ付き) |
ORDER_004 | 409 | キャンセル不可状態(発送済み等) |
ORDER_005 | 404 | 注文が見つからない |
ORDER_006 | 403 | 返品期限超過(14日) |
9.4 AIエラー(AI_XXX)
| コード | HTTPステータス | 説明 |
|---|
AI_001 | 503 | AIサービス一時停止 |
AI_002 | 422 | 予算内の商品なし |
AI_003 | 408 | 生成タイムアウト(30秒) |
AI_004 | 429 | レート制限(1ユーザーあたり1日10回) |
9.5 ファイルエラー(FILE_XXX)
| コード | HTTPステータス | 説明 |
|---|
FILE_001 | 413 | ファイルサイズ超過 |
FILE_002 | 415 | 対応していないファイル形式 |
FILE_003 | 422 | 3Dモデル品質チェック不合格 |
FILE_004 | 500 | アップロード失敗(S3エラー) |
9.6 メーカーエラー(MAKER_XXX)
| コード | HTTPステータス | 説明 |
|---|
MAKER_001 | 409 | 既に申請済み |
MAKER_002 | 403 | 審査中または却下 |
MAKER_003 | 403 | アカウント停止中 |
MAKER_004 | 422 | 法人番号不正 |
Generated by CCAGI SDK v3.14.4 - Phase 2: Design (spec.md)
作成日: 2026-03-19