You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

407 lines
14KB

  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. OnJSWorkInit(); //初始化文档事件(全局参数,挂载监听事件)
  19. activeTab(); // 激活OA助手菜单
  20. OpenTimerRun(OnDocSaveByAutoTimer); //启动定时备份过程
  21. return true;
  22. }
  23. //文档各类初始化工作(WPP Js环境)
  24. function OnJSWorkInit() {
  25. pInitParameters(); //OA助手环境的所有配置控制的初始化过程
  26. AddPresentationEvent(); //挂接文档事件处理函数
  27. }
  28. //初始化全局参数
  29. function pInitParameters() {
  30. wps.PluginStorage.setItem("OADocUserSave", EnumDocSaveFlag.NoneOADocSave); //初始化,没有用户点击保存按钮
  31. wps.PluginStorage.setItem("OADocCanSaveAs", false); //默认OA文档不能另存为本地
  32. wps.PluginStorage.setItem("AllowOADocReOpen", false); //设置是否允许来自OA的文件再次被打开
  33. wps.PluginStorage.setItem("ShowOATabDocActive", false); //设置新打开文档是否默认显示OA助手菜单Tab //默认为false
  34. wps.PluginStorage.setItem("DefaultUploadFieldName", "file"); //针对UploadFile方法设置上载字段名称
  35. wps.PluginStorage.setItem("AutoSaveToServerTime", "10"); //自动保存回OA服务端的时间间隔。如果设置0,则关闭,最小设置3分钟
  36. wps.PluginStorage.setItem("TempTimerID", "0"); //临时值,用于保存计时器ID的临时值
  37. // 以下是一些临时状态参数,用于打开文档等的状态判断
  38. wps.PluginStorage.setItem("IsInCurrOADocOpen", false); //用于执行来自OA端的新建或打开文档时的状态
  39. wps.PluginStorage.setItem("IsInCurrOADocSaveAs", false); //用于执行来自OA端的文档另存为本地的状态
  40. }
  41. //挂载WPS的演示事件
  42. function AddPresentationEvent() {
  43. wps.ApiEvent.AddApiEventListener("WindowActivate", OnWindowActivate);
  44. wps.ApiEvent.AddApiEventListener("PresentationBeforeClose", OnPresentationBeforeClose);
  45. wps.ApiEvent.AddApiEventListener("DocumentRightsInfo", OnDocumentRightsInfo);
  46. console.log("AddPresentationEvent");
  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(Doc.FullName);
  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.WppApplication().ActivePresentation;
  78. if (!l_Doc) {
  79. return false; //如果未装入文档,则设置OA助手按钮组不可见
  80. }
  81. //获取OA传入的按钮组参数组
  82. var l_grpButtonParams = GetDocParamsValue(l_Doc, "buttonGroups"); //disableBtns
  83. l_grpButtonParams = l_grpButtonParams + "," + GetDocParamsValue(l_Doc, "disableBtns");
  84. // 要求OA传入控制自定义按钮显示的参数为字符串 中间用 , 分隔开
  85. if (typeof (l_grpButtonParams) == "string") {
  86. var l_arrayGroup = new Array();
  87. l_arrayGroup = l_grpButtonParams.split(",");
  88. //console.log(l_grpButtonParams);
  89. // 判断当前按钮是否存在于数组
  90. if (l_arrayGroup.indexOf(CtrlID) >= 0) {
  91. return false;
  92. }
  93. }
  94. // 添加OA菜单判断
  95. if (CtrlID == "WPSWorkExtTab") {
  96. var l_value = wps.PluginStorage.getItem("ShowOATabDocActive");
  97. wps.PluginStorage.setItem("ShowOATabDocActive", false); //初始化临时状态变量
  98. console.log("菜单:" + l_value);
  99. return l_value;
  100. }
  101. return true;
  102. }
  103. /**
  104. * 调用文件上传到OA服务端时,
  105. * @param {*} resp
  106. */
  107. function OnUploadToServerSuccess(resp) {
  108. var l_doc = wps.WppApplication().ActivePresentation;
  109. if (wps.confirm("文件上传成功!继续编辑请确认,取消关闭文档。") == false) {
  110. if (l_doc) {
  111. console.log("OnUploadToServerSuccess: before Close");
  112. l_doc.Close(); //保存文档后关闭
  113. console.log("OnUploadToServerSuccess: after Close");
  114. }
  115. }
  116. var l_NofityURL = GetDocParamsValue(l_doc, "notifyUrl");
  117. if (l_NofityURL != "") {
  118. l_NofityURL = l_NofityURL.replace("{?}", "2"); //约定:参数为2则文档被成功上传
  119. NotifyToServer(l_NofityURL);
  120. }
  121. }
  122. function OnUploadToServerFail(resp) {
  123. alert("文件上传失败!");
  124. }
  125. //判断当前文档是否是OA文档
  126. function pCheckIfOADoc() {
  127. var doc = wps.WppApplication().ActivePresentation;
  128. console.log("先判断是否有doc对象")
  129. if (!doc)
  130. return false;
  131. return CheckIfDocIsOADoc(doc);
  132. }
  133. //根据传入的doc对象,判断当前文档是否是OA文档
  134. function CheckIfDocIsOADoc(doc) {
  135. if (!doc) {
  136. return false;
  137. }
  138. var l_isOA = GetDocParamsValue(doc, "isOA");
  139. if (l_isOA == "") {
  140. return false
  141. }
  142. return l_isOA == EnumOAFlag.DocFromOA ? true : false;
  143. }
  144. //返回是否可以点击OA保存按钮的状态
  145. function OnSetSaveToOAEnable() {
  146. return pCheckIfOADoc();
  147. }
  148. /**
  149. * 作用:判断是否是不落地文档
  150. * 参数:doc 文档对象
  151. * 返回值: 布尔值
  152. */
  153. function pIsOnlineOADoc(doc) {
  154. var l_LandMode = GetDocParamsValue(doc, "OADocLandMode"); //获取文档落地模式
  155. if (l_LandMode == "") { //用户本地打开的文档
  156. return false;
  157. }
  158. return l_LandMode == EnumDocLandMode.DLM_OnlineDoc;
  159. }
  160. //保存到OA后台服务器
  161. function OnBtnSaveToServer() {
  162. // console.log('SaveToServer');
  163. var l_doc = wps.WppApplication().ActivePresentation;
  164. if (!l_doc) {
  165. alert("空文档不能保存!");
  166. return;
  167. }
  168. //非OA文档,不能上传到OA
  169. if (pCheckIfOADoc() == false) {
  170. alert("非系统打开的文档,不能直接上传到系统!");
  171. return;
  172. }
  173. /**
  174. * 参数定义:OAAsist.UploadFile(name, path, url, field, "OnSuccess", "OnFail")
  175. * 上传一个文件到远程服务器。
  176. * name:为上传后的文件名称;
  177. * path:是文件绝对路径;
  178. * url:为上传地址;
  179. * field:为请求中name的值;
  180. * 最后两个参数为回调函数名称;
  181. */
  182. var l_uploadPath = GetDocParamsValue(l_doc, "uploadPath"); // 文件上载路径
  183. if (l_uploadPath == "") {
  184. wps.alert("系统未传入文件上载路径,不能执行上传操作!");
  185. return;
  186. }
  187. if (!wps.confirm("先保存文档,并开始上传到系统后台,请确认?")) {
  188. return;
  189. }
  190. var l_FieldName = GetDocParamsValue(l_doc, "uploadFieldName"); //上载到后台的字段名称
  191. if (l_FieldName == "") {
  192. l_FieldName = wps.PluginStorage.getItem("DefaultUploadFieldName"); // 默认为‘file’
  193. }
  194. var l_UploadName = GetDocParamsValue(l_doc, "uploadFileName"); //设置OA传入的文件名称参数
  195. if (l_UploadName == "") {
  196. l_UploadName = l_doc.Name; //默认文件名称就是当前文件编辑名称
  197. }
  198. var l_DocPath = l_doc.FullName; // 文件所在路径
  199. if (pIsOnlineOADoc(l_doc) == false) {
  200. //对于本地磁盘文件上传OA,先用Save方法保存后,再上传
  201. //设置用户保存按钮标志,避免出现禁止OA文件保存的干扰信息
  202. wps.PluginStorage.setItem("OADocUserSave", EnumDocSaveFlag.OADocSave);
  203. l_doc.Save(); //执行一次保存方法
  204. //设置用户保存按钮标志
  205. wps.PluginStorage.setItem("OADocUserSave", EnumDocSaveFlag.NoneOADocSave);
  206. //落地文档,调用UploadFile方法上传到OA后台
  207. try {
  208. //调用OA助手的上传方法
  209. wps.OAAssist.UploadFile(l_UploadName, l_DocPath, l_uploadPath, l_FieldName, "OnUploadToServerSuccess", "OnUploadToServerFail");
  210. } catch (err) {
  211. alert("上传文件失败!请检查系统上传参数及网络环境!");
  212. }
  213. } else {
  214. // 不落地的文档,调用 Document 对象的不落地上传方法
  215. wps.PluginStorage.setItem("OADocUserSave", EnumDocSaveFlag.OADocSave);
  216. try {
  217. //调用不落地上传方法
  218. l_doc.SaveAsUrl(l_UploadName, l_uploadPath, l_FieldName, "OnUploadToServerSuccess", "OnUploadToServerFail");
  219. } catch (err) {
  220. alert("上传文件失败!请检查系统上传参数及网络环境,重新上传。");
  221. }
  222. wps.PluginStorage.setItem("OADocUserSave", EnumDocSaveFlag.NoneOADocSave);
  223. }
  224. //获取OA传入的 转其他格式上传属性
  225. var l_suffix = GetDocParamsValue(l_doc, "suffix");
  226. if (l_suffix == "") {
  227. console.log("上传需转换的文件后缀名错误,无妨进行转换上传!");
  228. return;
  229. }
  230. //判断是否同时上传PDF等格式到OA后台
  231. var l_uploadWithAppendPath = GetDocParamsValue(l_doc, "uploadWithAppendPath"); //标识是否同时上传OFD、PDF等格式的文件
  232. if (l_uploadWithAppendPath == "1") {
  233. //调用转 pdf格式函数,强制关闭转换修订痕迹
  234. pDoChangeToOtherDocFormat(l_doc, l_suffix, false, false); //
  235. }
  236. return;
  237. }
  238. /**
  239. * 执行另存为本地文件操作
  240. */
  241. function OnBtnSaveAsLocalFile() {
  242. //初始化临时状态值
  243. wps.PluginStorage.setItem("OADocUserSave", false);
  244. wps.PluginStorage.setItem("IsInCurrOADocSaveAs", false);
  245. //检测是否有文档正在处理
  246. var l_doc = wps.WppApplication().ActivePresentation;
  247. if (!l_doc) {
  248. alert("WPS当前没有可操作文档!");
  249. return;
  250. }
  251. // 设置WPS文档对话框 2 FileDialogType:=msoFileDialogSaveAs
  252. var l_ksoFileDialog = wps.WppApplication().FileDialog(2);
  253. l_ksoFileDialog.InitialFileName = l_doc.Name; //文档名称
  254. if (l_ksoFileDialog.Show() == -1) { // -1 代表确认按钮
  255. wps.PluginStorage.setItem("OADocUserSave", true); //设置保存为临时状态,在Save事件中避免OA禁止另存为对话框
  256. l_ksoFileDialog.Execute(); //会触发保存文档的监听函数
  257. pSetNoneOADocFlag(l_doc.FullName);
  258. wps.ribbonUI.Invalidate(); //刷新Ribbon的状态
  259. };
  260. }
  261. /**
  262. *
  263. * @param {*} params
  264. * @param {*} Key
  265. */
  266. function GetParamsValue(Params, Key) {
  267. if (typeof (Params) == "undefined") {
  268. return "";
  269. }
  270. var l_rtnValue = Params[Key];
  271. return l_rtnValue;
  272. }
  273. function OnAction(control) {
  274. var strId = typeof (control) == "object" ? control.Id : control;
  275. switch (strId) {
  276. case "btnSaveToServer":
  277. OnBtnSaveToServer();
  278. break;
  279. case "btnSaveAsFile":
  280. OnBtnSaveAsLocalFile();
  281. break;
  282. default:
  283. ;
  284. }
  285. return true;
  286. }
  287. /**
  288. * 设置功能的可用性
  289. *
  290. * @param {*} control
  291. * @returns
  292. */
  293. function OnGetEnabled(control) {
  294. var eleId;
  295. if (typeof control == "object" && arguments.length == 1) { //针对Ribbon的按钮的
  296. eleId = control.Id;
  297. } else if (typeof control == "undefined" && arguments.length > 1) { //针对idMso的
  298. eleId = arguments[1].Id;
  299. console.log(eleId)
  300. } else if (typeof control == "boolean" && arguments.length > 1) { //针对checkbox的
  301. eleId = arguments[1].Id;
  302. } else if (typeof control == "number" && arguments.length > 1) { //针对combox的
  303. eleId = arguments[2].Id;
  304. }
  305. switch (eleId) {
  306. case "btnSaveToServer": //保存到OA服务器的相关按钮。判断,如果非OA文件,禁止点击
  307. case "btnChangeToPDF": //保存到PDF格式再上传
  308. case "btnChangeToUOT": //保存到UOT格式再上传
  309. case "btnChangeToOFD": //保存到OFD格式再上传
  310. return OnSetSaveToOAEnable();
  311. case "SaveAsPDF":
  312. case "SaveAsOfd":
  313. case "SaveAsPicture":
  314. case "FileMenuSendMail":
  315. case "FileSaveAsPicture":
  316. case "FileSaveAsPdfOrXps":
  317. case "VisualBasic":
  318. case "MacroPlay":
  319. return OnSetSaveAsRightsEnable();
  320. default:
  321. ;
  322. }
  323. return true;
  324. }
  325. function OnGetVisible(control) {
  326. var eleId = typeof (control) == "object" ? control.Id : control;
  327. var l_value = false;
  328. //按照 OA文档传递过来的属性进行判断
  329. l_value = pShowRibbonGroupByOADocParam(eleId);
  330. return l_value;
  331. }
  332. function GetImage(control) {
  333. var eleId = typeof (control) == "object" ? control.Id : control;
  334. switch (eleId) {
  335. case "btnSaveToServer": //保存到OA后台服务端
  336. return "./icon/w_Save.png";
  337. case "btnSaveAsFile": //另存为本地文件
  338. return "./icon/w_SaveAs.png";
  339. default:
  340. ;
  341. }
  342. return "./icon/c_default.png";
  343. }
  344. function OnGetLabel(control) {
  345. var eleId = typeof (control) == "object" ? control.Id : control;
  346. switch (eleId) {
  347. case "btnSaveAsFile":
  348. return "另存为本地";
  349. default:
  350. ;
  351. }
  352. return "";
  353. }