SlideShare a Scribd company logo
ソーシャル機能を取り入れた
エンタープライズアプリケーション
チームスピリットのご紹介




                倉谷 彰
          デジタルコースト株式会社
              研究開発グループ
                 エンジニア
デジタルコーストとは

         を組み込んだ、
ソーシャル・ワークフォースマネジメント・サービス

                                       を開発・提供している会社です。




1            Copyright © DigitalCoast Inc. All Rights Reserved.   2012/7/30
とは
                                                                                            デモを
ビジネスで起こる全ての活動をタイムラインで記録                                                                     ご覧ください
                                                                                     勤怠管理
行動を記録




                                                タイムライン
                                                                                             プロジェクト
                                                                                              工数管理




                                                                                     経費精算
     Project A   移動 Project B


            実労働時間



 2                              Copyright © DigitalCoast Inc. All Rights Reserved.            2012/7/30
少し技術的なお話
ソーシャル・エンタープライズを実現する業務アプリの作り方
チームスピリットのアーキテクチャ



      勤怠管理                                                             認証


    プロジェクト工数管理                                                        Chatter


                                                                      権限管理
      経費精算

                                                                承認プロセス


                                                       レポート/ダッシュボード


    業務に関連する機能                                                汎用的な機能


4                Copyright © DigitalCoast Inc. All Rights Reserved.             2012/7/30
例えば、Chatter




              Chatter投稿




5             Copyright © DigitalCoast Inc. All Rights Reserved.   2012/7/30
コードはどうなっているか?
モバイル                                                              Force.com
       { “time” : ”2012/07/27”,
         “feed” : “今日は○○社の・・・”,                                   public with sharing class TxsActivityLogic {
         “latitude” : 35.684337,                                    public static void insertActivity(
         “longitude” : 139.739649                                       Map<String,Object> r, RestRequest req) {
         “placeId” : “WGS84”,                                           Map<String, String> p = req.params;
         “placeName” : “デジタルコースト・・・” }
                                                                        String s = p.get('time');
                                                Force.com
                                                                        DateTime tim = TxsUtil.now();
                                                                        if(s != null)
               REST                                                         tim = DateTime.valueOf(s);
              リソース
                                                                        TxsLog__c log = new TxsLog__c(TargetTime__c=tim);
                    クラス                                                 log.Status__c = null;
                  TxsActivity                                           ・・・(位置情報や画像をレコードにセットする)

                                               行動ログ                     String feed = p.get('feed');
                                                                        if(feed != null) {
                                               TxsLog
                                                                            FeedItem post = new FeedItem();
                             クラス                                            post.ParentId = UserInfo.getUserId();
                           TxsActivity                                      post.Body = feed;                        Chatter投稿
                             Logic                                          post.Type = 'TextPost';
                                                                            insert post;

                                                                            log.FeedId__c = post.Id;
                                                                        }

                                                                        insert log;            行動ログレコード追加
                                                                        r.put('id', log.Id);
                                                                     }
                                                                     ・・・


  6                                      Copyright © DigitalCoast Inc. All Rights Reserved.                         2012/7/30
例えば、承認プロセス

                                 承認プロセスの設定




            承認申請




7       Copyright © DigitalCoast Inc. All Rights Reserved.   2012/7/30
コードはどうなっているか?


    Force.com側
     // id : 承認申請対象とするオブジェクトのID
     // comment : 承認申請時のコメント
     // approver : 承認プロセスのID
     ・・・
     Approval.ProcessSubmitRequest req1 = new             Approval.ProcessSubmitRequest();

     req1.setObjectId(id);
     req1.setComments(comment);

     if(approver != null) {
         req1.setNextApproverIds(new Id[]{ approver });
     }

     Approval.ProcessResult result = Approval.process(req1);
     ・・・




8                                 Copyright © DigitalCoast Inc. All Rights Reserved.         2012/7/30
モバイル・アプリケーション
モバイル側                                                          クラウドサービス側




        Salesforce Toolkit
        for Appcelarator                                         OAuth2.0




                                       JSON
                             { “time” : ”2012/07/27”,
                               “feed” : “今日は○○社の・・・”,
                                                                Apex REST
                               “latitude” : 35.684337,
                               “longitude” : 139.739649
                               “placeId” : “WGS84”,
                               “placeName” : “デジタルコースト・・・” }




 9                           Copyright © DigitalCoast Inc. All Rights Reserved.   2012/7/30
OAuth2.0

     Force.com側




10                Copyright © DigitalCoast Inc. All Rights Reserved.   2012/7/30
Apex REST:コードはどうなっているか?
                   RestResourceアノテーションを利用することで簡単に
                    RESTリソースを公開できます
モバイル側                                                                        Force.com側
postBtn.addEventListener(‘click’, function() {                              @RestResource(urlMapping='/txsapi2/activity/*')
  ・・・                                                                       global with sharing class TxsActivity {
  var oauthJson = JSON.parse(oauthData);                                       @HttpPost
                                                                               global static void doPost(RestRequest req, RestResponse res) {
     var uri = '/services/apexrest/txsapi2/activity/?';                           Map<String,Object> r = new Map<String,Object>();
     uri += 'time=' + TSX.timeAsString();                                         try {
     uri += '&feed=' + (commentText.value ? commentText.value : '');                 String id = TxsUtil.getParamId(req);
     var restUrl = encodeURI(                                                        if(id != null)
        Ti.Network.decodeURIComponent(oauthJson.instance_url) +
                                                                                            TxsActivityLogic.updateActivity(r, req, id);
        uri);
                                                                                     else
                                                                                            TxsActivityLogic.insertActivity(r, req);
     var xhr = Ti.Network.createHTTPClient();
     xhr.onload = function() {
                                                                                     r.put('success', true);
        var res = JSON.parse(this.responseText);                                  }
        // Callbackでの処理                                                           catch(Exception e) { TxsUtil.setException(r, e); }
        ・・・                                                                       res.responseBody = Blob.valueof(JSON.serialize(r));
     };                                                                        }

     xhr.open(“GET”, restUrl, true);                                         @HttpGet
     xhr.setRequestHeader(                                                   global static void doGet(RestRequest req, RestResponse res) {
         “Authorization”, “OAuth ” +                                            Map<String,Object> r = new Map<String,Object>();
         Ti.Network.decodeURIComponent(oauthJson.access_token));            ・・・
     xhr.setRequestHeader("Content-Type", "application/json");
     xhr.send();
     ・・・
};


           11                                          Copyright © DigitalCoast Inc. All Rights Reserved.                      2012/7/30
モバイルとForce.comアプリの役割分担
モバイル側                                   クラウドサービス側

                                         OAuth2.0
              画面制御


                                                                                                      外部
          Salesforce Toolkit            RESTリソース                  ロジック                                Web
           for Appcelarator                TxsActivity
                                                                                                      サービス


                                        RESTリソース                  ロジック              駅探経路探索エンジン
                                          TxsExpense2




                                        RESTリソース                  ロジック               勤怠計算エンジン
                                        TxsWorkTimeLogic


   サーバ側にロジックを集約
    複雑な勤怠計算や経路探索はサーバ側に任せた

   クライアント側は画面制御に特化
    短期間でプロトタイプを開発し、試作を繰り返
    すことができた




    12                         Copyright © DigitalCoast Inc. All Rights Reserved.                2012/7/30
最後に
ソーシャル化した企業はどのように変わったか?
業務アプリをソーシャル化するということ




      エンジニアのちょっとしたアイデアで
     お客様の業務が大きく変えることができる



14         Copyright © DigitalCoast Inc. All Rights Reserved.   2012/7/30
15   Copyright © DigitalCoast Inc. All Rights Reserved.   2012/7/30

More Related Content

夏サミ2012 [A-2]ソーシャルプラットフォームを使った業務アプリ開発の現場(ソーシャル機能を取り入れたエンタープライズアプリケーション)

  • 1. ソーシャル機能を取り入れた エンタープライズアプリケーション チームスピリットのご紹介 倉谷 彰 デジタルコースト株式会社 研究開発グループ エンジニア
  • 2. デジタルコーストとは を組み込んだ、 ソーシャル・ワークフォースマネジメント・サービス を開発・提供している会社です。 1 Copyright © DigitalCoast Inc. All Rights Reserved. 2012/7/30
  • 3. とは デモを ビジネスで起こる全ての活動をタイムラインで記録 ご覧ください 勤怠管理 行動を記録 タイムライン プロジェクト 工数管理 経費精算 Project A 移動 Project B 実労働時間 2 Copyright © DigitalCoast Inc. All Rights Reserved. 2012/7/30
  • 5. チームスピリットのアーキテクチャ 勤怠管理 認証 プロジェクト工数管理 Chatter 権限管理 経費精算 承認プロセス レポート/ダッシュボード 業務に関連する機能 汎用的な機能 4 Copyright © DigitalCoast Inc. All Rights Reserved. 2012/7/30
  • 6. 例えば、Chatter Chatter投稿 5 Copyright © DigitalCoast Inc. All Rights Reserved. 2012/7/30
  • 7. コードはどうなっているか? モバイル Force.com { “time” : ”2012/07/27”, “feed” : “今日は○○社の・・・”, public with sharing class TxsActivityLogic { “latitude” : 35.684337, public static void insertActivity( “longitude” : 139.739649 Map<String,Object> r, RestRequest req) { “placeId” : “WGS84”, Map<String, String> p = req.params; “placeName” : “デジタルコースト・・・” } String s = p.get('time'); Force.com DateTime tim = TxsUtil.now(); if(s != null) REST tim = DateTime.valueOf(s); リソース TxsLog__c log = new TxsLog__c(TargetTime__c=tim); クラス log.Status__c = null; TxsActivity ・・・(位置情報や画像をレコードにセットする) 行動ログ String feed = p.get('feed'); if(feed != null) { TxsLog FeedItem post = new FeedItem(); クラス post.ParentId = UserInfo.getUserId(); TxsActivity post.Body = feed; Chatter投稿 Logic post.Type = 'TextPost'; insert post; log.FeedId__c = post.Id; } insert log; 行動ログレコード追加 r.put('id', log.Id); } ・・・ 6 Copyright © DigitalCoast Inc. All Rights Reserved. 2012/7/30
  • 8. 例えば、承認プロセス 承認プロセスの設定 承認申請 7 Copyright © DigitalCoast Inc. All Rights Reserved. 2012/7/30
  • 9. コードはどうなっているか? Force.com側 // id : 承認申請対象とするオブジェクトのID // comment : 承認申請時のコメント // approver : 承認プロセスのID ・・・ Approval.ProcessSubmitRequest req1 = new Approval.ProcessSubmitRequest(); req1.setObjectId(id); req1.setComments(comment); if(approver != null) { req1.setNextApproverIds(new Id[]{ approver }); } Approval.ProcessResult result = Approval.process(req1); ・・・ 8 Copyright © DigitalCoast Inc. All Rights Reserved. 2012/7/30
  • 10. モバイル・アプリケーション モバイル側 クラウドサービス側 Salesforce Toolkit for Appcelarator OAuth2.0 JSON { “time” : ”2012/07/27”, “feed” : “今日は○○社の・・・”, Apex REST “latitude” : 35.684337, “longitude” : 139.739649 “placeId” : “WGS84”, “placeName” : “デジタルコースト・・・” } 9 Copyright © DigitalCoast Inc. All Rights Reserved. 2012/7/30
  • 11. OAuth2.0 Force.com側 10 Copyright © DigitalCoast Inc. All Rights Reserved. 2012/7/30
  • 12. Apex REST:コードはどうなっているか?  RestResourceアノテーションを利用することで簡単に RESTリソースを公開できます モバイル側 Force.com側 postBtn.addEventListener(‘click’, function() { @RestResource(urlMapping='/txsapi2/activity/*') ・・・ global with sharing class TxsActivity { var oauthJson = JSON.parse(oauthData); @HttpPost global static void doPost(RestRequest req, RestResponse res) { var uri = '/services/apexrest/txsapi2/activity/?'; Map<String,Object> r = new Map<String,Object>(); uri += 'time=' + TSX.timeAsString(); try { uri += '&feed=' + (commentText.value ? commentText.value : ''); String id = TxsUtil.getParamId(req); var restUrl = encodeURI( if(id != null) Ti.Network.decodeURIComponent(oauthJson.instance_url) + TxsActivityLogic.updateActivity(r, req, id); uri); else TxsActivityLogic.insertActivity(r, req); var xhr = Ti.Network.createHTTPClient(); xhr.onload = function() { r.put('success', true); var res = JSON.parse(this.responseText); } // Callbackでの処理 catch(Exception e) { TxsUtil.setException(r, e); } ・・・ res.responseBody = Blob.valueof(JSON.serialize(r)); }; } xhr.open(“GET”, restUrl, true); @HttpGet xhr.setRequestHeader( global static void doGet(RestRequest req, RestResponse res) { “Authorization”, “OAuth ” + Map<String,Object> r = new Map<String,Object>(); Ti.Network.decodeURIComponent(oauthJson.access_token)); ・・・ xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(); ・・・ }; 11 Copyright © DigitalCoast Inc. All Rights Reserved. 2012/7/30
  • 13. モバイルとForce.comアプリの役割分担 モバイル側 クラウドサービス側 OAuth2.0 画面制御 外部 Salesforce Toolkit RESTリソース ロジック Web for Appcelarator TxsActivity サービス RESTリソース ロジック 駅探経路探索エンジン TxsExpense2 RESTリソース ロジック 勤怠計算エンジン TxsWorkTimeLogic  サーバ側にロジックを集約 複雑な勤怠計算や経路探索はサーバ側に任せた  クライアント側は画面制御に特化 短期間でプロトタイプを開発し、試作を繰り返 すことができた 12 Copyright © DigitalCoast Inc. All Rights Reserved. 2012/7/30
  • 15. 業務アプリをソーシャル化するということ エンジニアのちょっとしたアイデアで お客様の業務が大きく変えることができる 14 Copyright © DigitalCoast Inc. All Rights Reserved. 2012/7/30
  • 16. 15 Copyright © DigitalCoast Inc. All Rights Reserved. 2012/7/30