システム仕様書

在庫同期システム

概要

Shopify、楽天、Qoo10の各ECサイトとGoogleスプレッドシート間での在庫同期を自動化するシステムです。注文確認や注文タグ「DD日」をもって売れたと判断し、自動実行で在庫を同期します。1時間に1回の定期実行を想定しています。

フォルダ構成

標準的なアプリケーション構成

在庫同期/
├── inventory_sync_allinone.py  # メインスクリプト(全機能統合版)
├── app.py                      # Webアプリケーション(Flask)
├── requirements.txt            # Python依存関係
├── README.md                   # このファイル
├── config/                     # 設定ファイル
│   ├── .env                    # 環境変数設定ファイル
│   └── credentials.json        # Google Sheets API認証情報
├── data/                       # データファイル
│   └── inventory_sync.db       # SQLiteデータベース(注文処理履歴等)
├── logs/                       # ログファイル
│   └── inventory_sync.log      # 実行ログ
├── templates/                  # Webアプリケーション用HTMLテンプレート
│   ├── base.html               # ベーステンプレート
│   ├── index.html              # メインページ
│   ├── logs.html               # ログ表示ページ
│   ├── database.html           # データベース表示ページ
│   └── readme.html             # 仕様書表示ページ
└── archive/                    # アーカイブファイル(開発段階のファイル)
    ├── bat/                    # バッチファイル(開発用)
    ├── docs/                   # API仕様書等のドキュメント
    ├── logs/                   # 過去のログファイル
    ├── debug_*.py              # デバッグ用スクリプト
    ├── fix_*.py                # 修正用スクリプト
    ├── check_*.py              # チェック用スクリプト
    ├── inventory_*.py          # 開発中の古いバージョン
    └── product_identification_report.py  # 商品識別レポート生成

セットアップ

1. 仮想環境の作成とアクティベート

# 仮想環境を作成
python3 -m venv venv

# 仮想環境をアクティベート(macOS/Linux)
source venv/bin/activate

# 仮想環境をアクティベート(Windows)
venv\Scripts\activate

2. 依存関係のインストール

# 仮想環境がアクティブな状態で実行
pip install --upgrade pip
pip install -r requirements.txt

3. 環境変数の設定

config/.envファイルに以下の設定が必要です:

# 環境設定
ENVIRONMENT=production  # test または production

# Lark通知設定
LARK_WEBHOOK_URL=https://your-webhook-url

# Googleスプレッドシート設定
PRODUCTION_SPREADSHEET_URL=https://docs.google.com/spreadsheets/d/...
PRODUCTION_SHEET_NAME=出荷予定日別集計
TEST_SPREADSHEET_URL=https://docs.google.com/spreadsheets/d/...
TEST_SHEET_NAME=出荷予定日別集計_テスト

# 楽天API設定
RAKUTEN_SERVICE_SECRET=your-service-secret
RAKUTEN_LICENSE_KEY=your-license-key
RAKUTEN_TEST_SERVICE_SECRET=your-test-service-secret
RAKUTEN_TEST_LICENSE_KEY=your-test-license-key

# Shopify店舗設定
ARTGRAPH_SHOP=your-shop.myshopify.com
ARTGRAPH_TOKEN=your-token
PHOTOPRI_SHOP=your-shop.myshopify.com
PHOTOPRI_TOKEN=your-token
QOO_SHOP=your-shop.myshopify.com
QOO_TOKEN=your-token

# テスト環境用(ENVIRONMENT=testの場合)
ARTGRAPH_TEST_SHOP=your-test-shop.myshopify.com
ARTGRAPH_TEST_TOKEN=your-test-token
PHOTOPRI_TEST_SHOP=your-test-shop.myshopify.com
PHOTOPRI_TEST_TOKEN=your-test-token
QOO_TEST_SHOP=your-test-shop.myshopify.com
QOO_TEST_TOKEN=your-test-token

4. Google Sheets認証設定

config/credentials.jsonファイルにGoogle Sheets APIのサービスアカウント認証情報を配置してください。

実行方法

Webアプリケーション(推奨)

# 仮想環境をアクティベート
source venv/bin/activate

# Webアプリケーションを起動
python app.py
# または
./run_web.sh

ブラウザで http://localhost:8080 にアクセスしてWebインターフェースを使用

手動実行(コマンドライン)

# 仮想環境をアクティベート
source venv/bin/activate

# 在庫同期を実行
python inventory_sync_allinone.py

定期実行設定(crontab例)

# 1時間に1回実行
0 * * * * cd /path/to/在庫同期 && python inventory_sync_allinone.py

Webアプリケーション機能

メイン機能

  1. 在庫同期実行ボタン
  2. ワンクリックで在庫同期処理を実行
  3. 実行状況のリアルタイム表示
  4. 実行中は他の操作をブロック

  5. ロールバックボタン

  6. 直前の処理を取り消し
  7. 確認ダイアログで誤操作を防止

  8. ログファイル確認

  9. ブラウザでログファイルを直接表示
  10. ログのダウンロード機能
  11. ログレベルの説明付き

  12. データベース確認

  13. 各テーブルの内容を表形式で表示
  14. 最新100件のデータを表示
  15. テーブル説明付き

  16. 仕様書確認

  17. README.mdの内容をブラウザで表示
  18. クイックリファレンス付き

システム状況表示

  • 実行状態のリアルタイム更新
  • 最終実行時刻の表示
  • 視覚的なステータス表示

🆕 最新更新(2025年9月24日)

🔧 重要な修正・改善

  • データベース構築方法の修正: 注文処理ロジックの根本的な問題を解決
  • 部材条件マッピングベース在庫調整: サイズ×色の組み合わせによる正確な在庫調整
  • 楽天variant_title対応: 商品名ではなくvariant_titleから色情報を抽出するように変更
  • 部材条件の完全対応: 全サイズ(A5,A4,A3,A2,A1,B5,B4,B3,B2,B1)×全3色(ビルマチーク、チェリーウッド、ブラックウォルナット)に対応
  • チャイナフレーム誤判定問題の解決: チャイナフレームがL字スタンドとして誤判定される問題を修正
  • Lark通知機能の実装: 在庫調整結果の自動通知機能を追加
  • 楽天チャイナフレーム部材条件の追加: 楽天の注文に対するチャイナフレーム部材条件を設定し、在庫調整エラーを解決
  • sku_info_extractionマッチングロジックの修正: 楽天の部材条件マッチングで条件値の解析ロジックを修正し、複数のサイズ・色を正しく処理できるように改善

📊 システム状況

  • 処理対象: Shopify各ストア(artgraph、PHOTOPRI、Qoo)、楽天市場
  • 在庫調整対象商品: チャイナフレーム、キャンバス木枠、L字スタンド、カレンダー&木製スタンド
  • 通知機能: Lark(飛書)への在庫調整結果自動通知
  • データベース: SQLiteによる処理履歴管理と重複防止

機能概要

統合スクリプト inventory_sync_allinone.py

この1つのスクリプトで以下の全機能を実行できます:

  1. 注文取得・処理
  2. Shopify各ストア(artgraph、PHOTOPRI、Qoo)の注文取得
  3. 楽天APIからの注文取得
  4. 注文タグ「DD日」による出荷予定日算出
  5. 重複集計防止(SQLite DB管理)
  6. 改善されたページネーション処理: すべての注文を確実に取得
  7. 楽天variant_title対応: 正確な色情報抽出

  8. 在庫調整

  9. スプレッドシート在庫表の自動更新
  10. 楽天API在庫の自動反映
  11. ウッド額縁(p00002)と同サイズ・色の他楽天商品の在庫調整
  12. キャンバス木枠: 各ストアの条件に基づく在庫調整
  13. L字スタンド: サイズ・色に基づく在庫調整
  14. カレンダー&木製スタンド: Qoo注文に基づく在庫調整
  15. 部材条件マッピングベース: サイズ×色の組み合わせによる正確な在庫調整

  16. 集計・出力

  17. 出荷予定日別集計データのCSV出力
  18. Googleスプレッドシートへの自動反映
  19. 小物印刷/大物印刷の分類集計

  20. 在庫突合・監視

  21. 楽天⇔スプレッドシート在庫突合チェック
  22. 差分検出とログ出力

  23. 通知・報告機能

  24. Lark(飛書)への在庫調整結果通知
  25. 詳細ログファイルへの記録

  26. ロールバック機能

  27. 前回同期の取り消し機能

ファイル説明

設定ファイル(config/)

  • .env - 環境変数設定ファイル(APIキー等の機密情報)
  • credentials.json - Google Sheets API認証情報

データファイル(data/)

  • inventory_sync.db - SQLiteデータベース(注文処理履歴等)

ログファイル(logs/)

  • inventory_sync.log - 実行ログ(継続的に追記される)

注意: データベースファイルとログファイルは既存のファイルを使用します。初回実行時は自動的に作成されますが、既存の履歴を保持するため、これらのファイルは削除しないでください。

ログ・通知の詳細

ログファイル(logs/inventory_sync.log)の内容

1. システム起動・環境情報

=== 在庫同期開始 ===
本番環境のストア設定を使用
本番環境の楽天API認証情報を使用

2. 注文処理の詳細

未処理注文を検出: Shopify X件, 楽天 Y件
処理した注文数: Z件
[在庫調整対象] 店舗名: 注文番号 - 商品タイプ サイズ 色 x数量
[削除済み商品除外] 店舗名: 注文番号 - 削除済み

3. 在庫調整処理の詳細

=== 部材条件マッピングベース在庫調整開始 ===
[在庫更新] シート名: 商品タイプ サイズ 在庫 旧値 → 新値(セル位置): 成功/失敗
=== 部材条件マッピングベース在庫調整完了 ===

4. ECサイト同期処理

=== スプレッドシート在庫を楽天に反映します ===
=== 楽天在庫反映 完了 ===
=== スプレッドシート在庫をShopifyに反映します ===
=== Shopify在庫反映 完了 ===

5. エラー・警告情報

楽天注文出荷状態確認エラー (注文番号): エラー内容
Google Sheets認証エラー: エラー内容

6. 出荷済み注文クリーンアップ

出荷済み注文を削除: 店舗名 - 注文ID
出荷済み注文の削除完了: X件

Lark通知の内容

通知タイミング

  • 在庫調整処理が完了した時(調整対象がある場合)
  • 在庫調整対象がない場合でも空の通知を送信

通知形式(調整対象がある場合)

📊 在庫調整結果報告
⏰ 実行時刻: 2024年09月20日 13:30
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

調整日時: 2024年09月20日 13:30
調整対象部材数: 3種類

チャイナフレーム(チェリーウッド) A4サイズ
調整前: 50個 → 調整後: 47個
消費数量: 3個
調整理由: 部材消費(注文処理による)
関連注文:
注文番号#1001: "チェリーウッド チャイナフレーム (A4(チェリーウッド))" (A4サイズ)

キャンバス木枠(ブラックウォルナット) F4サイズ
調整前: 30個 → 調整後: 28個
消費数量: 2個
調整理由: 部材消費(注文処理による)
関連注文:
注文番号#1003: "ブラックウォルナット キャンバス木枠 (F4(ブラックウォルナット))" (F4サイズ)

通知形式(調整対象がない場合)

📊 在庫調整結果報告
⏰ 実行時刻: 2024年09月20日 13:30
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

調整日時: 2024年09月20日 13:30
調整対象部材数: 0種類

調整対象の部材がありませんでした。
在庫同期処理は正常に完了しました。

ログと通知の役割分担

  • ログファイル: 技術的な詳細情報、デバッグ情報、エラー追跡
  • Lark通知: ビジネス関係者向けの要約情報、在庫調整結果の可視化

同期条件

注文対象

  • Shopify: 直近90日間の未出荷注文で、注文タグに「DD日」が含まれるもの
  • 楽天: 直近30日間の発送待ち・発送済み注文

在庫調整対象商品

チャイナフレーム

  • 概要: ウッド額縁(p00002)と同サイズ・色の他楽天商品、色とサイズはヴァリアントタイトルで判断(管理番号:p00002outletは除外)
  • 対象サイズ: A5, A4, A3, A2, A1, B5, B4, B3, B2, B1
  • 対象色: チェリーウッド、ビルマチーク、ブラックウォルナット
  • ストア別設定:
  • PHOTOPRI: 取扱なし
  • artgraph: 商品タイプが「Frame.」の商品、または「Poster.」の商品。色とサイズはヴァリアントタイトルで判断。色がなしの場合は額縁不使用。
  • Qoo: 商品IDが「8913272406326」または「8877398229302」の商品、色とサイズはヴァリアントタイトルで判断(スプシの在庫数をShopifyへ反映)
  • 楽天: variant_titleから色とサイズを抽出、SKUパターンベースで判定

キャンバス木枠

  • 概要: キャンバス木枠張り商品、色は存在しない、サイズはヴァリアントタイトルで判断
  • 対象サイズ: A5, A4, A3, A2, A1, B5, B4, B3, B2, B1, 300300, 600600, F0, F3, F4, F6, F8, F10, F15, F20
  • 対象色: なし(色情報なし)
  • ストア別設定:
  • PHOTOPRI: 商品名が「キャンバス木枠張り」の商品
  • artgraph: 商品タイプが「Canvas.」の商品,サイズはヴァリアントタイトルで判断
  • Qoo: 商品IDが「9040419782966」の商品(スプシの在庫数をShopifyへ反映)

L字スタンド

  • 概要: フォトスタンド商品、2Lサイズのみ対象、ハガキサイズは対象外
  • 対象サイズ: 2L(固定)
  • 対象色: ブラウン、ナチュラル、ダークブラウン
  • ストア別設定:
  • 楽天: variant_titleから色とサイズを抽出(2Lサイズは対象、ハガキサイズは対象外)
  • artgraph: 商品名に「Postcard.」を含む商品、色は「ブラウン」「ナチュラル」のみ、色がない場合は部材不使用
  • Qoo: 商品IDが「10053750849846」または「9090376237366」の商品、サイズはなし、色はヴァリアントタイトルで判断(スプシの在庫数をShopifyへ反映)

カレンダー&木製スタンド

  • 概要: 卓上フォトカレンダー商品
  • 対象サイズ: なし(サイズ情報なし)
  • 対象色: なし(色情報なし)
  • ストア別設定:
  • PHOTOPRI: 取扱なし
  • artgraph: 取扱なし
  • Qoo: 商品IDが「10123983716662」かつ、ヴァリアントタイトルが「カレンダー&木製スタンド」の商品(スプシの在庫数をShopifyへ反映)

商品判定ロジック

Shopify商品の判定順序

  1. チャイナフレーム判定(最優先): variant_titleにチャイナフレームの色とサイズが含まれている場合
  2. キャンバス木枠判定: 商品名に「キャンバス木枠張り」「Canvas.」「似顔絵キャンバス」「フォトキャンバス」「木枠」を含む場合
  3. L字スタンド判定: 商品名に「フォトスタンド」「Postcard.」「L字スタンド」「ウッドスタンド」を含む場合
  4. カレンダー&木製スタンド判定: 商品名に「卓上フォトカレンダー」を含み、variant_titleに「カレンダー&木製スタンド」を含む場合
  5. その他: 上記に該当しない商品

楽天商品の判定順序

  1. SKU情報抽出(最優先): skuInfoからサイズと色を抽出し、部材条件とマッチング
  2. SKUパターン: 色とサイズからSKUパターンを生成してマッチング
  3. 商品名パターン: 商品名に特定のキーワードが含まれているかチェック
  4. 商品管理番号: 商品管理番号が一致するかチェック

色情報抽出ロジック

# variant_titleから色情報を抽出
if 'チェリーウッド' in color_info or 'チェリー' in color_info:
    color = 'チェリーウッド'
elif 'ビルマチーク' in color_info or 'ビルマ' in color_info:
    color = 'ビルマチーク'
elif 'ブラックウォルナット' in color_info or 'ウォルナット' in color_info:
    color = 'ブラックウォルナット'
elif 'ブラウン' in color_info:
    color = 'ブラウン'
elif 'ナチュラル' in color_info:
    color = 'ナチュラル'

サイズ情報抽出ロジック

# variant_titleからサイズ情報を抽出
size_patterns = ['A5', 'A4', 'A3', 'A2', 'A1', 'B5', 'B4', 'B3', 'B2', 'B1', 
                '300*300', '600*600', 'F0', 'F3', 'F4', 'F6', 'F8', 'F10', 'F15', 'F20', '2L']

for pattern in size_patterns:
    if pattern in variant_title:
        size = pattern
        break

部材条件マッピング

部材条件マッピングテーブル

システムはmaterial_conditionsテーブルで部材条件を管理し、在庫調整を行います:

データベース確認

# 部材条件の確認
sqlite3 inventory_sync.db "SELECT material_name, store_name, condition_type, condition_value FROM material_conditions;"

現在の部材条件(2025年9月24日時点)

-- キャンバス木枠の条件
キャンバス木枠|PHOTOPRI|product_name_pattern|キャンバス木枠張り|現在庫|51|70
キャンバス木枠|Qoo|product_name_pattern|似顔絵キャンバス|現在庫|51|70
キャンバス木枠|artgraph|product_type|Canvas.|現在庫|51|70
キャンバス木枠|artgraph|product_name_pattern|似顔絵キャンバス|現在庫|51|70

-- チャイナフレームの条件
チャイナフレーム|artgraph|product_type|Frame.|現在庫|51|70
チャイナフレーム|artgraph|product_name_pattern|Poster.|現在庫|51|70
チャイナフレーム|Qoo|product_id_and_variant|8913272406326,8877398229302|現在庫|51|70
チャイナフレーム|rakuten|sku_info_extraction|A1,A2,A3,A4,A5,B1,B2,B3,B4,B5,チェリーウッド,ビルマチーク,ブラックウォルナット|在庫管理|1|100

注意: チャイナフレームの部材条件は、PHOTOPRIストアには現在設定されていません。

楽天チャイナフレーム部材条件の詳細

楽天のチャイナフレーム部材条件はsku_info_extractionタイプを使用し、以下の特徴があります:

  • 判定ロジック: variant_titleから色とサイズを抽出し、チャイナフレームの色(チェリーウッド、ビルマチーク、ブラックウォルナット)とサイズ(A1-A5, B1-B5)の組み合わせで判定
  • 対象商品: ウッドフォトフレーム、木製額縁、ポスター印刷商品など
  • 在庫管理: 在庫管理シートの1-100行で管理
  • 設定日: 2025年9月24日
  • 修正日: 2025年9月24日(マッチングロジック修正)

修正内容(2025年9月24日): - 問題: 条件値の解析ロジックが間違っており、最後に見つかった値のみを期待値として設定していた - 修正: 条件値から期待されるサイズと色のリストを正しく解析し、実際のサイズ・色が期待されるリストに含まれているかチェックするように変更 - 効果: 楽天の注文でチャイナフレームとして認識された商品が部材条件とマッチし、在庫調整が正常に実行されるようになります

この設定により、楽天の注文でチャイナフレームとして認識された商品が部材条件とマッチし、在庫調整が正常に実行されるようになります。

条件タイプ

  • sku_info_extraction: variant_titleから色情報を抽出(楽天推奨)
  • sku_pattern: SKUパターンベースの抽出
  • product_name_pattern: 商品名パターンベースの抽出
  • product_name_and_variant: 商品名とバリアント情報ベースの抽出
  • product_type: 商品タイプベースの抽出(artgraph推奨)
  • product_id_and_variant: 商品IDとバリアント情報ベースの抽出(Qoo推奨)

ストア別の優先順位

楽天: 1. sku_info_extractionタイプ(最優先) 2. sku_patternタイプ 3. product_name_patternタイプ 4. その他のタイプ

artgraph: 1. product_typeタイプ(最優先) 2. product_name_patternタイプ 3. その他のタイプ

PHOTOPRI: 1. product_name_patternタイプ(最優先) 2. その他のタイプ

Qoo: 1. product_id_and_variantタイプ(最優先) 2. product_name_patternタイプ 3. その他のタイプ

SKUマッピング

ウッド額縁SKUマッピング

WOOD_FRAME_SKU_MAP = {
    ('ビルマチーク', 'A5'): 'r-sku00000001',
    ('ビルマチーク', 'A4'): 'r-sku00000002',
    ('ビルマチーク', 'A3'): 'r-sku00000003',
    ('ビルマチーク', 'A2'): 'r-sku00000004',
    ('ビルマチーク', 'A1'): 'r-sku00000005',
    ('ビルマチーク', 'B5'): 'r-sku00000006',
    ('ビルマチーク', 'B4'): 'r-sku00000007',
    ('ビルマチーク', 'B3'): 'r-sku00000008',
    ('ビルマチーク', 'B2'): 'r-sku00000009',
    ('ビルマチーク', 'B1'): 'r-sku00000010',
    ('チェリーウッド', 'A5'): 'r-sku00000011',
    ('チェリーウッド', 'A4'): 'r-sku00000012',
    ('チェリーウッド', 'A3'): 'r-sku00000013',
    ('チェリーウッド', 'A2'): 'r-sku00000014',
    ('チェリーウッド', 'A1'): 'r-sku00000015',
    ('チェリーウッド', 'B5'): 'r-sku00000016',
    ('チェリーウッド', 'B4'): 'r-sku00000017',
    ('チェリーウッド', 'B3'): 'r-sku00000018',
    ('チェリーウッド', 'B2'): 'r-sku00000019',
    ('チェリーウッド', 'B1'): 'r-sku00000020',
    ('ブラックウォルナット', 'A5'): 'r-sku00000021',
    ('ブラックウォルナット', 'A4'): 'r-sku00000022',
    ('ブラックウォルナット', 'A3'): 'r-sku00000023',
    ('ブラックウォルナット', 'A2'): 'r-sku00000024',
    ('ブラックウォルナット', 'A1'): 'r-sku00000025',
    ('ブラックウォルナット', 'B5'): 'r-sku00000026',
    ('ブラックウォルナット', 'B4'): 'r-sku00000027',
    ('ブラックウォルナット', 'B3'): 'r-sku00000028',
    ('ブラックウォルナット', 'B2'): 'r-sku00000029',
    ('ブラックウォルナット', 'B1'): 'r-sku00000030',
}

L字スタンドSKUマッピング

L_STAND_SKU_MAP = {
    ('ナチュラル', '2L'): 'r-sku00000001',
    ('ブラウン', '2L'): 'r-sku00000002',
    ('ダークブラウン', '2L'): 'r-sku00000002',
}

システムロジック

注文処理ロジック

  1. 注文データ取得
  2. Shopify API: 90日間の注文を取得、タグ「DD日」でフィルタリング
  3. 楽天API: 30日間の注文を取得、発送状況でフィルタリング
  4. 改善されたページネーション: すべてのページを確実に取得

  5. 出荷予定日算出

  6. Shopify: 注文日 + タグの日数(例:「2日」→ 注文日+2日)
  7. 楽天: 確認日 + 2日

  8. 商品分類

  9. 商品名・バリアント情報から商品タイプを判定
  10. チャイナフレーム、キャンバス木枠、L字スタンド、カレンダー&木製スタンドに分類

  11. 在庫調整

  12. スプレッドシート在庫表の該当セルを自動更新
  13. 楽天API在庫の自動反映
  14. 重複処理防止のためDBで処理済み注文を管理
  15. 部材条件マッピングベース: サイズ×色の組み合わせで正確な在庫管理

  16. 集計出力

  17. 出荷予定日別の注文件数・印刷枚数を集計
  18. CSVファイル出力
  19. Googleスプレッドシートへの自動反映

楽天部材情報抽出ロジック

variant_titleからの抽出

def extract_rakuten_size_and_color_from_sku(self, order_item):
    # variant_titleからサイズと色を抽出
    variant_title = order_item.get('variant_title', '')

    # サイズ抽出
    size_match = re.search(r'サイズ:([^(]+)\(', variant_title)
    if size_match:
        size = size_match.group(1).strip()

    # 色抽出
    color_match = re.search(r'カラー:([^\n]+)', variant_title)
    if color_match:
        color_info = color_match.group(1).strip()
        # 色情報から色を決定
        color = self.extract_color_from_info(color_info)

    return size, color

在庫調整対象外の判定

# variant_titleに色情報がない場合は在庫調整対象外
if not color or color == 'None':
    return None, None  # 在庫調整対象外

データベース構造

processed_orders テーブル

  • 処理済み注文の管理
  • 重複集計防止

inventory_adjustments テーブル

  • 在庫調整履歴の記録

material_conditions テーブル

  • 部材条件の管理
  • 条件タイプ、条件値、シート情報を格納

execution_logs テーブル

  • 実行ログの記録

注意事項

  • 本システムは本番環境での使用を想定しています
  • テスト環境での動作確認はENVIRONMENT=testで実行してください
  • API制限に注意し、適切な間隔での実行を心がけてください
  • 定期的なログ確認とデータベースのメンテナンスを推奨します
  • 設定ファイルはconfig/フォルダに集約されており、セキュリティ上適切に管理してください
  • variant_title対応: 楽天商品の色情報抽出はvariant_titleを使用
  • 部材条件: 新しいサイズ・色の組み合わせは部材条件に追加が必要
  • デバッグログ: 問題が発生した場合はデバッグログを確認して原因を特定

最新更新(2025年9月26日)

product_id_and_variantロジックの修正

  • 問題: Qooのチャイナフレーム部材条件で複数商品ID(8913272406326, 8877398229302)に対応していなかった
  • 原因: 従来のロジックでは最初の要素を商品ID、残りをvariant_titleパターンとして解釈していた
  • 修正: 条件値のすべての要素を商品IDとして扱い、いずれかと一致するかチェックするロジックに変更
  • 効果: 注文1861・1862(商品ID: 8877398229302)が正しくチャイナフレームとして認識されるようになった

sku_info_extractionマッチングロジックの修正

  • 問題: 楽天チャイナフレームの部材条件で、複数のサイズ・色を正しく解析できていなかった
  • 原因: condition_valueの解析ロジックが最後の値のみを取得していた
  • 修正: カンマ区切りの条件値を正しく配列として解析し、期待されるサイズ・色のリストを作成
  • 効果: 楽天チャイナフレームの在庫調整が正常に動作するようになった

Google Sheets動的検索の実装

  • 問題: チャイナフレームのGoogle Sheets更新で固定範囲検索を使用していた
  • 修正: L字スタンド・キャンバス木枠と同様の動的行検索ロジックを実装
  • 効果: チャイナフレームの在庫更新が正常に動作するようになった

データベーススキーマの修正

  • 問題: inventory_adjustmentsテーブルのスキーマとINSERT文が一致していなかった
  • 修正: record_inventory_adjustmentメソッドのINSERT文を実際のテーブルスキーマに合わせて修正
  • 効果: 「table inventory_adjustments has no column named part_name」エラーが解消された

楽天チャイナフレーム部材条件の設定

  • 追加: 楽天ストア用のチャイナフレーム部材条件をsku_info_extractionタイプで設定
  • 設定内容: variant_titleからサイズと色を抽出し、部材条件とマッチング
  • 効果: 楽天注文のチャイナフレームが正しく在庫調整されるようになった

トラブルシューティング

よくある問題

  1. 認証エラー
  2. .envファイルの認証情報を確認
  3. APIキーの有効期限を確認

  4. スプレッドシートアクセスエラー

  5. credentials.jsonファイルの存在確認
  6. Google Sheets APIの権限設定確認

  7. 在庫更新エラー

  8. SKUマッピングの確認
  9. 楽天APIのレスポンス確認
  10. 部材条件の設定確認

  11. 処理漏れ

  12. ページネーション処理が正常に動作しているか確認
  13. ログでページごとの取得状況を確認
  14. variant_titleからの色情報抽出が正常か確認

  15. 部材条件エラー

  16. 新しいサイズ・色の組み合わせが部材条件に定義されているか確認
  17. 条件タイプの優先順位が正しく設定されているか確認
  18. チャイナフレームの部材条件が全ストアに設定されているか確認
  19. キャンバス木枠の部材条件が全ストアに設定されているか確認

ログ確認

# エラーログのみ確認
grep "ERROR" inventory_sync.log

# 在庫調整対象の確認
grep "在庫調整対象" inventory_sync.log

# 部材消費の確認
grep "部材消費" inventory_sync.log

# デバッグログの確認
grep "DEBUG" inventory_sync.log

# 条件マッチングの確認
grep "条件チェック" inventory_sync.log

データベース確認

# 処理済み注文の確認
sqlite3 inventory_sync.db "SELECT COUNT(*) FROM processed_orders WHERE DATE(processed_at) = '$(date +%Y-%m-%d)';"

# 在庫調整履歴の確認
sqlite3 inventory_sync.db "SELECT COUNT(*) FROM inventory_adjustments WHERE DATE(adjusted_at) = '$(date +%Y-%m-%d)';"

# 部材条件の確認
sqlite3 inventory_sync.db "SELECT material_name, store_name, condition_type, condition_value FROM material_conditions ORDER BY material_name, store_name;"

# 特定の部材の条件確認
sqlite3 inventory_sync.db "SELECT * FROM material_conditions WHERE material_name = 'チャイナフレーム';"
sqlite3 inventory_sync.db "SELECT * FROM material_conditions WHERE material_name = 'キャンバス木枠';"

部材条件の追加

新しいサイズ・色の組み合わせが必要な場合:

INSERT INTO material_conditions (
    material_name, store_name, store_type, condition_type, condition_value, 
    sheet_name, sheet_row_start, sheet_row_end, sheet_col_type, sheet_col_size, sheet_col_stock
) VALUES (
    'チャイナフレーム', 'rakuten', 'rakuten', 'sku_info_extraction', 'サイズ,色', 
    '現在庫', 51, 70, 'A', 'C', 'G'
);

修正方法

部材条件の追加・修正

1. データベースで直接修正

# 部材条件の確認
sqlite3 inventory_sync.db "SELECT * FROM material_conditions WHERE material_name = 'キャンバス木枠';"
sqlite3 inventory_sync.db "SELECT * FROM material_conditions WHERE material_name = 'チャイナフレーム';"

# 新しい条件の追加
sqlite3 inventory_sync.db "INSERT INTO material_conditions (material_name, store_name, store_type, condition_type, condition_value, sheet_name, sheet_row_start, sheet_row_end, sheet_col_type, sheet_col_size, sheet_col_stock) VALUES ('キャンバス木枠', '新しいストア', 'shopify', 'product_name_pattern', '新しいパターン', '現在庫', 51, 70, 'A', 'C', 'G');"

# 条件の更新
sqlite3 inventory_sync.db "UPDATE material_conditions SET condition_value = '新しいパターン' WHERE id = 1;"

# チャイナフレームの部材条件追加(推奨)
sqlite3 inventory_sync.db "INSERT INTO material_conditions (material_name, store_name, store_type, condition_type, condition_value, sheet_name, sheet_row_start, sheet_row_end, sheet_col_type, sheet_col_size, sheet_col_stock) VALUES ('チャイナフレーム', 'PHOTOPRI', 'shopify', 'product_name_pattern', 'チャイナフレーム', '現在庫', 51, 70, 'A', 'C', 'G');"
sqlite3 inventory_sync.db "INSERT INTO material_conditions (material_name, store_name, store_type, condition_type, condition_value, sheet_name, sheet_row_start, sheet_row_end, sheet_col_type, sheet_col_size, sheet_col_stock) VALUES ('チャイナフレーム', 'Qoo', 'shopify', 'product_name_pattern', 'チャイナフレーム', '現在庫', 51, 70, 'A', 'C', 'G');"

2. コードでの修正

# material_conditionsテーブルの構造
# id: 主キー
# material_name: 部材名(例:キャンバス木枠)
# store_name: ストア名(例:artgraph, PHOTOPRI, Qoo, rakuten)
# store_type: ストアタイプ(例:shopify, rakuten)
# condition_type: 条件タイプ(例:product_name_pattern, sku_info_extraction)
# condition_value: 条件値(例:Canvas., キャンバス木枠張り)
# sheet_name: シート名(例:現在庫)
# sheet_row_start: 開始行(例:51)
# sheet_row_end: 終了行(例:70)
# sheet_col_type: タイプ列(例:A)
# sheet_col_size: サイズ列(例:C)
# sheet_col_stock: 在庫列(例:G)

SKUマッピングの修正

ウッド額縁SKUマッピング

# inventory_sync_allinone.py の WOOD_FRAME_SKU_MAP を修正
WOOD_FRAME_SKU_MAP = {
    ('色名', 'サイズ'): 'SKU番号',
    # 例:
    ('ビルマチーク', 'A5'): 'r-sku00000001',
}

L字スタンドSKUマッピング

# inventory_sync_allinone.py の L_STAND_SKU_MAP を修正
L_STAND_SKU_MAP = {
    ('色名', 'サイズ'): 'SKU番号',
    # 例:
    ('ナチュラル', '2L'): 'r-sku00000001',
}

デバッグログの追加

条件マッチングのデバッグ

# process_shopify_order_materials メソッドにデバッグログを追加
logger.info(f"[DEBUG] 条件チェック開始: material_name='{condition.get('material_name', '')}', condition_type='{condition.get('condition_type', '')}', condition_value='{condition.get('condition_value', '')}'")

# match_material_condition メソッドにデバッグログを追加
logger.info(f"[DEBUG] Shopifyマッチング詳細: product_title='{product_title}', variant_title='{variant_title}', product_type='{product_type}'")

重要なログメッセージ

  • [在庫調整対象]: 在庫調整対象として認識された注文
  • [在庫調整対象外]: 在庫調整対象外として処理された注文
  • [部材消費]: 部材消費として記録された処理
  • [在庫調整]: 実際の在庫調整処理
  • [DEBUG]: デバッグ情報(条件マッチングの詳細など)

デバッグログの確認

# 条件マッチングの詳細確認
grep "条件チェック開始" inventory_sync.log

# キャンバス木枠の処理確認
grep "キャンバス木枠" inventory_sync.log

# 部材消費の確認
grep "部材消費" inventory_sync.log

問題が発生した場合は、以下の手順で確認してください:

  1. ログファイル(logs/inventory_sync.log)の確認
  2. 環境変数の設定確認(config/.env
  3. API接続状況の確認
  4. データベースファイル(data/inventory_sync.db)の整合性確認

詳細な問題解決については、archive/docs/フォルダ内のドキュメントを参照してください。

クイックリファレンス
主要機能
  • 注文データ取得(Shopify・楽天)
  • 材料ベース在庫調整
  • ECサイト在庫同期
  • Lark通知送信
  • ロールバック機能
調整対象商品
  • チャイナフレーム
  • キャンバス木枠
  • L字スタンド
  • カレンダー&木製スタンド