プロセス管理アクション実行時のイベントでAPI実行する際の挙動について

実現したいこと

プロセス管理アクション実行時に発火する「 app.record.detail.process.proceed 」イベント内で、

次に変更されるステータス「event.nextStatus.value」の内容によっていくつかのAPI処理行う実装をしたいと考えています。

プロセス管理アクションのパターンは以下のパターンとなっています。

「未確認」から「受注確認依頼中」

「受注確認依頼中、受注確認再依頼中」から「受注確認済み」

「受注確認依頼中、受注確認再依頼中」から「差戻し」

「受注確認済み」から「受注データ修正中」

「差戻し」から「受注確認再依頼中」

「受注データ修正中」から「受注確認再依頼中」

 

発生した状況

1.「未確認」から「受注確認依頼中」に変更

2.「受注確認依頼中」から「差戻し」に変更

上記の操作を行った際、

1の操作でエラーチェック連携が実行されますが、

2の操作時に通常連携が実行されてしまいます。

 

問題点

以下に記載しますコードの実装で動作を確認した際、多くの場合で正常に想定した動作をしているようなのですが、

稀に「受注確認依頼中」から「差戻し」のアクションを実行した際に

「event.nextStatus.value」が「受注確認済」の際に行われる処理が行われてしまうことがあります。

 

エラー情報

この症状が発生した際、エラーは何も発生していません。

記録用に用意している「APIログ」のフィールドに何も記録されず、

アラート、例外も発生せずにAPIが呼ばれています。

API側のログを確認したところ、リクエスト、レスポンス共に正常なパラメータとなっていました。

 

APIが呼ばれる際には何かしらの記録が残るように考えて実装しておりますが

なぜ記録が残らずAPIが呼ばれてしまうか原因を特定することができていません。

解決策についてご教示いただけますと幸いです。

何卒よろしくお願い申し上げます。

 

利用しているソースコードの一部抜粋

  kintone.events.on([‘app.record.detail.process.proceed’], async (event) => {
    console.log(“プロセス更新”);
    const { record } = event;
    const nextStatus = event.nextStatus.value;
    let uriageApiRes;
    let renkeiFlag;
    // 0 通称連携
    // 1 エラーチェックモード
    // 2 受注取り消し

    try {
      const params = {
        app: ${customerAppId},
        id: ${record.顧客レコード番号.value},
      };
      const customer = await kintone.api(kintone.api.url(‘/k/v1/record.json’, true), ‘GET’, params);
      const customerRecord = customer.record;

      if (nextStatus === ‘受注確認依頼中’ || nextStatus === ‘受注確認再依頼中’) {
        console.log(“エラーチェック連携”);
        record.APIログ.value = ${record.APIログ.value}[エラーチェックモード]${thisDateTime(new Date())};
        renkeiFlag = ‘1’;
        uriageApiRes = await callUriageApi(record, customerRecord, renkeiFlag, nextStatus);
        record.APIログ.value = uriageApiRes ?
          ${record.APIログ.value}■params:${uriageApiRes.ApiParams.value}■response:${JSON.stringify(uriageApiRes.ApiResponse.value)}}
          : ${record.APIログ.value}API連携失敗;
        if (!uriageApiRes) {
          return false;
        }
      } else if (nextStatus === ‘受注データ修正中’) {
        console.log(“プレゼン連携”);
        renkeiFlag = ‘2’;
        if ((record.求人売上No.value || record.その他売上No.value)) {
          record.APIログ.value = ${record.APIログ.value}[プレゼン]${thisDateTime(new Date())};
          uriageApiRes = await callUriageApi(record, customerRecord, renkeiFlag, nextStatus);
          record.APIログ.value = uriageApiRes ?
            ${record.APIログ.value}■params:${uriageApiRes.ApiParams.value}■response:${JSON.stringify(uriageApiRes.ApiResponse.value)}}
            : ${record.APIログ.value}API連携失敗;
          if (!uriageApiRes) {
            return false;
          }
        }
      } else if (nextStatus === ‘受注確認済’) {
        console.log(“通常連携”);

        record.APIログ.value = ${record.APIログ.value}[通常連携]${thisDateTime(new Date())};
        renkeiFlag = ‘0’;
        uriageApiRes = await callUriageApi(record, customerRecord, renkeiFlag, nextStatus);
        record.APIログ.value = uriageApiRes ? 
        ${record.APIログ.value}■params:${uriageApiRes.ApiParams.value}■response:${JSON.stringify(uriageApiRes.ApiResponse.value)}}
        : ${record.APIログ.value}API連携失敗;
        if (!uriageApiRes) {
          return false;
        } else {
          record.ステータス.value = uriageApiRes.ステータス.value;
          record.求人売上No.value = uriageApiRes.求人売上No.value;
          record.その他売上No.value = uriageApiRes.その他売上No.value;
          record.原稿No.value = uriageApiRes.原稿No.value;

          }
        }
      }
    }
    catch (e){
      alert(e);
      return false;
    }
    return event;
  });

 

  ////////////////////////////// API実行関数 ///////////////////////////
  let callUriageApi = async (record, customerRecord, renkeiFlag, nextStatus) => {
    const isUriageData = (record.求人売上No.value || record.その他売上No.value);

    const data = record\_id=${record.$id.value}&type=${isUriageData ? '2' : '1'}&error\_check\_mode=${(renkeiFlag === '2' && nextStatus === '受注データ修正中') ? '0' : renkeiFlag};     let errorLog = [通信前リクエスト]■request:${data};     return kintone.proxy(url, 'POST', headers, data).then((response) =\> {       console.log(response[0]);       if (response[1] !== 200) {         errorLog = ${errorLog}[ステータスコード:${response[1]}]■response:${response};         const fixedMessage = '連携に失敗しました。以下のエラー内容を運用管理者に連絡してください。';         try {           prompt(fixedMessage, ${JSON.parse(response[0]).message}${errorLog}`);
        } catch {
          prompt(fixedMessage, errorLog);
        }
        return false;
      }

      const resData = JSON.parse(response[0]);

      const updateData = {
        ステータス: {
          value: record.ステータス.value = nextStatus,
        },
        求人売上No: {
          value: resData.urikanri_no,
        },
        その他売上No: {
          value: resData.sonota_urikanri_no,
        },
        原稿No: {
          value: resData.genko_no,
        },
        ApiParams: {
          value: data,
        },
        ApiResponse: {
          value: response,
        },
      };

      return updateData;
    }).catch(function(error){
      throw ‘kintone.proxyで例外が発生しました。’;
    });
  };

サラッと読んで、「この症状」というのをちょっと理解することができなかったのでなんとなくですが

 

>「受注確認依頼中」から「差戻し」のアクションを実行した際に「event.nextStatus.value」が「受注確認済」の際に行われる処理が行われてしまうことがあります。

処理が終わる前にreturn event;されて次のステータスに進んでいるんですかね?
return event;にブレークポイント張ったうえで、1行ずつ止めながらやってみると良いかもしれません。
※1行ずつ進めているはずなのにreturn event;に飛んだりすると非同期処理がうまく行っていないはず。

 

>APIが呼ばれる際には何かしらの記録が残るように考えて実装しておりますが
なぜ記録が残らずAPIが呼ばれてしまうか原因を特定することができていません。

記録を残す部分ってconsole.log()でしょうか?console.logはreturn eventまで到達すると画面が更新されてたぶん残らない・・ので1行ずつ止めながらconsole.log()見ると良いかもしれません。

らいと様

 

貴重なご意見ありがとうございます。

ブレークポイントを設置して追っていくのが原因の解明につながりそうです。

発生する確率は低いですが気長に調べていこうと思います。

ありがとうございました。

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。