var EnumOAFlag = { DocFromOA: 1, DocFromNoOA: 0, } //标识文档的落地模式 本地文档落地 0 ,不落地 1 var EnumDocLandMode = { DLM_LocalDoc: 0, DLM_OnlineDoc: 1, } //加载时会执行的方法 function OnWPSWorkTabLoad(ribbonUI) { wps.ribbonUI = ribbonUI if (typeof wps.Enum == 'undefined') { // 如果没有内置枚举值 wps.Enum = WPS_Enum } OnJSWorkInit() //初始化文档事件(全局参数,挂载监听事件) // activeTab(); // 激活OA助手菜单 if (!IsWindows()) { constStrEnum.DirSeparator = '/' } return true } //文档各类初始化工作(WPS Js环境) function OnJSWorkInit() { pInitParameters() //OA助手环境的所有配置控制的初始化过程 AddWorkbookEvent() //挂接文档事件处理函数 } //初始化全局参数 function pInitParameters() { var l_wpsUserName = wps.Application.UserName wps.PluginStorage.setItem('WPSInitUserName', l_wpsUserName) //在OA助手加载前,先保存用户原有的WPS应用用户名称 wps.PluginStorage.setItem('OADocCanSaveAs', false) //默认OA文档不能另存为本地 wps.PluginStorage.setItem('AllowOADocReOpen', false) //设置是否允许来自OA的文件再次被打开 wps.PluginStorage.setItem('ShowOATabDocActive', false) //设置新打开文档是否默认显示OA助手菜单Tab //默认为false wps.PluginStorage.setItem('DefaultUploadFieldName', 'file') //针对UploadFile方法设置上载字段名称 // 以下是一些临时状态参数,用于打开文档等的状态判断 wps.PluginStorage.setItem('IsInCurrOADocOpen', false) //用于执行来自OA端的新建或打开文档时的状态 wps.PluginStorage.setItem('IsInCurrOADocSaveAs', false) //用于执行来自OA端的文档另存为本地的状态 } //挂载WPS的表格事件 function AddWorkbookEvent() { wps.ApiEvent.AddApiEventListener('WindowActivate', OnWindowActivate) wps.ApiEvent.AddApiEventListener('WorkbookBeforeClose', OnWorkbookBeforeClose) wps.ApiEvent.AddApiEventListener('WorkbookBeforeSave', OnWorkbookBeforeSave) wps.ApiEvent.AddApiEventListener('WorkbookOpen', OnWorkbookOpen) } /** * 根据传入Document对象,获取OA传入的参数的某个Key值的Value * @param {*} Doc * @param {*} Key * 返回值:返回指定 Key的 Value */ function GetDocParamsValue(Doc, Key) { if (!Doc) { return '' } var l_Params = wps.PluginStorage.getItem(GetUniqueId(Doc)) if (!l_Params) { return '' } var l_objParams = JSON.parse(l_Params) if (typeof l_objParams == 'undefined') { return '' } var l_rtnValue = l_objParams[Key] if (typeof l_rtnValue == 'undefined' || l_rtnValue == null) { return '' } return l_rtnValue } /** * 作用:根据OA传入参数,设置是否显示Ribbob按钮组 * 参数:CtrlID 是OnGetVisible 传入的Ribbob控件的ID值 */ function pShowRibbonGroupByOADocParam(CtrlID) { var l_Doc = wps.EtApplication().ActiveWorkbook if (!l_Doc) { return false //如果未装入文档,则设置OA助手按钮组不可见 } //获取OA传入的按钮组参数组 var l_grpButtonParams = GetDocParamsValue(l_Doc, 'buttonGroups') //disableBtns l_grpButtonParams = l_grpButtonParams + ',' + GetDocParamsValue(l_Doc, 'disableBtns') // 要求OA传入控制自定义按钮显示的参数为字符串 中间用 , 分隔开 if (typeof l_grpButtonParams == 'string') { var l_arrayGroup = new Array() l_arrayGroup = l_grpButtonParams.split(',') //console.log(l_grpButtonParams); // 判断当前按钮是否存在于数组 if (l_arrayGroup.indexOf(CtrlID) >= 0) { return false } } // 添加OA菜单判断 if (CtrlID == 'WeOfficeWPSExtTab') { var l_value = wps.PluginStorage.getItem('ShowOATabDocActive') wps.PluginStorage.setItem('ShowOATabDocActive', false) //初始化临时状态变量 console.log('菜单:' + l_value) return l_value } //disableBtns return true } /** * 调用文件上传到OA服务端时, * @param {*} resp */ function OnUploadToServerSuccess(resp) { loginfo('成功上传服务端后的回调:' + resp) return } /** * 上传失败回调 * @param {document} doc * @param {response} rps * @param {boolean} savetmp 是否保存临时文件 */ function OnUploadFileFail(doc, rps, savetmp = true) { //同步操作会把wps卡死 setTimeout(() => { CloseLoading(GetUniqueId(doc)) if (rps.startWith('lockError')) { if (savetmp) { var gs = doc.Name.match(/^(?.*)\.(?\w+)$/).groups var sourcename = doc.FullName var bkname = wps.Env.GetHomePath() + GetDirSpacer() + gs.name + '_锁异常临时备份' + '.' + gs.ext var data = wps.FileSystem.readAsBinaryString(sourcename) wps.FileSystem.writeAsBinaryString(bkname, data) } var failMsg = rps.split(',') var name = decodeURIComponent(failMsg[1]) || '未知' var msg = `文件已被 ${name} 编辑,无法继续提交,请确认是否关闭?` ShowConfirm(msg, 'error', { title: '提交失败', btns: [ { key: 'close', text: '确认', primary: true, callback: function () { Heart.CloseOADocument(doc) doc.Close() }, }, { key: 'cancel', text: '取消', callback: function () { SetDocParamsValue(doc, 'LockError', { callback: 'AfterLockError', msg, }) }, }, ], }) } else { ShowMessage('上传文件失败!请联系管理员', 'error') } logerr('上传失败:') logerr(rps) }, 1000) } //判断当前文档是否是OA文档 function pCheckIfOADoc() { var doc = wps.EtApplication().ActiveWorkbook if (!doc) return false return CheckIfDocIsOADoc(doc) } //根据传入的doc对象,判断当前文档是否是OA文档 function CheckIfDocIsOADoc(doc) { if (!doc) { return false } var l_isOA = GetDocParamsValue(doc, 'isOA') if (l_isOA == '') { return false } return l_isOA == EnumOAFlag.DocFromOA ? true : false } //返回是否可以点击OA保存按钮的状态 function OnSetSaveToOAEnable() { return pCheckIfOADoc() } /** * 作用:判断是否是不落地文档 * 参数:doc 文档对象 * 返回值: 布尔值 */ function pIsOnlineOADoc(doc) { var l_LandMode = GetDocParamsValue(doc, 'OADocLandMode') //获取文档落地模式 if (l_LandMode == '') { //用户本地打开的文档 return false } return l_LandMode == EnumDocLandMode.DLM_OnlineDoc } //保存到OA后台服务器 function OnBtnSaveToServer(l_doc) { var params = GetDocParamsValues(l_doc) var l_uploadPath = params[constStrEnum.uploadPath] // 文件上载路径 if (!l_uploadPath) { return } var l_FieldName = params[constStrEnum.uploadFieldName] //上载到后台的业务方自定义的字段名称 if (!l_FieldName) { l_FieldName = wps.PluginStorage.getItem(constStrEnum.DefaultUploadFieldName) // 默认为‘file’ } var l_UploadName = params[constStrEnum.uploadFileName] //设置OA传入的文件名称参数 if (!l_UploadName) { l_UploadName = l_doc.Name //默认文件名称就是当前文件编辑名称 } var l_DocPath = l_doc.FullName // 文件所在路径 if (pIsOnlineOADoc(l_doc) == false) { //落地文档,调用UploadFile方法上传到OA后台 try { //调用OA助手的上传方法 UploadFile( l_UploadName, l_DocPath, l_uploadPath, l_FieldName, l_doc, function (rps) { //延时执行,因为显示loading的页面可能还没有加载完成,注册回调事件。 //这样loading页窗体就会无法消失 setTimeout(function () { CloseLoading(GetUniqueId(l_doc)) ShowMessage('上传成功', 'success') //清空心跳记录 Heart.CloseOADocument(l_doc) OnUploadToServerSuccess(rps) l_doc.Close() }, 1000) }, OnUploadFileFail, OnUploadToServerSuccess ) } catch (err) { alert('上传文件失败!请检查系统上传参数及网络环境!') } } else { // 不落地的文档,调用 Document 对象的不落地上传方法 wps.PluginStorage.setItem('OADocUserSave', EnumDocSaveFlag.OADocSave) try { //调用不落地上传方法 l_doc.SaveAsUrl( l_UploadName, l_uploadPath, l_FieldName, 'OnUploadToServerSuccess', 'OnUploadToServerFail' ) } catch (err) { alert('上传文件失败!请检查系统上传参数及网络环境,重新上传。') } wps.PluginStorage.setItem('OADocUserSave', EnumDocSaveFlag.NoneOADocSave) } return } /** * 执行另存为本地文件操作 */ function OnBtnSaveAsLocalFile() { //初始化临时状态值 wps.PluginStorage.setItem('OADocUserSave', false) wps.PluginStorage.setItem('IsInCurrOADocSaveAs', false) //检测是否有文档正在处理 var l_doc = wps.EtApplication().ActiveWorkbook if (!l_doc) { alert('WPS当前没有可操作文档!') return } // 设置WPS文档对话框 2 FileDialogType:=msoFileDialogSaveAs var l_ksoFileDialog = wps.EtApplication().FileDialog(2) l_ksoFileDialog.InitialFileName = l_doc.Name //文档名称 if (l_ksoFileDialog.Show() == -1) { // -1 代表确认按钮 wps.PluginStorage.setItem('OADocUserSave', true) //设置保存为临时状态,在Save事件中避免OA禁止另存为对话框 l_ksoFileDialog.Execute() //会触发保存文档的监听函数 pSetNoneOADocFlag(l_doc) wps.ribbonUI.Invalidate() //刷新Ribbon的状态 } } /** * * @param {*} params * @param {*} Key */ function GetParamsValue(Params, Key) { if (typeof Params == 'undefined') { return '' } var l_rtnValue = Params[Key] return l_rtnValue } function OnAction(control) { var eleId if (typeof control == 'object' && arguments.length == 1) { //针对Ribbon的按钮的 eleId = control.Id } else if (typeof control == 'undefined' && arguments.length > 1) { //针对idMso的 eleId = arguments[1].Id console.log(eleId) } else if (typeof control == 'boolean' && arguments.length > 1) { //针对checkbox的 eleId = arguments[1].Id } else if (typeof control == 'number' && arguments.length > 1) { //针对combox的 eleId = arguments[2].Id } switch (eleId) { case 'btnRefreshVersion': refreshVersion() break case 'btnShowLogPane': ShowLogInfoDialog() break default: break } return true } /** * 刷新加载项 */ function refreshVersion() { alert('更新加载项后请重新打开WPS') } function GetVersionText() { return `当前版本:${GetCurrentVersion()}` } function ShowLogInfoDialog() { wps.ShowDialog( GetResourcePath() + 'share/ui/loginfo.html', '本地日志', 600 * window.devicePixelRatio, 600 * window.devicePixelRatio, false ) } function OnGetEnabled(control) { var eleId = typeof control == 'object' ? control.Id : control switch (eleId) { case 'btnSaveToServer': //保存到OA服务器的相关按钮。判断,如果非OA文件,禁止点击 return OnSetSaveToOAEnable() case 'btnSaveAsFile': let doc = wps.EtApplication().ActiveWorkbook let l_Params = wps.PluginStorage.getItem(doc.FullName) let OADocLandMode = JSON.parse(l_Params).OADocLandMode return !OADocLandMode default: } return true } function OnGetVisible(control) { var eleId = typeof control == 'object' ? control.Id : control var l_value = false //按照 OA文档传递过来的属性进行判断 l_value = pShowRibbonGroupByOADocParam(eleId) return l_value } function GetImage(control) { var eleId = typeof control == 'object' ? control.Id : control switch (eleId) { case 'btnSaveToServer': //保存到OA后台服务端 return './icon/w_Save.png' case 'btnSaveAsFile': //另存为本地文件 return './icon/w_SaveAs.png' default: } return './icon/c_default.png' } function OnGetLabel(control) { var eleId if (typeof control == 'object' && arguments.length == 1) { //针对Ribbon的按钮的 eleId = control.Id } else if (typeof control == 'undefined' && arguments.length > 1) { //针对idMso的 eleId = arguments[1].Id } else if (typeof control == 'boolean' && arguments.length > 1) { //针对checkbox的 eleId = arguments[1].Id } else if (typeof control == 'number' && arguments.length > 1) { //针对combox的 eleId = arguments[2].Id } switch (eleId) { // case 'btnLogDebugInfo': // return GetLocalDebugBtnText() case 'btnShowOAStatus': return GetOAStatusBtnText() default: } return '' } function GetOAStatusBtnText() { if (Heart) { if (Heart.IsOASystemOnline(false)) { return '系统在线' } else { return '系统离线' } } return '未知' } /******** 自定义功能 *********/ function getTitle() { var defaultTitle = 'IndiDocXET' var customertitle = OACustomer.getCustomerTitle('et') return customertitle || defaultTitle }