heart.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. /**
  2. * 心跳检测的JS
  3. * 系统下线 25 秒后,将无法提交文档到服务器
  4. * 检测到系统下线后,在关闭文档的时候会提醒,并自动开启重连
  5. * 添加自定义协议$reconnect 请求系统重连
  6. */
  7. ;(function () {
  8. const ACTIONS_WITHOUT_HEART = [
  9. 'printdocument',
  10. 'convertpdf',
  11. 'convertofd',
  12. 'saveAs',
  13. ]
  14. const HEAR_OPEN_DOCS = 'HEAR_OPENED_DOCS'
  15. const OA_SYSTEM_ONLINE = 'OA_SYSTEM_ONLINE'
  16. const HEART_INTERVAL = 2e3 //心跳频率 和OA系统一致
  17. let retrycount = 5
  18. let reconnectHandler
  19. /**
  20. * 设定已经打开的OA文档
  21. * @param {wps.Document} obj
  22. */
  23. function OpendOADocument(doc) {
  24. const fileinfo = GetDocParamsValue(doc, 'fileInfo')
  25. let uuid = getParamFormIndiDocxForm(fileinfo, 'file_unid')
  26. let name = getParamFormIndiDocxForm(fileinfo, 'file_name')
  27. let current = JSON.parse(wps.PluginStorage.getItem(HEAR_OPEN_DOCS) || '{}')
  28. var info = { uuid, name }
  29. current[GetUniqueId(doc)] = info
  30. wps.PluginStorage.setItem(HEAR_OPEN_DOCS, JSON.stringify(current))
  31. //反向重连
  32. Reconnect(info)
  33. }
  34. /**
  35. * 关闭OA文档
  36. * @param {*} uuid
  37. */
  38. function CloseOADocument(doc) {
  39. let current = JSON.parse(wps.PluginStorage.getItem(HEAR_OPEN_DOCS) || '{}')
  40. let info = current[GetUniqueId(doc)]
  41. delete current[GetUniqueId(doc)]
  42. wps.PluginStorage.setItem(HEAR_OPEN_DOCS, JSON.stringify(current))
  43. loginfo(`${doc.Name}下线`)
  44. if (!!info)
  45. OAWebNotice(
  46. JSON.stringify({
  47. cmd: '$disconnect',
  48. type: ClientType,
  49. uuid: info.uuid,
  50. name: info.name,
  51. })
  52. ) //发送重连信号
  53. }
  54. function GetCurrentDocs() {
  55. return JSON.parse(wps.PluginStorage.getItem(HEAR_OPEN_DOCS) || '{}')
  56. }
  57. function getDocHeart(doc) {
  58. return GetCurrentDocs()[GetUniqueId(doc)]
  59. }
  60. function OASystemOnLine(expried) {
  61. var next = expried || Date.now() + HEART_INTERVAL * 10
  62. wps.PluginStorage.setItem(OA_SYSTEM_ONLINE, next)
  63. wps.ribbonUI.Invalidate() //刷新Ribbon的状态
  64. //清理
  65. ClearReconnect()
  66. }
  67. /**
  68. * OA系统是否在线
  69. * @returns booleans
  70. */
  71. function IsOASystemOnline(tryReconnect = false) {
  72. //ClientType in util.js
  73. if (OACustomer.getCustomerHeart(ClientType) === false) return true
  74. var online =
  75. Number(wps.PluginStorage.getItem(OA_SYSTEM_ONLINE)) > Date.now()
  76. if (!online && tryReconnect) {
  77. //启动主动请求重
  78. loginfo('系统下线,启动自动重连')
  79. reconnectHandler = setTimeout(Reconnect, 500)
  80. }
  81. wps.ribbonUI.Invalidate() //刷新Ribbon的状态
  82. return online
  83. }
  84. function Reconnect(info) {
  85. if (OACustomer.getCustomerHeart(ClientType) === false) return
  86. if (retrycount-- > 0) {
  87. loginfo('请求心跳')
  88. OAWebNotice(
  89. JSON.stringify({
  90. cmd: '$reconnect',
  91. type: ClientType,
  92. uuid: info.uuid,
  93. name: info.name,
  94. })
  95. ) //发送重连信号
  96. reconnectHandler = setTimeout(function () {
  97. !IsOASystemOnline() && Reconnect(info)
  98. }, HEART_INTERVAL)
  99. } else {
  100. //请求5次后,重置
  101. retrycount = 5
  102. }
  103. }
  104. function ClearReconnect() {
  105. if (!!reconnectHandler) {
  106. loginfo('业务系统已重新连接')
  107. clearTimeout(reconnectHandler)
  108. reconnectHandler = null
  109. }
  110. retrycount = 5
  111. }
  112. window.Heart = {
  113. OpendOADocument,
  114. CloseOADocument,
  115. GetCurrentDocs,
  116. OASystemOnLine,
  117. IsOASystemOnline,
  118. getDocHeart,
  119. HEART_INTERVAL,
  120. ACTIONS_WITHOUT_HEART,
  121. }
  122. })(window)
  123. /**
  124. * 心跳
  125. * @returns
  126. */
  127. function heart() {
  128. Heart.OASystemOnLine()
  129. var data = Heart.GetCurrentDocs() || {}
  130. return {
  131. message: 'ok',
  132. app: ClientType,
  133. docs: Object.values(data),
  134. }
  135. }