function currentTime() { var now = new Date() var year = now.getFullYear() //年 var month = now.getMonth() + 1 //月 var day = now.getDate() //日 var hh = now.getHours() //时 var mm = now.getMinutes() //分 var clock = year + '' if (month < 10) clock += '0' clock += month + '' if (day < 10) clock += '0' clock += day + '' if (hh < 10) clock += '0' clock += hh + '' if (mm < 10) clock += '0' clock += mm return clock } /** * 解析返回response的参数 * @param {*} resp * @return {*} body */ function handleResultBody(resp) { var result = '' if (resp.Body) { // 解析返回response的参数 } return result } /** * 判断WPS中的文件个数是否为0,若为0则关闭WPS函数 * @param {*} name */ function closeWpsIfNoDocument() { var wpsApp = wps.WpsApplication() var docs = wpsApp.Documents if (!docs || docs.Count == 0) { setTimeout(function () { //修复国产环境启动WPS后状态未重置的问题 wps .WpsApplication() .CommandBars.ExecuteMso('KsoEx_RevisionCommentModify_Enable') wpsApp.Quit() }, 200) } } /** * 隐藏掉wps应用 * @param {number} num beforeclose:1 afterclose:0 */ function hiddenIfNoDocument(num) { var wpsApp = wps.WpsApplication() var docs = wpsApp.Documents if (!docs || docs.Count == num) { loginfo('hidden') wps.Application.Visible = false } } function activeTab() { //启动WPS程序后,默认显示的工具栏选项卡为ribbon.xml中某一tab WeOfficeWPSExtTab if (wps.ribbonUI) wps.ribbonUI.ActivateTab('WeOfficeWPSExtTab') } function showOATab() { wps.PluginStorage.setItem('ShowOATabDocActive', pCheckIfOADoc()) //根据文件是否为OA文件来显示OA菜单 wps.ribbonUI.Invalidate() // 刷新Ribbon自定义按钮的状态 } function pGetParamName(data, attr) { var start = data.indexOf(attr) data = data.substring(start + attr.length) return data } function GetRequest(url) { if (url.indexOf('?') != -1) { //判断是否有参数 var str = url.substr(1) //从第一个字符开始 因为第0个是?号 获取所有除问号的所有符串 strs = str.split('=') //用等号进行分隔 (因为知道只有一个参数 所以直接用等号进分隔 如果有多个参数 要用&号分隔 再用等号进行分隔) return strs[1] //直接弹出第一个参数 (如果有多个参数 还要进行循环的) } else { return '' } } /** * 从requst中获取文件名(确保请求中有filename这个参数) * @param {*} request * @param {*} url */ function pGetFileName(request, url) { var disposition = request.getResponseHeader('Content-Disposition') var filename = '' if (disposition && GetRequest(url) == '') { var matchs = disposition.match(/filename[^;\n=]*=((['"]).*?\2|[^;\n]*)/) if (matchs != null && matchs[1]) { filename = decodeURIComponent( matchs[1].replace('UTF-8', '').replace("'", '') ) } else { filename = 'petro' + Date.now() } } else { //var filename = url.substring(url.lastIndexOf("/") + 1); var filename = GetRequest(url) } return filename } /** * * @param {String} params OA传递过来的字符串 * @returns 文件名称 */ function GetFileNameByParams(params) { return getParamFormIndiDocxForm(params.fileInfo, 'file_name') } function GetFileNameByFileInfo(fileInfo) { return getParamFormIndiDocxForm(fileInfo, 'file_name') } /** * 获取落地文件地址 * @param {*} url * @param {*} filename * @param {boolean} 生成随机dir * @returns */ function GetLocalFileName(url, filename, random) { var match = url.match(/(?\d*)(\?fileName=(?.*))?$/) var customerdir = OACustomer.getCustomerDir('word') var dir = (customerdir || wps.Env.GetTempPath()) + constStrEnum.DirSeparator + match.groups.id mkdir(dir) if (!!filename) return dir + constStrEnum.DirSeparator + filename if (random) { dir += constStrEnum.DirSeparator + Number(Math.random().toString().substr(3, 3) + Date.now()).toString(36) mkdir(dir) } return dir + constStrEnum.DirSeparator + match.groups.filename } /** * WPS下载文件到本地打开(业务系统可根据实际情况进行修改) * @param {*} url 文件流的下载路径 * @param {*} callback 下载后的回调 * @param {boolean} random 是否随机目录名称 如果fileName为空这个参数才生效 */ function DownloadFile(url, fileName, random = false) { return new Promise((resolve, reject) => { var xhr = new XMLHttpRequest() xhr.onreadystatechange = function () { if (this.readyState == 4) { if (this.status == 200) { try { var path = GetLocalFileName(url, fileName, random) var sourceName = pGetFileName(this, url) loginfo(`下载文件[${sourceName}]完成`) var reader = new FileReader() reader.onload = function () { wps.FileSystem.writeAsBinaryString(path, reader.result) loginfo(`下载文件[${sourceName}]写入磁盘完成`) resolve(path) } reader.readAsBinaryString(xhr.response) } catch (err) { toggleBeforeOAfterLoading() loginfo(err) reject(err) } } else { toggleBeforeOAfterLoading() loginfo(`下载文件[${fileName}]报错:${xhr.status}`) reject(xhr.status) } } } GetToken().then(function (token) { xhr.open('GET', url) xhr.setRequestHeader('Authorization', token) xhr.responseType = 'blob' loginfo(`开始下载文件[${fileName}]`) xhr.send() }) }) } function getParamFormIndiDocxForm(initStr, paramName) { if (initStr == null || initStr == '' || initStr.indexOf(paramName) < 0) { return '' } var startTag = '<' + paramName + '>' var endTag = '' var value = '' value = initStr.split(startTag)[1] value = value.split(endTag)[0] return value } /** * WPS上传文件到服务端(业务系统可根据实际情况进行修改,为了兼容中文,服务端约定用UTF-8编码格式) * @param {*} strFileName 上传到服务端的文件名称(包含文件后缀) * @param {*} strPath 上传文件的文件路径(文件在操作系统的绝对路径) * @param {*} uploadPath 上传文件的服务端地址 * @param {*} strFieldName 业务调用方自定义的一些内容可通过此字段传递,默认赋值'file' * @param {*} OnSuccess 上传成功后的回调 * @param {*} OnFail 上传失败后的回调 * @param {*} l_doc 当前操作的doc对象 */ function UploadFile( strFileName, strPath, uploadPath, strFieldName = 'file', l_doc, OnSuccess, OnFail, OnComplated ) { var params = GetDocParamsValues(l_doc) //统一名称 var filename = strFileName // getParamFormIndiDocxForm(params.fileInfo, 'file_name') //只读文档 if (l_doc.ProtectionType == WdProtectionType.wdAllowOnlyFormFields) { return } loginfo('文件内容读取') var fileData = wps.FileSystem.readAsBinaryString(strPath) loginfo('文件内容读取完成') var data = new FakeFormData() if (params.action != null && params.action != '') { data.append('action', utf16ToUtf8(params.action)) } if (params.trackFileName != null && params.trackFileName != '') { data.append('trackFileName', utf16ToUtf8(params.trackFileName)) } data.append('querystring', utf16ToUtf8(params.fileInfo)) data.append('FileName', utf16ToUtf8(filename)) if (params.uploadParam != '' && params.uploadParam != 'undefined') { var arrParams = params.uploadParam.split('|') for (var i = 0; i < arrParams.length; i++) { if (arrParams[i] != '') { data.append( arrParams[i].split('=')[0], utf16ToUtf8(arrParams[i].split('=')[1]) ) } } } if (!strFieldName) { //如果业务方没定义,默认设置为'file' strFieldName = 'file' } data.append(strFieldName, { name: utf16ToUtf8(strFileName), //主要是考虑中文名的情况,服务端约定用utf-8来解码。 type: 'application/octet-stream', getAsBinary: function () { return fileData }, }) var xhr = new XMLHttpRequest() xhr.open('POST', uploadPath, true) //添加回调来刷新前端列表 青格勒 2021年4月16日 xhr.onreadystatechange = function () { if (this.readyState == 4) { OnComplated && OnComplated() //接口会返回多种结构的信息 //平台异常返回json;eq:{"message":"groupId参数格式不正确","errors":null,"code":400} httpCode为code元素 //成功返回true|XXXXX|XXXXXXX httpCode 200 //悲观锁异常返回 lockError|lock failure httpCode 200 if (this.status === 200 || this.status === 0) { loginfo(`上传文件[${filename}]完成`) if (this.responseText.startsWith('true')) { OnSuccess && OnSuccess(this.response) } else { OnFail && OnFail(l_doc, this.response) } } else { loginfo(`上传文件[${l_doc.Name}]报错:${this.response}`) OnFail && OnFail(l_doc, this.response) } } } if (OnFail) xhr.timeout = function () { OnFail(l_doc, 'timeout') } GetToken().then(function (token) { xhr.setRequestHeader('Cache-Control', 'no-cache') xhr.setRequestHeader('Authorization', token) xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest') if (data.fake) { xhr.setRequestHeader( 'Content-Type', 'multipart/form-data; boundary=' + data.boundary ) loginfo(`开始编码[${filename}]`) var arr = StringToUint8Array(data.toString()) loginfo(`编码[${filename}]完成`) try { loginfo(`上传文件[${filename}]`) xhr.send(arr) } catch (e) { logerr('刷新授权错误:' + e) OnFail && OnFail(this.response) } } else { try { loginfo(`上传文件[${filename}]`) xhr.send(data) } catch (e) { logerr('刷新授权错误:' + e) OnFail && OnFail(this.response) } } }) } /** * 上传并删除action和trackFileName * @param {*} doc * @param {*} uploadName * @param {*} uploadPath * @param {*} docPath * @param {*} fieldName */ function UploadAndRemoveAction( doc, uploadName, uploadPath, docPath, fieldName ) { try { doc.Save() //调用OA助手的上传方法 UploadFile( uploadName, docPath, uploadPath, fieldName, doc, function () { SetDocParamsValue(doc, 'action', null) SetDocParamsValue(doc, 'trackFileName', null) var params = GetDocParamsValues(doc) if (params.fileparam.IsMaximization == false) { //静默模式 doc.Close() } }, function (doc, rps) { OnUploadFileFail(doc, rps, false) } ) } catch (err) { alert('上传文件失败!请检查系统上传参数及网络环境!') } } /** * 根据传入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 } /** * 根据传入Document对象,获取OA传入的参数的所有参数 * @param {*} Doc * @param {*} Key * 返回值 Object */ function GetDocParamsValues(Doc) { if (!Doc) { return '' } var l_Params = wps.PluginStorage.getItem(GetUniqueId(Doc)) if (!l_Params) { return '' } return JSON.parse(l_Params) } /** * 设置文档参数的属性值 * @param {*} Doc * @param {*} Key * @param {*} Value */ function SetDocParamsValue(Doc, Key, Value) { if (!Doc || !Key) { return } var docid = GetUniqueId(Doc) var l_Params = wps.PluginStorage.getItem(docid) || '{}' var l_objParams = JSON.parse(l_Params) if (!(typeof l_objParams == 'undefined')) { l_objParams[Key] = Value } //把属性值整体再写回原来的文档ID中 wps.PluginStorage.setItem(docid, JSON.stringify(l_objParams)) } /** * 批量设置文档oa参数 * @param {wps.document} Doc * @param {Object} values * @returns */ function SetDocParamsValues(Doc, values) { if (!Doc) { return } var docid = GetUniqueId(Doc) var l_Params = wps.PluginStorage.getItem(docid) || '{}' var l_objParams = JSON.parse(l_Params) if (!(typeof l_objParams == 'undefined')) { Object.keys(values).forEach((key) => { l_objParams[key] = values[key] }) } //把属性值整体再写回原来的文档ID中 wps.PluginStorage.setItem(docid, JSON.stringify(l_objParams)) } function GetCurrentDocument() { return wps.Application.ActiveDocument }