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.

441 lines
16KB

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