util.js 15 KB

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