夏サミ2012...

Post on 03-Nov-2014

792 Views

Category:

Documents

5 Downloads

Preview:

Click to see full reader

DESCRIPTION

2012年7月27日に行われた「Developer [Social Enterprise] Summit」(通称:夏サミ)のA-2ブレイクアウトセッションの中で発表した講演資料です。

TRANSCRIPT

ソーシャル機能を取り入れた

エンタープライズアプリケーション チームスピリットのご紹介

倉谷 彰

デジタルコースト株式会社

研究開発グループ

エンジニア

デジタルコーストとは

1 2012/8/11 Copyright © DigitalCoast Inc. All Rights Reserved.

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

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

2012/8/11 Copyright © DigitalCoast Inc. All Rights Reserved. 2

勤怠管理

プロジェクト

工数管理

経費精算

タイムライン

行動を記録

デモを ご覧ください

とは

実労働時間

Project A Project B 移動

ビジネスで起こる全ての活動をタイムラインで記録

少し技術的なお話

ソーシャル・エンタープライズを実現する業務アプリの作り方

チームスピリットのアーキテクチャ

2012/8/11 Copyright © DigitalCoast Inc. All Rights Reserved. 4

認証

権限管理

Chatter

承認プロセス

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

勤怠管理

プロジェクト工数管理

経費精算

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

例えば、Chatter

2012/8/11 Copyright © DigitalCoast Inc. All Rights Reserved. 5

Chatter投稿

コードはどうなっているか?

2012/8/11 Copyright © DigitalCoast Inc. All Rights Reserved. 6

public with sharing class TxsActivityLogic { public static void insertActivity( Map<String,Object> r, RestRequest req) { Map<String, String> p = req.params; String s = p.get('time'); DateTime tim = TxsUtil.now(); if(s != null) tim = DateTime.valueOf(s); TxsLog__c log = new TxsLog__c(TargetTime__c=tim); log.Status__c = null; ・・・(位置情報や画像をレコードにセットする) String feed = p.get('feed'); if(feed != null) { FeedItem post = new FeedItem(); post.ParentId = UserInfo.getUserId(); post.Body = feed; post.Type = 'TextPost'; insert post; log.FeedId__c = post.Id; } insert log; r.put('id', log.Id); } ・・・

Force.com

行動ログ TxsLog

クラス TxsActivity

クラス TxsActivity

Logic

REST

リソース

モバイル { “time” : ”2012/07/27”,

“feed” : “今日は○○社の・・・”, “latitude” : 35.684337, “longitude” : 139.739649 “placeId” : “WGS84”,

“placeName” : “デジタルコースト・・・” }

Chatter投稿

行動ログレコード追加

Force.com

例えば、承認プロセス

2012/8/11 Copyright © DigitalCoast Inc. All Rights Reserved. 7

承認プロセスの設定

承認申請

コードはどうなっているか?

2012/8/11 Copyright © DigitalCoast Inc. All Rights Reserved. 8

// 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); ・・・

Force.com側

モバイル・アプリケーション

2012/8/11 Copyright © DigitalCoast Inc. All Rights Reserved. 9

OAuth2.0

Apex REST

Salesforce Toolkit for Appcelarator

{ “time” : ”2012/07/27”,

“feed” : “今日は○○社の・・・”, “latitude” : 35.684337, “longitude” : 139.739649 “placeId” : “WGS84”,

“placeName” : “デジタルコースト・・・” }

JSON

クラウドサービス側 モバイル側

OAuth2.0

2012/8/11 Copyright © DigitalCoast Inc. All Rights Reserved. 10

Force.com側

Apex REST:コードはどうなっているか?

RestResourceアノテーションを利用することで簡単に RESTリソースを公開できます

2012/8/11 Copyright © DigitalCoast Inc. All Rights Reserved. 11

@RestResource(urlMapping='/txsapi2/activity/*') global with sharing class TxsActivity { @HttpPost global static void doPost(RestRequest req, RestResponse res) { Map<String,Object> r = new Map<String,Object>(); try { String id = TxsUtil.getParamId(req); if(id != null) TxsActivityLogic.updateActivity(r, req, id); else TxsActivityLogic.insertActivity(r, req); r.put('success', true); } catch(Exception e) { TxsUtil.setException(r, e); } res.responseBody = Blob.valueof(JSON.serialize(r)); } @HttpGet global static void doGet(RestRequest req, RestResponse res) { Map<String,Object> r = new Map<String,Object>(); ・・・

postBtn.addEventListener(‘click’, function() { ・・・ var oauthJson = JSON.parse(oauthData); var uri = '/services/apexrest/txsapi2/activity/?'; uri += 'time=' + TSX.timeAsString(); uri += '&feed=' + (commentText.value ? commentText.value : ''); var restUrl = encodeURI( Ti.Network.decodeURIComponent(oauthJson.instance_url) + uri); var xhr = Ti.Network.createHTTPClient(); xhr.onload = function() { var res = JSON.parse(this.responseText); // Callbackでの処理 ・・・ }; xhr.open(“GET”, restUrl, true); xhr.setRequestHeader( “Authorization”, “OAuth ” + Ti.Network.decodeURIComponent(oauthJson.access_token)); xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(); ・・・ };

モバイル側 Force.com側

モバイルとForce.comアプリの役割分担

2012/8/11 Copyright © DigitalCoast Inc. All Rights Reserved. 12

OAuth2.0

RESTリソース TxsExpense2

Salesforce Toolkit for Appcelarator

サーバ側にロジックを集約

複雑な勤怠計算や経路探索はサーバ側に任せた

クライアント側は画面制御に特化

短期間でプロトタイプを開発し、試作を繰り返すことができた

モバイル側 クラウドサービス側

RESTリソース TxsActivity

RESTリソース TxsWorkTimeLogic

駅探経路探索エンジン

勤怠計算エンジン

ロジック

ロジック

ロジック

外部

Web サービス

画面制御

最後に

ソーシャル化した企業はどのように変わったか?

ソーシャル化した企業はどのように変わったか?

日報こそソーシャル

出退社でつぶやくアイデアで日報をやるようになった

「つぶやきはキッカケがないとつぶやかない」

タイムラインで社内の状況がわかるようになる

業務的な依頼もChatterで行う。そのときに誰が関わっているか知ることができる

2012/8/11 Copyright © DigitalCoast Inc. All Rights Reserved. 14

入社6ヶ月目の 木村圭太さん 入社6日目の

浦畑 瞳さん

課題

東京、札幌、帯広の3拠点体制

クリエイティブな仕事なのでリアルな一体感が重要

事例:株式会社 スカイアークシステム 様

すべてのウェブサイトに「かんたん」と「成果」を

CMSインテグレーション事業を行う会社です。

入社して6日目でも雰囲気が分かった

業務アプリをソーシャル化するということ

エンジニアのちょっとしたアイデアで

お客様の業務が大きく変えることができる

2012/8/11 Copyright © DigitalCoast Inc. All Rights Reserved. 15

2012/8/11 Copyright © DigitalCoast Inc. All Rights Reserved. 16

top related