util.js 31 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099
  1. import moment from "moment";
  2. import React, { useRef, useState } from "react";
  3. import { message, notification, Button } from "antd";
  4. import { getFineBiToken, getPreFineBiUrl } from "@apis/outer";
  5. import { getDmpAccessUrl, getValueByDictCode } from "@apis/dict";
  6. import { getSheetToken } from "@apis/common";
  7. import { switchPage, getUnionId } from "@apis/common.js";
  8. import $store from "@store/";
  9. import utils from "@utils/index";
  10. import RouterCache from '@utils/routerCache';
  11. /**
  12. * 公用事件封装文件
  13. */
  14. /**获取url的参数*/
  15. export function getParams(url = "") {
  16. url = url || location.href || "";
  17. let args = {}; // 保存参数数据的对象
  18. if (url.indexOf("=") === -1) {
  19. return args;
  20. }
  21. let urlSplit = url.split(/[?&#]/g);
  22. urlSplit.map((item, index) => {
  23. let str = item.split("=");
  24. if (str.length > 1) {
  25. args[str[0]] = decodeURIComponent(str[1]);
  26. }
  27. });
  28. return args;
  29. }
  30. export function sortby(prop, rev = true) {
  31. // prop 属性名
  32. // rev 升序降序 默认升序
  33. return function(a, b) {
  34. var val1 = a[prop];
  35. var val2 = b[prop];
  36. return rev ? val1 - val2 : val2 - val1;
  37. }
  38. }
  39. /**下载文件*/
  40. export function download(param) {
  41. // 文件类型是否为pdf
  42. let type = param.slice(-3);
  43. if (type === "pdf") {
  44. var saveAs = function (blob, filename) {
  45. var URL = window.URL || window.webkitURL;
  46. var type = blob.type;
  47. var force_saveable_type = "application/octet-stream";
  48. if (type && type !== force_saveable_type) {
  49. // 强制下载,而非在浏览器中打开
  50. var slice = blob.slice || blob.webkitSlice || blob.mozSlice;
  51. blob = slice.call(blob, 0, blob.size, force_saveable_type);
  52. }
  53. var url = URL.createObjectURL(blob);
  54. var save_link = document.createElementNS(
  55. "http://www.w3.org/1999/xhtml",
  56. "a"
  57. );
  58. save_link.href = url;
  59. save_link.download = filename;
  60. var event = new MouseEvent("click", {
  61. bubbles: true,
  62. cancelable: true,
  63. view: window,
  64. });
  65. save_link.dispatchEvent(event);
  66. URL.revokeObjectURL(url);
  67. };
  68. var oReq = new XMLHttpRequest();
  69. var URLToPDF = param;
  70. oReq.open("GET", URLToPDF, true);
  71. oReq.responseType = "blob";
  72. oReq.onload = function () {
  73. var file = new Blob([oReq.response], { type: "application/pdf" });
  74. saveAs(file, "我的策划案.pdf");
  75. };
  76. oReq.send();
  77. return;
  78. }
  79. // let elemIF = document.createElement('iframe');
  80. // elemIF.src = param;
  81. // elemIF.style.display = "none";
  82. // document.body.appendChild(elemIF);
  83. }
  84. // downLoad('XXXX' ,'test.xlxs')
  85. /**
  86. *
  87. * @param href
  88. * @param fileName
  89. * @param isBlock 是否文件流
  90. */
  91. export function downLoad2(href, fileName, isBlock = false) {
  92. let aEle = document.createElement("a"); // 创建a标签
  93. if (isBlock) {
  94. let blob = new Blob([href]);
  95. aEle.download = fileName; // 设置下载文件的文件名
  96. aEle.href = window.URL.createObjectURL(blob);
  97. } else {
  98. aEle.download = fileName; // 设置下载文件的文件名
  99. aEle.href = href; // content为后台返回的下载地址
  100. }
  101. // 绑定点击时间
  102. document.body.appendChild(aEle);
  103. aEle.click(); // 设置点击事件
  104. // 然后移除
  105. document.body.removeChild(aEle);
  106. }
  107. /***
  108. * 解决js精度问题
  109. * method **
  110. * add / subtract / multiply /divide
  111. * floatObj.add(0.1, 0.2) >> 0.3
  112. * floatObj.multiply(19.9, 100) >> 1990
  113. *
  114. */
  115. export var FloatObj = (function () {
  116. function decNum(a) {
  117. /*获取小数位数*/
  118. var r = 0;
  119. a = a.toString();
  120. if (a.indexOf(".") !== -1) {
  121. r = a.split(".")[1].length;
  122. }
  123. return r;
  124. }
  125. function int(a) {
  126. /*去除小数点并转成数值*/
  127. return parseInt(a.toString().replace(".", ""));
  128. }
  129. function calc(a, b, type) {
  130. //加减乘除
  131. var r,
  132. da = decNum(a),
  133. db = decNum(b),
  134. dsum = da + db,
  135. dmin = Math.min(da, db),
  136. dmax = Math.max(da, db);
  137. dsum += dmax - dmin;
  138. dsum = Math.pow(10, dsum);
  139. dmax = Math.pow(10, dmax);
  140. a = int(a);
  141. b = int(b);
  142. if (da > db) {
  143. b *= Math.pow(10, da - db);
  144. } else {
  145. a *= Math.pow(10, db - da);
  146. }
  147. switch (type) {
  148. case "add":
  149. r = (a + b) / dmax;
  150. break;
  151. case "subtract":
  152. r = (a - b) / dmax;
  153. break;
  154. case "multiply":
  155. r = (a * b) / dsum;
  156. break;
  157. case "divide":
  158. r = a / b;
  159. break;
  160. case "mod":
  161. r = (multiply(a, dmax) % multiply(b, dmax)) / dmax;
  162. break;
  163. }
  164. return r;
  165. }
  166. // 加减乘除的四个接口
  167. // 加
  168. function add(a, b, type) {
  169. return calc(a, b, "add");
  170. }
  171. // 减
  172. function subtract(a, b, type) {
  173. return calc(a, b, "subtract");
  174. }
  175. // 乘
  176. function multiply(a, b, type) {
  177. return calc(a, b, "multiply");
  178. }
  179. // 除
  180. function divide(a, b, type) {
  181. return calc(a, b, "divide");
  182. }
  183. // 取余
  184. function mod(a, b, type) {
  185. return calc(a, b, "mod");
  186. }
  187. // exports
  188. return {
  189. add: add,
  190. subtract: subtract,
  191. multiply: multiply,
  192. divide: divide,
  193. mod: mod,
  194. formatNum: formatNum,
  195. };
  196. })();
  197. // 生成水印
  198. export function setWaterMark(option = {}) {
  199. let arr = [];
  200. let {
  201. waterMarkText = "",
  202. eleId = "",
  203. toImg = false,
  204. toDataURL = false,
  205. rotate = 45,
  206. color = "rgba(180, 180, 180, 0.2)",
  207. // color='red',
  208. fontSize = 12,
  209. gap = 40,
  210. globalAlpha = 1,
  211. } = option;
  212. if (Object.prototype.toString.call(waterMarkText) == "[object Array]") {
  213. arr = waterMarkText;
  214. } else if (
  215. Object.prototype.toString.call(waterMarkText) == "[object String]"
  216. ) {
  217. arr = [waterMarkText];
  218. }
  219. var canvas = eleId
  220. ? document.getElementById(eleId)
  221. : document.createElement("canvas");
  222. if (!canvas) {
  223. return false;
  224. }
  225. var ctx = canvas.getContext("2d");
  226. let horizontalWidth = ctx.measureText(waterMarkText).width;
  227. // horizontalWidth =
  228. // Math.sqrt((horizontalWidth * horizontalWidth) / 2) + fontSize;
  229. // horizontalWidth = horizontalWidth;
  230. canvas.width = horizontalWidth * 1 + 20;
  231. canvas.height = horizontalWidth * 1 + 20;
  232. ctx.textAlign = "center";
  233. ctx.textBaseline = "middle";
  234. ctx.fillStyle = color;
  235. ctx.globalAlpha = globalAlpha;
  236. ctx.font = `${fontSize}px Microsoft Yahei`;
  237. // ctx.translate(horizontalWidth/2, horizontalWidth/2);
  238. const draw = (text, x, y) => {
  239. ctx.save();
  240. ctx.translate(x, y);
  241. ctx.rotate((-rotate / 180) * Math.PI);
  242. ctx.fillText(text, 0, 0);
  243. ctx.restore();
  244. };
  245. arr.map((item, index) => {
  246. ctx.beginPath();
  247. draw(item, horizontalWidth / 2 - 20, index * 20 + horizontalWidth / 2 - 20);
  248. // ctx.fillText(item, index * 100, index * 100);
  249. ctx.closePath();
  250. });
  251. if (toImg) {
  252. // debugger
  253. //新Image对象,可以理解为DOM
  254. var image = new Image();
  255. // canvas.toDataURL 返回的是一串Base64编码的URL
  256. // 指定格式 PNG
  257. let src = canvas.toDataURL("image/png");
  258. image.src = src;
  259. return image;
  260. } else if (toDataURL) {
  261. let src = canvas.toDataURL("image/png");
  262. return src;
  263. }
  264. return canvas;
  265. }
  266. /**带小数的千分位转化*/
  267. export function formatNum(num = 0, n = 0) {
  268. try {
  269. if (!num || isNaN(num)) {
  270. return num;
  271. }
  272. num = String(Number(num).toFixed(n));
  273. var re = /(-?\d+)(\d{3})/;
  274. while (re.test(num)) {
  275. num = String(num).replace(re, "$1,$2");
  276. }
  277. return num;
  278. } catch (e) {
  279. }
  280. }
  281. /**判断一个时间是否在某个时间端内*/
  282. export function isTimes(newdate, startdate, enddate) {
  283. var newdate = newdate ? new Date(newdate) : new Date();
  284. var startdate = new Date(startdate);
  285. console.log(newdate);
  286. console.log(startdate);
  287. var enddate = new Date(enddate);
  288. var a = newdate.getTime() - startdate.getTime();
  289. var b = newdate.getTime() - enddate.getTime();
  290. console.log(a);
  291. console.log(b);
  292. if (a < 0 || b > 0) {
  293. return false;
  294. } else {
  295. return true;
  296. }
  297. }
  298. export function recursion(tree = [], oldParam_ = { '200000': '移动端首页' }) {
  299. // let param_ = {};
  300. for (let index = 0; index < tree.length; index++) {
  301. const item = tree[index];
  302. oldParam_[item.resourceId] = item.resourceName; // 保存每次遍历的结果
  303. if ((item.resourceList).length > 0) {
  304. recursion(item.resourceList, oldParam_);
  305. }
  306. }
  307. return oldParam_
  308. }
  309. export function calcEnc(str) {
  310. let res = [];
  311. for (let i = 0; i < str.length; i++) {
  312. res.push((str.charCodeAt(i) + 13) * Math.pow(2, i));
  313. }
  314. return window.btoa(res.join("%"));
  315. }
  316. export function tipsLockStatus(callback) {
  317. const key = `open${Date.now()}`;
  318. const btn = <Button type="primary" onClick={() => {
  319. notification.close(key)
  320. callback && callback()
  321. }}>
  322. 确定
  323. </Button>
  324. ;
  325. notification.open({
  326. message: '消息提示',
  327. description:
  328. `您的密码将于${sessionStorage.getItem("accountLockTime")}过期,过期后将无法使用数据门户,请点击“确认”立即修改密码,或在3天内前往【首页-右上角-点击头像】修改密码!`,
  329. btn,
  330. duration: null,
  331. placement: 'topLeft',
  332. key,
  333. style: {
  334. width: "600px",
  335. bottom: "auto",
  336. minHeight: "200px",
  337. borderRadius: "10px",
  338. },
  339. onClose: () => { },
  340. });
  341. }
  342. /**相对时间差 */
  343. export function timeDiffer(date) {
  344. let nowTime = moment(); //当下时间
  345. // let nowTime=moment('2019-12-18 10:10:00');
  346. let createTime = moment(date);
  347. let du = moment.duration(nowTime - createTime, "ms"); //做差
  348. let years = du.get("year");
  349. let months = du.get("month");
  350. let days = du.get("days");
  351. let hours = du.get("hours");
  352. let mins = du.get("minutes");
  353. let ss = du.get("seconds");
  354. if (years > 0) {
  355. return years + "年前";
  356. } else if (months > 0) {
  357. return months + "月前";
  358. } else if (days > 0) {
  359. return days + "天前";
  360. } else if (hours > 0) {
  361. return hours + "小时前";
  362. } else if (mins > 0) {
  363. return mins + "分钟前";
  364. } else {
  365. return ss + "秒前";
  366. }
  367. }
  368. export function timestampToTime() {
  369. var d = new Date();
  370. var datetime = d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate() + ' ' + d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds();
  371. return datetime
  372. }
  373. export function getArrMax(arr) {
  374. arr.sort(function (a, b) {
  375. return a - b
  376. })
  377. return arr[arr.length - 1]
  378. }
  379. export async function dealDiffSheetType(item) {
  380. return new Promise((resolve, reject) => {
  381. let type = item.resourceType;
  382. if (item.resourceUrl) {
  383. const new_url = item.resourceUrl.indexOf("?") === -1 ? item.resourceUrl + `?accountNm=${localStorage.getItem("account")}` : item.resourceUrl + `&accountNm=${localStorage.getItem("account")}`
  384. if (item.resourceUrl.indexOf("datav.aliyuncs.com") > -1 && item.resourceUrl.indexOf("accountNm=") === -1) {
  385. item.resourceUrl = new_url;
  386. }
  387. }
  388. switch (item.resourceType) {
  389. case "sys":
  390. if (item.openType === "blank") {
  391. window.open(
  392. `${window.location.protocol}//${window.location.host}/#${item.resourceUrl}`
  393. );
  394. }
  395. resolve({
  396. openType: item.openType,
  397. link: item.resourceUrl,
  398. type,
  399. activeItem: item
  400. });
  401. break;
  402. case "report":
  403. case "yonghong":
  404. (async () => {
  405. let link = item.resourceUrl;
  406. // 遇到 &reportToken 标识符,获取token并拼接到url后
  407. if (link.match(/reportToken/)) {
  408. try {
  409. let { data, code } = await getSheetToken({
  410. tenantId: "1234",
  411. appCode: "admin",
  412. appPassword: "MTIzNDU2",
  413. });
  414. sessionStorage.setItem("outerToken", data);
  415. link = link.replace(/reportToken/, `reportToken=${data}&userName=${sessionStorage.getItem("userName")}&userCode=${sessionStorage.getItem("accountId")}`);
  416. sessionStorage.setItem("outerUrl", item.resourceType == "yonghong" ? link + `&token=${sessionStorage.getItem("token")}` : link);
  417. console.log("dy4", `拿到token了${data}`);//谜之加了console就不会有获取不到token的情况
  418. resolve({
  419. openType: item.openType,
  420. link: link,
  421. type: "report",
  422. activeItem: item
  423. });
  424. } catch (e) {
  425. console.error("获取报表token失败哦");
  426. }
  427. } else {
  428. sessionStorage.setItem("outerUrl", item.resourceType == "yonghong" ? link + `&token=${sessionStorage.getItem("token")}` : link);
  429. if (item.openType === "blank") {
  430. window.open(item.resourceType == "yonghong" ? item.resourceUrl + `&token=${sessionStorage.getItem("token")}` : item.resourceUrl);
  431. }
  432. resolve({
  433. openType: item.openType,
  434. link: link,
  435. type: "report",
  436. activeItem: item
  437. });
  438. }
  439. })();
  440. break;
  441. case "module":
  442. (async () => {
  443. let link = item.resourceUrl;
  444. // 遇到 &reportToken 标识符,获取token并拼接到url后
  445. if (link.match(/reportToken/)) {
  446. try {
  447. let { data, code } = await getSheetToken({
  448. tenantId: "1234",
  449. appCode: "admin",
  450. appPassword: "MTIzNDU2",
  451. });
  452. link = link.replace(/reportToken/, `reportToken=${data}&userName=${sessionStorage.getItem("userName")}&userCode=${sessionStorage.getItem("accountId")}`);
  453. } catch (e) {
  454. console.error("获取报表token失败哦");
  455. }
  456. }
  457. sessionStorage.setItem("outerUrl", link);
  458. resolve({
  459. openType: item.openType,
  460. link: link,
  461. type: "module",
  462. activeItem: item
  463. });
  464. })();
  465. break;
  466. case "url":
  467. sessionStorage.setItem("outerUrl", item.resourceUrl);
  468. if (item.openType === "blank") {
  469. window.open(item.resourceUrl);
  470. }
  471. resolve({
  472. openType: item.openType,
  473. link: item.resourceUrl,
  474. type: "url",
  475. activeItem: item
  476. });
  477. break;
  478. case "dmpReport":
  479. getDmpAccessUrl({
  480. account:
  481. sessionStorage.getItem("account") ||
  482. sessionStorage.getItem("userName"),
  483. url: item.resourceUrl,
  484. }).then((resp) => {
  485. if (+resp.resultCode === 0) {
  486. if (item.openType === "blank") {
  487. window.open(resp.data, "dmp");
  488. }
  489. sessionStorage.setItem("outerUrl", resp.data);
  490. resolve({
  491. openType: item.openType,
  492. link: resp.data,
  493. type: "dmpReport",
  494. activeItem: item
  495. });
  496. } else {
  497. message.error("网络出错了!");
  498. reject();
  499. }
  500. });
  501. break;
  502. case "thirdsys":
  503. window.open(item.resourceUrl, "third");
  504. resolve({
  505. openType: item.openType,
  506. link: item.resourceUrl,
  507. type: "thirdsys",
  508. activeItem: item
  509. });
  510. break;
  511. case "fine_bi":
  512. case "fine_bi_new":
  513. getPreFineBiUrl(item.resourceType).then(async (resp) => {
  514. if (+resp.resultCode === 0) {
  515. let resourceUrl = item.resourceUrl;
  516. if (!resourceUrl.match(/^http/)) {
  517. resourceUrl = `//${window.location.host}${item.resourceUrl}`;
  518. }
  519. let link = `${resp.data}${resourceUrl}`.replace(
  520. /http:|https:/g,
  521. ""
  522. );
  523. // 遇到 &reportToken 标识符,获取token并拼接到url后
  524. // if (link.match(/reportToken/)) {
  525. // try {
  526. // let { data, code } = await getSheetToken({
  527. // tenantId: "1234",
  528. // admin: "user",
  529. // appPassword: "MTIzNDU2",
  530. // });
  531. // link = link.replace(/reportToken/, data);
  532. // } catch (e) {
  533. // console.error("获取报表token失败哦");
  534. // }
  535. // }
  536. if (item.openType === "blank") {
  537. window.open(link, "fine_bi");
  538. }
  539. sessionStorage.setItem("outerUrl", link);
  540. resolve({
  541. openType: item.openType,
  542. link,
  543. type: "fine_bi",
  544. activeItem: item
  545. });
  546. }
  547. });
  548. break;
  549. case "fine_tool":
  550. case "fine_tool_new":
  551. getPreFineBiUrl(item.resourceType).then(async (resp) => {
  552. if (+resp.resultCode === 0) {
  553. let resourceUrl = item.resourceUrl;
  554. if (!resourceUrl.match(/^http/)) {
  555. resourceUrl = `//${window.location.host}${item.resourceUrl}`;
  556. }
  557. let link = `${resp.data}${resourceUrl}`.replace(
  558. /http:|https:/g,
  559. ""
  560. );
  561. // 遇到 &reportToken 标识符,获取token并拼接到url后
  562. // if (link.match(/reportToken/)) {
  563. // try {
  564. // let { data, code } = await getSheetToken({
  565. // tenantId: "1234",
  566. // admin: "user",
  567. // appPassword: "MTIzNDU2",
  568. // });
  569. // link = link.replace(/reportToken/, data);
  570. // } catch (e) {
  571. // console.error("获取报表token失败哦");
  572. // }
  573. // }
  574. if (item.openType === "blank") {
  575. window.open(link, "fine_tool");
  576. }
  577. sessionStorage.setItem("outerUrl", link);
  578. resolve({
  579. openType: item.openType,
  580. link,
  581. type: "fine_tool",
  582. activeItem: item
  583. });
  584. }
  585. });
  586. break;
  587. default:
  588. sessionStorage.setItem("outerUrl", item.resourceUrl);
  589. sessionStorage.setItem("routeName", item.resourceName);
  590. getValueByDictCode({ dictCode: "report_param" }).then(
  591. ({ data, resultCode }) => {
  592. if (+resultCode === 0) {
  593. let types = data.map((item) => {
  594. item.key = item.dictValueId;
  595. return item;
  596. });
  597. let queryString = "";
  598. let paramTypeStr =
  599. (
  600. types.filter(
  601. (type) => type.dictKey === data.resourceType
  602. )[0] || {}
  603. ).dictValue || {};
  604. let paramType = JSON.parse(paramTypeStr);
  605. // 需要接口返回token
  606. if (paramTypeStr.match(/fine_auth_token/)) {
  607. getFineBiToken().then((resp) => {
  608. if (+resp.resultCode === 0) {
  609. document.cookie = `fine_auth_token=${data};fine_remember_login=-1`;
  610. queryString = `fine_auth_token=${resp.data}`;
  611. sessionStorage.setItem("queryString", queryString);
  612. resolve({
  613. openType: item.openType,
  614. link: queryString,
  615. type: "default",
  616. activeItem: item
  617. });
  618. }
  619. });
  620. } else {
  621. for (let k in paramType) {
  622. queryString += `&${k}=${calcValue(paramType[k])}`;
  623. }
  624. sessionStorage.setItem("queryString", queryString.substr(1));
  625. }
  626. resolve({
  627. openType: item.openType,
  628. link: queryString.substr(1),
  629. type: "default",
  630. activeItem: item
  631. });
  632. }
  633. }
  634. );
  635. break;
  636. }
  637. });
  638. }
  639. const navToUrl = (item, callback) => {
  640. sessionStorage.setItem("curNodeId", item.resourceId);
  641. // sessionStorage.setItem("jumpType", item.props.type);
  642. dealDiffSheetType(item).then((response) => {
  643. if (response.type === "sys") {
  644. callback && callback(response.link);
  645. } else {
  646. callback && callback(`/home/outer/${response.activeItem.resourceId}`);
  647. }
  648. });
  649. };
  650. /**跨导航栏转跳 */
  651. export function crossMenuClick(f_url, s_url, callback) {
  652. let activeTree = utils.findNodeTree($store.sysMenu.menuList, f_url, "resourceUrl");
  653. let activeTreeSon = utils.findNodeTree($store.sysMenu.menuList, s_url, "resourceUrl");
  654. handleClickForUtil(activeTree, "", ((res) => {
  655. callback && callback(res);
  656. }), activeTreeSon)
  657. }
  658. /**一级导航栏转跳 */
  659. export function handleClickForUtil(e, type, callback, goSonUrl) {
  660. localStorage.setItem("account", sessionStorage.getItem("userName"));
  661. let item = null;
  662. let submenuList = [];
  663. let activeUrl = "";
  664. let locationUrl = "";
  665. let isOuter = false;
  666. let isBi = false;
  667. if (!goSonUrl) {
  668. if (type === "cust") {
  669. if (e.target.tagName.match(/li/i)) {
  670. item = JSON.parse(e.target.dataset.key || {});
  671. } else {
  672. item = JSON.parse(e.target.parentNode.dataset.key || {});
  673. }
  674. } else if (type === "item_cust") {//直接传递对象的
  675. item = e;
  676. } else {
  677. if (e === null) {
  678. // message.warning('抱歉!您没有此功能权限!');
  679. return
  680. } else {
  681. const item_s = e && e.resourceId ? e : (e && e.key ? JSON.parse(e.key) : {})
  682. item = item_s;
  683. }
  684. }
  685. } else {
  686. item = e;
  687. }
  688. sessionStorage.setItem("topNavUrl", item.resourceUrl)
  689. if (item.openType === "close") {
  690. message.destroy();
  691. return message.warning("该菜单暂未开放");
  692. }
  693. if (
  694. item.resourceName === "驾驶舱" ||
  695. item.resourceName === "报表中心" ||
  696. item.resourceName === "填报中心"
  697. ) {
  698. switchPage({
  699. // pageId: relationship[key].pageId,
  700. modelName: item.resourceName,
  701. pageName: item.resourceName,
  702. pageUrl: item.resourceUrl,
  703. resourceId: item.resourceId,
  704. visitId: sessionStorage.getItem("unionId"),
  705. });
  706. $store.sysMenu.setIsShowLeftMenuSearch(true);
  707. } else {
  708. switchPage({
  709. // pageId: relationship[key].pageId,
  710. modelName: item.resourceName,
  711. pageName: item.resourceName,
  712. pageUrl: item.resourceUrl,
  713. resourceId: item.resourceId,
  714. visitId: sessionStorage.getItem("unionId"),
  715. });
  716. $store.sysMenu.setIsShowLeftMenuSearch(false);
  717. }
  718. // 一体化跳转处理
  719. if ((item.resourceUrl || "").includes("integration")) {
  720. activeUrl = item.resourceUrl;
  721. $store.app.setActivedUrl(activeUrl);
  722. return navToUrl(item, callback);
  723. }
  724. // 切换一级菜单清空选项卡
  725. // $store.app.setNavList([], "set");
  726. // 如果是工作台(没二级菜单),重新添加一个nav
  727. if (item.resourceUrl === "/home/work" || item.resourceUrl === "/home/reportForWork") {
  728. $store.app.setNavList({
  729. name: item.resourceName,
  730. path: item.resourceUrl,
  731. type: item.resourceType,
  732. openType: item.openType,
  733. id: item.resourceId,
  734. });
  735. sessionStorage.setItem("curNodeId", item.resourceId);
  736. $store.app.setCurNav(item.resourceUrl);
  737. $store.app.setRefresh(Date.now());
  738. }
  739. // 判断是否有子集菜单
  740. if (Array.isArray(item.resourceList) && item.resourceList.length > 0) {
  741. if (goSonUrl) {
  742. locationUrl = goSonUrl.resourceUrl;
  743. submenuList = item.resourceList;
  744. activeUrl = goSonUrl.resourceUrl;
  745. } else if ((item.resourceList[0] || {}).resourceType === "url") {
  746. locationUrl = (item.resourceList[0] || {}).resourceUrl;
  747. submenuList = item.resourceList;
  748. activeUrl = item.resourceUrl;
  749. } else {
  750. locationUrl = `/home/outer/${item.resourceId}`;
  751. submenuList = item.resourceList;
  752. activeUrl = item.resourceUrl;
  753. isOuter = true;
  754. }
  755. } else {
  756. if (item.resourceType === "url") {
  757. locationUrl = item.resourceUrl;
  758. submenuList = [];
  759. activeUrl = item.resourceUrl;
  760. } else if (item.resourceType === "fine_tool") {
  761. submenuList = [];
  762. activeUrl = item.resourceUrl;
  763. isBi = true;
  764. } else {
  765. locationUrl = `/home/outer/${item.resourceId}`;
  766. submenuList = item.resourceList;
  767. activeUrl = item.resourceUrl;
  768. isOuter = true;
  769. }
  770. }
  771. // setCurActived(activeUrl);
  772. $store.app.setActivedUrl(activeUrl);
  773. $store.sysMenu.setSubmenuList(submenuList);
  774. sessionStorage.setItem("subMenuList", JSON.stringify(submenuList));
  775. $store.app.setRefresh(Date.now());
  776. if (item.resourceList.length > 0) {
  777. let { resourceName, resourceUrl, resourceType, openType, resourceId } =
  778. goSonUrl ? goSonUrl : (item.resourceList[0] || {});
  779. $store.app.setNavList({
  780. name: resourceName,
  781. path: resourceUrl,
  782. type: resourceType,
  783. openType: openType,
  784. id: resourceId,
  785. });
  786. // 记录当前选项卡url
  787. $store.app.setCurNav(resourceUrl);
  788. }
  789. if (isBi) {
  790. return navToUrl(item, callback);
  791. }
  792. if (isOuter) {
  793. if (!item.defaultOpen) {
  794. $store.app.setCurNav("");
  795. $store.app.setNavList([], "set");
  796. sessionStorage.setItem("outerUrl", "");
  797. if (item.openType === "blank") {
  798. return window.open(
  799. `${window.location.protocol}//${window.location.host}/#/home/outer`
  800. );
  801. }
  802. return callback && callback(`/home/outer/${item.resourceId}`);
  803. }
  804. //防止第一个菜单是2级菜单
  805. let _items = {};
  806. if (item.resourceList.length > 0 && item.resourceList[0].resourceType != "folder") {
  807. _items = item.resourceList[0]
  808. } else if (item.resourceList.length > 0 && item.resourceList[0].resourceType == "folder" && item.resourceList[0].resourceList.length > 0) {
  809. _items = item.resourceList[0].resourceList[0]
  810. } else {
  811. _items = item
  812. }
  813. return navToUrl(
  814. goSonUrl ? goSonUrl : _items, callback
  815. );
  816. } else {
  817. if (!item.defaultOpen) {
  818. $store.app.setCurNav("");
  819. $store.app.setNavList([], "set");
  820. sessionStorage.setItem("outerUrl", "");
  821. if (item.openType === "blank") {
  822. return window.open(
  823. `${window.location.protocol}//${window.location.host}/#/home/outer`
  824. );
  825. }
  826. return callback && callback(`/home/outer/${item.resourceId}`);
  827. }
  828. callback && callback(locationUrl);
  829. }
  830. }
  831. export function checkIsIe10() {
  832. if (window.ActiveXObject) {
  833. var reg = /10\.0/
  834. var str = navigator.userAgent
  835. if (reg.test(str)) {
  836. return true
  837. }
  838. }
  839. return false
  840. }
  841. export function getSheetToolToken(item) {
  842. let link = item.resourceUrl;
  843. // 遇到 &reportToken 标识符,获取token并拼接到url后
  844. if (link.match(/reportToken/)) {
  845. getSheetToken({
  846. tenantId: "1234",
  847. appCode: "admin",
  848. appPassword: "MTIzNDU2",
  849. })
  850. .then(({ data, code }) => {
  851. link = link.replace(/reportToken/, `reportToken=${data}&userName=${sessionStorage.getItem("userName")}&userCode=${sessionStorage.getItem("accountId")}`);
  852. })
  853. .catch((e) => {
  854. console.error("获取报表token失败哦");
  855. });
  856. }
  857. // sessionStorage.setItem("outerUrl", link);
  858. return link;
  859. }
  860. function calcValue(str) {
  861. if (str === "sysToken") {
  862. return `${sessionStorage.getItem("token")}$`;
  863. }
  864. }
  865. // 格式化树结构
  866. export function mapTree(tree, c_name, la_name, k_name, k = 1) {
  867. const haveChildren = Array.isArray(tree[c_name]) && tree[c_name].length > 0;
  868. return {
  869. ...tree,
  870. // level: k++,
  871. groupValue: tree.parentName + tree.permissionType + tree.dataResourceName,
  872. title: tree[la_name],
  873. key: tree.parentName + tree.permissionType + tree.dataResourceName + '',
  874. value: tree.parentName + tree.permissionType + tree.dataResourceName + '',
  875. // 判断它是否存在子集,若果存在就进行再次进行遍历操作,知道不存在子集便对其他的元素进行操作
  876. children: haveChildren ? tree[c_name].map(i => mapTree(i, c_name, la_name, k_name, k)) : []
  877. };
  878. }
  879. // 格式化数据源树结构
  880. export function mapTree2(tree, c_name, la_name, isChildren = false, fathers) {
  881. let old_c_name = c_name;
  882. let old_la_name = la_name;
  883. if (!tree[c_name] && tree["dbs"]) {
  884. old_c_name = "dbs"
  885. old_la_name = "name"
  886. }
  887. const haveChildren = Array.isArray(tree[old_c_name]) && tree[old_c_name].length > 0;
  888. const lastFather = tree['dsId'] ? tree : { ...tree, ...{ dsId: fathers['dsId'], name: fathers['name'] } }
  889. const par = {
  890. // disabled:true,
  891. dsId: tree['dsId'] ? tree['dsId'] : fathers['dsId'],
  892. name: tree['name'] ? tree['name'] : (fathers[old_la_name] || fathers['name']),
  893. // title: haveChildren ? tree[old_la_name] : tree,
  894. title: haveChildren ? tree[old_la_name] : tree,
  895. key: haveChildren ? tree[old_la_name] : tree,
  896. value: haveChildren ? tree[old_la_name] : tree,
  897. // 判断它是否存在子集,若果存在就进行再次进行遍历操作,知道不存在子集便对其他的元素进行操作
  898. children: haveChildren ? tree[old_c_name].map(i => mapTree2(i, c_name, la_name, old_c_name != "dbs", lastFather)) : [],
  899. }
  900. return par;
  901. }
  902. export function getThousandNum(num){
  903. if(!num){return 0}
  904. //统一保留2位小数
  905. // num = Math.floor(num*100)/100;
  906. num = num.toFixed(2);
  907. var TextBox8_all = num+"";
  908. var text8_sum = TextBox8_all.replace(/(\d{1,3})(?=(\d{3})+(?:$|\.))/g,'$1,');
  909. return text8_sum;
  910. }
  911. //大屏转跳-去除缓存
  912. export function deleteCacheAndChangeUrl(url,callback){
  913. RouterCache.deleteCache(url)
  914. setTimeout(()=>{
  915. callback && callback(url)
  916. },300)
  917. }
  918. // 格式化树结构
  919. export function findTreeAllNode(tree) {
  920. const haveChildren = Array.isArray(tree.children) && tree.children.length > 0;
  921. if (haveChildren) {
  922. return tree.children.map(i => findTreeAllNode(i))
  923. } else {
  924. return tree
  925. }
  926. }
  927. /**
  928. * 使用crypto-js的AES算法进行加解密
  929. */
  930. const CryptoJS_key = CryptoJS.enc.Utf8.parse('1234123412ABCDEF') //十六位十六进制数作为密钥
  931. const CryptoJS_iv = CryptoJS.enc.Utf8.parse('ABCDEF1234123412') //十六位十六进制数作为密钥偏移量
  932. //加密方法
  933. export function Encrypt(word) {
  934. const srcs = CryptoJS.enc.Utf8.parse(word)
  935. const encrypted = CryptoJS.AES.encrypt(srcs, CryptoJS_key, {
  936. iv: CryptoJS_iv,
  937. mode: CryptoJS.mode.CBC,
  938. padding: CryptoJS.pad.Pkcs7
  939. })
  940. const hexStr = encrypted.ciphertext.toString().toUpperCase()
  941. var oldHexStr = CryptoJS.enc.Hex.parse(hexStr)
  942. // 将密文转为Base64的字符串
  943. const base64Str = CryptoJS.enc.Base64.stringify(oldHexStr)
  944. return base64Str
  945. }
  946. //解密方法
  947. export function Decrypt(word) {
  948. /*
  949. * const encryptedHexStr = CryptoJS.enc.Hex.parse(word)
  950. * const srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr)
  951. */
  952. const decrypt = CryptoJS.AES.decrypt(word, CryptoJS_key, {
  953. iv: CryptoJS_iv,
  954. mode: CryptoJS.mode.CBC,
  955. padding: CryptoJS.pad.Pkcs7
  956. })
  957. const decryptedStr = decrypt.toString(CryptoJS.enc.Utf8)
  958. return decryptedStr.toString()
  959. }
  960. export function queryToObj() {
  961. const url = window.location.href;
  962. const result = {};
  963. const urlSplit = url.split('?');
  964. const len = urlSplit.length - 1;
  965. const queryParam = urlSplit[len] || '';
  966. queryParam
  967. .split('&')
  968. .filter(str => str !== '')
  969. .forEach(str => {
  970. const [key, value] = str.split('=');
  971. result[key] = value;
  972. });
  973. return result;
  974. };
  975. /**
  976. * 字符串模板转换 ,将数据源对应{键}的值填入str
  977. *
  978. * @param {*} str 字符串
  979. * @param {*} source 数据源
  980. * @param {*} handle 处理函数
  981. * @returns
  982. */
  983. export function strFormat(str, source, handle = () => { }) {
  984. if (str instanceof Function) {
  985. return str(source);
  986. } else if (!isObject(source)) {
  987. return str;
  988. }
  989. const data = { ...source };
  990. const r = /{[^}]+}/;
  991. while (r.test(str)) {
  992. const key = str.match(r).toString().replace("{", "").replace("}", "");
  993. const value = get(data, key, []);
  994. const ids = toArray(value).filter((id) => id != null);
  995. str = str.replace(r, ids.join(","));
  996. handle(key, value);
  997. }
  998. return str;
  999. };