apiready = function () { var ctrl = { frames: [], userId: null, messageSocket: null, //用来获取产生新消息的消息 newsSocket: null, // 用来获取产生新闻 messageTimer: null, //messageSocket 与服务端发送心跳 newsTimer: null, init: {}, initWebsocket: {}, //初始化websocket closeWebsocket: {}, //关闭websocket bind: {}, initBadge: {}, switchFrame: {}, frameX: 0, frameY: 0, frameWidth: 0, frameHeight: 0, defaultNavItemCallback: {}, featureFrameCallBack: {}, checkToUpdate: {}, //查询已跟新 checkHasUpdated: {}, //查出是否已经跟新 // address: 'api.dianwutong.com' address: 'wss://cdyapi.saas.dianwutong.com' } //初始化页面 ctrl.init = function () { // 解决iphonex底部标签栏被虚拟home键遮挡 $api.fixTabBar($api.byId('footer')); // 适配状态栏 var statusBarHeightDom = document.getElementById('statusBarHeight'); if (api.systemType == "android") { // var statusBar = api.require('statusBar'); // var statusBarHeight = statusBar.getStatusBarHeight(); // statusBarHeightDom.style.height = statusBarHeight + 'px'; statusBarHeightDom.style.height = api.safeArea.top + 'px'; } else { statusBarHeightDom.style.height = '1.67rem'; } ctrl.initPorjectPicker(); ctrl.checkToUpdate(); ctrl.checkHasUpdated(); //获取token; 如果token不存存在跳转登录页 var token = $api.getStorage("token"); if (!token) { api.openWin({ name: 'login', url: 'widget://html/user/login.html' }); api.closeWin({}); return false; } ctrl.dialogBox = api.require('dialogBox'); //初始化底部badge ctrl.initBadge(); // privilegeModule.getMenuList(function() { // ctrl.initFrame(); // }); ctrl.frames["messageFrame"] = { "title": "消息", "url": "widget://html/index/messageFrame.html", "normalIcon": "../../image/message-normal.svg", "activeIcon": "../../image/message-active.svg", "navItem": $api.dom(".nav-item[frame='messageFrame']"), "callback": ctrl.messageNavItemCallback }; ctrl.frames["rtAlarmFrame"] = { "title": "实时报警", "url": "widget://html/index/rtAlarmFrame.html", "normalIcon": "../../image/rtAlarm-normal.svg", "activeIcon": "../../image/rtAlarm-active.svg", "navItem": $api.dom(".nav-item[frame='rtAlarmFrame']"), "callback": ctrl.defaultNavItemCallback } ctrl.frames["featureFrame"] = { "title": "功能", "url": "widget://html/index/featureFrame.html", "normalIcon": "../../image/feature-normal.svg", "activeIcon": "../../image/feature-active.svg", "navItem": $api.dom(".nav-item[frame='featureFrame']"), "callback": ctrl.featureFrameCallBack }; ctrl.frames["contactFrame"] = { "title": "一键直通", "url": "widget://html/index/contactFrame.html", "normalIcon": "../../image/contact-normal.svg", "activeIcon": "../../image/contact-active.svg", "navItem": $api.dom(".nav-item[frame='contactFrame']"), "callback": ctrl.defaultNavItemCallback }; ctrl.frames["inspectionFrame"] = { "title": "巡检", "url": "widget://html/index/inspectionFrame.html", "normalIcon": "../../image/inspection-normal.svg", "activeIcon": "../../image/inspection-active.svg", "navItem": $api.dom(".nav-item[frame='inspectionFrame']"), "callback": ctrl.defaultNavItemCallback }; ctrl.frames["systemOrderFrame"] = { "title": "工单", "url": "widget://html/index/systemOrderFrame.html", "normalIcon": "../../image/repair-normal.svg", "activeIcon": "../../image/repair-active.svg", "navItem": $api.dom(".nav-item[frame='systemOrderFrame']"), "callback": ctrl.defaultNavItemCallback }; ctrl.bind(); // //计算frame显示的位置和尺寸 var windowWidth = parseInt($api.cssVal($api.dom("body"), "width")); var windowHeight = parseInt($api.cssVal($api.dom("body"), "height")); var headerHeight = parseInt($api.cssVal($api.dom(".index-header"), "height")); var footerHeight = parseInt($api.cssVal($api.dom("footer"), "height")); var footerPaddingBottom = parseInt($api.cssVal($api.dom("footer"), "padding-bottom")); this.frameX = 0; this.frameY = headerHeight; this.frameWidth = windowWidth; this.frameHeight = windowHeight - headerHeight - footerHeight - footerPaddingBottom; // add start // 员工账号登录,所有底部Tab菜单全部可见,客户登陆时,隐藏底部巡检、工单Tab var isEmployee = $api.getStorage("isEmployee") if (isEmployee) { // 隐藏底部全部tab // $api.css($api.domAll('.nav-item'), 'display:none'); // $api.domAll('.nav-item').forEach(function (el, index) { // $api.css(el, 'display:none'); // }) var tabArr = [] $api.css($api.dom('#inspectionFrame'), 'display:block') tabArr.push('inspectionFrame') $api.css($api.dom('#systemOrderFrame'), 'display:block') tabArr.push('systemOrderFrame') // 隐藏“消息”和“一键直通”tab // $api.css($api.dom('#messageFrame'), 'display:none') // $api.css($api.dom('#contactFrame'), 'display:none') ctrl.switchFrame('rtAlarmFrame'); return } privilegeModule.getMenuList(function () { ctrl.initFrame(); }); ctrl.switchFrame("messageFrame"); ctrl.initWebsocket(); } // 初始化frame ctrl.initFrame = function () { if (!privilegeModule.hasMenu('实时报警')) { $api.css($api.dom('#rtAlarmFrame'), 'display:none'); } if (!privilegeModule.hasMenu('功能')) { $api.css($api.dom('#featureFrame'), 'display:none'); } if (!privilegeModule.hasMenu('一键直通')) { $api.css($api.dom('#contactFrame'), 'display:none'); } $api.css($api.dom('#inspectionFrame'), 'display:none'); $api.css($api.dom('#systemOrderFrame'), 'display:none'); } // 判断是否为园区客户(显示客户即项目下拉选项) ctrl.initPorjectPicker = function () { var customers = $api.getStorage('customers'); var projectPicker = $api.dom('#project-picker'); if (!customers || customers.length <= 1) { $api.text(projectPicker, ''); } else { $api.text(projectPicker, '项目'); }; } //弹出框设置 ctrl.initAlertContent = function (options) { var options = options || {}; var content = { texts: { title: options.title || '提示', content: options.content || '您将退出此次登陆,是否确定?', leftBtnTitle: '确认', rightBtnTitle: '取消', }, styles: { bg: '#fff', corner: 6, w: 300, title: { marginT: 20, titleSize: 18, titleColor: '#000' }, content: { marginT: 10, color: '#000', size: 14 }, left: { marginB: 7, marginL: 20, w: 130, h: 35, corner: 2, bg: 'white', size: 18, }, right: { marginB: 7, marginL: 10, w: 130, h: 35, corner: 2, bg: 'white', size: 18 } } } return content; } //初始化websocket ctrl.initWebsocket = function () { if (this.messageSocket) { return false; } if (this.newsSocket) { return false; } // var roleId = $api.getStorage('roleId'); var userId = $api.getStorage('userId'); var url = ctrl.address + '/ems/app/msg_socket/' + userId; var newsUrl = ctrl.address + '/admin/app/msg_socket/' + userId; this.messageSocket = new WebSocket(url); this.newsSocket = new WebSocket(newsUrl); this.messageSocket.onmessage = function (data) { messageDao.updateData(); } this.messageSocket.onclose = function () { ctrl.closeWebsocket(); // api.toast({ // msg: "消息socket连接失败" // }); } this.newsSocket.onclose = function () { ctrl.closeWebsocket(); } this.newsSocket.onmessage = function (data) { messageDao.updateData(); } this.messageTimer = setInterval(function () { if (ctrl.messageSocket) { //发送心跳 避免socket长时间没有消息传递而断开 ctrl.messageSocket.send('beat'); } }, 30000); this.newsTimer = setInterval(function () { if (ctrl.newsSocket) { //发送心跳 避免socket长时间没有消息传递而断开 ctrl.newsSocket.send('beat'); } }, 30000); } //关闭websocket ctrl.closeWebsocket = function () { if (this.messageTimer) { clearInterval(this.messageTimer); } if (this.newsTimer) { window.clearInterval(this.newsTimer); } if (this.messageSocket) { this.messageSocket.close(); this.messageSocket = null; } if (this.newsSocket) { this.newsSocket.close(); this.newsSocket = null; } } //退出登录 ctrl.logout = function () { // 在清除所有的storage信息时,若选择了记住密码,则重新存储账号密码 var remember = $api.getStorage('remember'); var account = $api.getStorage('account'); var password = $api.getStorage('password'); $api.clearStorage(); if (remember) { $api.setStorage('remember', remember); $api.setStorage("account", account); $api.setStorage("password", password); } api.sendEvent({ name: 'loginout' }); api.removeEventListener({ name: 'leftPanelClicklogout' }); api.removeEventListener({ name: 'changePwdTip' }); api.removeEventListener({ name: 'leftPanelClickClear' }); api.closeWin({ animation: { type: "fade" } }); api.openWin({ name: 'login', url: 'widget://html/user/login.html', }); } //事件绑定 ctrl.bind = function () { //修改密码提示 var timer; api.addEventListener({ name: 'changePwdTip' }, function () { if (timer) { window.clearTimeout(timer); } var timer = window.setTimeout(function () { ctrl.dialogBox.alert({ texts: { content: '体验账号没有修改密码的权限', leftBtnTitle: '确定', }, styles: { bg: '#fff', w: 300, corner: 6, content: { color: '#000', size: 14 }, left: { marginB: 7, marginL: 0, w: 300, h: 30, corner: 2, bg: '#fff', size: 18 }, } }, function (ret) { if (ret.eventType == 'left') { ctrl.dialogBox.close({ dialogName: 'alert' }); } }); }, 100) }) //避免重复监听 api.removeEventListener({ name: 'leftPanelClicklogout' }); //退出登录 var alertContent = ctrl.initAlertContent(); api.addEventListener({ name: 'leftPanelClicklogout' }, function (ret, err) { if (timer) { window.clearTimeout(timer); } var timer = window.setTimeout(function () { ctrl.dialogBox.alert(alertContent, function (ret) { if (ret.eventType == 'right') { ctrl.dialogBox.close({ dialogName: 'alert' }); } else if (ret.eventType == 'left') { ctrl.dialogBox.close({ dialogName: 'alert' }); ctrl.logout(); } }); }, 100) }) //清除缓存 api.addEventListener({ name: 'leftPanelClickClear' }, function (ret, err) { if (timer) { window.clearTimeout(timer); } window.setTimeout(function () { var options = {}; options.title = "清空缓存"; options.content = "该操作将清空图片缓存,消息等数据,是否清空?" var alertContent = ctrl.initAlertContent(options); ctrl.dialogBox.alert(alertContent, function (ret) { if (ret.eventType == 'right') { ctrl.dialogBox.close({ dialogName: 'alert' }); } else if (ret.eventType == 'left') { api.clearCache(function () { messageDao.clearAll(function () { api.execScript({ name: 'index', script: 'api.toast({msg:"成功清空缓存"});' }); var dialogBox = api.require('dialogBox'); ctrl.dialogBox.close({ dialogName: 'alert' }); }) }); } }); }, 100) }) // 应用从后台回到前台 api.addEventListener({ name: 'resume' }, function (ret, err) { ctrl.initWebsocket(); if (!/has_remind_update/.test(document.cookie)) { ctrl.checkToUpdate(); } }); //应用到后台 api.addEventListener({ name: 'pause' }, function (ret, err) { ctrl.closeWebsocket(); }); //绑定底部导航 var navItems = $api.domAll(".nav-item"); var length = navItems.length; for (var i = 0; i < length; i++) { (function (index) { $api.addEvt(navItems[index], "touchend", function () { // 切换底部nav时,隐藏掉modal(项目选择modal和配电室选择modal) api.sendEvent({ name: 'requestCloseModal' }); var frameName = $api.attr(this, "frame"); var frame = ctrl.frames[frameName]; if (typeof (frame.callback) == "function") { frame.callback(this); } }, false); })(i); } //绑定用户按钮 点击弹出左侧的抽屉页 $api.addEvt($api.dom("#user"), "touchend", function () { //发送点击的事件提醒隐藏配电室;列表 api.sendEvent({ name: 'userTouched', }); // $api.css($api.dom("#pr-picker-modal"), "display:none"); api.openDrawerPane({ type: 'left' }); }, false); //阻止android的返回事件 api.addEventListener({ name: 'keyback' }, function (ret, err) { api.closeWidget({}); return false; }); //阻止ios的返回事件 api.addEventListener({ name: 'swiperight' }, function (ret, err) { return false; }); //如果二级页面设置了横屏显示 返回时变成横屏 api.addEventListener({ name: 'viewappear' }, function (ret, err) { }); //切换配电室 $api.addEvt($api.dom("#pr-name"), "touchend", function () { api.sendEvent({ name: 'requestChangePr' }); }, false); //收到配电室改变的消息 api.addEventListener({ name: 'prChanged' }, function (ret, err) { if (!err) { var prName = ret.value.prName; var length = prName.length; if (length > 10) { prName = prName.slice(0, 10) + "..."; } $api.text($api.dom("#pr-name"), prName); } }); //收到消息改变的事件 api.addEventListener({ name: 'messageUpdated' }, function (ret, err) { ctrl.initBadge(); }); //收到报警改变的事件 api.addEventListener({ name: 'rtAlarmListUpdated' }, function (ret, err) { ctrl.initBadge(); }); // add by guoyuanyuan 2018/9/25 // 对于园区客户的董事长,项目经理角色,增加项目切换 $api.addEvt($api.dom("#project-picker"), "touchend", function () { api.sendEvent({ name: 'requestChangeProject' }); }, false); } //初始化导航栏底部badge //如果是ios 初始化桌面的badge ctrl.initBadge = function () { //消息badge var ajpush = api.require('ajpush'); messageDao.getAllUnReadCount(function (sum) { if (sum == 0) { $api.css($api.dom("#message-badge"), "display:none"); ajpush.setBadge({ badge: 0 }); return false; } if (sum > 99) { sum = "99+"; } $api.css($api.dom("#message-badge"), "display:block"); $api.text($api.dom("#message-badge"), sum); ajpush.setBadge({ badge: sum }); }) // //实时报警数量 var rtAlarmList = $api.getStorage('rtAlarmList'); rtAlarmList = (rtAlarmList ? rtAlarmList : []); var alarmCount = rtAlarmList.length; if (alarmCount == 0) { $api.css($api.dom("#rtAlarm-badge"), "display:none"); } else { $api.css($api.dom("#rtAlarm-badge"), "display:block"); } } // add by guoyuanyuan 2018/9/25 // 点击消息nav ctrl.messageNavItemCallback = function (obj) { ctrl.defaultNavItemCallback(obj); // 在消息页显示项目选择提示 ctrl.initPorjectPicker(); } //点击底部导航的默认回调函数 ctrl.defaultNavItemCallback = function (obj) { //隐藏掉pr-name //显示title; $api.css($api.dom("#title"), "display:block"); $api.css($api.dom("#pr-name"), "display:none"); // add by guoyuanyuan 2018/9/25 // 在其他页面不显示项目提示 var projectPicker = $api.dom('#project-picker'); $api.text(projectPicker, ''); //切换frame var frameName = $api.attr(obj, "frame"); ctrl.switchFrame(frameName); } //点击底部导航的功能按钮的回调函数 ctrl.featureFrameCallBack = function (obj) { // add by guoyuanyuan 2018/9/25 // 在其他页面不显示项目提示 var projectPicker = $api.dom('#project-picker'); $api.text(projectPicker, ''); //显示pr-name //隐藏title $api.css($api.dom("#title"), "display:none"); $api.css($api.dom("#pr-name"), "display:flex"); var powerRoom = $api.getStorage("powerRoom"); _log(powerRoom); //如果没用选中配电室 if (!powerRoom) { api.sendEvent({ name: 'requestChangePr' }); } else { var prName = powerRoom.prName; var length = prName.length; if (length > 10) { prName = prName.slice(0, 10) + "..."; } $api.text($api.dom("#pr-name"), prName); } //切换frame; var frameName = $api.attr(obj, "frame"); ctrl.switchFrame(frameName); } //切换frame ctrl.switchFrame = function (frameName) { $api.setStorage('activeNav', frameName) var _this = ctrl; var frame = _this.frames[frameName]; //显示对应的标题 $api.text($api.dom("#title"), frame.title); //重置底部导航的选中状态 var frames = _this.frames; var length = frames.length; var navItems = $api.domAll(".nav-item"); var showFrame = "$api.css($api.dom('body'), 'display:block');"; var hideFrame = "$api.css($api.dom('body'), 'display:none');"; for (var name in frames) { if (frame == frames[name]) { $api.addCls(frames[name].navItem, "active"); $api.attr($api.dom(frames[name].navItem, "img"), "src", frames[name].activeIcon); api.execScript({ frameName: name, script: showFrame }); } else { $api.removeCls(frames[name].navItem, "active"); $api.attr($api.dom(frames[name].navItem, "img"), "src", frames[name].normalIcon); api.execScript({ frameName: name, script: hideFrame }); } } //切换frame api.openFrame({ name: frameName, url: frame.url, rect: { x: _this.frameX, y: _this.frameY, w: _this.frameWidth, h: _this.frameHeight } }); } //比较版本号 ctrl.cmpVersion = function (thisVersion, otherVersion) { var _this = thisVersion.split('.'); var _other = otherVersion.split('.'); for (var i = 0; i < 3; i++) { var _t = parseInt(_this[i]); var _o = parseInt(_other[i]); if (_t > _o) { return 1; } else if (_t < _o) { return -1; } } return 0; } //版本更新 ctrl.checkToUpdate = function () { var thisVersion = api.readFile({ sync: true, path: 'widget://resource/version.txt' }); $api.getVersion(function (ret) { if (ret) { //如果当前版本低于服务器的最低版本 强制更新 if (ctrl.cmpVersion(thisVersion, ret.minSupport) < 0) { api.alert({ title: '版本更新', msg: '版本太低,强烈建议更新', buttons: ['确定'] }, function (ret, err) { update(function () { //关闭当前页 退出登录 跳转到登录页 api.openWin({ name: 'login', url: 'widget://html/user/login.html', reload: true, animation: { type: "fade" } }); api.sendEvent({ name: 'loginout' }); api.closeWin({ animation: { type: "fade" } }); }); }); } else if (ctrl.cmpVersion(thisVersion, ret.latestVersion) < 0) { //如果当前版本低于服务器的最新版本 建议更新 if (dialogBox) { return; } var dialogBox = api.require('dialogBox'); dialogBox.alert({ texts: { title: '版本更新', content: '发现新的版本,请更新', leftBtnTitle: '确定', rightBtnTitle: '取消', }, styles: { bg: '#fff', w: 300, corner: 6, title: { marginT: 20, titleSize: 18, titleColor: '#000' }, content: { marginT: 10, color: '#000', size: 14 }, left: { marginB: 7, marginL: 20, w: 130, h: 35, corner: 2, bg: '#fff', size: 18 }, right: { marginB: 7, marginL: 10, w: 130, h: 35, corner: 2, bg: 'white', size: 18 } } }, function (ret) { if (ret.eventType == 'right') { var dialogBox = api.require('dialogBox'); dialogBox.close({ dialogName: 'alert' }); } else if (ret.eventType == 'left') { update(); var dialogBox = api.require('dialogBox'); dialogBox.close({ dialogName: 'alert' }); } }); } //如果版本号不一样 标记已经提示过 //一天之内不在提示 if (ctrl.cmpVersion(thisVersion, ret.latestVersion) != 0) { var exdate = new Date() exdate.setHours(exdate.getHours() + 24) document.cookie = "has_remind_update=1;expires=" + exdate.toGMTString(); } } }, 'json'); function update(callback) { var platform = api.systemType; if (platform == "ios") { api.openApp({ iosUrl: 'https://itunes.apple.com/us/app/%E7%94%B5%E5%8A%A1%E9%80%9Asaas/id1398709195?l=zh&ls=1&mt=8' }, function (ret, err) { //coding... }); callback && callback(); } else if (platform == "android") { api.showProgress({ title: '下载中', text: '请稍等...', modal: false }); api.download({ url: "https://cdn.dianwutong.com/app/dianwutong_saas/app.apk", cache: false, allowResume: true }, function (ret, err) { api.hideProgress(); if (ret.state == 1) { //下载成功 api.installApp({ appUri: ret.savePath }); callback && callback(); } else { api.alert({ title: '版本更新', msg: '下载失败,请到电务通官网扫码下载最新app', buttons: ['确定'] }, function (ret, err) { //coding... callback && callback(); }); } }); } } } //检查是否更新 ctrl.checkHasUpdated = function () { var lastVersion = $api.getStorage('lastVersion'); var currentVersion = api.readFile({ sync: true, path: 'widget://resource/version.txt' }); if (lastVersion && ctrl.cmpVersion(lastVersion, currentVersion) < 0) { api.alert({ title: '提示', msg: '版本更新成功,请重新登陆', buttons: ['确定'] }, function (ret, err) { api.sendEvent({ name: 'loginout' }); setTimeout(function () { api.closeWin({ animation: { type: 'fade' } }); }, 500) api.openWin({ name: 'login', url: 'widget://html/user/login.html', animation: { type: 'fade' } }); }) } else { $api.setStorage('lastVersion', currentVersion); } } ctrl.init(); }