func_docProcess.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. /**
  2. * 从OA调用传来的指令,打开本地新建文件
  3. * @param {*} fileUrl 文件url路径
  4. */
  5. function NewFile(params) {
  6. //获取ET Application 对象
  7. var etApp = wps.EtApplication()
  8. wps.PluginStorage.setItem('IsInCurrOADocOpen', true) //设置OA打开文档的临时状态
  9. var doc = etApp.Workbooks.Add() //新增OA端文档
  10. wps.PluginStorage.setItem('IsInCurrOADocOpen', false)
  11. //检查系统临时文件目录是否能访问
  12. if (wps.Env && wps.Env.GetTempPath) {
  13. if (params.newFileName) {
  14. //按OA传入的文件名称保存
  15. doc.SaveAs(
  16. ($FileName = wps.Env.GetTempPath() + '/' + params.newFileName),
  17. undefined,
  18. undefined,
  19. undefined,
  20. undefined,
  21. undefined,
  22. undefined,
  23. undefined,
  24. false
  25. )
  26. } else {
  27. //OA传入空文件名称,则保存成系统时间文件
  28. doc.SaveAs(
  29. ($FileName = wps.Env.GetTempPath() + '/OA_' + currentTime()),
  30. undefined,
  31. undefined,
  32. undefined,
  33. undefined,
  34. undefined,
  35. undefined,
  36. undefined,
  37. false
  38. )
  39. }
  40. } else {
  41. alert('文档保存临时目录出错!不能保存新建文档!请联系系统开发商。')
  42. }
  43. var l_NofityURL = GetParamsValue(params, 'notifyUrl')
  44. if (l_NofityURL) {
  45. NotifyToServer(l_NofityURL.replace('{?}', '1'))
  46. }
  47. //Office文件打开后,设置该文件属性:从服务端来的OA文件
  48. pSetOADocumentFlag(doc, params)
  49. //设置当前文档为 本地磁盘落地模式
  50. DoSetOADocLandMode(doc, EnumDocLandMode.DLM_LocalDoc)
  51. //强制执行一次Activate事件
  52. OnWindowActivate()
  53. return doc //返回新创建的Document对象
  54. }
  55. /**
  56. * 打开服务器上的文件
  57. * @param {*} fileUrl 文件url路径
  58. */
  59. function OpenFile(params) {
  60. var l_strFileUrl = params.fileName //来自OA网页端的OA文件下载路径
  61. var doc
  62. var l_IsOnlineDoc = false //默认打开的是不落地文档
  63. if (!l_strFileUrl) return
  64. //下载文档之前,判断是否已下载该文件
  65. if (pCheckIsExistOpenOADoc(l_strFileUrl) == true) {
  66. //如果找到相同OA地址文档,则给予提示
  67. wps.EtApplication().Visible = true
  68. //根据OA助手对是否允许再次打开相同文件的判断处理
  69. var l_AllowOADocReOpen = false
  70. l_AllowOADocReOpen = wps.PluginStorage.getItem('AllowOADocReOpen')
  71. if (l_AllowOADocReOpen == false) {
  72. alert('已打开相同的OA文件,请关闭之前的文件,再次打开。')
  73. wps.EtApplication().Visible = true
  74. return null
  75. } else {
  76. //处理重复打开相同OA 文件的方法
  77. var nDocCount = wps.EtApplication().Workbooks.Count
  78. pReOpenOADoc(l_strFileUrl)
  79. //重复打开的文档采用不落地的方式打开
  80. // 不落地方式打开文档判断落地比较多,V1版本先暂时关闭
  81. l_IsOnlineDoc = true
  82. var nDocCount_New = wps.EtApplication().Workbooks.Count
  83. if (nDocCount_New > nDocCount) {
  84. doc = wps.EtApplication().ActiveWorkbook
  85. }
  86. }
  87. } else {
  88. //如果当前没有打开文档,则另存为本地文件,再打开
  89. let fileName = GetFileNameByParams(params)
  90. DownloadFile(
  91. l_strFileUrl,
  92. fileName,
  93. params.action == 'printdocument' //打印文档操作保存随机路径
  94. )
  95. .then(function (path) {
  96. if (path == '') {
  97. ShowMessage(
  98. '从服务端下载路径:' + l_strFileUrl + '\n' + '获取文件下载失败!',
  99. 'error'
  100. )
  101. return null
  102. }
  103. doc = pDoOpenOADocProcess(params, path)
  104. pOpenFile(doc, params, l_IsOnlineDoc)
  105. })
  106. .catch((msg) => {
  107. ShowMessage(`下载文件[${fileName}]失败!${msg}`, 'error', 5)
  108. OAWebNotice(fileName)
  109. })
  110. }
  111. }
  112. function pOpenFile(doc, params, isOnlineDoc) {
  113. var l_IsOnlineDoc = isOnlineDoc
  114. //设置当前文档为 本地磁盘落地模式
  115. if (l_IsOnlineDoc == true) {
  116. DoSetOADocLandMode(doc, EnumDocLandMode.DLM_OnlineDoc)
  117. } else {
  118. DoSetOADocLandMode(doc, EnumDocLandMode.DLM_LocalDoc)
  119. }
  120. var l_ProtectType = -1
  121. if (!!params.openType && params.openType.hasOwnProperty('protectType'))
  122. l_ProtectType = params.openType.protectType
  123. var l_bShowRevision = getBoolean(params.fileparam.UseMark, true) //是否显示修订记录
  124. if (l_ProtectType < 2 && params.action !== 'printdocument') {
  125. //可编辑和非打印模式下才设置心跳
  126. //设定心跳值
  127. Heart.OpendOADocument(doc)
  128. }
  129. //设置文档修订状态
  130. DoOADocOpenRevision(doc, l_ProtectType == 0, l_bShowRevision)
  131. var ps = GetDocParamsValues(doc)
  132. ps[constStrEnum.OriginalRsid] = ps[constStrEnum.CurrentRsid]
  133. SetDocParamsValues(doc, ps)
  134. // 触发切换窗口事件
  135. OnWindowActivate()
  136. return doc
  137. }
  138. function DoOADocOpenRevision(doc, bOpenRevision, bShowRevision) {
  139. if (!doc) return
  140. if (bOpenRevision) {
  141. wps.Application.DisplayAlerts = false
  142. doc.SaveAs(
  143. doc.FullName,
  144. undefined,
  145. undefined,
  146. undefined,
  147. undefined,
  148. undefined,
  149. 2
  150. )
  151. doc.KeepChangeHistory = true
  152. if (bShowRevision) {
  153. doc.HighlightChangesOptions(2, '每个人')
  154. doc.ListChangesOnNewSheet = false //
  155. doc.HighlightChangesOnScreen = true
  156. }
  157. wps.Application.DisplayAlerts = true
  158. }
  159. }
  160. /**
  161. * 文档打开服务器上的文件
  162. * @param {*} fileUrl 文件url路径
  163. */
  164. function OpenOnLineFile(OAParams) {
  165. //OA参数如果为空的话退出
  166. if (!OAParams) return
  167. //获取在线文档URL
  168. var l_OAFileUrl = OAParams.fileName
  169. var l_doc
  170. if (l_OAFileUrl) {
  171. //下载文档不落地(16版WPS的925后支持)
  172. wps.PluginStorage.setItem('IsInCurrOADocOpen', true)
  173. wps
  174. .EtApplication()
  175. .Workbooks.OpenFromUrl(
  176. l_OAFileUrl,
  177. 'OnOpenOnLineDocSuccess',
  178. 'OnOpenOnLineDocDownFail'
  179. )
  180. wps.PluginStorage.setItem('IsInCurrOADocOpen', false)
  181. l_doc = wps.EtApplication().ActiveWorkbook
  182. }
  183. //Office文件打开后,设置该文件属性:从服务端来的OA文件
  184. pOpenFile(l_doc, OAParams, true)
  185. return l_doc
  186. }
  187. /**
  188. * 打开在线文档成功后触发事件
  189. * @param {*} resp
  190. */
  191. function OnOpenOnLineDocSuccess(resp) {}
  192. /**
  193. * 作用:打开文档处理的各种过程,包含:打开带密码的文档,保护方式打开文档,修订方式打开文档等种种情况
  194. * params Object OA Web端传来的请求JSON字符串,具体参数说明看下面数据
  195. * TempLocalFile : 字符串 先把文档从OA系统下载并保存在Temp临时目录,这个参数指已经下载下来的本地文档地址
  196. * ----------------------以下是OA参数的一些具体规范名称
  197. * docId String 文档ID
  198. * uploadPath String 保存文档接口
  199. * fileName String 获取服务器文档接口(不传即为新建空文档)
  200. * userName String 用于更改显示修改人的用户名
  201. * buttonGroups string 自定义按钮组 (可不传,不传显示所有按钮)
  202. * openType String 文档打开方式 ,不传正常打开
  203. * protectType bool 文档保护类型,false或是未定义为不启用保护,其他为启用
  204. * password String密码
  205. */
  206. var gettokenid = false
  207. function pDoOpenOADocProcess(params, TempLocalFile) {
  208. var l_ProtectPassword = '6TFC$RGB' //默认文档密码为空
  209. var l_strDocPassword = '' //打开文档密码参数
  210. for (var _key in params) {
  211. var key = (_key || '').toUpperCase()
  212. switch (key) {
  213. case 'userName'.toUpperCase(): //修改当前文档用户名
  214. wps.EtApplication().UserName = params[_key]
  215. break
  216. // case 'openType'.toUpperCase():
  217. // l_ProtectType = params[_key].protectType //获取OA传来的文档保护类型
  218. // // l_ProtectPassword = params[_key].password //获取OA传来的保护模式下的文档密码
  219. // break
  220. case 'docPassword'.toUpperCase(): //传入打开文件的密码
  221. l_strDocPassword = params[_key].docPassword
  222. break
  223. }
  224. }
  225. var l_Doc = wps
  226. .EtApplication()
  227. .Workbooks.Open(TempLocalFile, false, false, undefined, l_strDocPassword)
  228. var l_Count = 0
  229. for (l_Count = 0; l_Count < l_Doc.Worksheets.Count; l_Count++) {
  230. l_Doc.Worksheets.Item(l_Count + 1).Unprotect(l_ProtectPassword)
  231. }
  232. //处理另存为
  233. var Persist = getBoolean(params.fileparam.AllowSaveAs, true)
  234. var ps = Object.assign(
  235. {
  236. isOA: EnumOAFlag.DocFromOA,
  237. SourcePath: l_Doc.FullName,
  238. TempLocalFile,
  239. Persist,
  240. },
  241. params
  242. )
  243. var l_ProtectType = -1
  244. if (!!params.openType && params.openType.hasOwnProperty('protectType'))
  245. l_ProtectType = params.openType.protectType
  246. //打开文档后,根据保护类型设置文档保护
  247. if (l_ProtectType == 2 || l_ProtectType == 1) {
  248. // 设置文档保护
  249. SetOADocProtect(l_Doc, l_ProtectPassword)
  250. }
  251. l_Doc.Save()
  252. SetDocParamsValues(l_Doc, ps)
  253. return l_Doc
  254. }
  255. /**
  256. * protectType: '', 文档保护模式
  257. * @param {*} ProtectPassword
  258. * @param {*} doc
  259. */
  260. function SetOADocProtect(doc, ProtectPassword) {
  261. if (!doc) return //校验文档是否存在
  262. for (l_Count = 0; l_Count < doc.Worksheets.Count; l_Count++) {
  263. doc.Worksheets.Item(l_Count + 1).Protect(ProtectPassword)
  264. }
  265. return
  266. }
  267. /**
  268. * 打开在线不落地文档出现失败时,给予错误提示
  269. */
  270. function OnOpenOnLineDocDownFail() {
  271. alert('打开在线不落地文档失败!请尝试重新打开。')
  272. return
  273. }
  274. /**
  275. * 功能说明:判断是否已存在来自OA的已打开的文档
  276. * @param {字符串} FileURL
  277. */
  278. function pCheckIsExistOpenOADoc(FileURL) {
  279. var l_DocCount = wps.EtApplication().Workbooks.Count
  280. if (l_DocCount <= 0) return false
  281. //轮询检查当前已打开的WPS文档中,是否存在OA相同的文件
  282. if (l_DocCount >= 1) {
  283. for (var l_index = 1; l_index <= l_DocCount; l_index++) {
  284. var l_objDoc = wps.EtApplication().Workbooks.Item(l_index)
  285. var l_strParam = wps.PluginStorage.getItem(l_objDoc.FullName)
  286. if (l_strParam == null) continue
  287. var l_objParam = JSON.parse(l_strParam)
  288. if (l_objParam.fileName == FileURL) {
  289. return true
  290. }
  291. }
  292. return false
  293. }
  294. }
  295. /**
  296. * 参数:
  297. * doc : 当前OA文档的Document对象
  298. * DocLandMode : 落地模式设置
  299. */
  300. function DoSetOADocLandMode(doc, DocLandMode) {
  301. if (!doc) return
  302. var l_Param = wps.PluginStorage.getItem(doc.FullName)
  303. var l_objParam = JSON.parse(l_Param)
  304. //增加属性,或设置
  305. l_objParam.OADocLandMode = DocLandMode //设置OA文档的落地标志
  306. var l_p = JSON.stringify(l_objParam)
  307. //将OA文档落地模式标志存入系统变量对象保存
  308. wps.PluginStorage.setItem(doc.FullName, l_p)
  309. }
  310. //Office文件打开后,设置该文件属性:从服务端来的OA文件
  311. function pSetOADocumentFlag(doc, params) {
  312. if (!doc) {
  313. return
  314. }
  315. var l_Param = params
  316. l_Param.isOA = EnumOAFlag.DocFromOA //设置OA打开文档的标志
  317. l_Param.SourcePath = doc.FullName //保存OA的原始文件路径,用于保存时分析,是否进行了另存为操作
  318. if (doc) {
  319. var l_p = JSON.stringify(l_Param)
  320. //将OA文档标志存入系统变量对象保存
  321. wps.PluginStorage.setItem(doc.FullName, l_p)
  322. }
  323. }
  324. /**
  325. * 作用:设置Ribbon工具条的按钮显示状态
  326. * @param {*} paramsGroups
  327. */
  328. function pDoResetRibbonGroups(paramsGroups) {}