func_docEvents.js 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. //切换窗口时触发的事件
  2. function OnWindowActivate() {
  3. var l_doc = wps.EtApplication().ActiveWorkbook
  4. SetCurrDocEnvProp(l_doc) // 设置当前文档对应的用户名
  5. showOATab() // 根据文件是否为OA文件来显示OA菜单再进行刷新按钮
  6. setTimeout(activeTab, 500) // 激活页面必须要页签显示出来,所以做1秒延迟
  7. return
  8. }
  9. // 当文件保存前触发的事件
  10. function OnWorkbookBeforeSave(doc) {
  11. var ps = {}
  12. ps[constStrEnum.CurrentRsid] = Date.now()
  13. SetDocParamsValues(doc, ps)
  14. }
  15. //这里模拟了一个afterclose
  16. function offlineAndClose(doc) {
  17. Heart.CloseOADocument(doc)
  18. closeEtIfNoDocument()
  19. }
  20. //文档保存前关闭事件
  21. /**
  22. * 作用:
  23. * @param {*} doc
  24. */
  25. function OnWorkbookBeforeClose(doc) {
  26. var l_bIsOADoc = false
  27. l_bIsOADoc = CheckIfDocIsOADoc(doc) //判断是否OA文档要关闭
  28. if (l_bIsOADoc == false) {
  29. // 非OA文档不做处理
  30. return
  31. }
  32. var docparams = GetDocParamsValues(doc)
  33. var filename = getParamFormIndiDocxForm(docparams.fileInfo, 'file_name')
  34. if (!Heart.GetCurrentDocs()[GetUniqueId(doc)]) {
  35. //代替afterclose
  36. //这种情况已经做过离线操作了,所以直接关闭wps
  37. OAWebNotice(filename)
  38. var filepath = doc.FullName
  39. //清理文件
  40. //这里wps返回返回的路径和实际保存路径的间隔符不一致,所以全部替换掉
  41. // var filemoved =
  42. // docparams.TempLocalFile.replace(/[\/\\]/gi, '') !=
  43. // filepath.replace(/[\/\\]/gi, '')
  44. var persistdoc = GetDocParamsValue(doc, 'Persist') == true // || filemoved
  45. setTimeout(() => {
  46. if (!persistdoc) wps.FileSystem.Remove(filepath) //删除临时文件
  47. wps.FileSystem.Remove(docparams.TempLocalFile) //linux另存为不移除原有文件,需要手动处理
  48. closeEtIfNoDocument()
  49. }, 500)
  50. // closeEtIfNoDocument()
  51. return
  52. }
  53. //强制取消保存,并执行OA逻辑
  54. wps.ApiEvent.Cancel = true
  55. // 只读或者无变化操作不上传
  56. if (
  57. docparams.action == 'printdocument' ||
  58. doc.ProtectionType == WdProtectionType.wdAllowOnlyFormFields
  59. ) {
  60. loginfo(`文件[${doc.Name}] ${docparams.action} 关闭不上传`)
  61. setTimeout(function () {
  62. Heart.CloseOADocument(doc)
  63. doc.Close()
  64. }, 100)
  65. return
  66. }
  67. if (doc.Saved) {
  68. if (
  69. docparams[constStrEnum.CurrentRsid] ==
  70. docparams[constStrEnum.OriginalRsid]
  71. ) {
  72. loginfo(`文件[${doc.Name}] 无修改 关闭不上传`)
  73. setTimeout(function () {
  74. Heart.CloseOADocument(doc)
  75. doc.Close()
  76. }, 100)
  77. return
  78. }
  79. } else {
  80. var online = Heart.IsOASystemOnline()
  81. ShowConfirm('是否保存并上传服务器', 'warning', {
  82. title: '提醒',
  83. btns: [
  84. {
  85. key: 'yes',
  86. text: '保存',
  87. primary: true,
  88. close: true,
  89. callback: function () {
  90. //手动修复window Modal阻断的情况
  91. if (online) Heart.OASystemOnLine()
  92. doc.Save()
  93. doc.Close()
  94. },
  95. },
  96. {
  97. key: 'no',
  98. text: '不保存',
  99. close: true,
  100. danger: true,
  101. callback: function () {
  102. Heart.CloseOADocument(doc)
  103. doc.Close(WdSaveOptions.wdDoNotSaveChange)
  104. },
  105. },
  106. {
  107. key: 'cancel',
  108. text: '取消',
  109. close: true,
  110. },
  111. ],
  112. })
  113. return
  114. }
  115. //检测lockfailcallback
  116. var lockfail = GetDocParamsValue(doc, 'LockError')
  117. if (!!lockfail) {
  118. var callback = window[lockfail.callback]
  119. if (callback) {
  120. callback(doc, lockfail.msg)
  121. return
  122. }
  123. }
  124. UploadFileToServer(doc)
  125. // closeEtIfNoDocument() // 判断文件个数是否为0,若为0则关闭组件
  126. }
  127. //文档打开事件
  128. function OnWorkbookOpen(doc) {
  129. //设置当前新增文档是否来自OA的文档
  130. if (wps.PluginStorage.getItem('IsInCurrOADocOpen') == false) {
  131. //如果是用户自己在WPS环境打开文档,则设置非OA文档标识
  132. pSetNoneOADocFlag(doc)
  133. }
  134. OnWindowActivate()
  135. ChangeOATabOnDocOpen() //打开文档后,默认打开Tab页
  136. }
  137. //新建文档事件
  138. function OnWorkbookNew(doc) {
  139. //设置当前新增文档是否来自OA的文档
  140. if (wps.PluginStorage.getItem('IsInCurrOADocOpen') == false) {
  141. //如果是用户自己在WPS环境打开文档,则设置非OA文档标识
  142. pSetNoneOADocFlag(doc)
  143. }
  144. ChangeOATabOnDocOpen() // 打开OA助手Tab菜单页
  145. wps.ribbonUI.Invalidate() // 刷新Ribbon按钮的状态
  146. }
  147. /**
  148. * 作用:根据当前活动文档的情况判断,当前文档适用的系统参数,例如:当前文档对应的用户名称等
  149. */
  150. function SetCurrDocEnvProp(doc) {
  151. if (!doc) return
  152. var l_bIsOADoc = false
  153. l_bIsOADoc = pCheckIfOADoc(doc)
  154. //如果是OA文件,则按OA传来的用户名设置WPS OA助手WPS用户名设置按钮冲突
  155. if (l_bIsOADoc == true) {
  156. //不允许另存为
  157. if (GetDocParamsValue(doc, 'Persist') == true) {
  158. wps.Application.CommandBars.SetEnabledMso('FileSaveAsMenu', true)
  159. wps.Application.CommandBars.SetEnabledMso('FileSaveAs', true)
  160. } else {
  161. wps.Application.CommandBars.SetEnabledMso('FileSaveAsMenu', false)
  162. wps.Application.CommandBars.SetEnabledMso('FileSaveAs', false)
  163. }
  164. //禁用修订按钮
  165. wps.Application.CommandBars.SetEnabledMso('ReviewTrackChangesMenu', false)
  166. var l_userName = GetDocParamsValue(doc, 'userName')
  167. if (l_userName != '') {
  168. wps.EtApplication().UserName = l_userName
  169. return
  170. }
  171. } else {
  172. wps.Application.CommandBars.SetEnabledMso('FileSaveAsMenu', true)
  173. wps.Application.CommandBars.SetEnabledMso('FileSaveAs', true)
  174. wps.Application.CommandBars.SetEnabledMso('ReviewTrackChangesMenu', true)
  175. }
  176. //如果是非OA文件或者参数的值是空值,则按WPS安装默认用户名设置
  177. wps.EtApplication().UserName = wps.PluginStorage.getItem('WPSInitUserName')
  178. }
  179. /*
  180. 入口参数:doc
  181. 功能说明:判断当前文档是否能另存为本地文件
  182. 返回值:布尔值true or false
  183. */
  184. function pCheckCurrOADocCanSaveAs(doc) {
  185. //如果是非OA文档,则允许另存为
  186. if (CheckIfDocIsOADoc(doc) == false) return true
  187. //对于来自OA系统的文档,则获取该文档对应的属性参数
  188. var l_CanSaveAs = GetDocParamsValue(doc, 'CanSaveAs')
  189. //判断OA传入的参数
  190. if (typeof l_CanSaveAs == 'boolean') {
  191. return l_CanSaveAs
  192. }
  193. return false
  194. }
  195. /**
  196. * 作用:判断文档关闭后,如果系统已经没有打开的文档了,则设置回初始用户名
  197. */
  198. function pSetetAppUserName() {
  199. //文档全部关闭的情况下,把WPS初始启动的用户名设置回去
  200. if (wps.EtApplication().Workbooks.Count == 1) {
  201. var l_strUserName = wps.PluginStorage.getItem('WPSInitUserName')
  202. wps.EtApplication().UserName = l_strUserName
  203. }
  204. }
  205. /**
  206. * 作用:文档关闭后,删除对应的PluginStorage内的参数信息
  207. * 返回值:没有返回值
  208. * @param {*} doc
  209. */
  210. function pRemoveDocParam(doc) {
  211. if (!doc) return
  212. wps.PluginStorage.removeItem(doc.FullName)
  213. return
  214. }
  215. /**
  216. * 作用:判断当前文档是否从OA来的文档,如果非OA文档(就是本地新建或打开的文档,则设置EnumOAFlag 标识)
  217. * 作用:设置非OA文档的标识状态
  218. * @param {*} doc
  219. * 返回值:无
  220. */
  221. function pSetNoneOADocFlag(doc) {
  222. if (!doc) return
  223. var l_param = wps.PluginStorage.getItem(doc.FullName) //定义JSON文档参数
  224. var l_objParams = new Object()
  225. if (l_param) {
  226. l_objParams = JSON.parse(l_param)
  227. }
  228. l_objParams.isOA = EnumOAFlag.DocFromNoOA // 新增非OA打开文档属性
  229. wps.PluginStorage.setItem(doc.FullName, JSON.stringify(l_objParams)) // 存入内存中
  230. }
  231. /**
  232. * 作用:根据设置判断打开文件是否默认激活OA助手工具Tab菜单
  233. * 返回值:无
  234. */
  235. function ChangeOATabOnDocOpen() {
  236. var l_ShowOATab = true //默认打开
  237. l_ShowOATab = wps.PluginStorage.getItem('ShowOATabDocActive')
  238. if (l_ShowOATab == true) {
  239. if (wps.ribbonUI) wps.ribbonUI.ActivateTab('WeOfficeWPSExtTab')
  240. //新建文档时,自动切换到OA助手状态
  241. else wps.ActivateTab('WeOfficeWPSExtTab') //新建文档时,自动切换到OA助手状态
  242. }
  243. }
  244. /**
  245. * 将文件保存到服务器的逻辑
  246. * @param {wps.document} doc
  247. * @returns
  248. */
  249. function UploadFileToServer(doc) {
  250. if (!Heart.IsOASystemOnline()) {
  251. ShowConfirm(
  252. '检测到审批单已经关闭,无法继续保存,是否另存本文档?',
  253. 'warning',
  254. {
  255. btns: [
  256. {
  257. key: 'close',
  258. text: '否',
  259. close: true,
  260. callback: function () {
  261. Heart.CloseOADocument(doc)
  262. doc.Close(WdSaveOptions.wdDoNotSaveChange)
  263. },
  264. },
  265. {
  266. key: 'saveas',
  267. text: '是',
  268. primary: true,
  269. close: true,
  270. callback: function () {
  271. var dialog = wps.Application.FileDialog(2)
  272. dialog.InitialFileName = doc.FullName
  273. if (dialog.Show() == -1) {
  274. dialog.Execute()
  275. SetDocParamsValue(doc, 'Persist', true)
  276. Heart.CloseOADocument(doc)
  277. doc.Close()
  278. }
  279. },
  280. },
  281. ],
  282. }
  283. )
  284. return
  285. }
  286. ShowLoading('上传中,请稍后...', GetUniqueId(doc))
  287. //水印不保留在文档中
  288. // WaterMark.ClearWaterMark(doc);
  289. // doc.Save();
  290. OnBtnSaveToServer(doc)
  291. }