DataSpiderでAgileWorksにつないでみた(1/2)（アドオン開発編）

## はじめに
こんにちは！すぎもんです:grinning:

いきなりですが、電子帳簿保存法というものをご存じですか？
いわゆるペーパーレスと言われる動きの背景にある法律で、ここ最近では請求書等の電子保存の義務化、なんてことも言われています。つまり、企業のワークフローなどにおける電子取引は今や必須になりつつあるのです。今回はそんなワークフローのDXを推し進めるサービスの一つであるAgileWorksとDataSpiderをつないでみようと思います！

今回は二部構成で記事を作成しました。後半記事はこちら↓↓↓↓↓です。
[DataSpiderでAgileWorksにつないでみた(2/2)（DataSpider設定編）](https://qiita.com/sugimon/items/3c55435132e7405ebd01)

## AgileWorksとは
AgileWorksとは、ATLED社が提供するワークフローシステムで、社内の業務効率化と生産性の向上を実現しています。AgileWorksはアドオン開発を行うことによって、RESTを利用したユーザーシステムとの連携が可能です！
今回は、DataSpiderと接続して、「書類情報の取得」をやってみようと思います！


AgileWorksのAPI（Published API）を利用するためには、窓口となるアドオンJavaプログラム（Bricklet）とAgileWorksServiceBus（ASB）の作成が必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/8100d9c2-61c6-fca0-fb94-bf0abd2648ca.png)

AgileWorks側の前提条件は下記の通りです。<strong> 
　・AgileWorksServiceBus（ASB）のサービスが実行されている
　・AgileWorksのアドオン開発環境の準備ができている
　・公開されているフォームがあり、フォームで作成した書類が１件以上存在する</strong>
　　※ASBを経由せずにBrickletを呼び出す方法もあるようですが今回は言及しません。

それでは、早速やっていきましょう！
## Bricklet（Javaプログラム）の作成
まず、Brikletの開発です。eclipseを起動します。
パッケージエクスプローラで、Brickletクラスを作成します。
今回は下記のクラス名にします。
<strong>クラス名　：　jp.atlet.agileworks.sample.DssTestBricklet</strong>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/6e06cade-b224-3509-cbcf-3a6640d5ba27.png)
作成したクラスに、メソッドを追加します。
今回はAgileWorks Service Bus（以降、ASB）経由で実行させるので、
*AsbCallRequestModel, AsbCallResponseModel* を引数としたメソッドを追加し、*@Procedure*アノテーションを付与します。PublishedAPIは、*DocServiceとBrickletLogger*を使用するので *@PapiInject*アノテーションで追加しています。

指定された「書類ID」と「フォームコード」を条件に、書類検索をして、「書類ID」,「書類状態」,「書類の申請ユーザのユーザコード」を返します。（※処理詳細は省略）
ソースコードは下記です。（ご参考）
```
public class DssTestBricklet {
	@PapiInject
	DocService docService;
	@PapiInject
	BrickletLogger logger;
	@Procedure
	
	public void getDocInfo(AsbCallRequestModel req, AsbCallResponseModel res) {
		
		
		long docId;
		String formCode;
		try {
			JSONObject jsonObj = new JSONObject(req.getMessage().getText());
			docId = Long.parseLong(jsonObj.getString("docId"));
			formCode = jsonObj.getString("formCode");
			
			// 書類検索用リクエストオブジェクト
			SelectDocRequestModel selectRequest = 
					docService.createRequestModel(SelectDocRequestModel.class);
			// 書類ビュー set
			selectRequest.getDocView().setFormCode(formCode);
			// 検索条件
			SelectDocConditionModel condition = selectRequest.getCondition();
			condition.setFormCode(formCode);
			condition.setDocId(docId);
			// 検索結果項目
			DocViewColumnModel colDocId = selectRequest.getDocView().getColumnList().add();
			colDocId.setType(EnumDocViewColumnType.DOC_ID);
			DocViewColumnModel colFlowStatus = selectRequest.getDocView().getColumnList().add();
			colFlowStatus.setType(EnumDocViewColumnType.FLOW_STATUS);
			DocViewColumnModel applyUser = selectRequest.getDocView().getColumnList().add();
			applyUser.setType(EnumDocViewColumnType.APPLY_USER_CODE);
			// 検索
			SelectResponseModel selectResponse = docService.selectDoc(selectRequest);
			if((EnumStatusType.SUCCESS).equals(selectResponse.getResultStatus().getStatus())) {
				// 結果をセット
				JSONObject resJson = new JSONObject();
				RecordListModel recordList = selectResponse.getResultSet().getRecordList();
				if(recordList.size() > 0) {
					for(RecordModel record : recordList) {
						EntryListModel entryList = record.getEntryList();
						resJson.put("docId", entryList.get(0).getValue());
						resJson.put("flowStatus", entryList.get(1).getValue());
						resJson.put("applyUserCode", entryList.get(2).getValue());				
					}
					
				}
				res.getMessage().setText(resJson.toString());
			}
			else {
				logger.error("検索エラー");
			}
			
		
		} catch (JSONException e) {
			// TODO 自動生成された catch ブロック
			logger.error(e.getMessage());
		}
	}
}
```


次に、Bricklet設定ファイル(bricklet.xml)を設定します。
[bricklet]-[resources]-bricklet.xml　に、今回作成したBrickletの情報を追加します。

（Brickletの見出しになる。任意の文字列）
　　caption属性　　：　`DSS Test` 
（Brickletの完全修飾クラス名）
　　classname属性　：　`jp.atlet.agileworks.sample.DssTestBricklet`
（開発元ベンダーの名称）
　　vendername属性 ：　`SAISON` 
（Brickletのバージョン番号）
　　version属性　　：　`1.0`

下記のように設定しました。
`<bricklet caption="DSSTest" classname="jp.atlet.agileworks.sample.DssTestBricklet" vendername="SAISON" version="1.0"/>`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/02020274-b6f4-c32b-8d36-fa257b2c6bf6.png)
続いて、デプロイ用のZIPアーカイブファイルを作成します。
[bricklet]-[build]-builud.xmlを右クリック、[実行]-[Antビルド]を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/06f34b19-90f3-ab4d-74d7-813addb9e28a.png)
ビルド後に、[deploy]-[bricklet]ディレクトリをリフレッシュ（F5）すると、zipファイルが作成されていることを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/73841200-8fdc-8906-5ab4-4e25305e5bd9.png)
`briklet-dss.zip` というZIPファイルが作成されていることが、確認できました。

## Agileworksの設定 （ZIPファイルのデプロイ）
ZIPファイルを作成したので、次はデプロイをします。

AgileWorks管理者サイトにログインし、[アドオン管理]-[アドオン設定]-[Bricklet]-[デプロイ]で、zipファイルをアップロードします。

::: note info 
ユーザー名の「イニシャルのアイコン」を選択し、「アカウントID」を取得しておきます。後で使うのでどこかに保存しておきましょう！
:::
Brickletデプロイのウィンドウが表示されたら、「ファイルを選択」で、作成したZIPファイルを選択し、「デプロイ」をクリックしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/92a5add8-ed6c-4c1d-c407-2e7bf2079e42.png)
今回作成したDSS TESTがデプロイされました。
Bricklet.xmlで設定した内容が表示されていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/a4811820-d089-c8a6-a813-195fd8e42783.png)
Javaプログラム（Bricklet）の準備ができました。

## AgileWorksServiceBus（ASB）の設定
次に、AgileWorksServiceBus（ASB）の設定を行います。
今回は「sa1ディレクトリ」を利用して、ASB設定を行います。

[sa1]-[resurces]-[asb-sa.xml]をダブルクリックして、サービスアセンブリ設定画面を開きます。
下記の通り設定しました。

　　コード　　　：　`dss-test`
　　名称　　　　：　`dss-test`
　　バージョン　：　`任意`
　　ベンダー　　：　`任意`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/102b5435-dac7-f118-4bdd-832f011fdcb8.png)

次に、ルートを追加します。
「ルート追加」をクリックして、新規サービスルートの追加を行います。

コード、名称を入力しルート種別は「HTTP受信ルート」を選択し、OKを選択します。
開始ノードが追加されます。このノードは特に変更しません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/b0cfc198-f4d8-1a11-80c5-b6cbd9527b37.png)

この設定で、`http://｛ASBサーバのホスト}:7501/dss-test/testGetDocInfo/`というURLで、ASBのHTTP受信受付ができるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/06078497-c92b-e46b-6875-2073848cfffb.png)
続けてBrickletを実行するためのBricklet呼出ノードを追加します。「ノードの追加」をクリックし、コード`bricklet`、名称`GetDocInfo Bricklet`、ノード種別`Bricklet呼出`を選択し、OKします。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/b8b39715-6ccb-c63d-4418-f1d7d14f2d4f.png)

Bricklet呼出ノードのプロパティを、下記の通りに変更して保存します。

　　クラス名　　：　`jp.atlet.agileworks.sample.DssTestBricklet`
　　メソッド名　：　`getDocInfo`

AgileWorksServiceBus（ASB）のデプロイ用にZIPファイルを作成します。
[sa1]-[build]-build.xmlを、Ant実行すると、プロジェクト直下の[deploy]-[asb]フォルダ下に、「sa1-1.0.0.zip」という名称のZIPファイルが配置されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/175c68f2-f755-a6d4-3e0b-590af82a89f7.png)

あと少しです:point_up:

作成したzipファイルをアップロードし、サービスアセンブリをAgileWorksにデプロイします！
管理サイトにログインし、「アドオン管理」-「アドオン設定」-「ASB設定」-「新規」-「新規アップロード」でZIPファイルをアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/23032306-a279-82f4-8fa4-452d238ae9b6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/9422bc85-81cd-a6b6-6b8a-b648502522c9.png)
dss-testのサービスアセンブリが追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/09eab97b-6b89-cf6f-b403-95f8d3e9a333.png)
AgileWoks側の準備として、接続確認で使用するデータを確認します。AgileWorksで作成した任意の書類を開き、書類IDとフォームコードを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/b4ce9fe1-a29d-f905-4985-b66f30b203d5.png)

今回使用する書類IDは`20`、フォームコードは`keiyaku_form`です。
以上でAgileWorksの準備は完了です。

少々長くなってきましたので・・
[次回の記事](https://qiita.com/sugimon/items/3c55435132e7405ebd01)で、DataSpider側の設定をやっていきます！

## 最後に
今回は、AgileWorksのAPIを利用するために、「アドオンJavaプログラム（Bricklet）の作成」と「AgileWorksServiceBus（ASB）の作成」をやってみました！Javaプログラムの作成が必要になるので、ひと手間必要な連携ではありますが、皆さんの何かの参考になれば幸いです！

少々長くなってしまいましたので、後編として別記事でDataSpider設定について投稿します。こちらも併せてご一読ください！
[DataSpiderでAgileWorksにつないでみた(2/2)（DataSpider設定編）](https://qiita.com/sugimon/items/3c55435132e7405ebd01)

このブログでは、今後も様々な実際にやってみた検証や、日々の業務で学んだり思いついた開発Tipsなどを投稿していきたいと思います！

お読みいただきありがとうございました。それでは、また！