func_tabcontrol.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521
  1. var EnumOAFlag = {
  2. DocFromOA: 1,
  3. DocFromNoOA: 0,
  4. }
  5. //记录是否用户点击OA文件的保存按钮
  6. var EnumDocSaveFlag = {
  7. OADocSave: 1,
  8. NoneOADocSave: 0,
  9. }
  10. //标识文档的落地模式 本地文档落地 0 ,不落地 1
  11. var EnumDocLandMode = {
  12. DLM_LocalDoc: 0,
  13. DLM_OnlineDoc: 1,
  14. }
  15. //加载时会执行的方法
  16. function OnWPSWorkTabLoad(ribbonUI) {
  17. wps.ribbonUI = ribbonUI
  18. if (typeof wps.Enum == 'undefined') {
  19. // 如果没有内置枚举值
  20. wps.Enum = WPS_Enum
  21. }
  22. //设定记录RSID 用于处理逻辑判断
  23. wps.Application.Options.StoreRSIDOnSave = true
  24. OnJSWorkInit() //初始化文档事件(全局参数,挂载监听事件)
  25. setTimeout(activeTab, 1000) // 激活OA助手菜单
  26. // OpenTimerRun(OnDocSaveByAutoTimer); //启动定时备份过程
  27. if (!IsWindows()) {
  28. constStrEnum.DirSeparator = '/'
  29. }
  30. // SetLocalDebug(true); 当前日志自动开启
  31. return true
  32. }
  33. //文档各类初始化工作(WPS Js环境)
  34. function OnJSWorkInit() {
  35. wps.Application.ActiveWindow &&
  36. (wps.Application.ActiveWindow.ActivePane.View.RevisionsMode = 1)
  37. pInitParameters() //OA助手环境的所有配置控制的初始化过程
  38. AddDocumentEvent() //挂接文档事件处理函数
  39. }
  40. //初始化全局参数
  41. function pInitParameters() {
  42. wps.PluginStorage.setItem(
  43. constStrEnum.OADocUserSave,
  44. EnumDocSaveFlag.NoneOADocSave
  45. ) //初始化,没有用户点击保存按钮
  46. var l_wpsUserName = wps.WpsApplication().UserName
  47. wps.PluginStorage.setItem(constStrEnum.WPSInitUserName, l_wpsUserName) //在OA助手加载前,先保存用户原有的WPS应用用户名称
  48. wps.PluginStorage.setItem(constStrEnum.OADocCanSaveAs, false) //默认OA文档不能另存为本地
  49. wps.PluginStorage.setItem(constStrEnum.AllowOADocReOpen, false) //设置是否允许来自OA的文件再次被打开
  50. wps.PluginStorage.setItem(constStrEnum.ShowOATabDocActive, false) //设置新打开文档是否默认显示OA助手菜单Tab 默认为false
  51. wps.PluginStorage.setItem(constStrEnum.DefaultUploadFieldName, 'file') //针对UploadFile方法设置上载字段名称
  52. wps.PluginStorage.setItem(constStrEnum.AutoSaveToServerTime, '10') //自动保存回OA服务端的时间间隔。如果设置0,则关闭,最小设置3分钟
  53. wps.PluginStorage.setItem(constStrEnum.TempTimerID, '0') //临时值,用于保存计时器ID的临时值
  54. // 以下是一些临时状态参数,用于打开文档等的状态判断
  55. wps.PluginStorage.setItem(constStrEnum.IsInCurrOADocOpen, false) //用于执行来自OA端的新建或打开文档时的状态
  56. wps.PluginStorage.setItem(constStrEnum.IsInCurrOADocSaveAs, false) //用于执行来自OA端的文档另存为本地的状态
  57. }
  58. //挂载WPS的文档事件
  59. function AddDocumentEvent() {
  60. wps.ApiEvent.AddApiEventListener('WindowActivate', OnWindowActivate)
  61. // wps.ApiEvent.AddApiEventListener('DocumentBeforeSave', OnDocumentBeforeSave)
  62. wps.ApiEvent.AddApiEventListener('DocumentBeforeClose', OnDocumentBeforeClose)
  63. wps.ApiEvent.AddApiEventListener('DocumentAfterClose', OnDocumentAfterClose)
  64. // wps.ApiEvent.AddApiEventListener(
  65. // "DocumentBeforePrint",
  66. // OnDocumentBeforePrint
  67. // );
  68. wps.ApiEvent.AddApiEventListener('DocumentOpen', OnDocumentOpen)
  69. // wps.ApiEvent.AddApiEventListener("DocumentNew", OnDocumentNew);
  70. }
  71. /**
  72. * 作用: 把当前文档保存为其他格式的文档并上传
  73. * @param {*} p_FileSuffix 输出的目标格式后缀名,支持:.pdf .uof .uot .ofd
  74. * @param {*} pShowPrompt 是否弹出用户确认框
  75. */
  76. function OnDoChangeToOtherDocFormat(p_FileSuffix, pShowPrompt) {
  77. var l_suffix = p_FileSuffix // params.suffix;
  78. if (!l_suffix) {
  79. return
  80. }
  81. //获取当前执行格式转换操作的文档
  82. var l_doc = wps.WpsApplication().ActiveDocument
  83. if (!l_doc) {
  84. return
  85. }
  86. if (typeof pShowPrompt == 'undefined') {
  87. // pShowPrompt = true; //默认设置为弹出用户确认框
  88. pShowPrompt = false //默认不弹出用户确认
  89. }
  90. //默认设置为以当前文件的显示模式输出,即当前为修订则输出带有修订痕迹的
  91. pDoChangeToOtherDocFormat(l_doc, l_suffix, pShowPrompt, true)
  92. }
  93. /**
  94. * 作用:把当前文档输出为另外的格式保存
  95. * @param {*} p_Doc 文档对象
  96. * @param {*} p_Suffix 另存为的目标文件格式
  97. * @param {*} pShowPrompt 是否弹出用户确认框
  98. * @param {*} p_ShowRevision :是否强制关闭修订,如果是False,则强制关闭痕迹显示。如果为true则不做控制输出。
  99. */
  100. function pDoChangeToOtherDocFormat(
  101. p_Doc,
  102. p_Suffix,
  103. pShowPrompt,
  104. p_ShowRevision
  105. ) {
  106. if (!p_Doc) {
  107. return
  108. }
  109. var l_suffix = p_Suffix
  110. //获取该文档对应OA参数的上载路径
  111. var l_uploadPath = GetDocParamsValue(p_Doc, constStrEnum.uploadAppendPath)
  112. if (l_uploadPath == '' || l_uploadPath == null) {
  113. l_uploadPath = GetDocParamsValue(p_Doc, constStrEnum.uploadPath)
  114. }
  115. var l_FieldName = GetDocParamsValue(p_Doc, constStrEnum.uploadFieldName)
  116. if (l_FieldName == '') {
  117. l_FieldName = wps.PluginStorage.getItem(constStrEnum.DefaultUploadFieldName) //默认是'file'
  118. }
  119. if (l_uploadPath == '' && pShowPrompt == true) {
  120. ShowMessage('系统未传入有效上载文件路径!不能继续转换操作。', 'error') //如果OA未传入上载路径,则给予提示
  121. return
  122. }
  123. //已经设置成默认不提醒无需替换ShowConfirm
  124. if (pShowPrompt == true) {
  125. if (
  126. !wps.confirm(
  127. '当前文档将另存一份' +
  128. l_suffix +
  129. ' 格式的副本,并上传到系统后台,请确认 ?'
  130. )
  131. ) {
  132. return
  133. }
  134. }
  135. // 先把文档输出保存为指定的文件格式,再上传到后台
  136. wps.PluginStorage.setItem(constStrEnum.OADocUserSave, true) //设置一个临时变量,用于在BeforeSave事件中判断
  137. if (p_ShowRevision == false) {
  138. // 强制关闭痕迹显示
  139. var l_SourceName = p_Doc.FullName
  140. l_NewName = p_Doc.Path + '\\B_' + p_Doc.Name
  141. p_Doc.SaveAs2(($FileName = l_NewName), ($AddToRecentFiles = false))
  142. p_Doc.SaveAs2(($FileName = l_SourceName), ($AddToRecentFiles = false))
  143. //以下以隐藏模式打开另一个文档
  144. var l_textEncoding = wps.WpsApplication().Options.DefaultTextEncoding //默认 936
  145. var l_Doc = wps
  146. .WpsApplication()
  147. .Documents.Open(
  148. l_NewName,
  149. false,
  150. false,
  151. false,
  152. '',
  153. '',
  154. false,
  155. '',
  156. '',
  157. 0,
  158. l_textEncoding,
  159. false
  160. )
  161. l_Doc.TrackRevision = false //关闭修订模式
  162. l_Doc.ShowRevision = false //隐含属性,隐藏修订模式
  163. l_Doc.AcceptAllRevisions()
  164. l_Doc.Save()
  165. handleFileAndUpload(l_suffix, l_Doc, l_uploadPath, l_FieldName)
  166. l_Doc.Close()
  167. wps.FileSystem.Remove(l_NewName) //删除临时文档
  168. } else {
  169. handleFileAndUpload(l_suffix, p_Doc, l_uploadPath, l_FieldName)
  170. }
  171. wps.PluginStorage.setItem(constStrEnum.OADocUserSave, false)
  172. return
  173. }
  174. //保存到OA后台服务器
  175. function OnBtnSaveToServer(l_doc) {
  176. var params = GetDocParamsValues(l_doc)
  177. var l_uploadPath = params[constStrEnum.uploadPath] // 文件上载路径
  178. if (!l_uploadPath) {
  179. return
  180. }
  181. var l_FieldName = params[constStrEnum.uploadFieldName] //上载到后台的业务方自定义的字段名称
  182. if (!l_FieldName) {
  183. l_FieldName = wps.PluginStorage.getItem(constStrEnum.DefaultUploadFieldName) // 默认为‘file’
  184. }
  185. var l_UploadName = params[constStrEnum.uploadFileName] //设置OA传入的文件名称参数
  186. if (!l_UploadName) {
  187. //l_UploadName = l_doc.Name //默认文件名称就是当前文件编辑名称
  188. //默认使用xml中定义的文件名 因为目前uploadFileName前端并没有传
  189. l_UploadName = GetFileNameByParams(params)
  190. }
  191. if (params.action == 'taoda' && !!params.oldDocName)
  192. l_UploadName = params.oldDocName
  193. var l_DocPath = l_doc.FullName // 文件所在路径
  194. loginfo('去水印')
  195. clearWaterMark(l_doc, params)
  196. loginfo('去水印完成')
  197. if (pIsOnlineOADoc(l_doc) == false) {
  198. //对于本地磁盘文件上传OA,先用Save方法保存后,再上传
  199. //设置用户保存按钮标志,避免出现禁止OA文件保存的干扰信息
  200. wps.PluginStorage.setItem(
  201. constStrEnum.OADocUserSave,
  202. EnumDocSaveFlag.OADocSave
  203. )
  204. loginfo('保存文件' + l_UploadName)
  205. // l_doc.Saved = false
  206. l_doc.Saved = false
  207. l_doc.Save() //执行一次保存方法
  208. loginfo('保存文件完成' + l_UploadName)
  209. //设置用户保存按钮标志
  210. wps.PluginStorage.setItem(
  211. constStrEnum.OADocUserSave,
  212. EnumDocSaveFlag.NoneOADocSave
  213. )
  214. //落地文档,调用UploadFile方法上传到OA后台
  215. try {
  216. //调用OA助手的上传方法
  217. UploadFile(
  218. l_UploadName,
  219. l_DocPath,
  220. l_uploadPath,
  221. l_FieldName,
  222. l_doc,
  223. function (rps) {
  224. //延时执行,因为显示loading的页面可能还没有加载完成,注册回调事件。
  225. //这样loading页窗体就会无法消失
  226. setTimeout(function () {
  227. CloseLoading(GetUniqueId(l_doc))
  228. ShowMessage('上传成功', 'success', 1, true)
  229. //清空心跳记录
  230. Heart.CloseOADocument(l_doc)
  231. OnUploadToServerSuccess(rps)
  232. hiddenIfNoDocument(1)
  233. setTimeout(function () {
  234. l_doc.Close()
  235. }, 2e2)
  236. }, 200)
  237. },
  238. OnUploadFileFail
  239. )
  240. } catch (err) {
  241. CloseLoading(GetUniqueId(l_doc))
  242. ShowMessage('上传文件失败!请联系管理员', 'error')
  243. logerr('上传失败:')
  244. logerr(rps)
  245. }
  246. } else {
  247. // 不落地的文档,调用 Document 对象的不落地上传方法
  248. wps.PluginStorage.setItem(
  249. constStrEnum.OADocUserSave,
  250. EnumDocSaveFlag.OADocSave
  251. )
  252. try {
  253. //调用不落地上传方法
  254. l_doc.SaveAsUrl(
  255. l_UploadName,
  256. l_uploadPath,
  257. l_FieldName,
  258. 'OnUploadToServerSuccess',
  259. 'OnUploadToServerFail'
  260. )
  261. } catch (err) {
  262. alert('上传文件失败!请检查系统上传参数及网络环境,重新上传。')
  263. }
  264. wps.PluginStorage.setItem(
  265. constStrEnum.OADocUserSave,
  266. EnumDocSaveFlag.NoneOADocSave
  267. )
  268. }
  269. //获取OA传入的 转其他格式上传属性
  270. //var l_suffix = GetDocParamsValue(l_doc, constStrEnum.suffix);
  271. //if (l_suffix == "") {
  272. //onsole.log("上传需转换的文件后缀名错误,无法进行转换上传!");
  273. // return;
  274. //}
  275. //判断是否同时上传PDF等格式到OA后台
  276. var l_uploadWithAppendPath = GetDocParamsValue(
  277. l_doc,
  278. constStrEnum.uploadWithAppendPath
  279. ) //标识是否同时上传suffix格式的文档
  280. if (l_uploadWithAppendPath == '1') {
  281. //调用转pdf格式函数,强制关闭转换修订痕迹,不弹出用户确认的对话框
  282. pDoChangeToOtherDocFormat(l_doc, l_suffix, false, false)
  283. }
  284. }
  285. /**
  286. * 锁异常后,二次提示操作
  287. * @param {document} doc
  288. * @param {msg} msg
  289. */
  290. function AfterLockError(doc, msg) {
  291. ShowConfirm(msg, 'warning', {
  292. title: '无法提交',
  293. btns: [
  294. {
  295. key: 'close',
  296. text: '确认',
  297. primary: true,
  298. callback: function () {
  299. Heart.CloseOADocument(doc)
  300. doc.Close()
  301. },
  302. },
  303. {
  304. key: 'cancel',
  305. text: '取消',
  306. },
  307. ],
  308. })
  309. }
  310. /**
  311. * 调用文件上传到OA服务端时,
  312. * @param {*} resp
  313. */
  314. function OnUploadToServerSuccess(resp) {
  315. loginfo('成功上传服务端后的回调:' + resp)
  316. return
  317. }
  318. function OnUploadToServerFail(resp) {
  319. alert('文件上传失败!')
  320. }
  321. //判断当前文档是否是OA文档
  322. function pCheckIfOADoc() {
  323. var doc = wps.WpsApplication().ActiveDocument
  324. if (!doc) return false
  325. return CheckIfDocIsOADoc(doc)
  326. }
  327. //根据传入的doc对象,判断当前文档是否是OA文档
  328. function CheckIfDocIsOADoc(doc) {
  329. if (!doc) {
  330. return false
  331. }
  332. var l_isOA = GetDocParamsValue(doc, constStrEnum.isOA)
  333. if (l_isOA == '') {
  334. return false
  335. }
  336. return l_isOA == EnumOAFlag.DocFromOA ? true : false
  337. }
  338. /**
  339. * 作用:判断是否是不落地文档
  340. * 参数:doc 文档对象
  341. * 返回值: 布尔值
  342. */
  343. function pIsOnlineOADoc(doc) {
  344. var l_LandMode = GetDocParamsValue(doc, constStrEnum.OADocLandMode) //获取文档落地模式
  345. if (l_LandMode == '') {
  346. //用户本地打开的文档
  347. return false
  348. }
  349. return l_LandMode == EnumDocLandMode.DLM_OnlineDoc
  350. }
  351. //自定义菜单按钮的点击执行事件
  352. function OnAction(control) {
  353. switch (getControlId(control)) {
  354. case 'btnRefreshVersion':
  355. refreshVersion()
  356. break
  357. case 'btnShowLogPane':
  358. ShowLogInfoDialog()
  359. break
  360. default:
  361. break
  362. }
  363. return true
  364. }
  365. function getControlId(control) {
  366. var eleId
  367. if (typeof control == 'object' && arguments.length == 1) {
  368. //针对Ribbon的按钮的
  369. eleId = control.Id
  370. } else if (typeof control == 'undefined' && arguments.length > 1) {
  371. //针对idMso的
  372. eleId = arguments[1].Id
  373. } else if (typeof control == 'boolean' && arguments.length > 1) {
  374. //针对checkbox的
  375. eleId = arguments[1].Id
  376. } else if (typeof control == 'number' && arguments.length > 1) {
  377. //针对combox的
  378. eleId = arguments[2].Id
  379. }
  380. return eleId
  381. }
  382. //xml文件中自定义按钮的文字处理函数
  383. function OnGetLabel(control) {
  384. switch (getControlId(control)) {
  385. // case 'btnLogDebugInfo':
  386. // return GetLocalDebugBtnText()
  387. case 'btnShowOAStatus':
  388. return GetOAStatusBtnText()
  389. default:
  390. }
  391. return ''
  392. }
  393. function GetOAStatusBtnText() {
  394. if (Heart) {
  395. if (Heart.IsOASystemOnline(false)) {
  396. return '系统在线'
  397. } else {
  398. return '系统离线'
  399. }
  400. }
  401. return '未知'
  402. }
  403. /**
  404. * 刷新加载项
  405. */
  406. function refreshVersion() {
  407. alert('更新加载项后请重新打开WPS')
  408. }
  409. function GetLocalDebugBtnText() {
  410. if (IfLocalDebugInfo()) return '开启本地日志' + Date.now()
  411. else return '关闭本地日志' + Date.now()
  412. }
  413. function GetVersionText() {
  414. return `当前版本:${GetCurrentVersion()}`
  415. }
  416. function ShowLogInfoDialog() {
  417. wps.ShowDialog(
  418. GetResourcePath() + 'share/ui/loginfo.html',
  419. '本地日志',
  420. 600 * window.devicePixelRatio,
  421. 600 * window.devicePixelRatio,
  422. false
  423. )
  424. }
  425. function ShowTabPane() {
  426. let taskPane = wps.CreateTaskPane(GetUrlPath() + '/ui/taskpane.html')
  427. taskPane.Title = 'IndiDocx'
  428. taskPane.DockPosition = wps.Enum.JSKsoEnum_msoCTPDockPositionLeft
  429. taskPane.Visible = true
  430. }
  431. /******** 自定义功能 *********/
  432. function getTitle() {
  433. var defaultTitle = 'Indidocx'
  434. var customertitle = OACustomer.getCustomerTitle('word')
  435. return customertitle || defaultTitle
  436. }
  437. function getCusBtnVisiable(control) {
  438. var id = getControlId(control)
  439. if (id.indexOf('cbn') == -1) return false
  440. var btn = OACustomer.getCustomerBtn('word', id.substr(3))
  441. return !!btn
  442. }
  443. function getCusBtnIcon(control) {
  444. var id = getControlId(control)
  445. if (id.indexOf('cbn') == -1) return ''
  446. var btn = OACustomer.getCustomerBtn('word', id.substr(3))
  447. return !!btn ? btn.getIcon() : ''
  448. }
  449. function getCusBtnLabel(control) {
  450. var id = getControlId(control)
  451. if (id.indexOf('cbn') == -1) return false
  452. var btn = OACustomer.getCustomerBtn('word', id.substr(3))
  453. return !!btn ? btn.getLabel() : ''
  454. }
  455. function onCusBtnAction(control) {
  456. var id = getControlId(control)
  457. if (id.indexOf('cbn') == -1) return false
  458. var btn = OACustomer.getCustomerBtn('word', id.substr(3))
  459. if (!!btn) btn.onAction()
  460. wps.ribbonUI.Invalidate()
  461. return true
  462. }