common.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487
  1. function currentTime() {
  2. var now = new Date()
  3. var year = now.getFullYear() //年
  4. var month = now.getMonth() + 1 //月
  5. var day = now.getDate() //日
  6. var hh = now.getHours() //时
  7. var mm = now.getMinutes() //分
  8. var clock = year + ''
  9. if (month < 10) clock += '0'
  10. clock += month + ''
  11. if (day < 10) clock += '0'
  12. clock += day + ''
  13. if (hh < 10) clock += '0'
  14. clock += hh + ''
  15. if (mm < 10) clock += '0'
  16. clock += mm
  17. return clock
  18. }
  19. /**
  20. * 解析返回response的参数
  21. * @param {*} resp
  22. * @return {*} body
  23. */
  24. function handleResultBody(resp) {
  25. var result = ''
  26. if (resp.Body) {
  27. // 解析返回response的参数
  28. }
  29. return result
  30. }
  31. /**
  32. * 判断WPS中的文件个数是否为0,若为0则关闭WPS函数
  33. * @param {*} name
  34. */
  35. function closeWpsIfNoDocument() {
  36. var wpsApp = wps.WpsApplication()
  37. var docs = wpsApp.Documents
  38. if (!docs || docs.Count == 0) {
  39. setTimeout(function () {
  40. //修复国产环境启动WPS后状态未重置的问题
  41. wps
  42. .WpsApplication()
  43. .CommandBars.ExecuteMso('KsoEx_RevisionCommentModify_Enable')
  44. wpsApp.Quit()
  45. }, 200)
  46. }
  47. }
  48. /**
  49. * 隐藏掉wps应用
  50. * @param {number} num beforeclose:1 afterclose:0
  51. */
  52. function hiddenIfNoDocument(num) {
  53. var wpsApp = wps.WpsApplication()
  54. var docs = wpsApp.Documents
  55. if (!docs || docs.Count == num) {
  56. loginfo('hidden')
  57. wps.Application.Visible = false
  58. }
  59. }
  60. function activeTab() {
  61. //启动WPS程序后,默认显示的工具栏选项卡为ribbon.xml中某一tab WeOfficeWPSExtTab
  62. if (wps.ribbonUI) wps.ribbonUI.ActivateTab('WeOfficeWPSExtTab')
  63. }
  64. function showOATab() {
  65. wps.PluginStorage.setItem('ShowOATabDocActive', pCheckIfOADoc()) //根据文件是否为OA文件来显示OA菜单
  66. wps.ribbonUI.Invalidate() // 刷新Ribbon自定义按钮的状态
  67. }
  68. function pGetParamName(data, attr) {
  69. var start = data.indexOf(attr)
  70. data = data.substring(start + attr.length)
  71. return data
  72. }
  73. function GetRequest(url) {
  74. if (url.indexOf('?') != -1) {
  75. //判断是否有参数
  76. var str = url.substr(1) //从第一个字符开始 因为第0个是?号 获取所有除问号的所有符串
  77. strs = str.split('=') //用等号进行分隔 (因为知道只有一个参数 所以直接用等号进分隔 如果有多个参数 要用&号分隔 再用等号进行分隔)
  78. return strs[1] //直接弹出第一个参数 (如果有多个参数 还要进行循环的)
  79. } else {
  80. return ''
  81. }
  82. }
  83. /**
  84. * 从requst中获取文件名(确保请求中有filename这个参数)
  85. * @param {*} request
  86. * @param {*} url
  87. */
  88. function pGetFileName(request, url) {
  89. var disposition = request.getResponseHeader('Content-Disposition')
  90. var filename = ''
  91. if (disposition && GetRequest(url) == '') {
  92. var matchs = disposition.match(/filename[^;\n=]*=((['"]).*?\2|[^;\n]*)/)
  93. if (matchs != null && matchs[1]) {
  94. filename = decodeURIComponent(
  95. matchs[1].replace('UTF-8', '').replace("'", '')
  96. )
  97. } else {
  98. filename = 'petro' + Date.now()
  99. }
  100. } else {
  101. //var filename = url.substring(url.lastIndexOf("/") + 1);
  102. var filename = GetRequest(url)
  103. }
  104. return filename
  105. }
  106. /**
  107. *
  108. * @param {String} params OA传递过来的字符串
  109. * @returns 文件名称
  110. */
  111. function GetFileNameByParams(params) {
  112. return getParamFormIndiDocxForm(params.fileInfo, 'file_name')
  113. }
  114. function GetFileNameByFileInfo(fileInfo) {
  115. return getParamFormIndiDocxForm(fileInfo, 'file_name')
  116. }
  117. /**
  118. * 获取落地文件地址
  119. * @param {*} url
  120. * @param {*} filename
  121. * @param {boolean} 生成随机dir
  122. * @returns
  123. */
  124. function GetLocalFileName(url, filename, random) {
  125. var match = url.match(/(?<id>\d*)(\?fileName=(?<filename>.*))?$/)
  126. var customerdir = OACustomer.getCustomerDir('word')
  127. var dir =
  128. (customerdir || wps.Env.GetTempPath()) +
  129. constStrEnum.DirSeparator +
  130. match.groups.id
  131. mkdir(dir)
  132. if (!!filename) return dir + constStrEnum.DirSeparator + filename
  133. if (random) {
  134. dir +=
  135. constStrEnum.DirSeparator +
  136. Number(Math.random().toString().substr(3, 3) + Date.now()).toString(36)
  137. mkdir(dir)
  138. }
  139. return dir + constStrEnum.DirSeparator + match.groups.filename
  140. }
  141. /**
  142. * WPS下载文件到本地打开(业务系统可根据实际情况进行修改)
  143. * @param {*} url 文件流的下载路径
  144. * @param {*} callback 下载后的回调
  145. * @param {boolean} random 是否随机目录名称 如果fileName为空这个参数才生效
  146. */
  147. function DownloadFile(url, fileName, random = false) {
  148. return new Promise((resolve, reject) => {
  149. var xhr = new XMLHttpRequest()
  150. xhr.onreadystatechange = function () {
  151. if (this.readyState == 4) {
  152. if (this.status == 200) {
  153. try {
  154. var path = GetLocalFileName(url, fileName, random)
  155. var sourceName = pGetFileName(this, url)
  156. loginfo(`下载文件[${sourceName}]完成`)
  157. var reader = new FileReader()
  158. reader.onload = function () {
  159. wps.FileSystem.writeAsBinaryString(path, reader.result)
  160. loginfo(`下载文件[${sourceName}]写入磁盘完成`)
  161. resolve(path)
  162. }
  163. reader.readAsBinaryString(xhr.response)
  164. } catch (err) {
  165. toggleBeforeOAfterLoading()
  166. loginfo(err)
  167. reject(err)
  168. }
  169. } else {
  170. toggleBeforeOAfterLoading()
  171. loginfo(`下载文件[${fileName}]报错:${xhr.status}`)
  172. reject(xhr.status)
  173. }
  174. }
  175. }
  176. GetToken().then(function (token) {
  177. xhr.open('GET', url)
  178. xhr.setRequestHeader('Authorization', token)
  179. xhr.responseType = 'blob'
  180. loginfo(`开始下载文件[${fileName}]`)
  181. xhr.send()
  182. })
  183. })
  184. }
  185. function getParamFormIndiDocxForm(initStr, paramName) {
  186. if (initStr == null || initStr == '' || initStr.indexOf(paramName) < 0) {
  187. return ''
  188. }
  189. var startTag = '<' + paramName + '>'
  190. var endTag = '</' + paramName + '>'
  191. var value = ''
  192. value = initStr.split(startTag)[1]
  193. value = value.split(endTag)[0]
  194. return value
  195. }
  196. /**
  197. * WPS上传文件到服务端(业务系统可根据实际情况进行修改,为了兼容中文,服务端约定用UTF-8编码格式)
  198. * @param {*} strFileName 上传到服务端的文件名称(包含文件后缀)
  199. * @param {*} strPath 上传文件的文件路径(文件在操作系统的绝对路径)
  200. * @param {*} uploadPath 上传文件的服务端地址
  201. * @param {*} strFieldName 业务调用方自定义的一些内容可通过此字段传递,默认赋值'file'
  202. * @param {*} OnSuccess 上传成功后的回调
  203. * @param {*} OnFail 上传失败后的回调
  204. * @param {*} l_doc 当前操作的doc对象
  205. */
  206. function UploadFile(
  207. strFileName,
  208. strPath,
  209. uploadPath,
  210. strFieldName = 'file',
  211. l_doc,
  212. OnSuccess,
  213. OnFail,
  214. OnComplated
  215. ) {
  216. var params = GetDocParamsValues(l_doc)
  217. //统一名称
  218. var filename = strFileName // getParamFormIndiDocxForm(params.fileInfo, 'file_name')
  219. //只读文档
  220. if (l_doc.ProtectionType == WdProtectionType.wdAllowOnlyFormFields) {
  221. return
  222. }
  223. loginfo('文件内容读取')
  224. var fileData = wps.FileSystem.readAsBinaryString(strPath)
  225. loginfo('文件内容读取完成')
  226. var data = new FakeFormData()
  227. if (params.action != null && params.action != '') {
  228. data.append('action', utf16ToUtf8(params.action))
  229. }
  230. if (params.trackFileName != null && params.trackFileName != '') {
  231. data.append('trackFileName', utf16ToUtf8(params.trackFileName))
  232. }
  233. data.append('querystring', utf16ToUtf8(params.fileInfo))
  234. data.append('FileName', utf16ToUtf8(filename))
  235. if (params.uploadParam != '' && params.uploadParam != 'undefined') {
  236. var arrParams = params.uploadParam.split('|')
  237. for (var i = 0; i < arrParams.length; i++) {
  238. if (arrParams[i] != '') {
  239. data.append(
  240. arrParams[i].split('=')[0],
  241. utf16ToUtf8(arrParams[i].split('=')[1])
  242. )
  243. }
  244. }
  245. }
  246. if (!strFieldName) {
  247. //如果业务方没定义,默认设置为'file'
  248. strFieldName = 'file'
  249. }
  250. data.append(strFieldName, {
  251. name: utf16ToUtf8(strFileName), //主要是考虑中文名的情况,服务端约定用utf-8来解码。
  252. type: 'application/octet-stream',
  253. getAsBinary: function () {
  254. return fileData
  255. },
  256. })
  257. var xhr = new XMLHttpRequest()
  258. xhr.open('POST', uploadPath, true)
  259. //添加回调来刷新前端列表 青格勒 2021年4月16日
  260. xhr.onreadystatechange = function () {
  261. if (this.readyState == 4) {
  262. OnComplated && OnComplated()
  263. //接口会返回多种结构的信息
  264. //平台异常返回json;eq:{"message":"groupId参数格式不正确","errors":null,"code":400} httpCode为code元素
  265. //成功返回true|XXXXX|XXXXXXX httpCode 200
  266. //悲观锁异常返回 lockError|lock failure httpCode 200
  267. if (this.status === 200 || this.status === 0) {
  268. loginfo(`上传文件[${filename}]完成`)
  269. if (this.responseText.startsWith('true')) {
  270. OnSuccess && OnSuccess(this.response)
  271. } else {
  272. OnFail && OnFail(l_doc, this.response)
  273. }
  274. } else {
  275. loginfo(`上传文件[${l_doc.Name}]报错:${this.response}`)
  276. OnFail && OnFail(l_doc, this.response)
  277. }
  278. }
  279. }
  280. if (OnFail)
  281. xhr.timeout = function () {
  282. OnFail(l_doc, 'timeout')
  283. }
  284. GetToken().then(function (token) {
  285. xhr.setRequestHeader('Cache-Control', 'no-cache')
  286. xhr.setRequestHeader('Authorization', token)
  287. xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest')
  288. if (data.fake) {
  289. xhr.setRequestHeader(
  290. 'Content-Type',
  291. 'multipart/form-data; boundary=' + data.boundary
  292. )
  293. loginfo(`开始编码[${filename}]`)
  294. var arr = StringToUint8Array(data.toString())
  295. loginfo(`编码[${filename}]完成`)
  296. try {
  297. loginfo(`上传文件[${filename}]`)
  298. xhr.send(arr)
  299. } catch (e) {
  300. logerr('刷新授权错误:' + e)
  301. OnFail && OnFail(this.response)
  302. }
  303. } else {
  304. try {
  305. loginfo(`上传文件[${filename}]`)
  306. xhr.send(data)
  307. } catch (e) {
  308. logerr('刷新授权错误:' + e)
  309. OnFail && OnFail(this.response)
  310. }
  311. }
  312. })
  313. }
  314. /**
  315. * 上传并删除action和trackFileName
  316. * @param {*} doc
  317. * @param {*} uploadName
  318. * @param {*} uploadPath
  319. * @param {*} docPath
  320. * @param {*} fieldName
  321. */
  322. function UploadAndRemoveAction(
  323. doc,
  324. uploadName,
  325. uploadPath,
  326. docPath,
  327. fieldName
  328. ) {
  329. try {
  330. doc.Save()
  331. //调用OA助手的上传方法
  332. UploadFile(
  333. uploadName,
  334. docPath,
  335. uploadPath,
  336. fieldName,
  337. doc,
  338. function () {
  339. SetDocParamsValue(doc, 'action', null)
  340. SetDocParamsValue(doc, 'trackFileName', null)
  341. var params = GetDocParamsValues(doc)
  342. if (params.fileparam.IsMaximization == false) {
  343. //静默模式
  344. doc.Close()
  345. }
  346. },
  347. function (doc, rps) {
  348. OnUploadFileFail(doc, rps, false)
  349. }
  350. )
  351. } catch (err) {
  352. alert('上传文件失败!请检查系统上传参数及网络环境!')
  353. }
  354. }
  355. /**
  356. * 根据传入Document对象,获取OA传入的参数的某个Key值的Value
  357. * @param {*} Doc
  358. * @param {*} Key
  359. * 返回值:返回指定 Key的 Value
  360. */
  361. function GetDocParamsValue(Doc, Key) {
  362. if (!Doc) {
  363. return ''
  364. }
  365. var l_Params = wps.PluginStorage.getItem(GetUniqueId(Doc))
  366. if (!l_Params) {
  367. return ''
  368. }
  369. var l_objParams = JSON.parse(l_Params)
  370. if (typeof l_objParams == 'undefined') {
  371. return ''
  372. }
  373. var l_rtnValue = l_objParams[Key]
  374. if (typeof l_rtnValue == 'undefined' || l_rtnValue == null) {
  375. return ''
  376. }
  377. return l_rtnValue
  378. }
  379. /**
  380. * 根据传入Document对象,获取OA传入的参数的所有参数
  381. * @param {*} Doc
  382. * @param {*} Key
  383. * 返回值 Object
  384. */
  385. function GetDocParamsValues(Doc) {
  386. if (!Doc) {
  387. return ''
  388. }
  389. var l_Params = wps.PluginStorage.getItem(GetUniqueId(Doc))
  390. if (!l_Params) {
  391. return ''
  392. }
  393. return JSON.parse(l_Params)
  394. }
  395. /**
  396. * 设置文档参数的属性值
  397. * @param {*} Doc
  398. * @param {*} Key
  399. * @param {*} Value
  400. */
  401. function SetDocParamsValue(Doc, Key, Value) {
  402. if (!Doc || !Key) {
  403. return
  404. }
  405. var docid = GetUniqueId(Doc)
  406. var l_Params = wps.PluginStorage.getItem(docid) || '{}'
  407. var l_objParams = JSON.parse(l_Params)
  408. if (!(typeof l_objParams == 'undefined')) {
  409. l_objParams[Key] = Value
  410. }
  411. //把属性值整体再写回原来的文档ID中
  412. wps.PluginStorage.setItem(docid, JSON.stringify(l_objParams))
  413. }
  414. /**
  415. * 批量设置文档oa参数
  416. * @param {wps.document} Doc
  417. * @param {Object} values
  418. * @returns
  419. */
  420. function SetDocParamsValues(Doc, values) {
  421. if (!Doc) {
  422. return
  423. }
  424. var docid = GetUniqueId(Doc)
  425. var l_Params = wps.PluginStorage.getItem(docid) || '{}'
  426. var l_objParams = JSON.parse(l_Params)
  427. if (!(typeof l_objParams == 'undefined')) {
  428. Object.keys(values).forEach((key) => {
  429. l_objParams[key] = values[key]
  430. })
  431. }
  432. //把属性值整体再写回原来的文档ID中
  433. wps.PluginStorage.setItem(docid, JSON.stringify(l_objParams))
  434. }
  435. function GetCurrentDocument() {
  436. return wps.Application.ActiveDocument
  437. }