func_docEvents.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. // 打印前监听事件
  2. function OnDocumentBeforePrint(doc) {
  3. return
  4. }
  5. //切换窗口时触发的事件
  6. function OnWindowActivate() {
  7. var l_doc = wps.WpsApplication().ActiveDocument
  8. SetCurrDocEnvProp(l_doc) // 设置当前文档对应的用户名
  9. // showOATab(); // 根据文件是否为OA文件来显示OA菜单再进行刷新按钮
  10. if (pCheckIfOADoc()) {
  11. setTimeout(activeTab, 500) // 激活页面必须要页签显示出来,所以做0.5秒延迟
  12. wps
  13. .WpsApplication()
  14. .CommandBars.ExecuteMso('KsoEx_RevisionCommentModify_Disable')
  15. // wps.WpsApplication().ActiveDocument.ActiveWindow.ActivePane.View.RevisionsMode =
  16. // GetDocParamsValue(l_doc, 'RevisionsMode')
  17. //不允许另存为
  18. if (GetDocParamsValue(l_doc, 'Persist') == true) {
  19. wps.Application.CommandBars.SetEnabledMso('FileSaveAsMenu', true)
  20. wps.Application.CommandBars.SetEnabledMso('FileSaveAs', true)
  21. } else {
  22. wps.Application.CommandBars.SetEnabledMso('FileSaveAsMenu', false)
  23. wps.Application.CommandBars.SetEnabledMso('FileSaveAs', false)
  24. }
  25. } else {
  26. // wps
  27. // .WpsApplication()
  28. // .CommandBars.ExecuteMso('KsoEx_RevisionCommentModify_Enable')
  29. // wps.WpsApplication().ActiveDocument.ActiveWindow.ActivePane.View.RevisionsMode = 1
  30. wps
  31. .WpsApplication()
  32. .CommandBars.ExecuteMso('KsoEx_RevisionCommentModify_Enable')
  33. wps.Application.CommandBars.SetEnabledMso('FileSaveAsMenu', true)
  34. wps.Application.CommandBars.SetEnabledMso('FileSaveAs', true)
  35. }
  36. return
  37. }
  38. /**
  39. * 作用:判断OA文档是否被另存为了
  40. */
  41. function CheckIfOADocSaveAs(doc) {
  42. if (!doc) {
  43. return
  44. }
  45. // 获取OA文档的原始保存路径
  46. var l_Path = GetDocParamsValue(doc, constStrEnum.SourcePath)
  47. // 原路径和当前文件的路径对比
  48. return l_Path == doc.FullName
  49. }
  50. // 当文件保存前触发的事件
  51. function OnDocumentBeforeSave(doc) {
  52. //设置变量,判断是否当前用户按了自定义的OA文件保存按钮
  53. var l_IsOADocButtonSave = false
  54. l_IsOADocButtonSave = wps.PluginStorage.getItem(constStrEnum.OADocUserSave)
  55. //根据传入参数判断当前文档是否能另存为,默认不能另存为
  56. if (pCheckCurrOADocCanSaveAs(doc) == false) {
  57. //先根据OA助手的默认设置判断是否允许OA文档另存为操作
  58. //0.如果配置文件:OA文档不允许另存为,则再判断
  59. //1.先判断是否是在线文档且是通过WPS自身按钮或快捷键保存,则取消弹出另存到本地的弹出框
  60. if (pIsOnlineOADoc(doc) == true && l_IsOADocButtonSave == false) {
  61. alert('来自OA的不落地文档,禁止另存为本地文档!')
  62. //如果是OA文档,则禁止另存为
  63. wps.ApiEvent.Cancel = true
  64. }
  65. //2.如果是落地打开的OA文档并且通过WPS自身按钮或者快捷键保存,则执行保存到本地临时目录,取消弹出对话框
  66. if (pIsOnlineOADoc(doc) == false && l_IsOADocButtonSave == false) {
  67. //用户手动另存为操作时,在这里被屏蔽掉
  68. doc.Save()
  69. //如果是OA文档,则禁止另存为
  70. //wps.ApiEvent.Cancel = true;
  71. }
  72. }
  73. //保存文档后,也要刷新一下Ribbon按钮的状态
  74. showOATab()
  75. // return;
  76. return false
  77. }
  78. //文档保存前关闭事件
  79. /**
  80. * 作用:
  81. * @param {*} doc
  82. */
  83. function OnDocumentBeforeClose(doc) {
  84. loginfo('用户点击关闭')
  85. var l_bIsOADoc = false
  86. l_bIsOADoc = CheckIfDocIsOADoc(doc) //判断是否OA文档要关闭
  87. if (l_bIsOADoc == false) {
  88. // 非OA文档不做处理
  89. return
  90. }
  91. if (!Heart.GetCurrentDocs()[GetUniqueId(doc)]) {
  92. return
  93. }
  94. //强制取消保存,并执行OA逻辑
  95. wps.ApiEvent.Cancel = true
  96. //只读文档
  97. var docparams = GetDocParamsValues(doc)
  98. if (
  99. doc.ProtectionType == WdProtectionType.wdAllowOnlyFormFields ||
  100. doc.ProtectionType == WdProtectionType.wdAllowOnlyReading ||
  101. docparams.action == 'convertpdf' ||
  102. docparams.action == 'convertofd' ||
  103. docparams.action == 'printdocument' ||
  104. docparams.action == 'saveAs'
  105. ) {
  106. clearWaterMark(doc, docparams)
  107. loginfo(`文件[${doc.Name}] ${docparams.action} 关闭不上传`)
  108. setTimeout(function () {
  109. Heart.CloseOADocument(doc)
  110. doc.Close()
  111. }, 100)
  112. return
  113. }
  114. if (
  115. doc.Saved == true &&
  116. doc.CurrentRsid == docparams[constStrEnum.OriginalRsid]
  117. ) {
  118. //无任何修改
  119. loginfo(`文件[${doc.Name}] 无修改 关闭不上传`)
  120. setTimeout(function () {
  121. Heart.CloseOADocument(doc)
  122. doc.Close()
  123. }, 100)
  124. return
  125. }
  126. if (doc.Saved == false) {
  127. var online = Heart.IsOASystemOnline()
  128. ShowConfirm('是否保存并上传服务器', 'warning', {
  129. title: '提醒',
  130. btns: [
  131. {
  132. key: 'yes',
  133. text: '保存',
  134. primary: true,
  135. close: true,
  136. callback: function () {
  137. //手动修复window Modal阻断的情况
  138. if (online) Heart.OASystemOnLine()
  139. doc.Save()
  140. doc.Close()
  141. },
  142. },
  143. {
  144. key: 'no',
  145. text: '不保存',
  146. close: true,
  147. danger: true,
  148. callback: function () {
  149. // Heart.CloseOADocument(doc)
  150. doc.Saved = true
  151. doc.Close(WdSaveOptions.wdDoNotSaveChange)
  152. },
  153. },
  154. {
  155. key: 'cancel',
  156. text: '取消',
  157. close: true,
  158. },
  159. ],
  160. })
  161. return
  162. }
  163. //检测lockfailcallback
  164. var lockfail = GetDocParamsValue(doc, 'LockError')
  165. if (!!lockfail) {
  166. var callback = window[lockfail.callback]
  167. if (callback) {
  168. callback(doc, lockfail.msg)
  169. return
  170. }
  171. }
  172. UploadFileToServer(doc)
  173. }
  174. //文档保存后关闭事件
  175. function OnDocumentAfterClose(doc) {
  176. var l_bIsOADoc = false
  177. l_bIsOADoc = CheckIfDocIsOADoc(doc) //判断是否OA文档要关闭
  178. if (l_bIsOADoc == false) {
  179. // 非OA文档不做处理
  180. return
  181. }
  182. //隐藏前置
  183. hiddenIfNoDocument(1)
  184. var params = GetDocParamsValues(doc)
  185. var filename = getParamFormIndiDocxForm(params.fileInfo, 'file_name')
  186. //清空心跳记录
  187. Heart.CloseOADocument(doc)
  188. OAWebNotice(filename) //统一提醒
  189. var filepath = doc.FullName
  190. //这里wps返回返回的路径和实际保存路径的间隔符不一致,所以全部替换掉
  191. // var filemoved =
  192. // params.TempLocalFile.replace(/[\/\\]/gi, '') !=
  193. // filepath.replace(/[\/\\]/gi, '')
  194. var persistdoc = GetDocParamsValue(doc, 'Persist') == true // || filemoved
  195. pRemoveDocParam(doc) // 关闭文档时,移除PluginStorage对象的参数
  196. pSetWPSAppUserName() // 判断文档关闭后,如果系统已经没有打开的文档了,则设置回初始用户名
  197. setTimeout(stopRefreshToken, 1e3) //一秒之后执行清理RefreshToken
  198. setTimeout(() => {
  199. if (!persistdoc) wps.FileSystem.Remove(filepath) //删除临时文件
  200. wps.FileSystem.Remove(params.TempLocalFile)
  201. // closeWpsIfNoDocument(params)
  202. hiddenIfNoDocument(0)
  203. }, 500)
  204. }
  205. function stopRefreshToken() {
  206. if (gettokenid) {
  207. const docs = wps.Application.Documents
  208. for (let i = 0; i < docs.Count; i++) {
  209. const doc = docs.Item(i)
  210. if (CheckIfDocIsOADoc(doc)) return
  211. }
  212. //没有OA文档
  213. clearTimeout(gettokenid)
  214. gettokenid = null
  215. }
  216. }
  217. //文档打开事件
  218. function OnDocumentOpen(doc) {
  219. //设置当前新增文档是否来自OA的文档
  220. if (wps.PluginStorage.getItem(constStrEnum.IsInCurrOADocOpen) == false) {
  221. //如果是用户自己在WPS环境打开文档,则设置非OA文档标识
  222. pSetNoneOADocFlag(doc)
  223. }
  224. OnWindowActivate()
  225. ChangeOATabOnDocOpen() //打开文档后,默认打开Tab页
  226. }
  227. //新建文档事件
  228. function OnDocumentNew(doc) {
  229. //设置当前新增文档是否来自OA的文档
  230. if (wps.PluginStorage.getItem(constStrEnum.IsInCurrOADocOpen) == false) {
  231. //如果是用户自己在WPS环境打开文档,则设置非OA文档标识
  232. pSetNoneOADocFlag(doc)
  233. }
  234. ChangeOATabOnDocOpen() // 打开OA助手Tab菜单页
  235. wps.ribbonUI.Invalidate() // 刷新Ribbon按钮的状态
  236. }
  237. /**
  238. * 作用:根据当前活动文档的情况判断,当前文档适用的系统参数,例如:当前文档对应的用户名称等
  239. */
  240. function SetCurrDocEnvProp(doc) {
  241. if (!doc) return
  242. var l_bIsOADoc = false
  243. l_bIsOADoc = pCheckIfOADoc(doc)
  244. //如果是OA文件,则按OA传来的用户名设置WPS OA助手WPS用户名设置按钮冲突
  245. if (l_bIsOADoc == true) {
  246. var l_userName = GetDocParamsValue(doc, constStrEnum.userName)
  247. if (l_userName != '') {
  248. wps.WpsApplication().UserName = l_userName
  249. return
  250. }
  251. }
  252. //如果是非OA文件或者参数的值是空值,则按WPS安装默认用户名设置
  253. wps.WpsApplication().UserName = wps.PluginStorage.getItem(
  254. constStrEnum.WPSInitUserName
  255. )
  256. }
  257. /*
  258. 入口参数:doc
  259. 功能说明:判断当前文档是否能另存为本地文件
  260. 返回值:布尔值true or false
  261. */
  262. function pCheckCurrOADocCanSaveAs(doc) {
  263. //如果是非OA文档,则允许另存为
  264. if (CheckIfDocIsOADoc(doc) == false) return true
  265. //对于来自OA系统的文档,则获取该文档对应的属性参数
  266. var l_CanSaveAs = GetDocParamsValue(doc, constStrEnum.CanSaveAs)
  267. //判断OA传入的参数
  268. if (typeof l_CanSaveAs == 'boolean') {
  269. return l_CanSaveAs
  270. }
  271. return false
  272. }
  273. /**
  274. * 作用:判断文档关闭后,如果系统已经没有打开的文档了,则设置回初始用户名
  275. */
  276. function pSetWPSAppUserName() {
  277. //文档全部关闭的情况下,把WPS初始启动的用户名设置回去
  278. if (wps.WpsApplication().Documents.Count == 1) {
  279. var l_strUserName = wps.PluginStorage.getItem(constStrEnum.WPSInitUserName)
  280. wps.WpsApplication().UserName = l_strUserName
  281. }
  282. }
  283. /**
  284. * 作用:文档关闭后,删除对应的PluginStorage内的参数信息
  285. * 返回值:没有返回值
  286. * @param {*} doc
  287. */
  288. function pRemoveDocParam(doc) {
  289. if (!doc) return
  290. wps.PluginStorage.removeItem(GetUniqueId(doc))
  291. return
  292. }
  293. /**
  294. * 作用:判断当前文档是否从OA来的文档,如果非OA文档(就是本地新建或打开的文档,则设置EnumOAFlag 标识)
  295. * 作用:设置非OA文档的标识状态
  296. * @param {*} doc
  297. * 返回值:无
  298. */
  299. function pSetNoneOADocFlag(doc) {
  300. if (!doc) return
  301. // var l_param = wps.PluginStorage.getItem(doc.DocID); //定义JSON文档参数
  302. // var l_objParams = new Object();
  303. // if (l_param) {
  304. // l_objParams = JSON.parse(l_param);
  305. // }
  306. // l_objParams.isOA = EnumOAFlag.DocFromNoOA; // 新增非OA打开文档属性
  307. // wps.PluginStorage.setItem(doc.DocID, JSON.stringify(l_objParams)); // 存入内存中
  308. SetDocParamsValue(doc, 'isOA', EnumOAFlag.DocFromNoOA)
  309. }
  310. /**
  311. * 作用:根据设置判断打开文件是否默认激活OA助手工具Tab菜单
  312. * 返回值:无
  313. */
  314. function ChangeOATabOnDocOpen() {
  315. var l_ShowOATab = true //默认打开
  316. l_ShowOATab = wps.PluginStorage.getItem(constStrEnum.ShowOATabDocActive)
  317. if (l_ShowOATab == true) {
  318. wps.ribbonUI.ActivateTab('WeOfficeWPSExtTab') //新建文档时,自动切换到OA助手状态
  319. }
  320. }