func_tabcontrol.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. var EnumOAFlag = {
  2. DocFromOA: 1,
  3. DocFromNoOA: 0,
  4. }
  5. //标识文档的落地模式 本地文档落地 0 ,不落地 1
  6. var EnumDocLandMode = {
  7. DLM_LocalDoc: 0,
  8. DLM_OnlineDoc: 1,
  9. }
  10. //加载时会执行的方法
  11. function OnWPSWorkTabLoad(ribbonUI) {
  12. wps.ribbonUI = ribbonUI
  13. if (typeof wps.Enum == 'undefined') {
  14. // 如果没有内置枚举值
  15. wps.Enum = WPS_Enum
  16. }
  17. OnJSWorkInit() //初始化文档事件(全局参数,挂载监听事件)
  18. // activeTab(); // 激活OA助手菜单
  19. if (!IsWindows()) {
  20. constStrEnum.DirSeparator = '/'
  21. }
  22. return true
  23. }
  24. //文档各类初始化工作(WPS Js环境)
  25. function OnJSWorkInit() {
  26. pInitParameters() //OA助手环境的所有配置控制的初始化过程
  27. AddWorkbookEvent() //挂接文档事件处理函数
  28. }
  29. //初始化全局参数
  30. function pInitParameters() {
  31. var l_wpsUserName = wps.Application.UserName
  32. wps.PluginStorage.setItem('WPSInitUserName', l_wpsUserName) //在OA助手加载前,先保存用户原有的WPS应用用户名称
  33. wps.PluginStorage.setItem('OADocCanSaveAs', false) //默认OA文档不能另存为本地
  34. wps.PluginStorage.setItem('AllowOADocReOpen', false) //设置是否允许来自OA的文件再次被打开
  35. wps.PluginStorage.setItem('ShowOATabDocActive', false) //设置新打开文档是否默认显示OA助手菜单Tab //默认为false
  36. wps.PluginStorage.setItem('DefaultUploadFieldName', 'file') //针对UploadFile方法设置上载字段名称
  37. // 以下是一些临时状态参数,用于打开文档等的状态判断
  38. wps.PluginStorage.setItem('IsInCurrOADocOpen', false) //用于执行来自OA端的新建或打开文档时的状态
  39. wps.PluginStorage.setItem('IsInCurrOADocSaveAs', false) //用于执行来自OA端的文档另存为本地的状态
  40. }
  41. //挂载WPS的表格事件
  42. function AddWorkbookEvent() {
  43. wps.ApiEvent.AddApiEventListener('WindowActivate', OnWindowActivate)
  44. wps.ApiEvent.AddApiEventListener('WorkbookBeforeClose', OnWorkbookBeforeClose)
  45. wps.ApiEvent.AddApiEventListener('WorkbookBeforeSave', OnWorkbookBeforeSave)
  46. wps.ApiEvent.AddApiEventListener('WorkbookOpen', OnWorkbookOpen)
  47. }
  48. /**
  49. * 根据传入Document对象,获取OA传入的参数的某个Key值的Value
  50. * @param {*} Doc
  51. * @param {*} Key
  52. * 返回值:返回指定 Key的 Value
  53. */
  54. function GetDocParamsValue(Doc, Key) {
  55. if (!Doc) {
  56. return ''
  57. }
  58. var l_Params = wps.PluginStorage.getItem(GetUniqueId(Doc))
  59. if (!l_Params) {
  60. return ''
  61. }
  62. var l_objParams = JSON.parse(l_Params)
  63. if (typeof l_objParams == 'undefined') {
  64. return ''
  65. }
  66. var l_rtnValue = l_objParams[Key]
  67. if (typeof l_rtnValue == 'undefined' || l_rtnValue == null) {
  68. return ''
  69. }
  70. return l_rtnValue
  71. }
  72. /**
  73. * 作用:根据OA传入参数,设置是否显示Ribbob按钮组
  74. * 参数:CtrlID 是OnGetVisible 传入的Ribbob控件的ID值
  75. */
  76. function pShowRibbonGroupByOADocParam(CtrlID) {
  77. var l_Doc = wps.EtApplication().ActiveWorkbook
  78. if (!l_Doc) {
  79. return false //如果未装入文档,则设置OA助手按钮组不可见
  80. }
  81. //获取OA传入的按钮组参数组
  82. var l_grpButtonParams = GetDocParamsValue(l_Doc, 'buttonGroups') //disableBtns
  83. l_grpButtonParams =
  84. l_grpButtonParams + ',' + GetDocParamsValue(l_Doc, 'disableBtns')
  85. // 要求OA传入控制自定义按钮显示的参数为字符串 中间用 , 分隔开
  86. if (typeof l_grpButtonParams == 'string') {
  87. var l_arrayGroup = new Array()
  88. l_arrayGroup = l_grpButtonParams.split(',')
  89. //console.log(l_grpButtonParams);
  90. // 判断当前按钮是否存在于数组
  91. if (l_arrayGroup.indexOf(CtrlID) >= 0) {
  92. return false
  93. }
  94. }
  95. // 添加OA菜单判断
  96. if (CtrlID == 'WeOfficeWPSExtTab') {
  97. var l_value = wps.PluginStorage.getItem('ShowOATabDocActive')
  98. wps.PluginStorage.setItem('ShowOATabDocActive', false) //初始化临时状态变量
  99. console.log('菜单:' + l_value)
  100. return l_value
  101. }
  102. //disableBtns
  103. return true
  104. }
  105. /**
  106. * 调用文件上传到OA服务端时,
  107. * @param {*} resp
  108. */
  109. function OnUploadToServerSuccess(resp) {
  110. loginfo('成功上传服务端后的回调:' + resp)
  111. return
  112. }
  113. /**
  114. * 上传失败回调
  115. * @param {document} doc
  116. * @param {response} rps
  117. * @param {boolean} savetmp 是否保存临时文件
  118. */
  119. function OnUploadFileFail(doc, rps, savetmp = true) {
  120. //同步操作会把wps卡死
  121. setTimeout(() => {
  122. CloseLoading(GetUniqueId(doc))
  123. if (rps.startWith('lockError')) {
  124. if (savetmp) {
  125. var gs = doc.Name.match(/^(?<name>.*)\.(?<ext>\w+)$/).groups
  126. var sourcename = doc.FullName
  127. var bkname =
  128. wps.Env.GetHomePath() +
  129. GetDirSpacer() +
  130. gs.name +
  131. '_锁异常临时备份' +
  132. '.' +
  133. gs.ext
  134. var data = wps.FileSystem.readAsBinaryString(sourcename)
  135. wps.FileSystem.writeAsBinaryString(bkname, data)
  136. }
  137. var failMsg = rps.split(',')
  138. var name = decodeURIComponent(failMsg[1]) || '未知'
  139. var msg = `文件已被 ${name} 编辑,无法继续提交,请确认是否关闭?`
  140. ShowConfirm(msg, 'error', {
  141. title: '提交失败',
  142. btns: [
  143. {
  144. key: 'close',
  145. text: '确认',
  146. primary: true,
  147. callback: function () {
  148. Heart.CloseOADocument(doc)
  149. doc.Close()
  150. },
  151. },
  152. {
  153. key: 'cancel',
  154. text: '取消',
  155. callback: function () {
  156. SetDocParamsValue(doc, 'LockError', {
  157. callback: 'AfterLockError',
  158. msg,
  159. })
  160. },
  161. },
  162. ],
  163. })
  164. } else {
  165. ShowMessage('上传文件失败!请联系管理员', 'error')
  166. }
  167. logerr('上传失败:')
  168. logerr(rps)
  169. }, 1000)
  170. }
  171. //判断当前文档是否是OA文档
  172. function pCheckIfOADoc() {
  173. var doc = wps.EtApplication().ActiveWorkbook
  174. if (!doc) return false
  175. return CheckIfDocIsOADoc(doc)
  176. }
  177. //根据传入的doc对象,判断当前文档是否是OA文档
  178. function CheckIfDocIsOADoc(doc) {
  179. if (!doc) {
  180. return false
  181. }
  182. var l_isOA = GetDocParamsValue(doc, 'isOA')
  183. if (l_isOA == '') {
  184. return false
  185. }
  186. return l_isOA == EnumOAFlag.DocFromOA ? true : false
  187. }
  188. //返回是否可以点击OA保存按钮的状态
  189. function OnSetSaveToOAEnable() {
  190. return pCheckIfOADoc()
  191. }
  192. /**
  193. * 作用:判断是否是不落地文档
  194. * 参数:doc 文档对象
  195. * 返回值: 布尔值
  196. */
  197. function pIsOnlineOADoc(doc) {
  198. var l_LandMode = GetDocParamsValue(doc, 'OADocLandMode') //获取文档落地模式
  199. if (l_LandMode == '') {
  200. //用户本地打开的文档
  201. return false
  202. }
  203. return l_LandMode == EnumDocLandMode.DLM_OnlineDoc
  204. }
  205. //保存到OA后台服务器
  206. function OnBtnSaveToServer(l_doc) {
  207. var params = GetDocParamsValues(l_doc)
  208. var l_uploadPath = params[constStrEnum.uploadPath] // 文件上载路径
  209. if (!l_uploadPath) {
  210. return
  211. }
  212. var l_FieldName = params[constStrEnum.uploadFieldName] //上载到后台的业务方自定义的字段名称
  213. if (!l_FieldName) {
  214. l_FieldName = wps.PluginStorage.getItem(constStrEnum.DefaultUploadFieldName) // 默认为‘file’
  215. }
  216. var l_UploadName = params[constStrEnum.uploadFileName] //设置OA传入的文件名称参数
  217. if (!l_UploadName) {
  218. l_UploadName = l_doc.Name //默认文件名称就是当前文件编辑名称
  219. }
  220. var l_DocPath = l_doc.FullName // 文件所在路径
  221. if (pIsOnlineOADoc(l_doc) == false) {
  222. //落地文档,调用UploadFile方法上传到OA后台
  223. try {
  224. //调用OA助手的上传方法
  225. UploadFile(
  226. l_UploadName,
  227. l_DocPath,
  228. l_uploadPath,
  229. l_FieldName,
  230. l_doc,
  231. function (rps) {
  232. //延时执行,因为显示loading的页面可能还没有加载完成,注册回调事件。
  233. //这样loading页窗体就会无法消失
  234. setTimeout(function () {
  235. CloseLoading(GetUniqueId(l_doc))
  236. ShowMessage('上传成功', 'success')
  237. //清空心跳记录
  238. Heart.CloseOADocument(l_doc)
  239. OnUploadToServerSuccess(rps)
  240. l_doc.Close()
  241. }, 1000)
  242. },
  243. OnUploadFileFail,
  244. OnUploadToServerSuccess
  245. )
  246. } catch (err) {
  247. alert('上传文件失败!请检查系统上传参数及网络环境!')
  248. }
  249. } else {
  250. // 不落地的文档,调用 Document 对象的不落地上传方法
  251. wps.PluginStorage.setItem('OADocUserSave', EnumDocSaveFlag.OADocSave)
  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('OADocUserSave', EnumDocSaveFlag.NoneOADocSave)
  265. }
  266. return
  267. }
  268. /**
  269. * 执行另存为本地文件操作
  270. */
  271. function OnBtnSaveAsLocalFile() {
  272. //初始化临时状态值
  273. wps.PluginStorage.setItem('OADocUserSave', false)
  274. wps.PluginStorage.setItem('IsInCurrOADocSaveAs', false)
  275. //检测是否有文档正在处理
  276. var l_doc = wps.EtApplication().ActiveWorkbook
  277. if (!l_doc) {
  278. alert('WPS当前没有可操作文档!')
  279. return
  280. }
  281. // 设置WPS文档对话框 2 FileDialogType:=msoFileDialogSaveAs
  282. var l_ksoFileDialog = wps.EtApplication().FileDialog(2)
  283. l_ksoFileDialog.InitialFileName = l_doc.Name //文档名称
  284. if (l_ksoFileDialog.Show() == -1) {
  285. // -1 代表确认按钮
  286. wps.PluginStorage.setItem('OADocUserSave', true) //设置保存为临时状态,在Save事件中避免OA禁止另存为对话框
  287. l_ksoFileDialog.Execute() //会触发保存文档的监听函数
  288. pSetNoneOADocFlag(l_doc)
  289. wps.ribbonUI.Invalidate() //刷新Ribbon的状态
  290. }
  291. }
  292. /**
  293. *
  294. * @param {*} params
  295. * @param {*} Key
  296. */
  297. function GetParamsValue(Params, Key) {
  298. if (typeof Params == 'undefined') {
  299. return ''
  300. }
  301. var l_rtnValue = Params[Key]
  302. return l_rtnValue
  303. }
  304. function OnAction(control) {
  305. var eleId
  306. if (typeof control == 'object' && arguments.length == 1) {
  307. //针对Ribbon的按钮的
  308. eleId = control.Id
  309. } else if (typeof control == 'undefined' && arguments.length > 1) {
  310. //针对idMso的
  311. eleId = arguments[1].Id
  312. console.log(eleId)
  313. } else if (typeof control == 'boolean' && arguments.length > 1) {
  314. //针对checkbox的
  315. eleId = arguments[1].Id
  316. } else if (typeof control == 'number' && arguments.length > 1) {
  317. //针对combox的
  318. eleId = arguments[2].Id
  319. }
  320. switch (eleId) {
  321. case 'btnRefreshVersion':
  322. refreshVersion()
  323. break
  324. case 'btnShowLogPane':
  325. ShowLogInfoDialog()
  326. break
  327. default:
  328. break
  329. }
  330. return true
  331. }
  332. /**
  333. * 刷新加载项
  334. */
  335. function refreshVersion() {
  336. alert('更新加载项后请重新打开WPS')
  337. }
  338. function GetVersionText() {
  339. return `当前版本:${GetCurrentVersion()}`
  340. }
  341. function ShowLogInfoDialog() {
  342. wps.ShowDialog(
  343. GetResourcePath() + 'share/ui/loginfo.html',
  344. '本地日志',
  345. 600 * window.devicePixelRatio,
  346. 600 * window.devicePixelRatio,
  347. false
  348. )
  349. }
  350. function OnGetEnabled(control) {
  351. var eleId = typeof control == 'object' ? control.Id : control
  352. switch (eleId) {
  353. case 'btnSaveToServer': //保存到OA服务器的相关按钮。判断,如果非OA文件,禁止点击
  354. return OnSetSaveToOAEnable()
  355. case 'btnSaveAsFile':
  356. let doc = wps.EtApplication().ActiveWorkbook
  357. let l_Params = wps.PluginStorage.getItem(doc.FullName)
  358. let OADocLandMode = JSON.parse(l_Params).OADocLandMode
  359. return !OADocLandMode
  360. default:
  361. }
  362. return true
  363. }
  364. function OnGetVisible(control) {
  365. var eleId = typeof control == 'object' ? control.Id : control
  366. var l_value = false
  367. //按照 OA文档传递过来的属性进行判断
  368. l_value = pShowRibbonGroupByOADocParam(eleId)
  369. return l_value
  370. }
  371. function GetImage(control) {
  372. var eleId = typeof control == 'object' ? control.Id : control
  373. switch (eleId) {
  374. case 'btnSaveToServer': //保存到OA后台服务端
  375. return './icon/w_Save.png'
  376. case 'btnSaveAsFile': //另存为本地文件
  377. return './icon/w_SaveAs.png'
  378. default:
  379. }
  380. return './icon/c_default.png'
  381. }
  382. function OnGetLabel(control) {
  383. var eleId
  384. if (typeof control == 'object' && arguments.length == 1) {
  385. //针对Ribbon的按钮的
  386. eleId = control.Id
  387. } else if (typeof control == 'undefined' && arguments.length > 1) {
  388. //针对idMso的
  389. eleId = arguments[1].Id
  390. } else if (typeof control == 'boolean' && arguments.length > 1) {
  391. //针对checkbox的
  392. eleId = arguments[1].Id
  393. } else if (typeof control == 'number' && arguments.length > 1) {
  394. //针对combox的
  395. eleId = arguments[2].Id
  396. }
  397. switch (eleId) {
  398. // case 'btnLogDebugInfo':
  399. // return GetLocalDebugBtnText()
  400. case 'btnShowOAStatus':
  401. return GetOAStatusBtnText()
  402. default:
  403. }
  404. return ''
  405. }
  406. function GetOAStatusBtnText() {
  407. if (Heart) {
  408. if (Heart.IsOASystemOnline(false)) {
  409. return '系统在线'
  410. } else {
  411. return '系统离线'
  412. }
  413. }
  414. return '未知'
  415. }
  416. /******** 自定义功能 *********/
  417. function getTitle() {
  418. var defaultTitle = 'IndiDocXET'
  419. var customertitle = OACustomer.getCustomerTitle('et')
  420. return customertitle || defaultTitle
  421. }