util.js 33 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151
  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 = 30,
  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 + 50;
  231. canvas.height = horizontalWidth * 1 + 50;
  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 - 0, index * 20 + horizontalWidth / 2 - 30);
  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, need100) {
  903. if (!num) { return 0 }
  904. //统一保留2位小数
  905. // num = Math.floor(num*100)/100;
  906. num = Number(need100 ? (num * 100).toFixed(2) : num.toFixed(2));
  907. var TextBox8_all = num.toLocaleString();
  908. // var text8_sum = TextBox8_all.replace(/(\d{1,3})(?=(\d{3})+(?:$|\.))/g,'$1,');
  909. if (TextBox8_all.split('.')[1] && TextBox8_all.split('.')[1].length == 1) {
  910. TextBox8_all = TextBox8_all + '0'
  911. } else if (!TextBox8_all.split('.')[1]) {
  912. TextBox8_all = TextBox8_all + '.00'
  913. }
  914. return TextBox8_all;
  915. }
  916. //大屏转跳-去除缓存
  917. export function deleteCacheAndChangeUrl(next = 'left', callback, needName) {//needName 获取名称
  918. const screenName = ["/home/operation", "/home/gvc", "/home/tlk"];
  919. const names = ["运营数据中心", "产供销价值链", "TLK运营数据中心 / TLK Plant Dashboard"];
  920. const HasScreen = localStorage.getItem("tqcHasScreen").split(",") || [];
  921. const currUrl = window.location.hash.split("#")[1];
  922. //检测是否含有当前页面的路径
  923. if (!HasScreen.includes(currUrl)) {
  924. message.error("您没有当前路径的权限!").then(() => {
  925. setTimeout(() => {
  926. if(HasScreen && HasScreen[0]){
  927. window.location = window.location.origin + '/transfer.html#'+HasScreen[0];
  928. }else{
  929. window.location = window.location.origin + '/transfer.html#/login';
  930. }
  931. }, 300)
  932. })
  933. return
  934. }
  935. //排序菜单路径
  936. let newHasScreen = [];
  937. screenName.map(x => {
  938. if (HasScreen.includes(x)) {
  939. newHasScreen.push(x)
  940. }
  941. })
  942. console.log(newHasScreen)
  943. //找到下一页的大屏
  944. let ai = 0;
  945. for (let index = 0; index < newHasScreen.length; index++) {
  946. const element = newHasScreen[index];
  947. if (element == currUrl) {
  948. ai = index
  949. }
  950. }
  951. let newUrl = '';
  952. if (next == 'right') {//向右切
  953. //当前地址在菜单数组中的index
  954. newUrl = newHasScreen[ai + 1] || newHasScreen[0]
  955. } else {
  956. newUrl = newHasScreen[ai - 1] || newHasScreen[newHasScreen.length - 1]
  957. }
  958. const sIndex = screenName.findIndex(b => b === newUrl);
  959. let newName = names[sIndex];
  960. RouterCache.deleteCache(newUrl)
  961. console.log(111111111111)
  962. if (needName) {
  963. return newName
  964. } else {
  965. setTimeout(() => {
  966. callback && callback(newUrl)
  967. }, 300)
  968. }
  969. }
  970. // 格式化树结构
  971. export function findTreeAllNode(tree) {
  972. const haveChildren = Array.isArray(tree.children) && tree.children.length > 0;
  973. if (haveChildren) {
  974. return tree.children.map(i => findTreeAllNode(i))
  975. } else {
  976. return tree
  977. }
  978. }
  979. /**
  980. * 使用crypto-js的AES算法进行加解密
  981. */
  982. const CryptoJS_key = CryptoJS.enc.Utf8.parse('1234123412ABCDEF') //十六位十六进制数作为密钥
  983. const CryptoJS_iv = CryptoJS.enc.Utf8.parse('ABCDEF1234123412') //十六位十六进制数作为密钥偏移量
  984. //加密方法
  985. export function Encrypt(word) {
  986. const srcs = CryptoJS.enc.Utf8.parse(word)
  987. const encrypted = CryptoJS.AES.encrypt(srcs, CryptoJS_key, {
  988. iv: CryptoJS_iv,
  989. mode: CryptoJS.mode.CBC,
  990. padding: CryptoJS.pad.Pkcs7
  991. })
  992. const hexStr = encrypted.ciphertext.toString().toUpperCase()
  993. var oldHexStr = CryptoJS.enc.Hex.parse(hexStr)
  994. // 将密文转为Base64的字符串
  995. const base64Str = CryptoJS.enc.Base64.stringify(oldHexStr)
  996. return base64Str
  997. }
  998. //解密方法
  999. export function Decrypt(word) {
  1000. /*
  1001. * const encryptedHexStr = CryptoJS.enc.Hex.parse(word)
  1002. * const srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr)
  1003. */
  1004. const decrypt = CryptoJS.AES.decrypt(word, CryptoJS_key, {
  1005. iv: CryptoJS_iv,
  1006. mode: CryptoJS.mode.CBC,
  1007. padding: CryptoJS.pad.Pkcs7
  1008. })
  1009. const decryptedStr = decrypt.toString(CryptoJS.enc.Utf8)
  1010. return decryptedStr.toString()
  1011. }
  1012. export function queryToObj() {
  1013. const url = window.location.href;
  1014. const result = {};
  1015. const urlSplit = url.split('?');
  1016. const len = urlSplit.length - 1;
  1017. const queryParam = urlSplit[len] || '';
  1018. queryParam
  1019. .split('&')
  1020. .filter(str => str !== '')
  1021. .forEach(str => {
  1022. const [key, value] = str.split('=');
  1023. result[key] = value;
  1024. });
  1025. return result;
  1026. };
  1027. /**
  1028. * 字符串模板转换 ,将数据源对应{键}的值填入str
  1029. *
  1030. * @param {*} str 字符串
  1031. * @param {*} source 数据源
  1032. * @param {*} handle 处理函数
  1033. * @returns
  1034. */
  1035. export function strFormat(str, source, handle = () => { }) {
  1036. if (str instanceof Function) {
  1037. return str(source);
  1038. } else if (!isObject(source)) {
  1039. return str;
  1040. }
  1041. const data = { ...source };
  1042. const r = /{[^}]+}/;
  1043. while (r.test(str)) {
  1044. const key = str.match(r).toString().replace("{", "").replace("}", "");
  1045. const value = get(data, key, []);
  1046. const ids = toArray(value).filter((id) => id != null);
  1047. str = str.replace(r, ids.join(","));
  1048. handle(key, value);
  1049. }
  1050. return str;
  1051. };