util.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425
  1. import moment from "moment";
  2. import {
  3. post,
  4. get
  5. } from "@/utils/request";
  6. import Cookies from "js-cookie";
  7. import html2Canvas from "html2canvas";
  8. import JsPDF from "jspdf";
  9. import * as toEnglish from "./ACapital.js";
  10. import CryptoJS from 'crypto-js'
  11. import {
  12. getToken
  13. } from "@/utils/auth";
  14. //根据value值回显字典label值
  15. export function dictDataEcho(value, arr) {
  16. if (value && arr) {
  17. value = value + "";
  18. const current = arr.find((x) => x.dictKey === value);
  19. if (current != undefined && current.dictValue) {
  20. return current.dictValue;
  21. }
  22. return "";
  23. }
  24. return "";
  25. }
  26. //根据value值回显字典label值
  27. export function dictValueLabel(value, arr) {
  28. if ((value || value === 0) && arr) {
  29. const current = arr.filter((x) => x.value == value);
  30. if (current && current.length > 0) {
  31. return current[0].label;
  32. }
  33. return "";
  34. }
  35. return "";
  36. }
  37. export function getDict(key) {
  38. return new Promise((resolve, reject) => {
  39. let dictObj = {};
  40. let arr = {};
  41. let num = 0;
  42. // if (!sessionStorage.getItem("dict")) {
  43. // sessionStorage.setItem("dict", JSON.stringify(dictObj));
  44. // } else {
  45. // dictObj = JSON.parse(sessionStorage.getItem("dict"));
  46. // }
  47. for (let i = 0; i < key.length; i++) {
  48. const element = key[i];
  49. if (dictObj[element]) {
  50. arr[element] = dictObj[element];
  51. num++;
  52. if (num === key.length) {
  53. resolve(arr);
  54. }
  55. } else {
  56. post("/dictTenantData/page", {
  57. pageNum: 1,
  58. pageSize: 999,
  59. tenantId: Cookies.get("tenantId"),
  60. dictCode: element,
  61. }).then((res) => {
  62. dictObj[element] = res.rows;
  63. arr[element] = res.rows;
  64. sessionStorage.setItem("dict", JSON.stringify(dictObj));
  65. num++;
  66. console.log(num);
  67. if (num === key.length) {
  68. resolve(arr);
  69. }
  70. });
  71. }
  72. }
  73. });
  74. }
  75. export function getDictOne(key) {
  76. return new Promise((resolve, reject) => {
  77. let dictObj = {};
  78. let arr = {};
  79. let num = 0;
  80. for (let i = 0; i < key.length; i++) {
  81. const element = key[i];
  82. if (dictObj[element]) {
  83. arr[element] = dictObj[element];
  84. num++;
  85. if (num === key.length) {
  86. resolve(arr);
  87. }
  88. } else {
  89. post("/tenantDict/getDict", {
  90. dictCode: element,
  91. }).then((res) => {
  92. dictObj[element] = res;
  93. arr[element] = res;
  94. num++;
  95. if (num === key.length) {
  96. resolve(arr);
  97. }
  98. });
  99. }
  100. }
  101. });
  102. }
  103. // 金额千分符
  104. export function moneyFormat(s, n) {
  105. if (s) {
  106. s = s + "";
  107. let str = s.slice(0, 1);
  108. if (str === "-") {
  109. s = s.slice(1, s.length);
  110. }
  111. n = n > 0 && n <= 20 ? n : 2;
  112. s = parseFloat((s + "").replace(/[^\d\.-]/g, "")).toFixed(n) + "";
  113. var l = s.split(".")[0].split("").reverse(),
  114. r = s.split(".")[1];
  115. var t = "";
  116. for (let i = 0; i < l.length; i++) {
  117. t += l[i] + ((i + 1) % 3 == 0 && i + 1 != l.length ? "," : "");
  118. }
  119. let result = t.split("").reverse().join("") + "." + r;
  120. if (str === "-") {
  121. return "-" + result;
  122. } else {
  123. return result;
  124. }
  125. } else {
  126. return "0.00";
  127. }
  128. }
  129. // 计算该日期是星期几
  130. export function calculationWeek(val, format) {
  131. let weekArrayList = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
  132. let index = new Date(moment(val, format).format("yyyy-MM-DD")).getDay();
  133. let week = weekArrayList[index];
  134. return week;
  135. }
  136. export function getPdf(title) {
  137. // pdfDom 这个就是你vue页面中定义的ID 比如<div id="pdfDom"> 这个也要避下雷
  138. const element = document.getElementById("pdfDom");
  139. window.pageYoffset = 0;
  140. document.documentElement.scrollTop = 0;
  141. document.body.scrollTop = 0;
  142. setTimeout(() => {
  143. // const nowDate = new Date();
  144. // const date = {
  145. // year: nowDate.getFullYear(),
  146. // month: nowDate.getMonth() + 1,
  147. // date: nowDate.getDate(),
  148. // hours: nowDate.getHours(),
  149. // minutes: nowDate.getMinutes(),
  150. // seconds: nowDate.getSeconds(),
  151. // };
  152. // const newMonth = date.month > 10 ? date.month : "0" + date.month;
  153. // const newDay = date.date > 10 ? date.date : "0" + date.date;
  154. // const newMinutes = date.minutes < 10 ? "0" + date.minutes : date.minutes;
  155. // const newSeconds = date.seconds < 10 ? "0" + date.seconds : date.seconds;
  156. // const value = date.year + newMonth + newDay + date.hours + newMinutes + newSeconds;
  157. let id = "";
  158. //创建一个画布 --- 增加导出的pdf水印 !!
  159. let can = document.createElement("canvas");
  160. //设置画布的长宽
  161. can.width = 400;
  162. can.height = 500;
  163. let cans = can.getContext("2d");
  164. //旋转角度
  165. cans.rotate((-15 * Math.PI) / 180);
  166. cans.font = "18px Vedana";
  167. //设置填充绘画的颜色、渐变或者模式
  168. cans.fillStyle = "rgba(200, 200, 200, 0.40)";
  169. //设置文本内容的当前对齐方式
  170. cans.textAlign = "left";
  171. //设置在绘制文本时使用的当前文本基线
  172. cans.textBaseline = "Middle";
  173. //在画布上绘制填色的文本(输出的文本,开始绘制文本的X坐标位置,开始绘制文本的Y坐标位置)
  174. //cans.fillText(value, can.width / 8, can.height / 2)
  175. let div = document.createElement("div");
  176. div.id = id;
  177. div.style.pointerEvents = "none";
  178. div.style.top = "2000px";
  179. div.style.left = "-2000px";
  180. div.style.position = "fixed";
  181. div.style.zIndex = "100000";
  182. div.style.width = document.getElementById("pdfDom").scrollHeight + "px";
  183. div.style.height = document.getElementById("pdfDom").scrollHeight + "px";
  184. div.style.background = "url(" + can.toDataURL("image/png") + ") left top repeat";
  185. document.getElementById("pdfDom").appendChild(div); // 到页面中
  186. html2Canvas(element, {
  187. allowTaint: true,
  188. useCORS: true, // 需要注意,element的 高度 宽度一定要在这里定义一下,不然会存在只下载了当前你能看到的页面 避雷避雷!!!
  189. scale: 2, // 提升画面质量,但是会增加文件大小
  190. height: document.getElementById("pdfDom").scrollHeight,
  191. windowHeight: document.getElementById("pdfDom").scrollHeight,
  192. }).then(function (canvas) {
  193. var contentWidth = canvas.width;
  194. var contentHeight = canvas.height;
  195. // 一页pdf显示html页面生成的canvas高度;
  196. var pageHeight = (contentWidth * 841.89) / 592.28;
  197. // 未生成pdf的html页面高度
  198. var leftHeight = contentHeight;
  199. // 页面偏移
  200. var position = 0;
  201. // a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
  202. var imgWidth = 595.28;
  203. var imgHeight = (592.28 / contentWidth) * contentHeight;
  204. var pageData = canvas.toDataURL("image/jpeg", 1.0);
  205. var pdf = new JsPDF("", "pt", "a4");
  206. // 有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
  207. // 当内容未超过pdf一页显示的范围,无需分页
  208. if (leftHeight < pageHeight) {
  209. pdf.addImage(pageData, "JPEG", 0, 0, imgWidth, imgHeight);
  210. } else {
  211. while (leftHeight > 0) {
  212. pdf.addImage(pageData, "JPEG", 0, position, imgWidth, imgHeight);
  213. leftHeight -= pageHeight;
  214. position -= 841.89;
  215. // 避免添加空白页
  216. if (leftHeight > 0) {
  217. pdf.addPage();
  218. }
  219. }
  220. }
  221. pdf.save(title + ".pdf");
  222. });
  223. }, 1000);
  224. }
  225. export function getPdfTransverseA4(title) {
  226. html2Canvas(document.getElementById("pdfDom"), {
  227. // allowTaint: true,
  228. // taintTest: false,
  229. // logging: false,
  230. // useCORS: true,
  231. // dpi: window.devicePixelRatio * 2, // 将分辨率提高到特定的DPI 提高四倍
  232. // scale: 2, // 按比例增加分辨率
  233. allowTaint: true,
  234. useCORS: true, // 需要注意,element的 高度 宽度一定要在这里定义一下,不然会存在只下载了当前你能看到的页面 避雷避雷!!!
  235. scale: 4, // 提升画面质量,但是会增加文件大小
  236. height: document.getElementById("pdfDom").scrollHeight,
  237. windowHeight: document.getElementById("pdfDom").scrollHeight,
  238. }).then((canvas) => {
  239. // eslint-disable-next-line new-cap
  240. var pdf = new JsPDF("l", "mm", "a4"); // A3纸,横向
  241. // var pdf = new JsPDF('p', 'mm', 'a4') // A4纸,纵向
  242. var ctx = canvas.getContext("2d");
  243. // A4大小,210mm x 297mm,四边各保留10mm的边距,显示区域190x277
  244. // var a4w = 190;
  245. // var a4h = 277
  246. // A3大小,279mm x 420mm,四边各保留10mm的边距,显示区域259x400
  247. // var a4w = 259;
  248. // var a4h = 400;
  249. var a4w = 210;
  250. var a4h = 297;
  251. // var imgHeight = Math.floor(a4h * canvas.width / a4w) // 按A4显示比例换算一页图像的像素高度[这个计算方式应该是纵向]
  252. var imgHeight = Math.floor((a4w * canvas.width) / a4h); // 按A4显示比例换算一页图像的像素高度[这个是横向打印的计算方法]
  253. var renderedHeight = 0;
  254. while (renderedHeight < canvas.height) {
  255. var page = document.createElement("canvas");
  256. page.width = canvas.width;
  257. page.height = Math.min(imgHeight, canvas.height - renderedHeight); // 可能内容不足一页
  258. // 用getImageData剪裁指定区域,并画到前面创建的canvas对象中
  259. page.getContext("2d").putImageData(ctx.getImageData(0, renderedHeight, canvas.width, Math.min(imgHeight, canvas.height - renderedHeight)), 0, 0);
  260. // 添加图像到页面,保留10mm边距 [a4使用]
  261. // pdf.addImage(page.toDataURL('image/jpeg', 1.0), 'JPEG', 10, 10, a4w, Math.min(a4h, a4w * page.height / page.width))
  262. // 添加图像到页面,保留10mm边距[a3使用1.414换算比例]
  263. // pdf.addImage(page.toDataURL("image/jpeg", 1.0), "JPEG", 10, 10, a4w * 1.414, Math.min(a4h, (a4w * page.height) / page.width) * 1.414);
  264. pdf.addImage(page.toDataURL("image/jpeg", 1.0), "JPEG", 0, 0, a4w * 1.414, Math.min(a4h, (a4w * page.height) / page.width) * 1.414);
  265. renderedHeight += imgHeight;
  266. if (renderedHeight < canvas.height) {
  267. pdf.addPage(); // 如果后面还有内容,添加一个空页
  268. }
  269. }
  270. // 保存文件
  271. pdf.save(title + ".pdf");
  272. });
  273. }
  274. export function currencyPrefix(key) {
  275. if (["¥", "¥", "1"].includes(key)) {
  276. return "SAY RMB ";
  277. } else if (["$", "2"].includes(key)) {
  278. return "SAY US DOLLARS ";
  279. } else if (["€", "3"].includes(key)) {
  280. return "SAY EURO ";
  281. } else {
  282. return "SAY RMB ";
  283. }
  284. }
  285. // 金额英文写法
  286. export function translateIntoEnglish(money, currencyType) {
  287. let text = "";
  288. if (money) {
  289. text = currencyPrefix(currencyType);
  290. if (!/^\d+$/.test(Number(money))) {
  291. text = text + parseFloat(money).toFixed(2).toEnglish().toUpperCase();
  292. } else {
  293. text = text + parseFloat(money).toFixed(2).toEnglish().toUpperCase() + " ONLY";
  294. }
  295. }
  296. text = text.split(" POINT ZERO ZERO ").join("");
  297. return text;
  298. }
  299. // 随机数
  300. export function random() {
  301. let $chars = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678";
  302. let maxPos = $chars.length;
  303. let random = "";
  304. for (let i = 0; i < 32; i++) {
  305. random += $chars.charAt(Math.floor(Math.random() * maxPos));
  306. }
  307. return random;
  308. }
  309. // 深拷贝
  310. export function checkType(target) {
  311. return Object.prototype.toString.call(target).slice(8, -1);
  312. }
  313. export function deepClone(data) {
  314. const obj = checkType(data) === "Array" ? [] : {};
  315. let arr = ["Object", "Array"];
  316. if (arr.includes(checkType(data))) {
  317. for (let key in data) {
  318. let value = data[key];
  319. //value为简单类型,直接赋值
  320. if (!arr.includes(checkType(value))) {
  321. obj[key] = value;
  322. } else {
  323. // 定义一个映射,初始化时,将data本身加入映射中
  324. const map = new WeakMap();
  325. // 如果拷贝的是复杂数据类型第一次拷贝后存入map
  326. // 第二次再遇到该值时,直接赋值为null,结束递归
  327. map.set(data, true);
  328. if (map.has(value)) {
  329. obj[key] = null;
  330. } else {
  331. map.set(value, true);
  332. obj[key] = deepClone(value);
  333. }
  334. }
  335. }
  336. } else {
  337. return data;
  338. }
  339. return obj;
  340. }
  341. // 计算时间间隔
  342. export function timeInterval(smallTime, largeTime) {
  343. //一般前端使用的时间分隔符是"-",需要替换成"/"
  344. let large = new Date(largeTime.replace("-", "/").replace("-", "/"));
  345. let small = new Date(smallTime.replace("-", "/").replace("-", "/"));
  346. if (large > small) {
  347. let date3 = large.getTime() - new Date(small).getTime(); //时间差的毫秒数
  348. //计算出相差天数
  349. let days = Math.floor(date3 / (24 * 3600 * 1000));
  350. //计算出小时数
  351. let leave1 = date3 % (24 * 3600 * 1000); //计算天数后剩余的毫秒数
  352. let hours = Math.floor(leave1 / (3600 * 1000));
  353. //计算相差分钟数
  354. let leave2 = leave1 % (3600 * 1000); //计算小时数后剩余的毫秒数
  355. let minutes = Math.floor(leave2 / (60 * 1000));
  356. //计算相差秒数
  357. let leave3 = leave2 % (60 * 1000); //计算分钟数后剩余的毫秒数
  358. let seconds = Math.round(leave3 / 1000);
  359. return {
  360. days: days,
  361. hours: hours,
  362. minutes: minutes,
  363. seconds: seconds
  364. };
  365. }
  366. return {
  367. days: 0,
  368. hours: 0,
  369. minutes: 0,
  370. seconds: 0
  371. };
  372. }
  373. // 比较时间大小
  374. export function compareTime(date1, date2) {
  375. var oDate1 = new Date(date1);
  376. var oDate2 = new Date(date2);
  377. if (oDate1.getTime() > oDate2.getTime()) {
  378. return true; //第一个大
  379. } else {
  380. return false; //第二个大
  381. }
  382. }
  383. export function generateRandomString(length) {
  384. var result = '';
  385. var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  386. var charactersLength = characters.length;
  387. for (var i = 0; i < length; i++) {
  388. result += characters.charAt(Math.floor(Math.random() * charactersLength));
  389. }
  390. return result;
  391. }
  392. export function generateAuthorization() {
  393. // 待加密的数据
  394. let randomNumber = generateRandomString(20)
  395. //后面加20位随机数
  396. let data = getToken() + new Date().getTime() + randomNumber;
  397. // 密钥,注意:密钥长度必须为16, 24, 32字节对应AES-128, AES-192, AES-256
  398. let key = CryptoJS.enc.Utf8.parse('N[9f%2gKyo7(GNv3');
  399. // AES加密
  400. let encrypted = CryptoJS.AES.encrypt(data, key, {
  401. mode: CryptoJS.mode.ECB,
  402. padding: CryptoJS.pad.Pkcs7
  403. });
  404. return {
  405. encrypted,
  406. randomNumber
  407. }
  408. }