Laravel:NextEngineAPIで登録在庫の数を社内販売管理の個数に変更する【その2】

Laravel:NextEngineAPIで登録在庫の数を社内販売管理の個数に変更する【その2】

Laravel:NextEngineAPIで登録在庫の数を社内販売管理の個数に変更する【その2】

前回までの関連記事はこちら『access_token取得』『在庫変更の段取りを考える

今回は在庫更新のScriptを書きながら少々の解説をしたいと思います。
ただし、実際のScriptは色々仕込んだ事もあり『600行を超え』になってしまったので省略しながら書いていきます。

作成していて分かったNextEngineAPIの注意点

在庫更新関連で利用したAPIのみですが、幾つか注意すべきことがありました。

  1. refresh_tokenに値を入れているとaccess_tokenは自動的に変更してくれるが、タイミングが読めない
  2. CSVデータではスペースを「レコードの切り替わり」と判断される
  3. 商品マスタアップロードの成功が【更新の成功】ではない

項目1について

有効なaccess_tokenを持っていれば「token取得」から動かす必要はないのでSQLにtokenの格納庫を作成しました。で、有効期間内であれば保存しているtoken情報を使ってAPI接続しようと考えていたのですが問題が発生しました。

有効期間内のtokenであるはずなのにAPI接続で拒否られる

理由はrefresh_tokenが気を利かせてくれたことでした。
まだ有効期間内だったのですが、どうやらaccess_tokenを再発行してくれたようで、2つのtokenの内容と有効期限か変わっていました。何かのトリガーがあるのだと思いますがそこまでは解明できていません。

なので、APIアクセスの度にtokenと有効期限を返してくれるので【有効期限が変わっていたらSQLを変更】するように仕掛けました。

項目2について

社内システムにあってネクストエンジンに未登録の商品があるので、在庫調整の際に一緒に追加してしまおうと模索。そうしたところ「9項目の1行目に対してレコードが5項目しかない」と怒られました。

商品登録の必須項目『商品名』にスペースが入っているものが【次レコード送り】と認識さているようです。

項目3について

ネクストエンジンでは、APIアップロードと同時に適用が入りません。あくまでキューに入れるだけです。
なので『アップロード』と『値の適用』とは別物と考える必要があります。
『値の適用』でエラーが起こるとしても、アップロードでそのエラーを捉えることはできません。
エラーの原因を知りたい場合は【アップロードキュー検索API】を利用して欲しいとの事でした。

在庫数更新のScript

■全体的な流れ

  1. 有効な access_tokenがあるか確認
    ある場合 => 6  / ない場合 => 2
  2. refresh_tokenの有効性を確認
    期限切れの場合 => 4  / 期限内の場合 => 3
  3. refresh_tokenでaccess_tokenを再発行
    成功の場合 => 6  / 失敗の場合 => 4
  4. ログインしてuidなどを取得
    成功の場合 => 5  / 失敗の場合 => エラー吐いて終了
  5. uidからaccess_tokenを取得
    成功の場合 => 6  / 失敗の場合 => エラー吐いて終了
  6. access_tokenを使ってAPI接続
    ※ $selecterCodeに沿った各処理へ投げる

上記 1~5については『access_token取得』で書いたので省略します。

お~長い!それも一般的に使うスクリプトと違うし。ほんと個人的なメモですね。
申し訳ない。

大まかな流れは『在庫変更の段取りを考える』でメモした通りです。

ちょっとしたスクリプト解説

393行目~405行目

まず最後のfunctionの部分、これはcurlのPOSTが多いので共通化しておいてあるものです。
このスクリプト内ではselfで呼び出してますが、実際には共通処理をまとめたLibrary に入れてあり『いろんな所』から呼び出して使ってます。

ネクストエンジンAPIではこの中の400行目【SSL証明書】が必須なので気をつけなきゃいけません。

9行目~20行目

selecterCodeという引数でその後のアクションを分けています。
理由はtoken取得までは同じ動きをするから。
スクリプトの例でいえば、引数=1の場合は在庫更新を起動、引数=99の場合はキューの調査を動かします。

23行目~42行目

このfunctionは在庫更新の動作を5パートに分けて動かしています。

  1. ネクストエンジンの商品マスタAPIを動かし、MySQLテンポラリテーブルに格納【30行目】
  2. ネクストエンジンの在庫マスタAPIを動かし、登録したテンポラリテーブルのstockカラムに格納【32行目】
  3. 社内システムから有効な商品(ネクストエンジンに登録する商品)の在庫数をリストで抽出【34行目】
  4. テンポラリテーブルのstockカラムと照らし合わせ更新用在庫数を登録、テンポラリにない場合は情報追加【37行目】
  5. テンポラリテーブルを参照し、変更のあったレコードをアップロード【39行目】

それぞれのコードのJUMP先は下のようになっています。

  • 44行目~108行目:30行目のコードの着地点。
  • 110行目~163行目:32行目のコードの着地点。
  • 165行目~299行目:34行目のコードの着地点。
  • 302行目~348行目:37行目のコードの着地点。
  • 351行目~369行目:39行目のコードの着地点。

371行目~390行目

selecterCode(引数)=99で読み込みを行うアップロードキューの実行結果取得API。
期間指定を毎回行うのも面倒なので、昨日~本日の値を取ってくるように指示しています。

まとめ

これで在庫数更新自体は機能したのですが、問題も発生。

250レコード以上の登録ができない…。

ん~、なんでだろう。

ネクストエンジンさんにお聞きしたところ、一括登録の制限と言う事ではなさそう。
となると、作成したCSVレコードのどこかが悪いんだろうけど…現状原因不明です。

理由が判明したら別途記事書いて記録しておこう。