var EnumOAFlag = { DocFromOA: 1, DocFromNoOA: 0, } //记录是否用户点击OA文件的保存按钮 var EnumDocSaveFlag = { OADocSave: 1, NoneOADocSave: 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 } //设定记录RSID 用于处理逻辑判断 wps.Application.Options.StoreRSIDOnSave = true OnJSWorkInit() //初始化文档事件(全局参数,挂载监听事件) setTimeout(activeTab, 1000) // 激活OA助手菜单 // OpenTimerRun(OnDocSaveByAutoTimer); //启动定时备份过程 if (!IsWindows()) { constStrEnum.DirSeparator = '/' } // SetLocalDebug(true); 当前日志自动开启 return true } //文档各类初始化工作(WPS Js环境) function OnJSWorkInit() { wps.Application.ActiveWindow && (wps.Application.ActiveWindow.ActivePane.View.RevisionsMode = 1) pInitParameters() //OA助手环境的所有配置控制的初始化过程 AddDocumentEvent() //挂接文档事件处理函数 } //初始化全局参数 function pInitParameters() { wps.PluginStorage.setItem( constStrEnum.OADocUserSave, EnumDocSaveFlag.NoneOADocSave ) //初始化,没有用户点击保存按钮 var l_wpsUserName = wps.WpsApplication().UserName wps.PluginStorage.setItem(constStrEnum.WPSInitUserName, l_wpsUserName) //在OA助手加载前,先保存用户原有的WPS应用用户名称 wps.PluginStorage.setItem(constStrEnum.OADocCanSaveAs, false) //默认OA文档不能另存为本地 wps.PluginStorage.setItem(constStrEnum.AllowOADocReOpen, false) //设置是否允许来自OA的文件再次被打开 wps.PluginStorage.setItem(constStrEnum.ShowOATabDocActive, false) //设置新打开文档是否默认显示OA助手菜单Tab 默认为false wps.PluginStorage.setItem(constStrEnum.DefaultUploadFieldName, 'file') //针对UploadFile方法设置上载字段名称 wps.PluginStorage.setItem(constStrEnum.AutoSaveToServerTime, '10') //自动保存回OA服务端的时间间隔。如果设置0,则关闭,最小设置3分钟 wps.PluginStorage.setItem(constStrEnum.TempTimerID, '0') //临时值,用于保存计时器ID的临时值 // 以下是一些临时状态参数,用于打开文档等的状态判断 wps.PluginStorage.setItem(constStrEnum.IsInCurrOADocOpen, false) //用于执行来自OA端的新建或打开文档时的状态 wps.PluginStorage.setItem(constStrEnum.IsInCurrOADocSaveAs, false) //用于执行来自OA端的文档另存为本地的状态 } //挂载WPS的文档事件 function AddDocumentEvent() { wps.ApiEvent.AddApiEventListener('WindowActivate', OnWindowActivate) // wps.ApiEvent.AddApiEventListener('DocumentBeforeSave', OnDocumentBeforeSave) wps.ApiEvent.AddApiEventListener('DocumentBeforeClose', OnDocumentBeforeClose) wps.ApiEvent.AddApiEventListener('DocumentAfterClose', OnDocumentAfterClose) // wps.ApiEvent.AddApiEventListener( // "DocumentBeforePrint", // OnDocumentBeforePrint // ); wps.ApiEvent.AddApiEventListener('DocumentOpen', OnDocumentOpen) // wps.ApiEvent.AddApiEventListener("DocumentNew", OnDocumentNew); } /** * 作用: 把当前文档保存为其他格式的文档并上传 * @param {*} p_FileSuffix 输出的目标格式后缀名,支持:.pdf .uof .uot .ofd * @param {*} pShowPrompt 是否弹出用户确认框 */ function OnDoChangeToOtherDocFormat(p_FileSuffix, pShowPrompt) { var l_suffix = p_FileSuffix // params.suffix; if (!l_suffix) { return } //获取当前执行格式转换操作的文档 var l_doc = wps.WpsApplication().ActiveDocument if (!l_doc) { return } if (typeof pShowPrompt == 'undefined') { // pShowPrompt = true; //默认设置为弹出用户确认框 pShowPrompt = false //默认不弹出用户确认 } //默认设置为以当前文件的显示模式输出,即当前为修订则输出带有修订痕迹的 pDoChangeToOtherDocFormat(l_doc, l_suffix, pShowPrompt, true) } /** * 作用:把当前文档输出为另外的格式保存 * @param {*} p_Doc 文档对象 * @param {*} p_Suffix 另存为的目标文件格式 * @param {*} pShowPrompt 是否弹出用户确认框 * @param {*} p_ShowRevision :是否强制关闭修订,如果是False,则强制关闭痕迹显示。如果为true则不做控制输出。 */ function pDoChangeToOtherDocFormat( p_Doc, p_Suffix, pShowPrompt, p_ShowRevision ) { if (!p_Doc) { return } var l_suffix = p_Suffix //获取该文档对应OA参数的上载路径 var l_uploadPath = GetDocParamsValue(p_Doc, constStrEnum.uploadAppendPath) if (l_uploadPath == '' || l_uploadPath == null) { l_uploadPath = GetDocParamsValue(p_Doc, constStrEnum.uploadPath) } var l_FieldName = GetDocParamsValue(p_Doc, constStrEnum.uploadFieldName) if (l_FieldName == '') { l_FieldName = wps.PluginStorage.getItem(constStrEnum.DefaultUploadFieldName) //默认是'file' } if (l_uploadPath == '' && pShowPrompt == true) { ShowMessage('系统未传入有效上载文件路径!不能继续转换操作。', 'error') //如果OA未传入上载路径,则给予提示 return } //已经设置成默认不提醒无需替换ShowConfirm if (pShowPrompt == true) { if ( !wps.confirm( '当前文档将另存一份' + l_suffix + ' 格式的副本,并上传到系统后台,请确认 ?' ) ) { return } } // 先把文档输出保存为指定的文件格式,再上传到后台 wps.PluginStorage.setItem(constStrEnum.OADocUserSave, true) //设置一个临时变量,用于在BeforeSave事件中判断 if (p_ShowRevision == false) { // 强制关闭痕迹显示 var l_SourceName = p_Doc.FullName l_NewName = p_Doc.Path + '\\B_' + p_Doc.Name p_Doc.SaveAs2(($FileName = l_NewName), ($AddToRecentFiles = false)) p_Doc.SaveAs2(($FileName = l_SourceName), ($AddToRecentFiles = false)) //以下以隐藏模式打开另一个文档 var l_textEncoding = wps.WpsApplication().Options.DefaultTextEncoding //默认 936 var l_Doc = wps .WpsApplication() .Documents.Open( l_NewName, false, false, false, '', '', false, '', '', 0, l_textEncoding, false ) l_Doc.TrackRevision = false //关闭修订模式 l_Doc.ShowRevision = false //隐含属性,隐藏修订模式 l_Doc.AcceptAllRevisions() l_Doc.Save() handleFileAndUpload(l_suffix, l_Doc, l_uploadPath, l_FieldName) l_Doc.Close() wps.FileSystem.Remove(l_NewName) //删除临时文档 } else { handleFileAndUpload(l_suffix, p_Doc, l_uploadPath, l_FieldName) } wps.PluginStorage.setItem(constStrEnum.OADocUserSave, false) return } //保存到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 //默认文件名称就是当前文件编辑名称 //默认使用xml中定义的文件名 因为目前uploadFileName前端并没有传 l_UploadName = GetFileNameByParams(params) } if (params.action == 'taoda' && !!params.oldDocName) l_UploadName = params.oldDocName var l_DocPath = l_doc.FullName // 文件所在路径 loginfo('去水印') clearWaterMark(l_doc, params) loginfo('去水印完成') if (pIsOnlineOADoc(l_doc) == false) { //对于本地磁盘文件上传OA,先用Save方法保存后,再上传 //设置用户保存按钮标志,避免出现禁止OA文件保存的干扰信息 wps.PluginStorage.setItem( constStrEnum.OADocUserSave, EnumDocSaveFlag.OADocSave ) loginfo('保存文件' + l_UploadName) // l_doc.Saved = false l_doc.Saved = false l_doc.Save() //执行一次保存方法 loginfo('保存文件完成' + l_UploadName) //设置用户保存按钮标志 wps.PluginStorage.setItem( constStrEnum.OADocUserSave, EnumDocSaveFlag.NoneOADocSave ) //落地文档,调用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', 1, true) //清空心跳记录 Heart.CloseOADocument(l_doc) OnUploadToServerSuccess(rps) hiddenIfNoDocument(1) setTimeout(function () { l_doc.Close() }, 2e2) }, 200) }, OnUploadFileFail ) } catch (err) { CloseLoading(GetUniqueId(l_doc)) ShowMessage('上传文件失败!请联系管理员', 'error') logerr('上传失败:') logerr(rps) } } else { // 不落地的文档,调用 Document 对象的不落地上传方法 wps.PluginStorage.setItem( constStrEnum.OADocUserSave, EnumDocSaveFlag.OADocSave ) try { //调用不落地上传方法 l_doc.SaveAsUrl( l_UploadName, l_uploadPath, l_FieldName, 'OnUploadToServerSuccess', 'OnUploadToServerFail' ) } catch (err) { alert('上传文件失败!请检查系统上传参数及网络环境,重新上传。') } wps.PluginStorage.setItem( constStrEnum.OADocUserSave, EnumDocSaveFlag.NoneOADocSave ) } //获取OA传入的 转其他格式上传属性 //var l_suffix = GetDocParamsValue(l_doc, constStrEnum.suffix); //if (l_suffix == "") { //onsole.log("上传需转换的文件后缀名错误,无法进行转换上传!"); // return; //} //判断是否同时上传PDF等格式到OA后台 var l_uploadWithAppendPath = GetDocParamsValue( l_doc, constStrEnum.uploadWithAppendPath ) //标识是否同时上传suffix格式的文档 if (l_uploadWithAppendPath == '1') { //调用转pdf格式函数,强制关闭转换修订痕迹,不弹出用户确认的对话框 pDoChangeToOtherDocFormat(l_doc, l_suffix, false, false) } } /** * 锁异常后,二次提示操作 * @param {document} doc * @param {msg} msg */ function AfterLockError(doc, msg) { ShowConfirm(msg, 'warning', { title: '无法提交', btns: [ { key: 'close', text: '确认', primary: true, callback: function () { Heart.CloseOADocument(doc) doc.Close() }, }, { key: 'cancel', text: '取消', }, ], }) } /** * 调用文件上传到OA服务端时, * @param {*} resp */ function OnUploadToServerSuccess(resp) { loginfo('成功上传服务端后的回调:' + resp) return } function OnUploadToServerFail(resp) { alert('文件上传失败!') } //判断当前文档是否是OA文档 function pCheckIfOADoc() { var doc = wps.WpsApplication().ActiveDocument if (!doc) return false return CheckIfDocIsOADoc(doc) } //根据传入的doc对象,判断当前文档是否是OA文档 function CheckIfDocIsOADoc(doc) { if (!doc) { return false } var l_isOA = GetDocParamsValue(doc, constStrEnum.isOA) if (l_isOA == '') { return false } return l_isOA == EnumOAFlag.DocFromOA ? true : false } /** * 作用:判断是否是不落地文档 * 参数:doc 文档对象 * 返回值: 布尔值 */ function pIsOnlineOADoc(doc) { var l_LandMode = GetDocParamsValue(doc, constStrEnum.OADocLandMode) //获取文档落地模式 if (l_LandMode == '') { //用户本地打开的文档 return false } return l_LandMode == EnumDocLandMode.DLM_OnlineDoc } //自定义菜单按钮的点击执行事件 function OnAction(control) { switch (getControlId(control)) { case 'btnRefreshVersion': refreshVersion() break case 'btnShowLogPane': ShowLogInfoDialog() break default: break } return true } function getControlId(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 } return eleId } //xml文件中自定义按钮的文字处理函数 function OnGetLabel(control) { switch (getControlId(control)) { // case 'btnLogDebugInfo': // return GetLocalDebugBtnText() case 'btnShowOAStatus': return GetOAStatusBtnText() default: } return '' } function GetOAStatusBtnText() { if (Heart) { if (Heart.IsOASystemOnline(false)) { return '系统在线' } else { return '系统离线' } } return '未知' } /** * 刷新加载项 */ function refreshVersion() { alert('更新加载项后请重新打开WPS') } function GetLocalDebugBtnText() { if (IfLocalDebugInfo()) return '开启本地日志' + Date.now() else return '关闭本地日志' + Date.now() } function GetVersionText() { return `当前版本:${GetCurrentVersion()}` } function ShowLogInfoDialog() { wps.ShowDialog( GetResourcePath() + 'share/ui/loginfo.html', '本地日志', 600 * window.devicePixelRatio, 600 * window.devicePixelRatio, false ) } function ShowTabPane() { let taskPane = wps.CreateTaskPane(GetUrlPath() + '/ui/taskpane.html') taskPane.Title = 'IndiDocx' taskPane.DockPosition = wps.Enum.JSKsoEnum_msoCTPDockPositionLeft taskPane.Visible = true } /******** 自定义功能 *********/ function getTitle() { var defaultTitle = 'Indidocx' var customertitle = OACustomer.getCustomerTitle('word') return customertitle || defaultTitle } function getCusBtnVisiable(control) { var id = getControlId(control) if (id.indexOf('cbn') == -1) return false var btn = OACustomer.getCustomerBtn('word', id.substr(3)) return !!btn } function getCusBtnIcon(control) { var id = getControlId(control) if (id.indexOf('cbn') == -1) return '' var btn = OACustomer.getCustomerBtn('word', id.substr(3)) return !!btn ? btn.getIcon() : '' } function getCusBtnLabel(control) { var id = getControlId(control) if (id.indexOf('cbn') == -1) return false var btn = OACustomer.getCustomerBtn('word', id.substr(3)) return !!btn ? btn.getLabel() : '' } function onCusBtnAction(control) { var id = getControlId(control) if (id.indexOf('cbn') == -1) return false var btn = OACustomer.getCustomerBtn('word', id.substr(3)) if (!!btn) btn.onAction() wps.ribbonUI.Invalidate() return true }