diff --git a/SRC/iMES_PAD/JSplugins/JDA/jdajia.js b/SRC/iMES_PAD/JSplugins/JDA/jdajia.js
new file mode 100644
index 0000000..fbfc14c
--- /dev/null
+++ b/SRC/iMES_PAD/JSplugins/JDA/jdajia.js
@@ -0,0 +1,2433 @@
+var da = {};
+da.djJsNeedInterface = true;
+da.djJsReady = false;
+da.djJsDebug = false;
+da.readyFun;
+da.errorFun;
+da.functionMap = {};
+da.version;
+da.djInjs = false;
+da.dajia_eval = function (data) {
+ try {
+ return eval('(' + data + ')');
+ } catch (e) {
+
+ }
+ return undefined;
+};
+/**
+ * 移动端底层调用,确定移动端已经准备好了
+ * @param data ['ok'|'error'|{msg:['ok']}]
+ */
+da.check = function (data) {
+ this.djInjs = true;
+ if (data == "ok") {
+ this.djJsReady = true;
+ if (this.readyFun)
+ this.readyFun();
+ return;
+ }
+ if (data == "error") {
+ this.djJsReady = false;
+ if (this.errorFun)
+ this.errorFun();
+ return;
+ }
+ if (typeof (data) != "object") {
+ data = this.dajia_eval('(' + data + ')');
+ }
+ if (data.msg == "ok") {
+ this.djJsReady = true;
+ this.functionMap = data.fun || {};
+ if (this.readyFun)
+ this.readyFun();
+ } else {
+ this.djJsReady = false;
+ if (this.errorFun)
+ this.errorFun();
+ }
+};
+/**
+ * 判断方法是否可以执行
+ * @returns {boolean}
+ */
+da.canTrans = function () {
+ return this.djJsReady && typeof(djInternal) != 'undefined';
+};
+
+
+/**
+ * 开启调试模式,调用的所有api的返回值会在客户端alert出来
+ * @param v debug [true|false]
+ */
+da.config = function (v) {
+ this.djJsDebug = v.debug;
+ this.djJsNeedInterface = true;
+};
+
+da.ready = function (v) {
+ this.readyFun = v;
+ if (this.djInjs && da.djJsReady) {
+ this.readyFun();
+ }
+};
+da.error = function (v) {
+ this.errorFun = v;
+ if (this.djInjs && da.djJsReady == false) {
+ this.errorFun();
+ }
+};
+
+/**
+ * 判断方法是否已经实现
+ * @param v.funName:需要检查的方法名
+ */
+da.checkFun = function (v) {
+ if (this.functionMap && this.dajia_eval('this.functionMap.' + v.funName)) {
+ v.success();
+ } else if (this.canTrans()) {
+ djInternal.callHandler('checkFun', {'funName': v.funName},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success();
+ break;
+ case 'fail':
+ v.fail && v.fail();
+ break;
+ default:
+ v.fail && v.fail();
+ break;
+ }
+ });
+ } else {
+ v.fail && v.fail();
+ }
+};
+
+/**
+ *
+ * @param v.reScan:
+ * @param v.sid:
+ * @return success.res:
+ * @return fail.res:
+ */
+da.scanDevice = function (v) {
+ if (this.canTrans())
+ djInternal.callHandler('scanDevice', {'reScan': v.reScan, 'sid': v.sid}, function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ });
+};
+
+/**
+ *
+ * @param v.pid:
+ * @param v.sid:
+ * @param v.rcid:
+ * @param v.wcid:
+ * @return success.res:
+ * @return fail.res:
+ */
+da.connectPeripheralAndRead = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('connectPeripheralAndRead', {'pid': v.pid, 'sid': v.sid, 'rcid': v.rcid, 'wcid': v.wcid},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ *
+ * @param v.pid:
+ * @param v.sid:
+ * @param v.rcid:
+ * @param v.wcid:
+ * @param v.content:
+ * @return success.res:
+ * @return fail.res:
+ */
+da.connectPeripheralAndWrite = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('connectPeripheralAndWrite', {
+ 'pid': v.pid,
+ 'sid': v.sid,
+ 'rcid': v.rcid,
+ 'wcid': v.wcid,
+ 'content': v.content
+ },
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ * 显示信息流的阅读列表
+ * @param v.feedID:信息流id
+ * @param v.communityID:社区id
+ */
+da.showReadList = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('showReadList', {'feedID': v.feedID, 'communityID': v.communityID});
+ }
+};
+
+/**
+ * 显示信息流的赞列表
+ * @param v.feedID:信息流id
+ * @param v.communityID:社区id
+ */
+da.showPraiseList = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('showPraiseList', {'feedID': v.feedID, 'communityID': v.communityID});
+ }
+};
+
+/**
+ * 显示信息流的回复列表
+ * @param v.feedID 信息流id
+ * @param v.communityID 社区
+ */
+da.showCommentList = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('showCommentList', {'feedID': v.feedID, 'communityID': v.communityID});
+ }
+};
+
+/**
+ * 跳转到个人空间
+ * @param v.personID:人员ID
+ * @param v.personName:人员姓名
+ */
+da.showPerson = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('showPerson', {'personID': v.personID, 'personName': v.personName});
+ }
+};
+
+/**
+ * 跳转到群空间
+ * @param v.groupID:群组ID
+ * @param v.groupName:群组名
+ * @return success.res:
+ * @return fail.res:
+ */
+da.showGroup = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('showGroup', {'groupID': v.groupID, 'groupName': v.groupName},
+ function (callback) {
+ switch (callback.code) {
+ case 'success': v.success(callback.res); break;
+ case 'fail': v.fail && v.fail(callback.res); break;
+ default: v.fail && v.fail(callback.res); break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ * 加入社区
+ * @param v.communityID:社区ID
+ */
+da.joinCommunity = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('joinCommunity', {'communityID': v.communityID});
+ }
+};
+
+/**
+ * 切换到指定社区
+ * @param v.communityID:社区ID
+ * @param v.communityName:社区名
+ */
+da.enterCommunity = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('enterCommunity', {'communityID': v.communityID, 'communityName': v.communityName});
+ }
+};
+
+/**
+ * 进入体验社区
+ * @param v.communityID:社区ID
+ * @param v.username:用户名
+ * @param v.password:密码
+ */
+da.enterExperience = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('enterExperience', {
+ 'communityID': v.communityID,
+ 'username': v.username,
+ 'password': v.password
+ });
+ }
+};
+
+/**
+ * 加入群组
+ * @param v.communityID:社区ID
+ * @param v.communityID:群组ID
+ */
+da.joinGroup = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('joinGroup', {'communityID': v.communityID, 'groupID': v.groupID});
+ }
+};
+
+/**
+ * 跳转到图片预览功能
+ * @param v.current:当前显示的图片
+ * @param v.ids:需要预览的图片ID列表
+ * @param v.isUrl:
+ *
+ */
+da.showPicList = function (v) {
+ if (this.canTrans())
+ djInternal.callHandler('showPicList', {'current': v.current, 'ids': v.ids, 'isUrl': v.isUrl});
+};
+
+/**
+ * 跳转到附件预览功能
+ * @param v.fileID:文件ID
+ * @param v.fileName:文件名
+ * @param v.fileSize:文件大小
+ */
+da.showFile = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('showFile', {'fileID': v.fileID, 'fileName': v.fileName, 'fileSize': v.fileSize});
+ }
+};
+
+/**
+ * 跳转到地理位置查看功能
+ * @param v.lat:纬度
+ * @param v.lon:经度
+ * @param v.name:地标名
+ * @param v.addr:位置描述
+ */
+da.showLocation = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('showLocation', {'lat': v.lat, 'lon': v.lon, 'name': v.name, 'addr': v.addr});
+ }
+
+};
+
+/**
+ * 获取地理位置功能
+ * @param v.lat:纬度
+ * @param v.lon:经度
+ * @param v.name:地标名
+ * @param v.addr:位置描述
+ * @return success.res:
+ * @return fail.res:
+ */
+da.getLocation = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('getLocation', {
+ 'current': v.current,
+ 'lat': v.lat,
+ 'lon': v.lon,
+ 'name': v.name,
+ 'addr': v.addr
+ },
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ * 调取扫一扫功能
+ * @param v.needResult:[0|1] // 默认为0、扫描结果由大家社区处理,1、则直接返回扫描结果
+ * @return success.res:扫描结果
+ */
+da.showScan = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('showScan', {'needResult': v.needResult},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ * 解析二维码图片
+ * @param v.url:
+ * @return success.res:
+ */
+da.showQRCode = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('showQRCode', {'url': v.url},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ * 获取网络类型
+ * @return success.res:none:无网络 2g:2g网络 3g:3g网络 4g:4g网络 wifi:wifi
+ */
+da.getNetWorkType = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('getNetWorkType', {},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+/**
+ * 选择图片(ios不支持)
+ * @param v.type [1|2] 1、只拍照,2、相册选取图片
+ * @return res.returnType 返回类型 : 2-base64
+ * @return res.current 当前已存在的张书
+ * @return res.returnType 获取图片的最大张数
+ */
+da.chooseImage = function (v) {
+ if (this.canTrans()){
+ djInternal.callHandler('chooseImage', {type: v.type, current: v.current, max: v.max, returnType: v.returnType},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ * 图片预览
+ * @param v.current 当前需要预览的图片再整体urls中的索引位置
+ * @param v.urls 当前需要预览的图片url集合
+ */
+da.previewImage = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('previewImage', {'current': v.current, 'urls': v.urls});
+ }
+};
+
+/**
+ * 上传文件
+ * @param v.files:
+ * @param v.isShowProgress:
+ */
+da.uploadFile = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('uploadFile', {'files': v.files, 'isShowProgress': v.isShowProgress},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ * 下载文件
+ * @param v.picId:图片ID
+ * @param v.isShowProgressTips:
+ */
+da.downloadImage = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('downloadImage', {'picId': v.picId, 'isShowProgressTips': v.isShowProgressTips},
+ function (callback) {
+ switch (callback.code) {
+ case 'success': v.success(callback.res); break;
+ case 'fail': v.fail && v.fail(callback.res); break;
+ default: v.fail && v.fail(callback.res); break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ * 关闭当前窗口
+ */
+da.closeWindow = function () {
+ if (this.canTrans()) {
+ djInternal.callHandler('closeWindow');
+ }
+};
+
+/**
+ * 关闭当前窗口并弹出提示信息
+ * @param v.msg:消息
+ */
+da.closeWindowWithMessage = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('closeWindowWithMessage', {'msg': v.msg});
+ }
+};
+
+/**
+ * 创建新窗口
+ * @param v.type:type="1" 时链接添加host:port并覆盖access_token
+ */
+da.createWindow = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('createWindow', {'type': v.type, 'url': v.url});
+ }
+
+};
+
+/**
+ * 显示提示信息
+ * @param v.type 显示提示的样式 0、普通(默认);1、警告;2、错误;9、顶部红条
+ * @param v.msg 提示语
+ */
+da.showMessage = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('showMessage', {'msg': v.msg, 'type': v.type});
+ }
+};
+
+/**
+ * 显示分类提示
+ * @param v.type
+ * @param v.style
+ * @param v.msg
+ */
+da.showPrompt = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('showPrompt', {
+ type: v.type, //标记提示 0:失败返回; 1: 提示我的服务单; 2:成功返回 ; 98:取消页面动作操作 99:恢复页面动作操作
+ style: v.style, //显示提示的样式 0:普通(默认) 1:警告 2:错误 9:顶部红条
+ msg: v.msg //提示语, 或者动作类型flush
+ });
+ }
+
+};
+
+
+da.statusWindow = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('statusWindow', {'type': v.type, 'msg': v.msg});
+ }
+};
+
+/**
+ * 网页回退
+ */
+da.historyBack = function () {
+ if (this.canTrans()) {
+ djInternal.callHandler('historyBack');
+ }
+};
+
+/**
+ * app登录
+ * ios:忽略action参数
+ * android:只实现了action=-1的情况
+ * @param v.name 用户名
+ * @param v.pwd 密码
+ * @param v.action -1:进入登录也并填充数据
+ */
+da.appLogin = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('appLogin', {'name': v.name, 'pwd': v.pwd, 'action': v.action},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ * 跳转到指定native页面
+ * @param v.code:
+ */
+da.forward = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('forward', {'code': v.code},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ * 通知app表单提交成功
+ * @param v.formID 表单id
+ * @param v.formRecordID 表单信息id
+ * @param v.title 表单标题
+ */
+da.saveFormFeed = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('saveFormFeed', {'formID': v.formID, 'formRecordID': v.formRecordID, 'title': v.title},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+da.setWebParam = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('setWebParam', {
+ 'title': v.title,
+ 'description': v.description,
+ 'address': v.address,
+ 'picID': v.picID,
+ 'logoID': v.logoID,
+ 'pageType': v.pageType,
+ 'pageID': v.pageID,
+ 'isPreview': v.isPreview
+ },
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+da.requestPortalTopic = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('requestPortalTopic', {'version': v.version, 'isCache': v.isCache},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ * 触发native跳转到对应的应用下
+ * 主要使用场景再portal中
+ * @param v.tagID 应用ID
+ */
+da.touchPortalTopic = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('touchPortalTopic', {'tagID': v.tagID});
+ }
+};
+
+/**
+ * 请求我的群组数据 主要使用场景再portal tab签中
+ * @param v.page:页码
+ * @param v.count:分页条数
+ * @param v.view
+ * @param v.style
+ * @param v.isCache
+ */
+da.requestPortalGroup = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('requestPortalGroup', {
+ 'page': v.page,
+ 'count': v.count,
+ 'view': v.view,
+ 'style': v.style,
+ 'isCache': v.isCache
+ },
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ *
+ * @param v.page [0|1] 0、请求首页;>0:tab签请求
+ */
+da.requestAllGroup = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('requestAllGroup', {
+ 'page': v.page,
+ 'count': v.count,
+ 'view': v.view,
+ 'style': v.style,
+ 'isCache': v.isCache
+ },
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ * 请求加入群组,目前没有使用
+ * @param v
+ */
+da.requestJoinGroup = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('requestJoinGroup', {'groupID': v.groupID, 'groupType': v.groupType},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ * 跳转到全部群组/搜索群组功能
+ * @param v.type 0、标识全部群组;1、标识搜索群组
+ */
+da.showAllGroup = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('showAllGroup', {'type': v.type},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ * 跳转到群组功能
+ */
+da.showGroupList = function () {
+ if (this.canTrans()) {
+ djInternal.callHandler('showGroupList');
+ }
+};
+
+
+/**
+ * 跳转到群组搜索功能
+ */
+da.showGroupSearch = function () {
+ if (this.canTrans()) {
+ djInternal.callHandler('showGroupSearch');
+ }
+};
+
+/**
+ * 获取对应应用的信息流,只取最新的指定条数,主要场景再portal中
+ * @param v.tagID 应用ID
+ * @param v.tagName 应用名称
+ * @param v.count 条数
+ * @param v.style 回调参数
+ * @param v.isCache 是否使用缓存[true|false]
+ */
+da.requestPortalFeed = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('requestPortalFeed', {
+ 'tagID': v.tagID,
+ 'tagName': v.tagName,
+ 'count': v.count,
+ 'style': v.style,
+ 'isCache': v.isCache
+ },
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ * 获取对应应用的商品
+ * @param v
+ */
+da.requestPortalShop = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('requestPortalShop', {
+ 'tagID': v.tagID,
+ 'page': v.page,
+ 'count': v.count,
+ 'isCache': v.isCache,
+ 'rowType': v.rowType
+ },
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ * 跳转到商品详情页面
+ * @param v.productID 商品ID
+ */
+da.showProduct = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('showProduct', {'productID': v.productID});
+ }
+};
+
+/**
+ * 跳转到信息流详情页面
+ * @param v.feedID 信息流ID
+ */
+da.showFeedDetail = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('showFeedDetail', {'feedID': v.feedID});
+ }
+};
+
+/**
+ * 跳转到新建信息流页面
+ * @param v.topicID topicPresetID
+ * @param v.tagID companyMenuID
+ */
+da.createFeed = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('createFeed', {'topicID': v.topicID, 'tagID': v.tagID});
+ }
+};
+
+
+/**
+ * 获取图片
+ * @param v.picID 图片id
+ * @param v.size 1:小图;2:大图;3:中图
+ * @param v.type 0:普通图片;1:人员头像;2:群组头像;3:社区头像
+ * @param v.cdnAddr cdn地址(不填)
+ */
+da.getPic = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('getPic', {'picID': v.picID, 'size': v.size, 'type': v.type, 'cdnAddr': v.cdnAddr},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+
+};
+/**
+ * 第三方系统调起app支付
+ * @param v.orderID: 订单ID
+ * @param v.merchantId: 商户ID
+ * @param v.subject: 标题
+ * @param v.desc: 描述
+ * @param v.orderAmount: 订单总金额
+ * @param v.paymentType: 支付方式 101:支付宝(默认) 201:微信
+ */
+da.thirdPartyOrderAppPay = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('payCheck', {
+ 'orderID': v.orderID,
+ 'merchantId': v.merchantId,
+ 'orderAmount': v.orderAmount,
+ 'paymentType': v.paymentType,
+ "subject": v.subject,
+ "desc": v.desc,
+ "checkOrder" : "0"
+ },
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ * 系统支付校验,校验成功后自动调起ap支付
+ *
+ * orderID: 订单ID
+ * merchantId: 商户ID
+ * companyID: 社区id
+ * subject: 商品名称
+ * desc: 商品描述
+ * orderAmount: 订单总金额
+ * paymentType: 支付方式 101:支付宝(默认) 201:微信
+ * @param v
+ */
+da.payCheck = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('payCheck', {
+ 'orderID': v.orderID,
+ 'merchantId': v.merchantId,
+ 'companyID': v.companyID,
+ 'orderAmount': v.orderAmount,
+ 'paymentType': v.paymentType,
+ "subject": v.subject,
+ "desc": v.desc,
+ "checkOrder" : "1"
+ },
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+da.pingpay = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('pingpay', {'content': v.content},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ * 发起app登录
+ * 如果app端已经登录会直接返回 {personID:'',companyID:'',accessToken:''}
+ * @param v.currentUrl 没有使用
+ */
+da.needLogin = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('needLogin', {'currentUrl': v.currentUrl},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+
+};
+
+/**
+ * 调用App的显示分先菜单的操作
+ * @param v
+ * v.optList ['menuItem:share:appMessage' 分享到微信好友
+ * |'menuItem:share:timeline' 分享到微信朋友圈
+ * |'menuItem:share:weiboApp' 分享到新浪微博
+ * |'menuItem:share:QZone' 分享到QQ空间
+ * |'menuItem:share:qq' 分享到QQ
+ * |'menuItem:share:message' 分享到短信
+ * |'menuItem:share:email' 分享到Email
+ * |'menuItem:openWithBrowser' 用浏览器打开操作
+ * |'menuItem:forward' 转发
+ * |'menuItem:refresh' 刷新操作
+ * |'menuItem:tipoff' ] 举报
+ * v.shareInfo.url
+ * v.shareInfo.imageThumbUrl
+ * v.shareInfo.shareDescription
+ * v.shareInfo.shareTitle
+ */
+da.showOptMenu = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('showOptMenu', {'optList': v.optList, 'shareInfo': v.shareInfo},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ * 调用App的显示分先菜单的操作
+ * @param v
+ * v.optList ['menuItem:share:appMessage' 分享到微信好友
+ * |'menuItem:share:timeline' 分享到微信朋友圈
+ * |'menuItem:share:weiboApp' 分享到新浪微博
+ * |'menuItem:share:QZone' 分享到QQ空间
+ * |'menuItem:share:qq' 分享到QQ
+ * |'menuItem:share:message' 分享到短信
+ * |'menuItem:share:email' 分享到Email
+ * |'menuItem:openWithBrowser' 用浏览器打开操作
+ * |'menuItem:forward' 转发
+ * |'menuItem:refresh' 刷新操作
+ * |'menuItem:tipoff'] 举报
+ * v.shareInfo.url
+ * v.shareInfo.imageThumbUrl
+ * v.shareInfo.shareDescription
+ * v.shareInfo.touchShow 是否手动出发
+ * v.shareInfo.shareTitle
+ */
+da.initShareOptMenu = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('initShareOptMenu', {'optList': v.optList, 'shareInfo': v.shareInfo},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+
+};
+/**
+ * 信息流的操作
+ * type 1 赞 2 收藏
+ * action 1 添加操作 2 取消操作
+ * @param v
+ */
+da.feedAction = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('feedAction', {'type': v.type, 'action': v.action, 'objID': v.objID },
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+/**
+ * 添加评论
+ * feedID feed的ID
+ * commentID
+ * @param v
+ */
+da.addComment = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler("addComment", {'feedID': v.feedID, 'commentID': v.commentID}, function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+/**
+ * fileID 文件ID
+ * @param v
+ * @param type 2 声音
+ * @return 文件路径
+ */
+da.getFile = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler("getFile", {'fileID': v.fileID, 'type': v.type}, function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ * 请求信息流
+ *
+ * @param v.tagID 应用ID
+ * @param v.page 页码
+ * @param v.count 单页条数
+ * @param v.maxTime 时间
+ * @param v.style 回调参数
+ * @param v.isCache
+ */
+da.requestFeed = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('requestFeed', {
+ 'tagID': v.tagID,
+ 'page': v.page,
+ 'count': v.count,
+ 'maxTime': v.maxTime,
+ 'style': v.style,
+ 'isCache': v.isCache
+ },
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ * 跳转到对应话题的信息流列表
+ * @param v
+ */
+da.showBlog = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('showBlog', {'feedID': v.feedID, 'blogID': v.blogID});
+ }
+};
+
+/**
+ * 获取app的主题颜色
+ * @param v
+ */
+da.getThemeColor = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('getThemeColor', {},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ * 发起IM聊天
+ * @param v
+ * v.conversationType 回话类型 目前只支持"PRIVATE" 私聊 "CUSTOM"发起客服聊天
+ * v.targetID 回话的目标ID,目前只支持personID
+ * v.targetName 回话的名字,目前只支持personName
+ * v.companyID 当前社区ID
+ * 需要在发起聊天同时自动发一条消息,请完善下述参数
+ * v.messageTitle
+ * v.messageDigest
+ * v.messageImageURL
+ * v.messageUrl
+ * v.messageExtra
+ * v.textMessageContent
+ * 规则1:messageTitle messageUrl 填写的话,会发送一条富文本消息
+ * 并且可以填写messageDigest messageImageURL messageExtra
+ * messageExtra参数暂时没有使用,将来可能用于扩展
+ * 规则2:textMessageContent 填写的话 会发送一条纯文本消息
+ * 规则3:messageTitle messageUrl textMessageContent都不填写时将不会发送任何消息
+ * 规则4:调用客服时暂时不要使用messageTitle messageUrl 客服现在不支持;
+ */
+da.startIMConversation = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler("startIMConversation", {
+ 'conversationType': v.conversationType,
+ 'targetID': v.targetID,
+ 'targetName': v.targetName,
+ 'companyID': v.companyID,
+ 'messageTitle': v.messageTitle,
+ 'messageDigest': v.messageDigest,
+ 'messageImageURL': v.messageImageURL,
+ 'messageUrl': v.messageUrl,
+ 'messageExtra': v.messageExtra,
+ 'textMessageContent': v.textMessageContent
+ },
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+
+/**
+ * 主题是否支持发送
+ * @param v.tagID 主题ID
+ * @return (res:{isSupport:[true|false]}
+ */
+da.getTopic = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler("getTopic", {'tagID': v.tagID},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ *
+ * @param v
+ */
+da.getValueByThird = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler("getValueByThird", {'key': v.key},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ * 显示错误信息
+ * @param v.file 文件名
+ * @param v.code 错误码
+ * @param v.error 错误描述
+ */
+da.showPortalError = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler("showPortalError", {'file': v.file, 'code': v.code, 'error': v.error},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ * 通用portal页主题列表通用接口
+ * @param v.tagID 主题ID
+ * @param v.page 页数
+ * @param v.count 单页条数
+ */
+da.requestPortalList = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler("requestPortalList", {
+ 'tagID': v.tagID,
+ 'page': v.page,
+ 'count': v.count,
+ 'isCache': v.isCache,
+ 'object': v.object
+ },
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail(callback.res);
+ break;
+ default:
+ v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ * 打开portal单个详情页面通用接口
+ * {worksShowID: worksShow.worksShowID}
+ * @param v.object.worksShowID
+ */
+da.showPortalDetail = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler("showPortalDetail", {'tagID': v.tagID, 'object': v.object},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail(callback.res);
+ break;
+ default:
+ v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ * 上传文件
+ * ios 支持
+ * android不支持
+ * @param v.files 本地图片路径
+ */
+da.uploadFileByApp = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('uploadFileByApp', {'files': v.files, 'isShowProgress': v.isShowProgress},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ });
+ }
+};
+// ----------------鼎捷项目新增js方法-----------------//
+/**
+ * 我发的消息
+ * 默认进入我发的消息页面,
+ * 当参数getMySelfSendFeed为字符类型1的时候进入我发的消息页面,其他参数时进入带头像的信息流页面
+ */
+da.getMySelfSendFeed = function () {
+ if (this.canTrans()) {
+ djInternal.callHandler('getMySelfSendFeed', {'getMySelfSendFeed': v.getMySelfSendFeed},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+/**
+ * 我的收藏
+ */
+da.getMySelfCollections = function () {
+ if (this.canTrans()) {
+ djInternal.callHandler('getMySelfCollections');
+ }
+};
+/**
+ * 发送队列
+ */
+da.findSendFeedQuque = function () {
+ if (this.canTrans()) {
+ djInternal.callHandler('findSendFeedQuque');
+ }
+};
+/**
+ * 邀请
+ */
+da.sendInvitation = function () {
+ if (this.canTrans()) {
+ djInternal.callHandler('sendInvitation');
+ }
+};
+/**
+ * 系统设置
+ */
+da.systemSetting = function () {
+ if (this.canTrans()) {
+ djInternal.callHandler('systemSetting');
+ }
+};
+/**
+ * 通知
+ */
+da.systemNtive = function () {
+ if (this.canTrans()) {
+ djInternal.callHandler('systemNtive');
+ }
+};
+/**
+ * 是否在大陆
+ * @return success.res.isChina:1、在大陆
+ * @return success.res.lon:经度
+ * @return success.res.lat:纬度
+ */
+da.inChina = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('inChina', {},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+/**
+ * 当前语言
+ * @return success.res:当前语言别
+ */
+da.currentLanguage = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('currentLanguage', {},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+/**
+ * 录音接口
+ * @param v
+ */
+da.record = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('record', {},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ * 获取预置内容接口中数据
+ * @param v
+ */
+da.getTopicPresetInfo = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('getTopicPresetInfo', {
+ 'url': v.url,
+ 'topicPresetID': v.topicPresetID,
+ 'portalRowID': v.portalRowID
+ },
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+
+};
+
+/**
+ * 上传名片图片到名片王服务器,获取名片的json数据
+ * @param v
+ */
+da.getCardInfo = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('getCardInfo', {'type': v.type},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+
+/**
+ * 跳转集成列表详情页
+ * @param v
+ */
+da.showListMessageDetail = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('showListMessageDetail', {'url': v.url},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ * 获取系统最新一条消息
+ * @param v
+ */
+da.getLatestCommunityNotification = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('getLatestCommunityNotification', {},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/*** 下面所有未读消息都取自手机端的SQLITE数据库,这个消息是定时从手机端取自服务端取后就会把服务端库的置为已读,但是手机数据库仍是未读 *****/
+/**
+ * 获取未读消息数
+ * @param v
+ */
+da.getNotificationCountBySourceType = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('getNotificationCountBySourceType', {'sourceType': v.sourceType},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+/**
+ * 取最新消息
+ * @param v
+ */
+da.getLatestNotificationBySourceType = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('getLatestNotificationBySourceType', {'sourceType': v.sourceType},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+/**
+ * 获取所有消息
+ * @param v
+ */
+da.getAllNotificationBySourceType = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('getAllNotificationBySourceType', {'sourceType': v.sourceType},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+/**
+ * 所有分类消息设置成已读
+ * @param v
+ */
+da.setNotificationReadBySourceType = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('setNotificationReadBySourceType', {'sourceType': v.sourceType},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+/**
+ * 删除某一条已查看的消息
+ * @param v
+ */
+da.deleteNotification = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('deleteNotification', {'sourceType': v.sourceType, 'notificationID': v.notificationID},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ * 获取设备唯一ID
+ * @return success.res:当前设备唯一ID
+ */
+da.getDeviceUniqueID = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('getDeviceUniqueID', {},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+
+};
+
+/**
+ * 选择人员
+ * @param v.includeSelf:是否包括自己
+ */
+da.choosePersons = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler("choosePersons", {
+ 'person_ids': v.person_ids,
+ 'isMultiple': v.isMultiple,
+ 'includeSelf': v.includeSelf
+ },
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ * 回首页
+ * @param v
+ */
+da.goBackToMain = function (v) {
+ if (this.canTrans())
+ djInternal.callHandler('goBackToMain');
+};
+/**
+ * 分享文档
+ * @param v
+ */
+da.shareDocument = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler("shareDocument", {
+ 'fileID': v.fileID,
+ 'sendNotice': v.sendNotice,
+ 'includeSelf': v.includeSelf //true指包含自己(可选择分享给自己),false不包含自己,默认为false
+ }, function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ });
+ }
+};
+/**
+ * 隐藏或显示左上角回退按钮
+ * @param v
+ */
+da.hideOrShowBackButton = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler("hideOrShowBackButton", {
+ 'show': v.show //true or false
+ }, function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ });
+ }
+};
+
+
+/**
+ * 保存状态变量
+ * @param v
+ * pageIndex为在第几个页面可以取值(字符类型)
+ */
+da.saveCustomizedData = function (v) {
+ if (this.canTrans())
+ djInternal.callHandler('saveCustomizedData', {
+ 'customizedKey': v.customizedKey,
+ 'customizedValue': v.customizedValue,
+ 'saveToPage':v.saveToPage
+ },
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ });
+};
+
+/**
+ * 获取保存的状态变量
+ * @param v
+ */
+da.getCustomizedData = function (v) {
+ if (this.canTrans())
+ djInternal.callHandler('getCustomizedData', {
+ 'customizedKey': v.customizedKey,
+ 'getDataFromPage': v.getDataFromPage
+ },
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ });
+};
+/**
+ * 跳转到特定页面(da.createwindow打开方式)
+ * @param v pageIndex:为0到count-1的数字,超过或者其他将返回错误,成功就会跳转
+ * refreshPage:这个参数代表是否刷新,默认不刷新,设置为true时则进入界面时会刷新
+ */
+da.goBackToSpecifiedPage = function (v) {
+ if (this.canTrans())
+ djInternal.callHandler('goBackToSpecifiedPage', {
+ 'pageIndex': v.pageIndex,
+ 'refreshPage': v.refreshPage
+ },
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ });
+};
+/**
+ * 获取当前控制器的栈的数量,默认为0,代表当前为根控制器(da.createwindow打开方式)
+ */
+da.getSpecifiedPageCount = function (v) {
+ if (this.canTrans())
+ djInternal.callHandler('getSpecifiedPageCount', {},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ });
+};
+
+/**
+ *
+ *打开全部消息接口//无参数
+ *无返回
+ */
+da.openAllFeedPage = function(v) {
+ if (this.canTrans())
+ djInternal.callHandler('openAllFeedPage');
+};
+
+/**
+ *
+ *切换社区接口//无参数
+ *无返回
+ */
+da.switchCommunity = function(v) {
+ if (this.canTrans())
+ djInternal.callHandler('switchCommunity');
+};
+
+
+/**
+ *切换横竖屏接口// 有参数
+ *参数说明: 传入switchScreen为key的 value是 0或者1 (数字必须是字符串形式)字段 1代表竖屏 0 代表横屏
+ * 无返回
+ */
+da.switchScreen = function(v){
+ if (this.canTrans()){
+ djInternal.callHandler('switchScreen' , {
+ 'switchScreen': v.switchScreen
+ } ,
+ function(callback){
+ switch (callback.code){
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ })
+ }
+};
+
+/**
+ *跳转搜索页面// 有参数
+ *参数说明: isInput为跳转时是否弹出键盘的参数,为布尔类型的true或false
+ * 无返回
+ */
+da.goToGlobalSearch = function(v){
+ if (this.canTrans()){
+ djInternal.callHandler('goToGlobalSearch' , {
+ 'isInput': v.isInput
+ } ,
+ function(callback){
+ switch (callback.code){
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ })
+ }
+};
+
+
+/**
+ * 开车啦 开始行程接口
+ * @param v isStart为字符类型的"0"或"1",0代表开始行程,1代表恢复行程
+ * distinceInterval:每隔多长距离去保存一次数据,单位是米,字符类型
+ */
+da.startDrive = function (v) {
+ if (this.canTrans())
+ djInternal.callHandler('startDrive', {
+ 'isStart': v.isStart,
+ 'distanceInterval': v.distanceInterval
+ },
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ });
+};
+
+/**
+ * 开车啦 结束行程
+ *
+ */
+da.endDrive = function (v) {
+ if (this.canTrans())
+ djInternal.callHandler('endDrive', {
+ },
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ });
+};
+
+
+/**
+ * 开车啦 获取行程信息
+ *
+ */
+da.getRouteData = function (v) {
+ if (this.canTrans())
+ djInternal.callHandler('getRouteData', {
+ },
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ });
+};
+
+/**
+ * ios 获取手机本地日历信息
+ */
+da.getCalendarList = function(v){
+ if (this.canTrans()){
+ djInternal.callHandler('getCalendarList', {
+ 'startDate':v.startDate,
+ 'endDate':v.endDate
+ },
+ function(callback){
+ switch (callback.code){
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ })
+ }
+};
+/**
+ * 参数type(必须,目前支持type=1时,为日历,type=2定位弹框,type=3位提醒事项弹框(暂时未使用,预留))
+ 正确提示:code:success
+
+ 错误提示:code:fail res:包括domain和code
+ code=1000。type未传或者传的值不包括上面的类型
+ Code 1001 已开启,不需要弹框
+ Code 1002 用户选择了取消按钮
+ * @param v
+ */
+da.systemPermissionsAlert = function (v) {
+ if (this.canTrans()){
+ djInternal.callHandler('systemPermissionsAlert',{
+ 'type':v.type
+ },
+ function (callback) {
+ switch (callback.code){
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ })
+ }
+};
+
+/**
+ * 开车啦 清除行程信息
+ *
+ */
+da.cleanDriveData = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('cleanDriveData', {
+ },
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+
+};
+
+/**
+ * 跳转手机设置开启定位权限页面
+ *
+ */
+da.openLocationSet = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('openLocationSet ', {},
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+/**
+ * 退出登录
+ * @param v.needAlert:0 不弹窗提示,1 弹窗提示
+ * @param vstyleType:0:不强制退出,1:强制退出
+ */
+da.logOut = function (v) {
+ if (this.canTrans()) {
+ djInternal.callHandler('logOut', {
+ 'needAlert':v.needAlert,'styleType':v.styleType
+ },
+ function (callback) {
+ switch (callback.code) {
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
+
+/**
+ * 调到手机高德/谷歌/苹果地图导航
+ * targetName:目的地名称
+ * targetLatitude:目的地纬度
+ * targetLongitute:目的地经度
+ * directionsmode:导航方式; 目前支持driving:驾车;walking,步行。 默认是驾车。
+ */
+da.openThreeMapNav = function(v){
+ if (this.canTrans()){
+ djInternal.callHandler('openThreeMapNav',{
+ 'targetName':v.targetName,
+ 'targetLatitude':v.targetLatitude,
+ 'targetLongitute':v.targetLongitute,
+ 'directionsmode':v.directionsmode,
+ },
+ function(callback){
+ switch (callback.code){
+ case 'success':
+ v.success(callback.res);
+ break;
+ case 'fail':
+ v.fail && v.fail(callback.res);
+ break;
+ default:
+ v.fail && v.fail(callback.res);
+ break;
+ }
+ }
+ );
+ }
+};
\ No newline at end of file
diff --git a/SRC/iMES_PAD/JSplugins/ModuleInstaller/ModuleInstaller.js b/SRC/iMES_PAD/JSplugins/ModuleInstaller/ModuleInstaller.js
new file mode 100644
index 0000000..46f048a
--- /dev/null
+++ b/SRC/iMES_PAD/JSplugins/ModuleInstaller/ModuleInstaller.js
@@ -0,0 +1,202 @@
+(function(window,angular){
+ 'use strict';
+ (function(){
+ 'use strict';
+ angular.module('ngModuleInstaller',['ng'])
+ .provider('$moduleInstaller', function(){
+ this.$get = ['$filter', '$translate', '$rootScope',
+ function($filter, $translate, $rootScope){
+ var $moduleInstaller = {status:{msg : '', is_complete: true}},
+ module_content = {root_path: '', zip_name: 'module_update.zip'};
+ //Module update(content = {version[模組現有版本], callback[更新成功], errorback[更新失敗]})
+ $moduleInstaller.update = function(content){
+ $moduleInstaller.status.is_complete = false;
+ $moduleInstaller.status.msg = '';
+
+ module_content.root_path = content.root_path||module_content.root_path;
+ module_content.zip_name = content.zip_name||module_content.zip_name;
+ if(content.url != ''){
+ //need update
+ if(window.cordova){
+ downloadZIP_cordova(content.url, function(){
+ if(content.callback)
+ content.callback();
+ }, function(){
+ if(content.errorback){
+ content.errorback();
+ }
+ });
+ } else if(window.nodeRequire){
+ downloadZIP_electron(content.url, function(){
+ if(content.callback)
+ content.callback();
+ }, function(){
+ if(content.errorback){
+ content.errorback();
+ }
+ });
+ } else {
+ content.callback();
+ }
+ } else {
+ //don't need update
+ if(content.callback)
+ content.callback();
+ }
+ }
+
+ //App platform download ZIP File
+ function downloadZIP_cordova(url, callback, errorback){
+ var zipDistUrl = cordova.file.dataDirectory;
+ var ft = new FileTransfer();
+ ft.onprogress = function(progressEvent) {
+ if (progressEvent.lengthComputable) {
+ //更新下載中
+ $moduleInstaller.status.msg = $filter('translate')('update.msg.update_downloading')+Math.floor(progressEvent.loaded / progressEvent.total * 100)+'%';
+ $rootScope.$apply();
+ }
+ };
+ ft.download(url, zipDistUrl+'//'+module_content.zip_name,
+ function(r) {
+ $moduleInstaller.status.msg = $filter('translate')('update.msg.updating');//程式更新中...
+ //$rootScope.$apply();
+ ExtractZIP_Cordova(zipDistUrl, callback, errorback);
+ }, function(error) {
+ $moduleInstaller.status.msg = $filter('translate')('update.msg.cant_download');//無法下載更新,請確認伺服器連線是否正常;
+ //$rootScope.$apply();
+ if(errorback)
+ errorback(error);
+ }
+ );
+ }
+
+ //App Android platform extract ZIP File
+ function ExtractZIP_Cordova(zipDistUrl, callback, errorback){
+ $moduleInstaller.status.msg = $filter('translate')('update.msg.updating');//程式更新中...
+ //$rootScope.$apply();
+ var dstDir = zipDistUrl + 'update//'+module_content.root_path;
+ zip.unzip(zipDistUrl + module_content.zip_name, dstDir,
+ function(result){
+ if(result==0){
+ clearUpdate(zipDistUrl, module_content.zip_name, function(){
+ if(callback)
+ callback();
+ });
+ } else {
+ $moduleInstaller.status.msg = $filter('translate')('update.msg.zip_server_connect');//'更新檔解析失敗,請重新下載';
+ //$rootScope.$apply();
+ if(errorback)
+ errorback();
+ }
+ },
+ function(progressEvent){
+ $moduleInstaller.status.msg = $filter('translate')('update.msg.updating') + Math.round((progressEvent.loaded / progressEvent.total) * 100)+'%';
+ //$rootScope.$apply();
+ }
+ );
+ }
+
+ //Desktop platform download ZIP File and extract zip
+ function downloadZIP_electron(url, callback, errorback){
+ var data = {
+ url : url,
+ method : 'GET',
+ type:"application/octet-stream",
+ responseType: 'arraybuffer'
+ };
+ var request = nodeRequire('request');
+ var progress = nodeRequire('request-progress');
+ var fs = nodeRequire('fs');
+
+ $moduleInstaller.status.msg = $filter('translate')('update.msg.updating');
+ //$rootScope.$apply();
+ var Zip = nodeRequire('adm-zip-electron');
+ var AppPath;
+ if(nodeRequire('electron')){
+ AppPath = nodeRequire('electron').remote.app.getAppPath()+'\\';
+ } else {
+ var nwDir = nodeRequire('path').dirname(process.execPath);
+ AppPath = nwDir+'\\package.nw\\';
+ }
+
+ var updateFile = AppPath + module_content.zip_name;//zip檔下載位置
+ var tempFile = fs.createWriteStream(updateFile);
+ tempFile.on('finish', function(){
+ tempFile.close(function(){
+ try{
+ $moduleInstaller.status.msg = $filter('translate')('update.msg.updating');//程式更新中...
+ //$rootScope.$apply();
+ var zip = new Zip(updateFile);
+ zip.extractAllTo(AppPath+'www\\'+module_content.root_path+'\\', true);
+ clearUpdate(AppPath, module_content.zip_name, callback);
+ }catch(e){
+ $moduleInstaller.status.msg = $filter('translate')('update.msg.zip_cant_download')+'
'+e;//無法下載更新,更新用的檔案不存在,請確認伺服器連線資訊是否正確
+ //$rootScope.$apply();
+ if(errorback)
+ errorback(e);
+ }
+ });
+ });
+ var request = request(url, function(error, response, body){
+ if(error){
+ $moduleInstaller.status.msg = $filter('translate')('update.msg.zip_cant_download')+'
'+error;//無法下載更新,更新用的檔案不存在,請確認伺服器連線資訊是否正確
+ //$rootScope.$apply();
+ if(errorback)
+ errorback(error);
+ } else {
+ $moduleInstaller.status.msg = $filter('translate')('update.msg.update_downloading')+'100%';
+ //$rootScope.$apply();
+ }
+ });
+ request.pipe(tempFile);
+ progress(request, {throttle: 200})
+ .on('progress', function (state) {
+ //更新下載中
+ $moduleInstaller.status.msg = $filter('translate')('update.msg.update_downloading')+
+ (Math.round(state.percent * 100))+'%';
+ $rootScope.$apply();
+ })
+ .on('error', function (err) {
+ $moduleInstaller.status.msg = $filter('translate')('update.msg.zip_cant_download')+'
'+err;//無法下載更新,更新用的檔案不存在,請確認伺服器連線資訊是否正確
+ //$rootScope.$apply();
+ if(errorback)
+ errorback(err);
+ });
+ }
+
+ //delete sJDS\\update.zip file
+ function clearUpdate(url, fileName, feedback){
+ try{
+ window.resolveLocalFileSystemURL(url, function(dir) {
+ dir.getFile(fileName, {create:false}, function(fileEntry) {
+ fileEntry.remove(function(){
+ if(feedback)
+ feedback();
+ // The file has been removed succesfully
+ },function(error){
+ $moduleInstaller.status.msg = $filter('translate')('update.msg.temp_file_cant_dele');//暫存檔案刪除失敗
+ //$rootScope.$apply();
+ if(feedback)
+ feedback();
+ },function(){
+ $moduleInstaller.status.msg = $filter('translate')('update.msg.temp_file_not_exist');//暫存檔案不存在
+ //$rootScope.$apply();
+ if(feedback)
+ feedback();
+ });
+ });
+ });
+ } catch(e){
+ nodeRequire('fs').unlink(url+'\\'+fileName, function(error){
+ if(feedback)
+ feedback();
+ });
+ }
+ }
+ return $moduleInstaller;
+ }
+ ];
+ });
+ })();
+
+ })(window, window.angular);
diff --git a/SRC/iMES_PAD/JSplugins/ModuleInstaller/sJDSConfig.css b/SRC/iMES_PAD/JSplugins/ModuleInstaller/sJDSConfig.css
new file mode 100644
index 0000000..406129d
--- /dev/null
+++ b/SRC/iMES_PAD/JSplugins/ModuleInstaller/sJDSConfig.css
@@ -0,0 +1,31 @@
+.sJDSConfig-dialog{
+ width: 50%;
+}
+.sJDSConfig-dialog .kmi-layout-main-content{
+ padding: 8px 16px;
+ border-radius: 5px;
+}
+.sJDSConfig-dialog .kmi-text-fields{
+ margin-bottom: 4px;
+}
+.sJDSConfig-dialog .loading-msg{
+ padding: 8px;
+}
+.sJDSConfig-dialog .kmi-text-fields--triangle{
+ border: 1px solid #1ab7cd;
+ border-radius: 4px;
+}
+.sJDSConfig-dialog .kmi-text-fields--triangle .label>label:FIRST-CHILD{
+ background: #1ab7cd;
+}
+.sJDSConfig-dialog .kmi-text-fields--triangle .triangle{
+ border-color: transparent transparent transparent #1ab7cd;
+}
+.sJDSConfig-dialog .btn-content{
+ display: flex;
+ justify-content: flex-end;
+}
+
+.sJDSConfig-dialog .btn-content .kmi-button{
+ margin-bottom: 0px;
+}
diff --git a/SRC/iMES_PAD/JSplugins/ModuleInstaller/sJDSConfig.tmp.html b/SRC/iMES_PAD/JSplugins/ModuleInstaller/sJDSConfig.tmp.html
new file mode 100644
index 0000000..cd83d0e
--- /dev/null
+++ b/SRC/iMES_PAD/JSplugins/ModuleInstaller/sJDSConfig.tmp.html
@@ -0,0 +1,60 @@
+
Please click on an element
+ + {{ record.title }} + +